如何在R中编写具有100个变量的线性模型公式


22

R中有一种简单的方法可以在R中具有100个参数的模型上创建线性回归吗?假设我们有一个具有10个值的向量Y和一个具有10列100行的数据框X以数学符号表示Y = X[[1]] + X[[2]] + ... + X[[100]]。如何用R语法写类似的东西?


1
有100或1000?同样,通常您会将列作为变量,将行作为观察值(在这里似乎是相反的)
Macro

100额外的0是错字
基督教徒

2
真?你确定你要这么做吗?我会担心预测变量的线性组合之间的过度拟合和相关性。不仅如此,如果有100个预测变量,但只有10个观察值,则而线性回归根本不起作用。p>n
亚伦-恢复莫妮卡

Answers:


29

尝试这个

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)

4
并且,如果您想进行所有二阶相互作用,则可以编写y ~ . + .^2。等等。
Lutz Prechelt 2015年

3
而且,如果您只需要某些二阶交互,则类似y ~ . + .:x1会为您提供每个变量(除外x1)与的交互x1。等等; 你明白了。
Lutz Prechelt 2015年

21

好答案!

我想补充一点,在默认情况下,调用formuladata.frame创建的添加剂配方,第一列回归到别人。

因此,在@ danas.zuokas的答案中,您甚至可以

lm(df)

解释正确。


不过,如果您想混合使用互动方式,此答案仍然无效。您的(+1)。
gui11aume12年

6
我对大多数R运算符的超载感到惊讶:)
Macro

19

如果每一行都是一个观测值,每一列都是一个预测变量,那么是一个长度向量,是一个矩阵(在这种情况下,),则可以使用n X n × p p = 100YnXn×pp=100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

如果您不想将其他列包含为预测变量,则必须X在使用此技巧或-在模型公式中使用它们排除之前将其从中删除。例如,如果您想排除第67个预测变量(具有相应的名称x67),则可以编写

lm(Y ~ .-x67,data=Z)

另外,如果要包括交互等,则需要手动将其添加为(例如)

lm(Y ~ .+X[,1]*X[,2],data=Z)

或确保将其作为的列输入X


19

您也可以结合使用formulapaste功能。

设置数据:假设我们有一个data.frame,其中包含x1to 的预测变量x100和我们的因变量y,但是还包含一个讨厌的变量asdfasdf。而且,预测变量的排列顺序应使它们在data.frame中不连续。

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

还要想象一下,您有一个包含预测变量名称的字符串。在这种情况下,可以使用paste函数轻松创建grep此字符串,但是在其他情况下,或者可以使用某些其他方法来获取此字符串。

PredictorVariables <- paste("x", 1:100, sep="")

应用方法:然后我们可以构造一个公式,如下所示:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • collapse参数插入+预测变量之间
  • formula将字符串转换为适合该lm函数的类公式的对象。

更一般而言,当我要提供预测变量作为变量名称的向量时,我会非常定期地使用以下函数。

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

例如,

regression("y", PredictorVariables, Data)

2
+1。我一直在使用这种技术。但是,有时将公式存储在变量中会引起问题。请参阅stackoverflow.com/a/7668846/210673以获取do.call在调用之前对公式求值的用法lm
亚伦-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.