2013-08-07 22 views
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]) 

謝謝你的幫忙!

+0

找到更多關於它們的信息 [This](http://stackoverflow.com/questions/18067519/using-r-to-do-a-regression-與木ltiple-dependent-and-multiple-independent-vari/18069211#18069211)可能會有所幫助。 – Metrics

+2

使用'anova(Models2 [[1]],Models [[1]])工作嗎? – dayne

+0

請注意,'anova'對於嵌套模型非常有用。 – Roland

回答

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   
+0

'do.call(anova,Models)'似乎工作得很好。 – Roland

+0

@Roland你是對的。不知道爲什麼! –

+0

我也很驚訝。尤其是,因爲它不能像'AIC'那樣工作。 – Roland

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

這爲我工作。

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) 

這基本上等同於循環如下:

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

地圖是一個功能的例子,你可以在https://github.com/hadley/devtools/wiki/Functionals