我有一个数据框,我想从其他变量中预测所有变量,所以我构建了一个像这样的循环:
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的理想行为。
问题是:我想念什么吗?有什么原因使此功能具有如此令人不适的行为?如果以前的问题的答案为“否”,是否应该加以改善?
这似乎是预料之中的,并且与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])
}
它不包括名称,但是该代码不使用任何名称。