Skip to content

creating a formula on-the-fly inside a function

4 messages · Dr Carbon, Marc Schwartz, Gabor Grothendieck +1 more

#
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)

Many thanks....
DrC
_              
platform i386-pc-mingw32
arch     i386           
os       mingw32        
system   i386, mingw32  
status                  
major    2              
minor    0.1            
year     2004           
month    11             
day      15             
language R
#
On Thu, 2005-03-03 at 10:28 -0500, Dr Carbon wrote:
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:
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
#
Dr Carbon <drcarbon <at> gmail.com> writes:

: 
: 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...
: }


The following allows any number of predictors:

 f <- function(y, ...) summary(lm(y ~., data.frame(y = y, ...)))$r.squared

Another possibility is to just pass the formula itself:

 f <- function(fo) summary(lm(fo))$r.squared
#
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