Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use lapply for multiple regression with formula changing, not the dataset

I have seen an example of list apply (lapply) that works nicely to take a list of data objects, and return a list of regression output, which we can pass to Stargazer for nicely formatted output. Using stargazer with a list of lm objects created by lapply-ing over a split data.frame

library(MASS)
library(stargazer)
data(Boston)

by.river <- split(Boston, Boston$chas)
class(by.river)

fit <- lapply(by.river, function(dd)lm(crim ~ indus,data=dd))
stargazer(fit, type = "text")

What i would like to do is, instead of passing a list of datasets to do the same regression on each data set (as above), pass a list of independent variables to do different regressions on the same data set. In long hand it would look like this:

fit2 <- vector(mode = "list", length = 2)
fit2[[1]] <- lm(nox ~ indus, data = Boston)
fit2[[2]] <- lm(crim ~ indus, data = Boston)
stargazer(fit2, type = "text")

with lapply, i tried this and it doesn't work. Where did I go wrong?

myvarc <- c("nox","crim")
class(myvarc)
myvars <- as.list(myvarc)
class(myvars)
fit <- lapply(myvars, function(dvar)lm(dvar ~ indus,data=Boston))
stargazer(fit, type = "text")
like image 385
Mark Neal Avatar asked Dec 15 '22 00:12

Mark Neal


1 Answers

Consider creating dynamic formulas from string:

fit <- lapply(myvars, function(dvar)
    lm(as.formula(paste0(dvar, " ~ indus")),data=Boston))
like image 191
Parfait Avatar answered Jan 22 '23 20:01

Parfait