【问题标题】:Extracting names from a VarCorr object in lme4 and pasting it as column names从 lme4 中的 VarCorr 对象中提取名称并将其粘贴为列名
【发布时间】:2021-01-13 14:57:47
【问题描述】:

下面我想知道是否有办法从vc1vc2 中提取列NameGroups,并将它们分别粘贴为对象AABB 的列名。

例如,对于MODEL 1(如下),我预期的AA 输出将是:

                    plate_(Intercept) #: Name & Groups column from `vc1`
Standard deviation     1.54
Proportion of Variance 1.00
Cumulative Proportion  1.00

                   sample_(Intercept) #: Name & Groups column from `vc1`
Standard deviation     3.513
Proportion of Variance 1.000
Cumulative Proportion  1.000

这在 R 中可以实现吗(可能作为一个函数)?

library(lme4)

## MODEL 1:
fm1 <- lmer(diameter ~ 1 + (1|plate) + (1|sample), Penicillin)

(vc1 <- VarCorr(fm1))

AA <- summary(rePCA(fm1))

## MODEL 2:
fm2 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)

(vc2 <- VarCorr(fm2))

BB <- summary(rePCA(fm2))

【问题讨论】:

    标签: r string function character lme4


    【解决方案1】:

    rePCAsummary 生成一个列表。您可以遍历该列表的名称,从vc1/vc2 绘制(唯一)相关标签,并将这些标签分配为colnames

    请注意,rePCA 的每个元素内的数据框是通过$importance 属性访问的。

    这可以包装成一个函数:

    set_importance_colnames <- function(vc, pca_data) {
      for (name in names(pca_data)) {
        vc_df <- as.data.frame(vc)
        target <- vc_df[vc_df$grp == name, ]
        new_label <- unique(paste(target$grp, target$var1, sep = "_"))
        colnames(pca_data[[name]]$importance) <- new_label
      }
      return(pca_data)
    }
    

    AA 的输出:

    set_importance_colnames(vc1, AA)
    
    $plate
    Importance of components:
                           plate_(Intercept)
    Standard deviation                  1.54
    Proportion of Variance              1.00
    Cumulative Proportion               1.00
    
    $sample
    Importance of components:
                           sample_(Intercept)
    Standard deviation                  3.513
    Proportion of Variance              1.000
    Cumulative Proportion               1.000
    

    BB 的输出:

    set_importance_colnames(vc2, BB)
    $Subject
    Importance of components:
                           Subject_(Intercept) Subject_Days
    Standard deviation                  0.9669      0.23088
    Proportion of Variance              0.9460      0.05395
    Cumulative Proportion               0.9460      1.00000
    

    【讨论】:

    • 谢谢,Andrew,您是否也可以使用 BB
    • 现在可以了。需要在 paste 周围添加一个 unique() 包装器 - 看起来它现在的行为符合预期。
    【解决方案2】:

    我们可以写一个函数:

    return_names <- function(obj, model) {
    
      Map(function(x, z) {
        colnames(x$importance) <- paste(z,unique(sapply(model, colnames)), sep = '_')
        x
      }, obj, names(obj))
    
    }
    
    return_names(AA, vc1)
    #$plate
    #Importance of components:
    #                       plate_(Intercept)
    #Standard deviation                  1.54
    #Proportion of Variance              1.00
    #Cumulative Proportion               1.00
    
    #$sample
    #Importance of components:
    #                       sample_(Intercept)
    #Standard deviation                  3.513
    #Proportion of Variance              1.000
    #Cumulative Proportion               1.000
    
    return_names(BB, vc2)
    #$Subject
    #Importance of components:
    #                       Subject_(Intercept) Subject_Days
    #Standard deviation                  0.9669      0.23088
    #Proportion of Variance              0.9460      0.05395
    #Cumulative Proportion               0.9460      1.00000
    

    【讨论】:

    • 恭喜200!
    • 对不起,需要在函数中使用names(obj)。我已经更新了答案。
    • Ronak,为什么您的解决方案因以下原因而失败? library(lme4); dat &lt;- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/sng.csv'); fm3 &lt;- lmer(y ~ A * B * C + (A + B | group) + (C|group), data = dat); AA &lt;-summary(rePCA(fm3)); vc1 &lt;- VarCorr(fm3)
    • 我纠正了这个问题。我也感谢您对上述问题的评论。
    • 上述模型的列名是什么?
    猜你喜欢
    • 2021-01-22
    • 2019-04-10
    • 2020-06-17
    • 2011-12-23
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    相关资源
    最近更新 更多