我试图仅对数据的一部分运行lm(),并遇到问题。
dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data
lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)
上面的方法不起作用,因为数据集现在只有人,因此我们不能在模型中包括性别变量x3。但...
lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great
这是公式中“减号”符号的问题吗?请指教。注意:当然,我可以用其他方法来做;例如,我可以在将变量放入lm()之前排除它们。但是我正在教一门关于此类知识的课程,并且我不想让学生感到困惑,因为他们已经告诉他们可以在公式中使用减号来排除变量。
我试图“扩展”
—
跳出
.
以获得简化的公式,terms(y ~ . -x3, data=dt, simplify=TRUE)
但奇怪的是,它仍然保留x3
在lm
@MrFlick-好像未实现的R
—
thelatemail
neg.out=
选项可能相关。从的S帮助文件中terms
,在以下neg.out=
位置实现: 标志,用于控制对带有“-”符号的术语的处理。如果为TRUE,将检查术语是否取消,否则将忽略。如果为FALSE,则将保留否定条款(以否定顺序)。
@MauritsEvers:
—
Artem Sokolov
lm
调用model.matrix
数据的修改版本。在开始时,lm
组成并评估以下表达式:mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )
。这导致x3
成为单级因素。model.matrix()
然后调用mf
,而不是原始数据,导致我们观察到错误。
model.matrix(y ~ . - x3, data = dt[x3 == "men"])
和一起model.matrix(y ~ x1 + x2, data = dt[x3 == "men"])
工作(内部lm
调用model.matrix
)很有趣。这两个模型矩阵之间的唯一区别是一个"contrasts"
属性(该属性仍然包含x3
),并且稍后会在lm
例程中获取该属性,这可能会导致您看到的错误。所以我的感觉是,问题与model.matrix
删除条款时如何创建和存储设计矩阵有关。