我想从lmer()模型获得围绕预测的预测间隔。我发现了一些有关此的讨论:
http://rstudio-pubs-static.s3.amazonaws.com/24365_2803ab8299934e888a60e7b16113f619.html
但他们似乎并未考虑随机效应的不确定性。
这是一个具体的例子。我在比赛金鱼。我有过去100场比赛的数据。考虑到我的RE估算和FE估算的不确定性,我想预测第101位。我包括鱼的随机拦截(有10种不同的鱼)和重量的固定效应(较轻的鱼更快)。
library("lme4")
fish <- as.factor(rep(letters[1:10], each=100))
race <- as.factor(rep(900:999, 10))
oz <- round(1 + rnorm(1000)/10, 3)
sec <- 9 + rep(1:10, rep(100,10))/10 + oz + rnorm(1000)/10
fishDat <- data.frame(fishID = fish,
raceID = race, fishWt = oz, time = sec)
head(fishDat)
plot(fishDat$fishID, fishDat$time)
lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)
现在,来预测第101场比赛。鱼已经过称重,可以出发了:
newDat <- data.frame(fishID = letters[1:10],
raceID = rep(1000, 10),
fishWt = 1 + round(rnorm(10)/10, 3))
newDat$pred <- predict(lme1, newDat)
newDat
fishID raceID fishWt pred
1 a 1000 1.073 10.15348
2 b 1000 1.001 10.20107
3 c 1000 0.945 10.25978
4 d 1000 1.110 10.51753
5 e 1000 0.910 10.41511
6 f 1000 0.848 10.44547
7 g 1000 0.991 10.68678
8 h 1000 0.737 10.56929
9 i 1000 0.993 10.89564
10 j 1000 0.649 10.65480
鱼D确实放手了(1.11盎司),并且实际上被预测输给了鱼E和鱼F,他俩都比过去更好。但是,现在我想说:“鱼E(重0.91盎司)将以概率p击败鱼D(重1.11盎司)”。有没有办法使用lme4做出这样的声明?我希望我的概率p在固定效应和随机效应中都考虑到我的不确定性。
谢谢!
PS查看该predict.merMod
文档,它表示“无法计算预测的标准误差,因为很难定义一种将方差参数中包含不确定性的有效方法;我们建议bootMer
针对此任务,”但是,天哪,我看不到如何使用bootMer
来做到这一点。它似乎bootMer
将用于获取估计参数的自举置信区间,但我可能是错的。
问:
好的,我想我问错了问题。我想说:“鱼A的重量为oz,将具有90%的比赛时间(lcl,ucl)。”
在我列出的示例中,重达1.0盎司的鱼A的9 + 0.1 + 1 = 10.1 sec
平均竞速时间为0.1,标准偏差为。因此,他观察到的比赛时间将介于
x <- rnorm(mean = 10.1, sd = 0.1, n=10000)
quantile(x, c(0.05,0.50,0.95))
5% 50% 95%
9.938541 10.100032 10.261243
90%的时间。我想要一个预测函数,试图给我这个答案。全部设置fishWt = 1.0
为newDat
,重新运行sim并使用(如下面的Ben Bolker所建议)
predFun <- function(fit) {
predict(fit,newDat)
}
bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = FALSE)
predMat <- bb$t
给
> quantile(predMat[,1], c(0.05,0.50,0.95))
5% 50% 95%
10.01362 10.55646 11.05462
这似乎实际上是以人口平均数为中心吗?好像没有考虑FishID的影响?我以为可能是样本量问题,但是当我将观察到的种族数从100增加到10000时,我仍然得到类似的结果。
我会默认记录bootMer
使用use.u=FALSE
情况。另一方面,使用
bb <- bootMer(lme1,nsim=1000,FUN=predFun, use.u = TRUE)
给
> quantile(predMat[,1], c(0.05,0.50,0.95))
5% 50% 95%
10.09970 10.10128 10.10270
该间隔太窄,对于鱼A的平均时间来说似乎是一个置信区间。我想要一个关于Fish A观察到的比赛时间的置信区间,而不是他的平均比赛时间。我该怎么办?
更新2,几乎:
我以为自己在Gelman and Hill(2007),第273页中找到了所需的内容arm
。需要利用该软件包。
library("arm")
对于鱼A:
x.tilde <- 1 #observed fishWt for new race
sigma.y.hat <- sigma.hat(lme1)$sigma$data #get uncertainty estimate of our model
coef.hat <- as.matrix(coef(lme1)$fishID)[1,] #get intercept (random) and fishWt (fixed) parameter estimates
y.tilde <- rnorm(1000, coef.hat %*% c(1, x.tilde), sigma.y.hat) #simulate
quantile (y.tilde, c(.05, .5, .95))
5% 50% 95%
9.930695 10.100209 10.263551
对于所有鱼类:
x.tilde <- rep(1,10) #assume all fish weight 1 oz
#x.tilde <- 1 + rnorm(10)/10 #alternatively, draw random weights as in original example
sigma.y.hat <- sigma.hat(lme1)$sigma$data
coef.hat <- as.matrix(coef(lme1)$fishID)
y.tilde <- matrix(rnorm(1000, coef.hat %*% matrix(c(rep(1,10), x.tilde), nrow = 2 , byrow = TRUE), sigma.y.hat), ncol = 10, byrow = TRUE)
quantile (y.tilde[,1], c(.05, .5, .95))
5% 50% 95%
9.937138 10.102627 10.234616
实际上,这可能并不是我想要的。我仅考虑整体模型的不确定性。例如,在我有5个观察到的关于K鱼的比赛和1000个观察到的关于L鱼的比赛的情况下,我认为与我对Fish K的预测相关的不确定性应该比与我对Fish L的预测相关的不确定性大得多。
我们将进一步研究Gelman and Hill2007。我觉得我可能最终不得不改用BUGS(或Stan)。
更新第三个:
也许我在概念上做得不好。predictInterval()
在下面的答案中使用Jared Knowles给出的功能,得出的间隔与我期望的不完全相同。
library("lattice")
library("lme4")
library("ggplot2")
fish <- c(rep(letters[1:10], each = 100), rep("k", 995), rep("l", 5))
oz <- round(1 + rnorm(2000)/10, 3)
sec <- 9 + c(rep(1:10, each = 100)/10,rep(1.1, 995), rep(1.2, 5)) + oz + rnorm(2000)
fishDat <- data.frame(fishID = fish, fishWt = oz, time = sec)
dim(fishDat)
head(fishDat)
plot(fishDat$fishID, fishDat$time)
lme1 <- lmer(time ~ fishWt + (1 | fishID), data=fishDat)
summary(lme1)
dotplot(ranef(lme1, condVar = TRUE))
我添加了两条新鱼。观察到995个种族的Fish K,观察到5个种族的FishL。我们已经观察了鱼AJ的100场比赛。我适合lmer()
以前。望着dotplot()
从lattice
包:
默认情况下,dotplot()
将随机效果按其点估计重新排序。鱼L的估计值位于第一行,并且具有非常宽的置信区间。鱼K在第三行,并且具有非常窄的置信区间。这对我来说很有意义。我们有很多有关Fish K的数据,但没有有关Fish L的大量数据,因此我们对Fish K的真实游泳速度的猜测更加自信。现在,我认为这将导致Fish K的预测间隔变窄,而Fish L的预测间隔变宽predictInterval()
。豪瓦:
newDat <- data.frame(fishID = letters[1:12],
fishWt = 1)
preds <- predictInterval(lme1, newdata = newDat, n.sims = 999)
preds
ggplot(aes(x=letters[1:12], y=fit, ymin=lwr, ymax=upr), data=preds) +
geom_point() +
geom_linerange() +
labs(x="Index", y="Prediction w/ 95% PI") + theme_bw()
所有这些预测间隔的宽度似乎都相同。为什么我们对Fish K的预测没有缩小?为什么我们对Fish L的预测没有比其他人更广泛?
predictInterval
包括固定效应和随机效应项的误差/不确定性。在dotplot
你只看到了不确定性,由于预测的随机部分,基本上是围绕着鱼截取特定的估计的不确定性。如果您的模型的固定参数有很多不确定性,fishWt
并且此参数驱动了大多数预测值,则任何特定鱼的截距周围的不确定性都是微不足道的,并且您不会在间隔宽度上看到很大的差异。我们应该在predictInterval
结果中更清楚地说明这一点。