来自merTools的预测顺序predictInterval()

时间:2016-03-22 21:00:37

标签: r lme4

我遇到来自predictInterval()的{​​{1}}问题。与使用merTools的标准predict()方法的数据和中点预测相比,预测似乎不合规格。我不能用模拟数据重现问题,所以我能做的最好的就是显示lme4对象和我的一些数据。

lmerMod

根据> # display input data to the model > head(inputData) id y x z 1 calibration19 1.336 0.531 001 2 calibration20 1.336 0.433 001 3 calibration22 0.042 0.432 001 4 calibration23 0.042 0.423 001 5 calibration16 3.300 0.491 001 6 calibration17 3.300 0.465 001 > sapply(inputData, class) id y x z "factor" "numeric" "numeric" "factor" > > # fit mixed effects regression with random intercept on z > lmeFit = lmer(y ~ x + (1 | z), inputData) > > # display lmerMod object > lmeFit Linear mixed model fit by REML ['lmerMod'] Formula: y ~ x + (1 | z) Data: inputData REML criterion at convergence: 444.245 Random effects: Groups Name Std.Dev. z (Intercept) 0.3097 Residual 0.9682 Number of obs: 157, groups: z, 17 Fixed Effects: (Intercept) x -0.4291 5.5638 > > # display new data to predict in > head(predData) id x z 1 29999900108 0.343 001 2 29999900207 0.315 001 3 29999900306 0.336 001 4 29999900405 0.408 001 5 29999900504 0.369 001 6 29999900603 0.282 001 > sapply(predData, class) id x z "factor" "numeric" "factor" > > # estimate fitted values using predict() > set.seed(1) > preds_mid = predict(lmeFit, newdata=predData) > > # estimate fitted values using predictInterval() > set.seed(1) > preds_interval = predictInterval(lmeFit, newdata=predData, n.sims=1000) # wrong order > > # estimate fitted values just for the first observation to confirm that it should be similar to preds_mid > set.seed(1) > preds_interval_first_row = predictInterval(lmeFit, newdata=predData[1,], n.sims=1000) > > # display results > head(preds_mid) # correct prediction 1 2 3 4 5 6 1.256860 1.101074 1.217913 1.618505 1.401518 0.917470 > head(preds_interval) # incorrect order fit upr lwr 1 1.512410 2.694813 0.133571198 2 1.273143 2.521899 0.009878347 3 1.398273 2.785358 0.232501376 4 1.878165 3.188086 0.625161201 5 1.605049 2.813737 0.379167003 6 1.147415 2.417980 -0.108547846 > preds_interval_first_row # correct prediction fit upr lwr 1 1.244366 2.537451 -0.04911808 > preds_interval[round(preds_interval$fit,3)==round(preds_interval_first_row$fit,3),] # the correct prediction ends up as observation 1033 fit upr lwr 1033 1.244261 2.457012 -0.0001299777 > 方法,我的数据框predData的第一次观察应该具有大约1.25的拟合值,但是使用{{1}它的值大约为1.5。 }} 方法。这似乎不仅仅是由于预测方法的差异,因为如果我将predict()参数限制为predictInterval()的第一行,则结果拟合值约为1.25,如预期的那样。

我无法通过模拟数据重现问题,这让我相信它与我的输入或预测数据的属性有关。我已经尝试将因子变量重新分类为字符,在拟合模型之前强制执行行的顺序,在拟合模型和预测之间,但没有成功。

这是一个已知问题吗?我该怎么做才能避免它?

1 个答案:

答案 0 :(得分:1)

我曾尝试制作此问题的最小可重现示例,但未成功。

library(merTools)
d <- data.frame(x = rnorm(1000), z = sample(1:25L, 1000, replace=TRUE),
              id = sample(LETTERS, 1000, replace = TRUE))
d$z <- as.factor(d$z)
d$id <- factor(d$id)
d$y <- simulate(~x+(1|z),family = gaussian,
              newdata=d,
              newparams=list(beta=c(2, -1.1), theta=c(.25),
                             sigma = c(.23)), seed =463)[[1]]
 lmeFit <- lmer(y ~ x + (1|z), data = d)
 predData <- data.frame(x = rnorm(25), z = sample(1:25L, 25, replace=TRUE),
              id = sample(LETTERS, 25, replace = TRUE))
predData$z <- as.factor(predData$z)
predData$id <- factor(predData$id)
predict(lmeFit, predData)
predictInterval(lmeFit, predData)
predictInterval(lmeFit, predData[1, ])

但是,玩这个代码我无法重现上面观察到的错误。您是否可以发布合成示例或查看是否可以创建合成示例?

或者,您是否可以首先将这些因素强制转换为字符并查看是否看到相同的重新排序问题?