[R] Formula in lm inside lapply
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.
Re: [R] Formula in lm inside lapply
try this: lapply(levels(df$group), function(x)lm(formula1, data=df[group==x,])) -- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40 S 49° 16' 22 O On 15/08/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. [[alternative HTML version deleted]] __ 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.
Re: [R] Formula in lm inside lapply
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.
Re: [R] Formula in lm inside lapply
try this: x = predict(z, Iris[-train, ]) 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) resf1 - lapply(levels(df$group),function(x) {formula1 - as.formula(y~x1); lm(formula1,df, subset =group ==x)}) # put the formula defn into function(x) resf1 [[1]] Call: lm(formula = formula1, data = df, subset = group == x) Coefficients: (Intercept) x1 0.8532 0.1189 [[2]] Call: lm(formula = formula1, data = df, subset = group == x) Coefficients: (Intercept) x1 0.7116 0.3398 HTH, Weiwei 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. -- Weiwei Shi, Ph.D Research Scientist GeneGO, Inc. Did you always know? No, I did not. But I believed... ---Matrix III __ 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.
Re: [R] Formula in lm inside lapply
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.