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

R linear model function (lm) doesn't exclude predicted variable from predictors

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

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 所期望的行为。

问题是:我错过了什么吗?这个函数有如此不舒服的行为是有原因的吗?万一前面问题的答案是"no",难道不应该改进一下吗?

这似乎是预料之中的,并且非常符合我对 R 的操作方式。您将 df 传递给 data 参数,但随后在您的公式中引用了不同的 df (它是同一个,但此时是不同的对象引用。

在您的第一个示例中,您的 y 变量不是来自 data,而是来自另一个 df。因此,因此没有 data 列和 . returns 全部。

在你的第二个例子中,你说要包括来自 data 的所有变量,但要排除来自其他数据框 df 的列。因此它从 df 中排除了该列,但仍然保留了 data.

中的所有列

我认为这就是您所期待的:

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

它排除了名称,但该代码不使用任何名称。

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...