R logisti c коэффициенты извлечения регрессии в al oop: ошибка при настройке цикла - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь построить логистическую модель c регрессии с 3 предикторами, и у меня есть список идентификаторов для каждого предиктора, как показано ниже. (на примере набора данных mtcars)

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

Я хочу построить несколько регрессионных моделей с каждым из этих идентификаторов. 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))
})

(+ Edit: 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

Это дает следующую ошибку: «объект тип "закрытие" не является подмножеством ".

Я искал другие сообщения 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))
})

Но это дало другую ошибку:« Ошибка в строке [1] + row [2]: нечисловой c аргумент двоичного оператора ". Что вызывает эти ошибки в моем коде?

1 Ответ

0 голосов
/ 29 мая 2020

Я решил это, используя 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)
})
...