存储在列表中的一系列模型上的anova

时间:2017-04-16 10:07:17

标签: r list for-loop anova

我正在运行一系列模型并将其存储在list

fm0 <- list()
for(i in 1:3){
  m <- formula(mpg ~ disp)
  if(i > 1)
    m <- update.formula(m, ~ . + gear)
  if(i > 2)
    m <- update.formula(m, ~ . + qsec)
  fm1 <- lm(m, data = mtcars)
  fm0[[i]] <- fm1
  names(fm0)[i] <- paste0("m",i)
}

我想在这样的模型序列上运行anova

anova(fm0$m1, fm0$m2, fm0$m3)
# Analysis of Variance Table
# 
# Model 1: mpg ~ disp
# Model 2: mpg ~ disp + gear
# Model 3: mpg ~ disp + gear + qsec
#   Res.Df    RSS Df Sum of Sq      F Pr(>F)
# 1     30 317.16                           
# 2     29 317.01  1    0.1443 0.0130 0.9099
# 3     28 309.83  1    7.1839 0.6492 0.4272

但我想要一些通用的东西,我不需要输入列表中的每个命名组件,因为模型的数量是变化的(取决于数据,这是在另一个循环中设置的,其中上面的循环位于其中)

我尝试lapply(fm0, anova),但它自己在每个模型上运行anova,这不是我所追求的。

1 个答案:

答案 0 :(得分:3)

这是一个绝对不优雅的解决方案:

eval(parse(text=paste("anova(",paste("fm0[[",1:length(fm0),"]]",sep="",collapse=","),")")))