从列表中创建和调用线性模型

3

我想比较不同的线性模型,以确定哪个更好。但是我有多个模型,所以我想创建一个模型列表,然后调用它们。这可能吗?

 Models <- list(lm(y~a),lm(y~b),lm(y~c)
 Models2 <- list(lm(y~a+b),lm(y~a+c),lm(y~b+c))

 anova(Models2[1],Models[1])

感谢您的帮助!

这可能会有所帮助:[链接](https://dev59.com/vXXYa4cB1Zd3GeqP41KM#18069211) 。 - Metrics
2
使用 anova(Models2[[1]],Models[[1]]) 有效吗? - dayne
请注意,anova 对于嵌套模型最为有用。 - Roland
3个回答

6

如果您有两个模型列表,想要比较每对模型,则需要使用Map:

models1 <- list(lm(y ~ a), lm(y ~ b), lm(y ~ c)
models2 <- list(lm(y ~ a + b), lm(y ~ a + c), lm(y ~ b + c))

Map(anova, models1, models2)

这基本上相当于以下for循环:

out <- vector("list", length(models1))
for (i in seq_along(out) {
  out[[i]] <- anova(models1[[i]], models2[[i]])
}

Map是函数式编程的一个例子,你可以在https://github.com/hadley/devtools/wiki/Functionals了解更多相关信息。


4
您可以使用do.call将任意长度的列表转换为适用于接受...的函数的调用。唯一的技巧是,anova希望第一个模型有名称--这就是Curry通过创建一个已经指定了其第一个参数的新函数来处理的内容。
将除第一个模型(称为lm1)之外的所有内容放入名为Models的列表中。
然后:
library(functional)
do.call( Curry(anova, object=lm1), Models )

例子:

> Models <- list( lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)) )
> lm1 <- lm(runif(10)~rnorm(10))
> do.call( Curry(anova, object=lm1), Models )
Analysis of Variance Table

Model 1: runif(10) ~ rnorm(10)
Model 2: runif(10) ~ rnorm(10)
Model 3: runif(10) ~ rnorm(10)
Model 4: runif(10) ~ rnorm(10)
  Res.Df     RSS Df Sum of Sq F Pr(>F)
1      8 0.46614                      
2      8 0.59522  0  -0.12908         
3      8 1.00869  0  -0.41346         
4      8 0.81686  0   0.19182         

我也感到惊讶。特别是因为 AIC 的工作方式并非如此。 - Roland
追问以找到问题根源:https://dev59.com/bnXYa4cB1Zd3GeqP52hw - Ari B. Friedman
@Roland 请查看此处的类似问题,其中包含 AIC。链接为:https://dev59.com/pHLYa4cB1Zd3GeqPVkfg - Gregor Thomas

1
x <- rnorm(100,0,1)
y <- rnorm(100,5,2)
z <- rnorm(100,8,1)    
models <- list(y.x = lm(y~x), y.z = lm(y~z))
anova(models[[1]],models[[2]])

这对我有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接