I needed to run variations of the same regression model: the same explanatory variables with multiple dependent variables. In R, we can do this with a simple `for()`

loop and `assign()`

.

First I specify the dependent variables:

`dv <- c("dv1", "dv2", "dv3")`

Then I create a for() loop to cycle through the different dependent variables:

`for(i in 1:length(dv)){`

Within this loop, I need to create an object to hold the models. I need a separate object for each model, so I create one with `paste()`

. For the first dependent variable, this will be `model1`

; for the second dependent variable `model2`

, and so on.

`model <- paste("model",i, sep="")`

With this object to hold the model in place, I can run the model: the i^{th} dependent variable is used. It is stored in an object called `m`

.

`m <- lm(as.formula(paste(dv[i],"~ ev1 + ev2")), data=mydata)`

Now, I assign the model `m`

to the `model`

object created above: model1 for the first dependent variable, etc. That’s also the end of the `for()`

loop.

`assign(model,m)}`

We can now look at the results:

`summary(model1); summary(model2); summary(model3)`

or, more practical to compare models:

`library(memisc)`

mtable(model1, model2, model3)

### Like this:

Like Loading...

*Related*

It’s great! Thank you

Your loop is great! Thank you.

I only have a question, if i want proob the combination between n dependent variables with m independent variables, how i can write the loop?

The approach using assign() described here should also work, just nest two for() loops. So you’d loop over say j (like for(j in 1:length(ev)){), and then have something like ev <- c("~ ev1 + ev2", "~ ev1 + ev2 + ev3", "~ ev2 + ev3") earlier on to define the explanatory variables. The line with the actual assignment may then be something like m <- lm(as.formula(paste(dv[i],ev[j])), data=mydata). In this example we'd have 9 models.

Thank you, this was very helpful. If I wanted to put the regression output from all models into a data frame (e.g. with the coefficient, standard error and p-value), how would I go about doing this?

I’m not sure why you’d want to have the output in a data.frame, but you’d have to create the data.frame bit by bit. Perhaps the easiest would be to change what you put into “m”; in the code above we put the model, but you can of course only but part of the model output. Check out the structure of the output by using str(m). For instance, in an OLS, you can access the coefficients using m$coefficients. Alternatively, modify the information in mtable or stargazer.

Here’s an alternative that supports more model types:

library(startgazer)

stargazer(model1, model2, model3, type=”text”)