GLMM过拟合解决方案

机器算法验证 咕噜咕噜 lme4-nlme
2022-03-19 20:53:09

在 GLMM 常见问题页面http://glmm.wikidot.com/faq中有关于过度拟合的声明:

“另一种选择(由 Robert LaBudde 建议)是“将模型与作为固定效应的随机因子拟合,得到总和为零形式的水平系数,然后计算系数的标准差。”这适用于(a) 主要对测量变异感兴趣的用户(即随机效应不仅仅是令人讨厌的参数,而且变异[而不是每个级别的估计值] 具有科学意义)”

这在实践中究竟意味着什么,是否意味着使用offset()现在是固定效应的随机效应?

除了非常小的随机效应方差分量之外,还有其他方法可以诊断过拟合吗?例如,您如何获得论文中报告的 GLMM 的 df?

1个回答

计算标准偏差(或系数的方差)本质上意味着获得每个级别的固定效应估计值(类似于混合模型中的 BLUP/条件模式)并计算它们的方差。您可以通过将对比度适当地设置为contr.sum(总和为零的对比度)来做到这一点(在这种情况下,您仍然必须重建一个级别的值,因为该模型只会拟合n-1具有截距的模型中的系数),并且/或在模型中适当使用-1+0在模型中拟合无截距模型,其中为每个级别计算系数。predict或者,如下所示,您可以通过(或例如通过包)使用蛮力lsmeans来计算每个级别的值......

仅使用两个水平的 RE 分组变量组成数据:

dd <- expand.grid(f1=factor(1:3),f2=factor(1:2),rep=1:10)
library(lme4)
simList <- 
   suppressMessages(simulate(~f1+(1|f2),
                 newdata=dd,
                 family="gaussian",
                 newparams=list(theta=1,beta=c(0,1,2),sigma=1),
                 seed=101,n=500))

作为f2随机效应拟合并检索估计方差:

sumfun1 <- function(y0) {
    m <- lmer(y~f1+(1|f2),data=transform(dd,y=y0))
    unlist(VarCorr(m))
}

library(plyr)
r1 <- laply(simList,sumfun1,.progress="text")

考虑到很少的级别,这实际上工作得非常好:

mean(r1)  ## 0.98
confint(lm(r1~1)) 
##                 2.5 %   97.5 %
## (Intercept) 0.9248779 1.189029

但是我们经常得到方差的零估计:

sum(r1==0)  ## 60

(以及一些非常小的值)

sum(log10(r1)<(-6))  ## 69

现在通过固定效果试试:

sumfun2 <- function(y0) {
    lm1 <- lm(y~f1+f2,data=transform(dd,y=y0))
    pframe <- data.frame(f1="1",f2=levels(dd$f2))
    var(predict(lm1,newdata=pframe))
}

r2 <- laply(simList,sumfun2,.progress="text")
mean(r2)  ## 1.01294
confint(lm(r2~1))
##             2.5 %   97.5 %
## (Intercept) 0.89081 1.135071

r1[log10(r1)< (-6)] <- 1e-6
p0 <- rbind(data.frame(m="f1=random",r=r1),
            data.frame(m="f1=fixed",r=r2))
library(ggplot2); theme_set(theme_bw())
ggplot(p0,aes(x=log10(r),fill=m))+
    geom_histogram(alpha=0.5,position="identity")+
        geom_vline(xintercept=0,lty=2)

在此处输入图像描述

固定效应方法实际上比我预期的效果更好......