[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