vglm:如何在模型中循环变量字符串?

时间:2014-12-01 20:33:21

标签: r loops glm logistic-regression

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”等。

提前致谢

1 个答案:

答案 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"))