0
votes

I want to get regression coefficients and fit statistics from one dependent regressed on all combinations of two other independent factors.

What I have is data like this (Note the NA):

H<-data.frame(replicate(10,sample(0:20,10,rep=TRUE))) 
H[2,3]<-NA
names(H)<-c("dep",letters[1:9])

So I want to regress "ind" on all these combinations using lm.

apply(combn(names(H)[2:9],2), MARGIN=2, FUN=paste, collapse="*")

"axb" "axc" "axd" "axe" "axf" "axg" ... etc.

One at a time, I could get what I want like:

ab<-data.frame(ind="a*b",cbind(data.frame(glance(lm(data=H,dep~a*b))),
t(data.frame(unlist((lm(data=H,dep~a*b)[1]))))
))
names(ab)[13:16]<-c("int","coef1","coef2","coefby")
ac<-data.frame(ind="a*c",cbind(data.frame(glance(lm(data=H,dep~a*c))),
                              t(data.frame(unlist((lm(data=H,dep~a*c)[1]))))
))
names(ac)[13:16]<-c("int","coef1","coef2","coefby")
rbind(ab,ac)

What I want is either all these coefficients and statistics, or at least the model coefficients and r.squared.

Someone already showed how to almost the exact same thing using combn. But when I tried a modification of this using glance instead of coefs

  fun <- function(x) glance(lm(dep~paste(x, collapse="*"), data=H))[[1]][1]
combn(names(H[2:10]), 2, fun)

I get an error. I thought maybe I needed to try "dep" repeated 36 times, one for each 2 factor combination, but that didn't do it.

     Error in model.frame.default(formula = dep ~ paste(x, collapse = "*"),  : 
  variable lengths differ (found for 'paste(x, collapse = "*")') 

How do I get either one coefficient at a time or all of them, for all possible dep~x*y multiple regression combination (with "dep" always being my y dependent variable)? Thanks!

1
I'm not sure where you got that code, using paste inside a formula won't work and I don't see that being done anywhere on the page you link. You need to build the full formula as a string. Try something like formula = as.formula(paste("dep ~", paste(x, collapse = "*"))). And please show the code you are using to call that function it it still doesn't work. You may also be interested in the leaps package if you just want the "best" model, not every model.Gregor Thomas
That works, thanks! And I'll check out leaps tooCrunchyTopping

1 Answers

1
votes

Posting as an answer since apparently it worked:

I'm not sure where you got the code dep~paste(x, collapse="*"), using paste inside a formula won't work and I don't see that being done anywhere on the page you link. You need to build the full formula as a string. Try something like this:

formula = as.formula(paste("dep ~", paste(x, collapse = "*")))

Next time, please show the code you are using to call the function, not just the function itself.

You may also be interested in the leaps package if you just want the "best" model, not every model. ("Best" in quotes because this is a terrible way to do model selection in general, violating all sorts of statistical assumptions for multiple comparisons and the like. Check out the LASSO instead for a better way.)