R:用lmer模拟数据并预测(或者)

时间:2017-04-25 15:25:00

标签: r lme4

我正在使用以下模型

fit<- lmer(y ~ a + b + (1|c) + (1|a:d) , data=inputdata)

在“inputdata”中收集的真实观察结果。 现在,我想基于模型参数和确定的误差为模拟生成各种(1000)建模数据集。我可以用

pred <- predict(fit, newdata=list(a=val_a1, b=val_b1, c=val_c1, d = val_d1),
                allow.new.levels = TRUE)

但这总是提供相同的(最可能的平均值)。有没有办法获得值的分布,意味着从预测的分布中得出?

正如@Adam Quek所提出的一个可重复的例子:

    #creating dataset
    a <- as.factor(sort(rep(1:4,5 )))
    b <- rep(1:2,10)+0.5
    c <- as.factor(c( sort(rep(1:2,5)),sort(rep(1:2,5)) ))
    d <- as.factor(rep(1:5,4 ))
    a <- c(a,a,a)
    b <- c(b,b,b)
    c <- c(c,c,c)
    d <- c(d,d,d)
    y <- rnorm(60)
    inputdata = data.frame(y,a,b,c,d)

    # fitting the model   
    fit<- lmer(y ~ a + b + (1|c) + (1|a:d) , data=inputdata)

    # making specific predictions for a parameter set
    val_a1 = 1
    val_b1 = 2
    val_c1 = 1
    val_d1 = 4
    pred <- predict(fit, newdata=list(a=val_a1, b=val_b1, c=val_c1, d = val_d1),
                    allow.new.levels = TRUE)
    pred

我获得的是: 0.2394255

如果我再做一次

pred <- predict(fit, newdata=list(a=val_a1, b=val_b1, c=val_c1, d = val_d1),
                allow.new.levels = TRUE)
pred

我当然得到了: 0.2394255

但我正在搜索的是一个R函数或例程,可以轻松提供一系列预测,这些预测遵循我的输入值的分布。像

这样的东西
for (i in 1:1000){
    pred[i] <- predict(fit, newdata=list(a=val_a1, b=val_b1, c=val_c1, d = 
               val_d1),allow.new.levels = TRUE)
}

mean(pred) = 0.2394255sd(pred) != 0

1 个答案:

答案 0 :(得分:0)

感谢@Alex W! bootMer完成这项工作。以下是那些对该示例的解决方案感兴趣的人:

m1 <- function(.) {
   predict(., newdata=inputdata, re.form=NULL)
}
boot1 <- lme4::bootMer(fit, m1, nsim=1000, use.u=FALSE, type="parametric")
boot1$t[,1]

其中boot1$t[,1]现在包含使用inputdata [1,]中定义的参数值时的1000个预测。 https://cran.r-project.org/web/packages/merTools/vignettes/Using_predictInterval.html 是一个有用的链接。