【问题标题】:lme4::lmer summary object contains double object with stringlme4::lmer 摘要对象包含带字符串的双对象
【发布时间】:2015-10-15 13:38:55
【问题描述】:

以下面的模型为例

library('lme4')
foo <- lmer(cty ~ hwy + (1|model), data=mpg, REML=F)

现在我们可以检索模型的对数似然

sum.foo <- summary(foo)
LL <- sum.foo[["logLik"]]
LL
'log Lik.' -343 (df=4)
typeof(LL)
[1] "double"

问题:如何将所有这些信息存储在双重对象中?那里似乎至少有两个字符串,即“log Lik”。和“(df = 4)”。有没有办法从这个对象中检索 df 的值?

【问题讨论】:

  • FWIW 您可以通过logLik(foo) 直接检索对数似然(检索具有相同结构的对象,即具有“df”属性的数值

标签: r summary lme4


【解决方案1】:

LL 实际上只是一个数字(带有属性)。打印LL 时看到的行是由print.logLik 函数创建的,如下所示:

getAnywhere(print.logLik)
A single object matching ‘print.logLik’ was found
It was found in the following places
  registered S3 method for print from namespace stats
  namespace:stats
with value

function (x, digits = getOption("digits"), ...) 
{
    cat("'log Lik.' ", paste(format(c(x), digits = digits), collapse = ", "), 
        " (df=", format(attr(x, "df")), ")\n", sep = "")
    invisible(x)
}

这是在您运行 LL 时调用的,但 LL 实际上只有一个数字(长度为 1 的数字向量)。 cat 函数用于打印您在控制台上看到的 'log Lik.' -343 (df=4)

为了得到你可以做的df值(从上面的函数也可以看出):

format(attr(LL[['logLik']], "df"))

查看示例(来自 lmer 的文档):

fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
a <- summary(fm1)# (with its own print method)

> a[['logLik']]
'log Lik.' -871.8141 (df=6)
> format(attr(a[['logLik']], "df"))
[1] "6"

并且根据@BenBolker 在评论format 中提到的仅将其转换为字符。

> attr(a[['logLik']], "df")
[1] 6

可能更好。

【讨论】:

  • 这是完全正确的,但我不会打扰format()——这只是为了打印目的。
  • 谢谢@BenBolker。有效的评论。我注意到了这一点,但我认为这很容易弄清楚。但你是对的,没有它可能最好使用它。 (大包顺便说一句)。
猜你喜欢
  • 2019-06-06
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多