[R] creating a formula on-the-fly inside a function

Berton Gunter gunter.berton at gene.com
Thu Mar 3 17:41:07 CET 2005


If these are nested models, see ?drop.terms. 


-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
 
"The business of the statistician is to catalyze the scientific learning
process."  - George E. P. Box
 
 

> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Marc Schwartz
> Sent: Thursday, March 03, 2005 7:52 AM
> To: Dr Carbon
> Cc: r-help at r-project.org
> Subject: Re: [R] creating a formula on-the-fly inside a function
> 
> On Thu, 2005-03-03 at 10:28 -0500, Dr Carbon wrote:
> > I have a function that, among other things, runs a linear model and
> > returns r2. But, the number of predictor variables passed to the
> > function changes from 1 to 3. How can I change the formula 
> inside the
> > function depending on the number of variables passed in?
> > 
> > An example:
> > 
> > get.model.fit <- function(response.dat, pred1.dat, pred2.dat = NULL,
> > pred3.dat = NULL)
> > {
> >     res <- lm(response.dat ~ pred1.dat + pred2.dat + pred3.dat)
> >     summary(res)$r.squared
> >     # other stuff happens here...
> > }
> > 
> > y <- rnorm(10)
> > x1 <- y + runif(10)
> > x2 <- y + runif(10)
> > x3 <- y + runif(10)
> > get.model.fit(y, x1, x2, x3)
> > get.model.fit(y, x1, x2)
> > get.model.fit(y, x1)
> 
> 
> Consider using as.formula() to take a character vector that 
> you pass as
> an argument instead of specifying each IV separately:
> 
> get.model.fit <- function(my.form)
> {
>     res <- lm(as.formula(my.form))
>     summary(res)$r.squared
>     # other stuff happens here...
> }
> 
> 
> Then call it with:
> 
> get.model.fit("y ~ x1 + x2 + x3")
> 
> Internally, the vector will be converted to:
> 
> > as.formula("y ~ x1 + x2 + x3")
> y ~ x1 + x2 + x3
> 
> Doing it this way provides for greater flexibility if you 
> want to use a
> more complicated formula construct.
> 
> See ?as.formula for more information and further examples, 
> including the
> use of paste() if you want to separate the DV from the IVs for an
> additional approach for a long set of similarly named IV's 
> (ie x1:x25).
> 
> HTH,
> 
> Marc Schwartz
> 
> ______________________________________________
> 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
>




More information about the R-help mailing list