# [R] lm with an arbitrary number of terms

Richard Nixon richard.nixon at mrc-bsu.cam.ac.uk
Thu Apr 3 12:04:36 CEST 2003

```Thanks to James Holtman, Matt Wiener, Douglas Bates, Spencer Graves, John Fox,
Roger Peng, Bill Venable, Darryl Greig, Vadim Ogranovich and Peter Dalgaard

There are several ways to tackel this problem, and one easy one which I missed
:-)

----------------------------------------------------------------------
Question
data.frame is a data frame with column names "x1",...,"xn"
y is a response variable of length dim(data.frame)

I want to write a function

function(y, data.frame){
lm(y~x1+...+xn)
}

This would be easy if n was always the same.
If n is arbitrary how could I feed the x1+...+xn terms into
lm(response~terms)?

----------------------------------------------------------------------
y <- c(67,76,56,48,10,43,12,33,88,63,75,14,58,19,14)
x1 <- as.factor(c(2,2,2,2,2,1,1,1,1,1,1,1,1,1,1))
x2 <- c(25,40,35,34,51,24,37,31,26,21,41,45,24,26,29)

data<-data.frame(x1,x2)
----------------------------------------------------------------------
1) James Holtman

fun <- function(y, data.frame){
.vars <- paste(names(data.frame), collapse="+")
eval(parse(text=paste('lm(y~',.vars,',data.frame)')))
}

fun(y,data)

Call:
lm(formula = y ~ x1 + x2, data = data.frame)

Coefficients:
(Intercept)          x12           x2
84.565       18.763       -1.403
----------------------------------------------------------------------
2) Matt Wiener

fun <- function(y, data.frame){
lm(y ~ ., data = data.frame)
}

fun(y,data)

Call:
lm(formula = y ~ ., data = data.frame)

Coefficients:
(Intercept)          x12           x2
84.565       18.763       -1.403

----------------------------------------------------------------------
3) Matt Wiener

fun <- function(y, data.frame){
.vars <- paste(names(data.frame), collapse="+")
lm(as.formula(paste('y~',.vars)),data.frame)
}

fun(y,data)

Call:
lm(formula = as.formula(paste("y~", .vars)), data = data.frame)

Coefficients:
(Intercept)          x12           x2
84.565       18.763       -1.403

----------------------------------------------------------------------
Douglas Bates: same as (2)
Spencer Graves: similar to (3)
John Fox: mixture of (2) and (3)
Roger Peng: similar to (3)
Bill Venable: same as (2)
Darryl Greig: simmilar to (3)

Peter Dalgaard
n <- names(my.data.frame)
f <- as.symbol(n)
for (i in 2:length(n))
f <- substitute(f+a,list(a=as.symbol(n[i]))
f <- substitute(y~f)
(I didn't try it. Most likely it doesn't quite work.)
Neither did I - Richard ;)

--
Dr. Richard Nixon
MRC Biostatistics Unit, Cambridge, UK
http://www.mrc-bsu.cam.ac.uk/personal/richard
Tel: +44 (0)1223 330382, Fax: +44 (0)1223 33038

```