R逻辑回归循环抽取系数:建立循环时出错

问题描述 投票:1回答:1

我正在尝试建立具有3个预测变量的逻辑回归模型,并且我为每个预测变量都有一个ID列表,如下所示。 (以mtcars数据集为例)

var1 <- c("mpg", "cyl", "disp")
var2 <- c("mpg", "hp", "wt")
var3 <- c("drat", "wt", "gear", "carb")

我想使用每个使用的ID建立多个回归模型。 am是我要预测的固定变量,因此我的每个模型都将如下所示:

mod1 <- glm(am ~ mpg + mpg + drat, data=mtcars, ...)
mod2 <- glm(am ~ mpg + mpg + wt, data=mtcars, ...)
mod3 <- glm(am ~ mpg + mpg + gear, data=mtcars, ...)
...
mod5 <- glm(am ~ mpg + hp + drat, data=mtcars, ...)
...
mod9 <- glm(am ~ mpg + wt + drat, data=mtcars, ...)
...
mod36 <- glm(am ~ disp + wt + carb, data=mtcars, ...)

因此,在这种情况下,总共为3 * 3 * 4 = 36个模型。我正尝试使用如下所示的apply

coefs_mat <- expand.grid(var1, var2, var3)
mods = apply(coefs_mat, 1, function(row) {
    glm(as.formula(am ~ row[1] + row[2] + row[3]), data = mtcars, 
family = "binomial",control=list(maxit=20))
})

(+编辑:coefs_mat如下所示:

>coefs_mat
  var1    var2    var3
1 mpg     mpg     drat
2 cyl     mpg     drat
3 disp    mpg     drat
4 mpg     hp      drat
...
36 disp   wt      carb

这将出现以下错误:“'closure'类型的对象不可子集化”。

我搜索了具有类似问题的其他Stackoverflow帖子,并尝试了此操作:

mods = apply(coefs_mat, 1, function(row) {
  glm(as.formula(paste("am~", row[1] + row[2] + row[3])), data = mtcars, 
family = "binomial",control=list(maxit=20))
})

但是这产生了另一个错误:“ row [1] + row [2]中的错误:二进制运算符的非数字参数”。是什么导致我的代码出现这些错误?

r regression apply
1个回答
0
投票

我使用sprintf解决了这个问题。

var1 <- c("mpg", "cyl", "disp")
var2 <- c("mpg", "hp", "wt")
var3 <- c("drat", "wt", "gear", "carb")
coefs_mat <- expand.grid(var1, var2, var3)
vars_comb <- apply(coefs_mat, 1, function(x){paste(sort(x), collapse = '+')})
formula_vec <- sprintf("am ~ %s", vars_comb)

glm_res <- lapply(formula_vec, function(x)   {
  fit1 <- glm(x, data = mtcars, family = binomial("logit"))
  return(fit1)
})
© www.soinside.com 2019 - 2024. All rights reserved.