【问题标题】:Extract a column from lme4 summary in R从 R 中的 lme4 摘要中提取一列
【发布时间】:2020-05-21 03:16:22
【问题描述】:

我想知道从下面的vc 对象中仅提取Std.Dev. 列作为向量的最有效方法是什么?

library(lme4)
library(nlme)

data(Orthodont, package = "nlme")
fm1 <- lmer(distance ~ age + (age|Subject), data = Orthodont)

vc <- VarCorr(fm1) ## extract only the `Std.Dev.` column as a vector

【问题讨论】:

  • 如果选中getAnywhere("as.data.frame.VarCorr.merMod"),它正在提取组件以创建data.frame vcov &lt;- c(diag(v), v[lt.v &lt;- lower.tri(v, diag = FALSE)]);sdcor &lt;- c(attr(v, "stddev"), attr(v, "correlation")[lt.v])
  • 它在内部在代码中做同样的事情r &lt;- rbind(r, data.frame(grp = "Residual", var1 = NA, var2 = NA, vcov = ss^2, sdcor = ss)。因此,提取 sd 并执行 ^ 而不是遍历 as.data.frame 并执行您可能不需要的所有步骤可能是有效的

标签: r dataframe extract lme4 nlme


【解决方案1】:

'vc' 的 structure 表明它是带有单个元素 'Subject' 的 list,而 'stddev' 是一个属性

str(vc)
#List of 1
# $ Subject: num [1:2, 1:2] 6.3334 -0.3929 -0.3929 0.0569
#  ..- attr(*, "dimnames")=List of 2
#  .. ..$ : chr [1:2] "(Intercept)" "age"
#  .. ..$ : chr [1:2] "(Intercept)" "age"
#  ..- attr(*, "stddev")= Named num [1:2] 2.517 0.239  ####

所以,直接提取属性

attr(vc$Subject, "stddev")

残差标准差是一个外部属性

attr(vc, "sc")
#[1] 1.297364

如果我们将它们与c 结合起来,我们会得到一个vector

c(attr(vc$Subject, "stddev"), attr(vc, "sc"))
#   (Intercept)         age             
#  2.5166317   0.2385853   1.2973640 

as.numeric/as.vector 包裹以删除名称,因为它是named 向量

或使用attributes

c(attributes(vc)$sc, attributes(vc$Subject)$stddev)

【讨论】:

    【解决方案2】:

    如果要列中的三个元素,可以使用:

    as.numeric(c(attr(vc[[1]], "stddev"), attr(vc, "sc")))
    

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多