繁体   English   中英

使用merTools中的predictInterval()从glmer对象生成边际预测置信区间

[英]Generating marginal prediction confidence intervals from a glmer object using predictInterval() from merTools

我正在尝试使用predictInterval函数为边际预测生成置信区间,这将在此处进一步描述

在这里,我使用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。scale(elevation)的最小值和最大值是-1.97056和2.52926,我用它们在下面制作新的预测数据。

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

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

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

任何关于如何从闪光物体产生边缘预测的建议都将不胜感激。

重要会话信息粘贴在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    

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,但不适用于斜率。

如果您真的只想基于固定效果及其不确定性来捕获预测中的方差(自从构建我所学的软件包以来,这种情况merTools普遍了),则可以在merTools之外进行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)

您应该得到这样的内容:

head(Preds)

     fit       upr       lwr
1 0.1860053 0.2482220 0.1427370
2 0.1860058 0.2482226 0.1427373
3 0.1860062 0.2482231 0.1427377
4 0.1860066 0.2482237 0.1427380
5 0.1860071 0.2482242 0.1427384
6 0.1860075 0.2482248 0.1427388

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM