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 <[EMAIL PROTECTED]> 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) <[EMAIL PROTECTED]> 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@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. > > > ______________________________________________ R-help@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.