lmer 对象通过效果包的置信区间的可信度如何?

机器算法验证 r 混合模式 置信区间 效果 lme4-nlme
2022-02-04 13:57:33

Effectspackage提供了一种非常快速方便​​的方式来绘制通过lme4package获得的线性混合效应模型结果。effect函数非常快速地计算置信区间 (CI),但这些置信区间的可信度如何?

例如:

library(lme4)
library(effects)
library(ggplot)

data(Pastes)

fm1  <- lmer(strength ~ batch + (1 | cask), Pastes)
effs <- as.data.frame(effect(c("batch"), fm1))
ggplot(effs, aes(x = batch, y = fit, ymin = lower, ymax = upper)) + 
  geom_rect(xmax = Inf, xmin = -Inf, ymin = effs[effs$batch == "A", "lower"],
        ymax = effs[effs$batch == "A", "upper"], alpha = 0.5, fill = "grey") +
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

在此处输入图像描述

根据使用effects包计算的 CI,批次“E”与批次“A”不重叠。

如果我尝试使用相同的confint.merMod函数和默认方法:

a <- fixef(fm1)
b <- confint(fm1)
# Computing profile confidence intervals ...
# There were 26 warnings (use warnings() to see them)

b <- data.frame(b)
b <- b[-1:-2,]

b1 <- b[[1]]
b2 <- b[[2]]

dt <- data.frame(fit   = c(a[1],  a[1] + a[2:length(a)]), 
                 lower = c(b1[1],  b1[1] + b1[2:length(b1)]), 
                 upper = c(b2[1],  b2[1] + b2[2:length(b2)]) )
dt$batch <- LETTERS[1:nrow(dt)]

ggplot(dt, aes(x = batch, y = fit, ymin = lower, ymax = upper)) +
  geom_rect(xmax = Inf, xmin = -Inf, ymin = dt[dt$batch == "A", "lower"], 
        ymax = dt[dt$batch == "A", "upper"], alpha = 0.5, fill = "grey") + 
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

在此处输入图像描述

我看到所有的 CI 都重叠。我还收到警告,表明该函数未能计算出可信赖的 CI。这个例子,以及我的实际数据集,让我怀疑这个effects包在 CI 计算中采取了捷径,这可能没有完全得到统计学家的认可。对象包中函数返回的 CI 的可信度如何effecteffectslmer

我尝试了什么:查看源代码,我注意到effect函数依赖于Effect.merMod函数,而函数又指向Effect.mer函数,如下所示:

effects:::Effect.mer
function (focal.predictors, mod, ...) 
{
    result <- Effect(focal.predictors, mer.to.glm(mod), ...)
    result$formula <- as.formula(formula(mod))
    result
}
<environment: namespace:effects>

mer.to.glm函数似乎从lmer对象计算方差协变量矩阵:

effects:::mer.to.glm

function (mod) 
{
...
mod2$vcov <- as.matrix(vcov(mod))
...
mod2
}

反过来,这可能用于Effect.default计算 CI 的函数(我可能误解了这部分):

effects:::Effect.default
...
     z <- qnorm(1 - (1 - confidence.level)/2)
        V <- vcov.(mod)
        eff.vcov <- mod.matrix %*% V %*% t(mod.matrix)
        rownames(eff.vcov) <- colnames(eff.vcov) <- NULL
        var <- diag(eff.vcov)
        result$vcov <- eff.vcov
        result$se <- sqrt(var)
        result$lower <- effect - z * result$se
        result$upper <- effect + z * result$se
...

我对 LMM 的了解不够,无法判断这是否是一种正确的方法,但考虑到围绕 LMM 的置信区间计算的讨论,这种方法似乎很简单。

2个回答

所有结果基本相同(对于这个特定示例)。一些理论差异是:

  • 正如@rvl 指出的那样,您在不考虑参数之间协方差的情况下重建 CI 是错误的(抱歉)
  • 参数的置信区间可以基于 Wald 置信区间(假设二次对数似然曲面):lsmeans, effects, confint(.,method="Wald"); 除了lsmeans,这些方法忽略了有限大小的影响(“自由度”),但在这种情况下,它几乎没有任何区别(df=40实际上与无限没有区别df
  • ...或轮廓置信区间(默认方法;忽略有限尺寸效应,但允许非二次曲面)
  • ...或参数自举(黄金标准——假设模型是正确的[响应是正态的,随机效应是正态分布的,数据是条件独立的,等等],但除此之外几乎没有假设)

我认为所有这些方法都是合理的(有些方法比其他方法更近似),但在这种情况下,您使用哪种方法几乎没有任何区别。如果您担心,请在您的数据或类似于您自己的模拟数据上尝试几种对比方法,看看会发生什么......

A(PS:我不会对和的置信区间不重叠这一事实过分重视E。您必须进行适当的成对比较程序才能对这对特定估计值之间的差异做出可靠的推论。 ..)

95% 置信区间:

在此处输入图像描述

比较代码:

library(lme4)
fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
c0 <- confint(fm2,method="Wald")
c1 <- confint(fm2)
c2 <- confint(fm2,method="boot")
library(effects)
library(lsmeans)
c3 <- with(effect("batch",fm2),cbind(lower,upper))
c4 <- with(summary(lsmeans(fm2,spec="batch")),cbind(lower.CL,upper.CL))
tmpf <- function(method,val) {
    data.frame(method=method,
               v=LETTERS[1:10],
               setNames(as.data.frame(tail(val,10)),
                        c("lwr","upr")))
}
library(ggplot2); theme_set(theme_bw())
allCI <- rbind(tmpf("lme4_wald",c0),
      tmpf("lme4_prof",c1),
      tmpf("lme4_boot",c2),
      tmpf("effects",c3),
               tmpf("lsmeans",c4))
ggplot(allCI,aes(v,ymin=lwr,ymax=upr,colour=method))+
    geom_linerange(position=position_dodge(width=0.8))

ggsave("pastes_confint.png",width=10)

看起来您在第二种方法中所做的是计算回归系数的置信区间,然后对其进行转换以获得预测的 CI。这忽略了回归系数之间的协方差。

尝试在没有截距的情况下拟合模型,这样batch效果实际上就是预测,并confint返回您需要的区间。

附录 1

我完全按照我上面的建议做了:

> fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
> confint(fm2)
Computing profile confidence intervals ...
           2.5 %    97.5 %
.sig01  0.000000  1.637468
.sigma  2.086385  3.007380
batchA 60.234772 64.298581
batchB 57.268105 61.331915
batchC 60.018105 64.081915
batchD 57.668105 61.731915
batchE 53.868105 57.931915
batchF 59.001439 63.065248
batchG 57.868105 61.931915
batchH 61.084772 65.148581
batchI 56.651439 60.715248
batchJ 56.551439 60.615248

这些间隔似乎与effects.

附录 2

另一种选择是lsmeans包。它从pbkrtest中获得自由度和调整后的协方差矩阵。

> library("lsmeans")
> lsmeans(fm1, "batch")
Loading required namespace: pbkrtest
 batch   lsmean       SE    df lower.CL upper.CL
 A     62.26667 1.125709 40.45 59.99232 64.54101
 B     59.30000 1.125709 40.45 57.02565 61.57435
 C     62.05000 1.125709 40.45 59.77565 64.32435
 D     59.70000 1.125709 40.45 57.42565 61.97435
 E     55.90000 1.125709 40.45 53.62565 58.17435
 F     61.03333 1.125709 40.45 58.75899 63.30768
 G     59.90000 1.125709 40.45 57.62565 62.17435
 H     63.11667 1.125709 40.45 60.84232 65.39101
 I     58.68333 1.125709 40.45 56.40899 60.95768
 J     58.58333 1.125709 40.45 56.30899 60.85768

Confidence level used: 0.95 

这些更符合effect结果:标准误差相同,但effect使用不同的 dfconfint附录 1 中的结果甚至比基于使用 $\pm1.96\times\mbox{se}$ 的渐近结果更窄。所以现在我认为那些不是很值得信赖。±1.96×se. So now I think those are

来自effect和的结果lsmeans相似,但在不平衡的多因素情况下,lsmeans默认情况下对具有相同权重的未使用因素进行平均,而effect按观察到的频率计算权重(在 中作为选项提供lsmeans)。