所以我試圖比較不同的線性模型,以確定一個是否比另一個好。不過,我有幾個模型,所以我想創建一個模型列表,然後調用它們。那可能嗎?創建並從列表中調用線性模型
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])
謝謝你的幫忙!
所以我試圖比較不同的線性模型,以確定一個是否比另一個好。不過,我有幾個模型,所以我想創建一個模型列表,然後調用它們。那可能嗎?創建並從列表中調用線性模型
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])
謝謝你的幫忙!
您可以使用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
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]])
這爲我工作。
如果你的模型兩個列表,你要比較每對車型,那麼你要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
找到更多關於它們的信息 [This](http://stackoverflow.com/questions/18067519/using-r-to-do-a-regression-與木ltiple-dependent-and-multiple-independent-vari/18069211#18069211)可能會有所幫助。 – Metrics
使用'anova(Models2 [[1]],Models [[1]])工作嗎? – dayne
請注意,'anova'對於嵌套模型非常有用。 – Roland