4

リストにいくつかのモデルが保存されているとしましょう:

mods <- list()
mods[[1]] <- lm(mpg ~ disp, data = mtcars)
mods[[2]] <- lm(mpg ~ disp + factor(cyl), data = mtcars)
mods[[3]] <- lm(mpg ~ disp * factor(cyl), data = mtcars)

を使って比較したいと思いますstats::AIC。から得られる出力を探していますがAIC(mods[[1]], mods[[2]], mods[[3]])、任意の長いリストに一般化したいと考えています。と思いました

do.call(AIC, mods)

動作しますが、非常に冗長で役に立たないものを返します。object(リストに名前が付けられている場合、名前の 1 つがの最初の引数に対応するでない限り、エラーが発生しますAICが、詳細な出力が再び得られます。)

の失敗後、解決策do.callを考え始めeval(parse())ましたが、まずはここで質問する必要があると考えました。

4

2 に答える 2

4
summary(do.call(AIC, mods))
       df         AIC       
 Min.   :3   Min.   :153.4  
 1st Qu.:4   1st Qu.:159.6  
 Median :5   Median :165.8  
 Mean   :5   Mean   :163.1  
 3rd Qu.:6   3rd Qu.:168.0  
 Max.   :7   Max.   :170.2  

しかし、これはおそらくあなたが望むものではありません。バティストの答えは次のとおりです。

my.aic <- function(x) {
  x <- do.call(AIC, x)
  rownames(x) <- NULL
  return(x)
}
my.aic(mods)
##   df      AIC
## 1  3 170.2094
## 2  5 165.7680
## 3  7 153.4352

これはかなり近いです:

AIC(mods[[1]], mods[[2]], mods[[3]])
##           df      AIC
## mods[[1]]  3 170.2094
## mods[[2]]  5 165.7680
## mods[[3]]  7 153.4352
于 2013-05-19T02:10:30.027 に答える
2

を使用した解決策を次に示しeval(parse())ます。幸いなことに、私がこれを入力する前に、マシューはより良い答えを出してくれました。

AIC_l <- function(L, FUN = "AIC") {
    args <- paste0("mods[[", seq_along(L), "]]", collapse = ", ")
    my_call <- paste0(FUN, "(", args, ")")
    eval(parse(text = my_call))
}
AIC_l(L = 1:3, FUN = "AIC")
于 2013-05-19T02:14:00.853 に答える