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

机器算法验证 r
2022-02-08 21:08:22

R中是否有一种简单的方法可以在R中具有100个参数的模型上创建线性回归?假设我们有一个包含 10 个值的向量 Y 和一个包含 10 列和 100 行的数据框 X 在数学符号中我会写Y = X[[1]] + X[[2]] + ... + X[[100]]如何在 R 语法中编写类似的内容?

4个回答

试试这个

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

很好的答案!

我会添加默认情况下,调用formulaadata.frame创建一个加法公式以将第一列回归到其他列。

因此,对于@danas.zuokas 的答案,您甚至可以这样做

lm(df)

这是正确解释的。

如果每一行是一个观察值,每一列是一个预测变量,那么Y是一个n-长度向量和X是一个n×p矩阵 (p=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.

您还可以使用formulapaste函数的组合。

设置数据:假设我们有一个 data.frame,其中包含预测变量x1x100我们的因变量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)