R stargazer、lme4 和 lmerTest 不兼容

R stargazer, lme4 and lmerTest incompatibility

R新手看这里。我在使用 lmerTeststargazer 时遇到问题。我按照这里的教程让 stargazer 在 R.

中使用 lme4

http://svmiller.com/blog/2015/02/quasi-automating-the-inclusion-of-random-effects-in-rs-stargazer-package/

我运行这个例子没有问题。

library(lme4)
library(stargazer)
data(cake)
summary(M1 <- lmer(angle ~ temp + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
summary(M2 <- lmer(angle ~ factor(temperature) + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
anova(M1,M2)
stargazer(M1, M2, style="ajps", title="An Illustrative Model Using Cake Data", dep.var.labels.include = FALSE, 
          covariate.labels=c( "Temperature (Continuous)", "Temperature (Factor $<$ 185)", "Temperature (Factor $<$ 195)", "Temperature (Factor $<$ 205)", "Temperature (Factor $<$ 215)", "Temperature (Factor $<$ 225)")
)

虽然这有效,但如果我包含 lmerTest 包,stargazer 将不再有效。

library(lme4)
library(lmerTest)
library(stargazer)
data(cake)
summary(M1 <- lmer(angle ~ temp + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
summary(M2 <- lmer(angle ~ factor(temperature) + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
anova(M1,M2)
stargazer(M1, M2, style="ajps", title="An Illustrative Model Using Cake Data", dep.var.labels.include = FALSE, 
          covariate.labels=c( "Temperature (Continuous)", "Temperature (Factor $<$ 185)", "Temperature (Factor $<$ 195)", "Temperature (Factor $<$ 205)", "Temperature (Factor $<$ 215)", "Temperature (Factor $<$ 225)")
)

Error in objects[[i]]$zelig.call : 
  $ operator not defined for this S4 class

我真的很想使用 stargazer,但我的实验需要使用 merModLmerTest 对象,stargazer 不支持。有人知道解决方法吗?将 merModLmerTest 对象转换为兼容的 lmerMod 对象有多难?

仔细查看该代码,我认为这是一个 stargazer 问题。 stargazer 可以读取 class lmerMod 的对象,不能读取 merModLmerTest。由于作者描述的那个 hack 需要 stargazer 包才能通过 stargazer 包含随机效果,我认为你被卡住了。

如果您的工作确实需要 lmerTest(看起来像 anova 函数,对吧?),我会推荐以下内容。

  1. 运行 您的模型并获得您的方差分析。随心所欲。
  2. 再次
  3. 运行 您的模型,但指定您想要 lme4 估计模型。您可以通过键入 lme4::lmer(y + x1, Data) 来完成此操作。由于您在 lme4 之后加载了 lmerTest 包,因此 lmerTest 实际上成为 运行 lmer 函数的默认包。这就是为什么您的对象变成 stargazer 无法读取的 class 的原因。归根结底,它是相同的模型,只是存储方式不同。
  4. 最后,使用 xtable 在 LaTeX 中创建方差分析结果,如果这正是您想要的。

修改后的代码应该对您有所帮助。

library(lme4)
library(lmerTest)
library(stargazer)
library(xtable)
data(cake)

# Get the table first.
summary(M1 <- lme4::lmer(angle ~ temp + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
summary(M2 <- lme4::lmer(angle ~ factor(temperature) + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))

stargazer(M1, M2, style="ajps", title="An Illustrative Model Using Cake Data", dep.var.labels.include = FALSE, 
      covariate.labels=c( "Temperature (Continuous)", "Temperature (Factor $<$ 185)", "Temperature (Factor $<$ 195)", "Temperature (Factor $<$ 205)", "Temperature (Factor $<$ 215)", "Temperature (Factor $<$ 225)")
)

# now for lmerTest
summary(M1a <- lmer(angle ~ temp + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
summary(M2a <- lmer(angle ~ factor(temperature) + (1 | replicate) + (1|recipe:replicate), cake, REML= FALSE))
anovadf <- data.frame(anova(M1a,M2a))
xtable(anovadf)

这很容易修复。将 lmerTest(在 class merModLmerTest 中)的输出转换为 lmerMod class。这将与 stargazer 兼容。

class(model) <- "lmerMod"