使用正确的标题查看许多变量的AIC

时间:2015-11-27 01:15:04

标签: r combinations lm

我在R中很新,我遇到了一个问题。 我已经找到了如何一次创建多个线性模型,我为每个lm创建了一个计算AIC的函数,但我无法使用将显示lm名称的标题显示此函数。我的意思是我想获得一个带有标题的数据框,例如lm(a~b+c, data=data)以及此lm的AIC结果。 这就是我已经写过的内容(当然还有stackoverflow的帮助)

vars <- c("azot_stand", "przeplyw", "pH", "twardosc", "fosf_stand", "jon_stand", "tlen_stand", "BZO_stand", "spadek_stand")  
N <- list(1,2,3,4,5,6,7,8)  
COMB <- sapply(N, function(m) combn(x=vars[1:8], m))  
COMB2 <- list()  
k=0  
for(i in seq(COMB)){  
  tmp <- COMB[[i]]  
  for(j in seq(ncol(tmp))){  
    k <- k + 1  
    COMB2[[k]] <- formula(paste("azot_stand", "~", paste(tmp[,j], collapse=" + ")))  
  }  
}  
res <- vector(mode="list", length(COMB2))  
for(i in seq(COMB2)){  
  res[[i]] <- lm(COMB2[[i]], data=s)  
}  

aic <- vector(mode="list", length(COMB2))  
d=0  
for(i in seq(res)){  
  aic[[i]] <- AIC(res[[i]])  
}  

View(aic)       
show(COMB2)

我想我错过aic中的某些内容,但不知道是什么......

1 个答案:

答案 0 :(得分:1)

使用formula,您可以获得回归模型的公式。由于您希望使用AIC存储公式,因此我将创建一个包含以下内容的data.frame

aic <- data.frame(model = character(length(res)), aic = numeric(length(res)), 
  stringsAsFactors = FALSE)
for(i in seq(res)){  
  aic$model[i] <- deparse(formula(res[[i]]), width.cutoff = 500)
  aic$aic[i] <- AIC(res[[i]])  
}  

通常您会使用format将公式转换为字符。但是,对于长公式,这会导致多行。因此,我使用deparse(也由format使用)并将width.cutoff参数传递给它。

您无法使用res[[i]]$call,因为它始终等于lm(formula = COMB2[[i]], data = s)

其他建议

您的代码的第一部分可以简化。我会写一些类似的东西:

s <- attitude
vars <- names(attitude)[-1]
yvar <- names(attitude)[1]

models <- character(0)
for (i in seq_along(vars)) {
  comb <- combn(vars, i)
  models <- c(models, 
    paste(yvar, " ~ ", apply(comb, 2, paste, collapse=" + ")))
}

res <- lapply(models, function(m) lm(as.formula(m), data = s))

它更短,并且还具有以下优点:8azot_stand之类的神奇常数在主代码之外定义,并且可以轻松修改。

我还注意到您使用azot_stand作为目标变量和predictor(它也是vars的一部分)。我不认为你会这样做。