Jen
Jen

Reputation: 355

R logistic regression extracting coefficients in a loop: error with setting up loop

I'm trying to build a logistic regression model with 3 predictors, and I have a list of IDs for each predictor like below. (using mtcars dataset as an example)

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

I want to build multiple regression models with each of these IDs used. am is a fixed variable that I want to predict, so each of my model would look like:

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, ...)

So in this case it would be 3*3*4 = 36 models total. I'm trying to use apply like below.

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 looks like below:

>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

This gives the following error: "object of type 'closure' is not subsettable".

I searched for other Stackoverflow posts that had similar problems, and tried this instead:

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))
})

But this gave another error: "Error in row[1] + row[2] : non-numeric argument to binary operator". What's causing these errors in my code?

Upvotes: 1

Views: 96

Answers (1)

Jen
Jen

Reputation: 355

I solved this by using 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)
})

Upvotes: 0

Related Questions