使用来自merTools

时间:2016-05-03 23:02:48

标签: r predict lme4

我正在尝试使用predictInterval函数further described here生成边际预测的置信区间。

此处我使用ResourceSelection包中的goats数据,其中包含已使用和可用的位置(分别为编码1和0)和感兴趣的协变量值(例如高程,坡度等)以构建可重复的模型。

library(lme4)
library(ResourceSelection)
library(merTools)

df包含10只动物的已使用和可用位置。

table(goats$ID, goats$STATUS)
       0    1
  1  1404  702
  2  1112  556
  3  1026  513
  4   634  317
  5  1272  636
  6  1456  728
  7  1394  697
  8  1468  734
  9  1608  804
  10 1302  651

以下是为个人(ID)指定随机拦截的示例模型。协变量使用scale()在模型拟合中居中和缩放。

 mod <- glmer(STATUS ~ scale(ELEVATION) + scale(SLOPE) + scale(ET) + scale(HLI) + (1|ID),
             family=binomial, data = goats, verbos = 1) 
summary(mod)

我现在想要预测一系列的ELEVATION与所有其他协变量的平均值。因为我正在使用缩放和居中的协变量,平均值为0.缩放的最小值和最大值(ELEVATION)是-1.97056和2.52926,我用它来制作下面的新预测数据。

PredDat <- data.frame(ELEVATION = seq(-1.97056, 2.52926, length.out = 1000),
                      SLOPE = 0,
                      ET = 0,
                      HLI = 0)

虽然我可以手动生成预测,但我不确定如何在大数据集使引导方法(recommended here)过高时估计95%的CI。是否有可能使用predictInterval函数生成边际预测和CI,而不考虑单个随机效应?下面的代码导致错误Error in eval(expr, envir, enclos) : object 'ID' not found,因为PredDat数据框中没有ID。如果我向PredDat数据框添加ID,则代码运行正常。

Preds <- predictInterval(mod, newdata = PredDat, type = "probability")

如何从glmer对象生成边缘预测的任何建议都将非常感激。

显着的会话信息粘贴在FYI下方。

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

other attached packages:
[1] merTools_0.2.0          plyr_1.8.3             
[3] arm_1.8-6               MASS_7.3-45            
[5] ResourceSelection_0.2-5 lme4_1.1-10            
[7] Matrix_1.2-3            sp_1.2-1    

1 个答案:

答案 0 :(得分:2)

此处merTools的包维护者。我们实现此功能的方式并不是很简单,但可以这样做。

您需要添加一个步骤,将中间随机效果添加到data.frame中。在大多数情况下,中值随机效应应为0或足够接近,以使其接近您要查找的内容。为此,您只需稍微修改代码并使用REquantile中的merTools函数:

medEff = REquantile(mod, quantile = 0.5, 
                    groupFctr = "ID", 
                    term = "(Intercept)")

PredDat <- data.frame(ELEVATION = seq(-1.97056, 2.52926, length.out = 1000),
                      SLOPE = 0, ET = 0, HLI = 0, ID = medEff)

Preds <- predictInterval(mod, newdata = PredDat, type = "probability")

这产生预测,但包括随机效应的不确定性,包括0的中值随机效应。在上面的例子中,这最终消除了ELEVATION变量对观察的影响,因为中值随机效应估计不是非常准确。所以,这可能不是你想要的。

另外,如果你有更复杂的随机效果规范有斜率和截距,那么这种方法变得更难,因为截距的中值效应可能是0,但它不适用于斜率。

如果你真的想根据固定效应和它们的不确定性来捕捉预测中的方差 - 自从我学到的包中我学到的东西很常见 - 有办法在{{{{{{{ 1}}。这不是最优雅的,但它是在merTools的引擎下发生的,以获得固定效应预测的可变性:

predictInterval

你应该得到这样的东西:

PredDat <- data.frame(Intercept = 1, 
           ELEVATION = seq(-1.97056, 2.52926,length.out = 1000), 
           SLOPE = 0, ET = 0, HLI = 0)

 fe.tmp <- fixef(mod)
 vcov.tmp <- as.matrix(vcov(mod))
 n.sims <- 1000
 sigmahat <- rep(1, n.sims)

 # Make n.sims draws for each element of the fixed effects

 betaSim <- abind::abind(lapply(1:n.sims,
  function(x) mvtnorm::rmvnorm(n = 1, mean = fe.tmp, 
       sigma = sigmahat[x]*vcov.tmp, method = "chol")), along=1)
# Calculate n.sims predictions for each row in PredDat
fixed <- as.matrix(PredDat) %*% t(betaSim)
# For each row (observation) in PredDat calculate the median, upr and lwr 
Preds <- data.frame(fit = apply(fixed, 1, median), 
                upr = apply(fixed, 1, quantile, 0.9), 
                lwr = apply(fixed, 1, quantile, 0.1))
# Calculate the probability from the linear predictor
Preds <- apply(Preds, 2, invlogit)

这不包括与分组因子的变化或模型本身相关的观察水平的任何不确定性。