gra*_*tur 113 r dataframe lm glm
假设我有一个响应变量和一个包含三个协变量的数据(作为玩具示例):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Run Code Online (Sandbox Code Playgroud)
我想对数据进行线性回归:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
Run Code Online (Sandbox Code Playgroud)
有没有办法编写公式,这样我就不必写出每个协变量?例如,像
fit = lm(y ~ d)
Run Code Online (Sandbox Code Playgroud)
(我希望数据框中的每个变量都是协变量.)我问,因为我的数据框中实际上有50个变量,所以我想避免写出来x1 + x2 + x3 + etc.
Rei*_*son 188
有一个特殊的标识符可以在公式中用来表示所有变量,它是.标识符.
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)
Run Code Online (Sandbox Code Playgroud)
你也可以这样做,使用所有变量吧一:
mod <- lm(y ~ . - x3, data = d)
Run Code Online (Sandbox Code Playgroud)
从技术上讲,.是指所有的变量不是公式中已经提到.例如
lm(y ~ x1 * x2 + ., data = d)
Run Code Online (Sandbox Code Playgroud)
其中.只引用x3作为x1与x2已在公式中.
jub*_*uba 61
稍微不同的方法是从字符串创建公式.在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= "+")))
Run Code Online (Sandbox Code Playgroud)
然后,如果你看看生成的公式,你会得到:
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
Run Code Online (Sandbox Code Playgroud)
是的,当然,只需将响应添加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
Run Code Online (Sandbox Code Playgroud)
另外,我关于R的信息指出<-推荐的作业是推荐的=.
juba 方法的一个扩展是使用reformulate,这是一个为此类任务明确设计的函数。
## 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
Run Code Online (Sandbox Code Playgroud)
对于 OP 中的示例,这里最简单的解决方案是
# add y variable to data.frame d
d <- cbind(y, d)
reformulate(names(d)[-1], names(d[1]))
y ~ x1 + x2 + x3
Run Code Online (Sandbox Code Playgroud)
或者
mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d)
Run Code Online (Sandbox Code Playgroud)
请注意,d <- cbind(y, d)首选将因变量添加到 data.frame 中,不仅因为它允许使用reformulate,还因为它允许将来lm在诸如predict.