R线性模型函数(lm)不会从预测变量中排除预测变量

时间:2020-01-12 15:42:02

标签: r lm

我有一个数据框,我想从其他变量中预测所有变量,因此我构建了一个像这样的循环:

df = iris
df$Species <- NULL

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] <- lm(df[, i] ~ ., df)
}

但是,令我惊讶的是,每个变量都是它自己的预测变量。即使我这样做:

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] = lm(df[, i] ~ . - df[, i], df)
}

发生同样的事情。

我知道我可以使用正确的名称在侧面创建正确的公式表达式,以此类推,但是我觉得这不是lm的理想行为。

问题是:我错过了什么吗?此功能有这种令人不适的行为吗?如果以前的问题的答案为“否”,是否应该加以改善?

2 个答案:

答案 0 :(得分:2)

这似乎是预料之中的,并且与R对我的运作方式非常一致。您要将df传递到data参数中,但随后在公式中引用了不同的df(这是相同的,但此时对象引用不同。

在第一个示例中,您的y变量不是来自data的变量,而是来自其他df的变量。因此,因此没有data列,而.返回了全部。

在第二个示例中,您说要包含data中的所有变量,但要排除其他数据框df中的列。因此,它从df中排除了该列,但仍保留了data中的所有列。

我认为这是您所期望的:

mods = list()
for (i in 1:ncol(df)) {
  mods[[i]] = lm(df[, i] ~ ., df[, -i])
}

答案 1 :(得分:2)

它不包含名称,但是该代码不使用任何名称。

df = iris
df$Species <- NULL

LM <- function(nm) {
  fo <- paste(nm, "~.")
  do.call("lm", list(fo, quote(df)))
}
Map(LM, names(df))

给出这4个元素列表(仅第一个显示):

$Sepal.Length

Call:
lm(formula = "Sepal.Length ~.", data = df)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      1.8560        0.6508        0.7091       -0.5565  

## ..snip...