我经常通过将我需要的部分粘贴在一起来为诸如lmlme之类的模型拟合函数指定公式参数,就像@DWin对这个问题的回答:Understanding lm and environment一样。

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

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"))

但是,使用lme包中的nlme时,无法比较使用anova构造的两个模型,因为anova.lme会查看保存的公式参数以确保模型适合相同的响应,并且保存的公式参数很简单as.formula(f)。错误是:
> anova(m1, m2)
Error in inherits(object, "formula") : object 'f' not found

这是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

有什么建议么?

最佳答案

Ben的答案有效,但是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"))
}

之所以起作用,是因为(默认情况下)args =中的参数在传递给lme之前已求值。

关于r - 在使用粘贴的公式创建的LME拟合上,方差分析测试失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7666807/

10-10 12:30