使用粘贴公式创建的lme拟合无法进行anova测试

Aar*_*ica 8 r

我经常指定公式参数来模拟拟合函数,lm或者lme将我需要的部分粘贴在一起,就像@DWin对这个问题的回答一样:理解lm和环境.

在实践中,这看起来像这样:

library(nlme)
set.seed(5)
ns <- 5; ni <- 5; N <- ns*ni
d <- data.frame(y=rnorm(N),
                x1=rnorm(N),
                x2=factor(rep(1:ni, each=ns)),
                id=factor(rep(1:ns, ni)))

getm <- function(xs) {
  f <- paste("y ~", paste(xs, collapse="+"))
  lme(as.formula(f), random=~1|id, data=d, method="ML")
}
m1 <- getm("x1")
m2 <- getm(c("x1", "x2"))
Run Code Online (Sandbox Code Playgroud)

但是,lmenlme包中,比较使用方式构造的两个模型anova不起作用,因为anova.lme查看保存的公式参数以确保模型适合相同的响应,并且保存的公式参数很简单as.formula(f).错误是:

> anova(m1, m2)
Error in inherits(object, "formula") : object 'f' not found
Run Code Online (Sandbox Code Playgroud)

这是anova命令应该做的(重新安装模型以使其工作):

> m1 <- lme(y~x1, random=~1|id, data=d, method="ML")
> m2 <- lme(y~x1+x2, random=~1|id, data=d, method="ML")
> anova(m1, m2)
   Model df      AIC      BIC    logLik   Test  L.Ratio p-value
m1     1  4 76.83117 81.70667 -34.41558                        
m2     2  8 72.69195 82.44295 -28.34597 1 vs 2 12.13922  0.0163
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Jos*_*ien 13

本的答案有效,但do.call提供了他希望的更一般的解决方案.

getm <- function(xs) {
    f <- as.formula(paste("y ~", paste(xs, collapse="+")))
    do.call("lme", args = list(f, random=~1|id, data=d, method="ML"))
}
Run Code Online (Sandbox Code Playgroud)

它起作用是因为(默认情况下)参数in args =在被传递给lme之前被计算.

  • 是的,但是......(这不是OP提出的问题)......我真的很好奇`lme`(或其他一些独立的函数)应该如何表现,以便它可以使用具有的公式在其他(不再可直接访问)的环境中构建 (4认同)
  • 使用`data = as.name("d")`而不是`data = d`将把调用存储为`data = d`,而不是存储数据帧的表示; 这对于对象大小和使用`update`重用都很有用. (2认同)