我有一个数据框,我想从其他变量中预测所有变量,因此我构建了一个像这样的循环:
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的理想行为。
问题是:我错过了什么吗?此功能有这种令人不适的行为吗?如果以前的问题的答案为“否”,是否应该加以改善?
答案 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...