[R] Formula in lm inside lapply

Gabor Grothendieck ggrothendieck at gmail.com
Wed Aug 15 19:21:50 CEST 2007


Here is another solution that gets around the non-standard
way that subset= is handled in lm.  It has the advantage that unlike
the previous solution where formula1 and group == x appear literally
in the output, in this one the formula appears written out and
group == "A" and group == "B" appear:

> lapply(levels(DF$group), function(x) do.call("lm",
+    list(formula1, quote(DF), subset = bquote(group == .(x)))))
[[1]]

Call:
lm(formula = y ~ x1, data = DF, subset = group == "A")

Coefficients:
(Intercept)           x1
    1.04855      0.04585


[[2]]

Call:
lm(formula = y ~ x1, data = DF, subset = group == "B")

Coefficients:
(Intercept)           x1
    1.13593     -0.01627


On 8/15/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> It can't find x since the environment of formula1 and of formula2 is the Global
> Environment and x is not there -- its local to the function.
>
> Try this:
>
> #generating data
> set.seed(1)
> DF <- data.frame(y = rnorm(100, 1), x1 = rnorm(100, 1), x2 = rnorm(100, 1),
>  group = rep(c("A", "B"), c(40, 60)))
>
> formula1 <- as.formula(y ~ x1)
> lapply(levels(DF$group), function(x) {
>   environment(formula1) <- environment()
>   lm(formula1, DF, subset = group == x)
> })
>
> formula2 <- as.formula(y ~ x1 + x2)
> lapply(levels(DF$group), function(x) {
>   environment(formula2) <- environment()
>   lm(formula2, DF, subset = group == x)
> })
>
>
>
> On 8/15/07, Li, Yan (IED) <Yan.Y.Li at morganstanley.com> wrote:
> > I am trying to run separate regressions for different groups of
> > observations using the lapply function. It works fine when I write the
> > formula inside the lm() function. But I would like to pass formulae into
> > lm(), so I can do multiple models more easily. I got an error message
> > when I tried to do that. Here is my sample code:
> >
> > #generating data
> > x1 <- rnorm(100,1)
> > x2 <- rnorm(100,1)
> > y  <- rnorm(100,1)
> > group <- rep(c("A","B"),c(40,60))
> > group <- factor(group)
> > df <- data.frame(y,x1,x2,group)
> >
> > #write formula inside lm--works fine
> > res1 <- lapply(levels(df$group), function(x) lm(y~x1,df, subset = group
> > ==x))
> > res1
> > res2 <- lapply(levels(df$group),function(x) lm(y~x1+x2,df, subset =
> > group ==x))
> > res2
> >
> > #try to pass formula into lm()--does not work
> > formula1 <- as.formula(y~x1)
> > formula2 <- as.formula(y~x1+x2)
> > resf1 <- lapply(levels(df$group),function(x) lm(formula1,df, subset =
> > group ==x))
> > resf1
> > resf2 <- lapply(levels(df$group),function(x) lm(formula2,df, subset =
> > group ==x))
> > Resf2
> >
> > The error message is
> > 'Error in eval(expr, envir, enclos): object "x" not found'
> >
> > Any help is greatly appreciated!
> >
> > Yan
> > --------------------------------------------------------
> >
> > This is not an offer (or solicitation of an offer) to buy/se...{{dropped}}
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
>



More information about the R-help mailing list