如何简洁地从数据框中写出一个包含多个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
因为x1
和x2
已经在公式中。
稍微不同的方法是从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