【问题标题】:Extract random effect variances from lme4 mer model object从 lme4 mer 模型对象中提取随机效应方差
【发布时间】:2012-01-21 12:54:41
【问题描述】:

我有一个具有固定和随机效果的 mer 对象。如何提取随机效应的方差估计?这是我的问题的简化版本。

study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
study

这会产生很长的输出 - 在这种情况下不会太长。无论如何,我如何明确选择

Random effects:
Groups   Name        Variance Std.Dev.
Subject  (Intercept) 1378.18  37.124  
Residual              960.46  30.991  

部分输出?我想要值本身。

看了很久

str(study)

那里什么都没有!还检查了 lme4 包中的任何提取器功能,但无济于事。请帮忙!

【问题讨论】:

    标签: r random effects lme4


    【解决方案1】:

    其他一些答案是可行的,但我声称最好的答案是使用为此设计的访问器方法——VarCorr(这与lme4 的前身 @ 987654323@包)。

    UPDATElme4 的最新版本(1.1-7 版,但以下所有内容可能适用于 >= 1.0 版)中,VarCorr 比以前更灵活,应该做所有事情你想要的,而不是在合适的模型对象内到处钓鱼。

    library(lme4)
    study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
    VarCorr(study)
    ##  Groups   Name        Std.Dev.
    ##  Subject  (Intercept) 37.124  
    ##  Residual             30.991
    

    默认情况下VarCorr() 打印标准差,但如果您愿意,也可以获取方差:

    print(VarCorr(study),comp="Variance")
    ##  Groups   Name        Variance
    ##  Subject  (Intercept) 1378.18 
    ##  Residual              960.46 
    

    comp=c("Variance","Std.Dev.") 将同时打印两者)。

    为了获得更大的灵活性,您可以使用as.data.frame 方法转换VarCorr 对象,它给出了分组变量、效果变量以及方差/协方差或标准差/相关性:

    as.data.frame(VarCorr(study))
    ##        grp        var1 var2      vcov    sdcor
    ## 1  Subject (Intercept) <NA> 1378.1785 37.12383
    ## 2 Residual        <NA> <NA>  960.4566 30.99123
    

    最后,VarCorr 对象的原始形式(如果你不需要,你可能不应该弄乱你)是一个方差-协方差矩阵列表,其中包含编码标准偏差的附加(冗余)信息和相关性,以及属性 ("sc") 给出残差标准差并指定模型是否具有估计的尺度参数 ("useSc")。

    unclass(VarCorr(fm1))
    ## $Subject
    ##             (Intercept)      Days
    ## (Intercept)  612.089748  9.604335
    ## Days           9.604335 35.071662
    ## attr(,"stddev")
    ## (Intercept)        Days 
    ##   24.740448    5.922133 
    ## attr(,"correlation")
    ##             (Intercept)       Days
    ## (Intercept)  1.00000000 0.06555134
    ## Days         0.06555134 1.00000000
    ## 
    ## attr(,"sc")
    ## [1] 25.59182
    ## attr(,"useSc")
    ## [1] TRUE
    ## 
    

    【讨论】:

    • VarCorr 似乎只提供标准偏差而不是一般人们想要报告的方差估计值吗?
    • (1) 标准差的平方很容易; (2)print(VarCorr(fitted_model),comp="Variance")as.data.frame(VarCorr(fitted_model)) 将轻松检索差异; (3) 报告方差与标准偏差取决于上下文——如果试图考虑 var 分解/解释的比例,我通常更喜欢方差,如果试图与固定效应的大小进行比较,我通常更喜欢标准开发
    • 感谢您的评论本,非常有帮助!
    【解决方案2】:

    lmer 返回一个 S4 对象,所以这应该可以工作:

    remat <- summary(study)@REmat
    print(remat, quote=FALSE)
    

    哪些打印:

     Groups   Name        Variance Std.Dev.
     Subject  (Intercept) 1378.18  37.124  
     Residual              960.46  30.991  
    

    ...一般情况下,您可以查看“mer”对象的printsummary 方法的来源:

    class(study) # mer
    selectMethod("print", "mer")
    selectMethod("summary", "mer")
    

    【讨论】:

    • 如果你想要这些值,那么 VarCorr() 效率更高。看看 Ben Bolker 的帖子
    • 这有点过时了(尽管最初的问题确实提到了“mer objects”,根据定义,这些对象与 pre-1.0 lme4 相关联——该类现在称为 merMod .
    【解决方案3】:
    > attributes(summary(study))$REmat
     Groups     Name          Variance  Std.Dev.
     "Subject"  "(Intercept)" "1378.18" "37.124"
     "Residual" ""            " 960.46" "30.991"
    

    【讨论】:

    • 我可能错了,attributes(summary(study)) 中似乎不再有 REmat
    【解决方案4】:

    这个答案很大程度上基于@Ben Bolker 的答案,但是如果人们对此不熟悉并且想要自己的值,而不仅仅是值的打印输出(正如 OP 似乎想要的那样),那么您可以提取值如下:

    VarCorr 对象转换为数据框。

    re_dat = as.data.frame(VarCorr(study))
    

    然后访问每个单独的值:

    int_vcov = re_dat[1,'vcov']
    resid_vcov = re_dat[2,'vcov']
    

    使用此方法(在您创建的日期框架中指定行和列),您可以访问您想要的任何值。

    【讨论】:

      【解决方案5】:

      另一种可能是

      sum <- summary (study)
      var <- data.frame (sum$varcor)
      

      【讨论】:

        【解决方案6】:

        这个包对这样的事情很有用(https://easystats.github.io/insight/reference/index.html

        library("insight")
        
        get_variance_random(study) #Where study is your fit mixed model
        

        【讨论】:

          【解决方案7】:

          试试

          attributes(study)
          

          举个例子:

          > women
             height weight
          1      58    115
          2      59    117
          3      60    120
          4      61    123
          5      62    126
          6      63    129
          7      64    132
          8      65    135
          9      66    139
          10     67    142
          11     68    146
          12     69    150
          13     70    154
          14     71    159
          15     72    164
          
          > lm1 <- lm(height ~ weight, data=women)
          > attributes(lm1)
          $names
           [1] "coefficients"  "residuals"     "effects"       "rank"         
           [5] "fitted.values" "assign"        "qr"            "df.residual"  
           [9] "xlevels"       "call"          "terms"         "model"        
          
          $class
          [1] "lm"
          
          > lm1$coefficients
          (Intercept)      weight 
           25.7234557   0.2872492 
          
          > lm1$coefficients[[1]]
          
          [1] 25.72346
          
          
          > lm1$coefficients[[2]]
          
          [1] 0.2872492
          

          结束。

          【讨论】:

          • 错误,您的代码使用了lm(),问题是关于lmer(),这不是一回事。
          猜你喜欢
          • 2012-11-09
          • 1970-01-01
          • 2018-11-11
          • 2011-07-24
          • 2020-11-08
          • 2020-03-20
          • 2018-06-24
          • 1970-01-01
          相关资源
          最近更新 更多