我在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
中的某些内容,但不知道是什么......
答案 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))
它更短,并且还具有以下优点:8
和azot_stand
之类的神奇常数在主代码之外定义,并且可以轻松修改。
我还注意到您使用azot_stand
作为目标变量和predictor
(它也是vars
的一部分)。我不认为你会这样做。