我found是一个方便的解决方案,用于编码循环调用vglm(),但仅使用单个变量:
R: varlist
[1] "X2" "X7" "X17" "X18" "X33"
models <- lapply(varlist, function(x) {
vglm(substitute(class ~ i, list(i = as.name(x))), data = train.data[c(-1)], family = multinomial())
})
由于我想用AIC执行变量选择,我运行以下
resAIC = lapply(models, AIC)
R: resAIC
[[1]]
[1] 11918.26
[[2]]
[1] 11917.55
[[3]]
[1] 11919.45
[[4]]
[1] 11926.03
[[5]]
[1] 11923.2
现在,对于下一个vglm调用,我必须更新AIC的变量列表,它现在是:
R: varlist
[1] "X18+X2" "X18+X7" "X18+X17" "X18+X33"
再次致电models <- lapply(varlist, function(x) { vglm(...)})
时出现以下错误。
Error in eval(expr, envir, enclos) : object 'X18+X2' not found
Called from: eval(expr, envir, enclos)
当分别调用vglm()时,我应该如何修改代码以便更通用并接受“X2”,“X18 + X2”,“X18 + X2 + X33”等。
提前致谢
答案 0 :(得分:0)
我可能会建议对data.frame的列进行子集化,而不是在构建带有加号的字符串时,而不是乱搞动态构建公式。
#SAMPLE DATA
train.data<-data.frame(class=sample(1:5, 50, replace=T),
matrix(runif(50*12), ncol=12))
library(VGAM)
varlist <- list("X2", c("X8","X2"), c("X8","X2","X11"))
models <- lapply(varlist, function(x) {
vglm(class ~ ., data = train.data[, c("class", x)], family = multinomial())
})
您可以使用
宣传AIC和条款sapply(models, AIC)
sapply(models, function(x) attr(terms(x), "term.labels"))