首页 文章

GAM与mgcv包随机效应的方差 - 协方差矩阵

提问于
浏览
1

随机效应与lme4包的随机效应和方差 - 协方差矩阵提取如下:

library(lme4)
fm1 <- lmer(Reaction ~ Days + (1|Subject), sleepstudy)
fm1.rr <- ranef(fm1,condVar=TRUE)
fm1.pv <- attr(rr[[1]],"postVar")

我想知道如何用mgcv做到这一点? 'gam.vcomp'函数确实提取了估计的方差分量,但不是每个级别的随机效应 .

library(mgcv)
fm2 <- gam(Reaction ~ Days + s (Subject, bs="re"), data = sleepstudy, method = "REML")
gam.vcomp(fm2)

2 回答

  • 1
    library(lme4)
    data(sleepstudy)
    
    fm1 <- lmer(Reaction ~ Days + (1|Subject), sleepstudy)
    fm1.rr <- ranef(fm1,condVar=TRUE)$Subject[,1]
    fm1.pv <- sqrt(attr(ranef(fm1,condVar=TRUE) [['Subject']],"postVar")[1,1,])
    
    library(mgcv)
    fm2 <- gam(Reaction ~ Days + s (Subject, bs="re"), 
    data = sleepstudy,   method = "REML")
    

    为每个 Subject 提取随机效果

    idx <-grep("Subject", names(coef(fm2)))
    fm2.rr<-coef(fm2)[idx]
    attributes(fm2.rr)<-NULL
    

    我们可以看到两个模型中的随机效应与预期相同 .

    为了提取随机效应的方差 - 协方差矩阵并计算误差,我们使用参数 Vp ,它是贝叶斯后验协方差矩阵:

    fm2.pv <-sqrt(diag(fm2$Vp))[idx]
    

    或频率论估计的协方差矩阵 Ve

    fm2.pv <-sqrt(diag(fm2$Ve))[idx]
    

    我们可以看到 mgcv 估计的随机效应误差与使用 lme4 模型估计的那些略有不同 . 基于贝叶斯后验协方差矩阵的误差较大,而基于频率矩阵的误差较小 .

  • 0

    您还可以使用包 gamm4 ,它基于 gamm 包,但在下面使用 lme4 . 该模型将适合:

    fm3 <- gamm4(Reaction ~ Days, random = ~ (1|Subject), data = sleepstudy)
    

    随机效应的随机效应和方差 - 协方差矩阵可以在正常的 lme4 过程之后获得 .

    fm3.rr <- ranef(fm3$mer,condVar=TRUE)
    fm3.pv <- attr(fm3.rr[[1]],"postVar")[1,1,]
    

    但是 gamm4 可能比 gam 慢得多,因此请阅读帮助文件以了解何时最适合您的需求 .

相关问题