如何简洁地从数据框中写出一个包含多个variables的公式?

假设我有一个响应variables和一个包含三个协variables的数据(作为一个玩具的例子):

y = c(1,4,6) d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2)) 

我想对数据进行线性回归:

 fit = lm(y ~ d$x1 + d$x2 + d$y2) 

有没有办法来写公式,所以我不必写出每个个人的协variables? 例如,类似的东西

 fit = lm(y ~ d) 

(我希望数据框中的每个variables都是一个协variables)。我问,因为我的数据框中实际上有50个variables,所以我想避免写出x1 + x2 + x3 + etc

在公式中可以使用一个特殊的标识符来表示所有的variables,它是. 标识符。

 y <- c(1,4,6) d <- data.frame(y = y, x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2)) mod <- lm(y ~ ., data = d) 

你也可以做这样的事情,使用所有的variables吧一:

 mod <- lm(y ~ . - x3, data = d) 

从技术上讲, .公式中提及的所有variables 。 例如

 lm(y ~ x1 * x2 + ., data = d) 

哪里. 只会引用x3因为x1x2已经在公式中。

稍微不同的方法是从string中创build公式。 在formula帮助页面中,您将看到以下示例:

 ## Create a formula for a model with a large number of variables: xnam <- paste("x", 1:25, sep="") fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+"))) 

那么如果你看看生成的公式,你会得到:

 R> fmla y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 

是的,当然,只需在数据框中添加第一列的响应y并在其上调用lm()

 d2<-data.frame(y,d) > d2 y x1 x2 x3 1 1 4 3 4 2 4 -1 9 -4 3 6 3 8 -2 > lm(d2) Call: lm(formula = d2) Coefficients: (Intercept) x1 x2 x3 -5.6316 0.7895 1.1579 NA 

另外,我的关于R的信息指出,使用<-分配build议超过=

朱巴方法的延伸是使用reformulate ,这是一个明确的devise来完成这个任务的function。

 ## Create a formula for a model with a large number of variables: xnam <- paste("x", 1:25, sep="") reformulate(xnam, "y") y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 

对于OP中的例子,这里最简单的解决scheme就是

 # add y variable to data.frame d d <- cbind(y, d) reformulate(names(d)[-1], names(d[1])) y ~ x1 + x2 + x3 

要么

 mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d) 

请注意,将因variables添加到d <- cbind(y, d)是首选,这不仅因为它允许使用reformulate ,而且还因为它允许将未来在predict函数中使用lm对象。

您可以检查软件包的regsubsets() ,特别是用于模型select的函数regsubsets()函数。 正如文件中所述:

通过详尽search进行模型select,逐步前进或后退或顺序replace