在lm公式中删除变量仍会触发对比度误差


9

我试图仅对数据的一部分运行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()之前排除它们。但是我正在教一门关于此类知识的课程,并且我不想让学生感到困惑,因为他们已经告诉他们可以在公式中使用减号来排除变量。


3
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删除条款时如何创建和存储设计矩阵有关。
Maurits Evers

我试图“扩展” .以获得简化的公式,terms(y ~ . -x3, data=dt, simplify=TRUE)但奇怪的是,它仍然保留x3lm
跳出

1
@MrFlick-好像未实现的R neg.out=选项可能相关。从的S帮助文件中terms,在以下neg.out=位置实现: 标志,用于控制对带有“-”符号的术语的处理。如果为TRUE,将检查术语是否取消,否则将忽略。如果为FALSE,则将保留否定条款(以否定顺序)。
thelatemail

1
@MauritsEvers:lm调用model.matrix数据的修改版本。在开始时,lm组成并评估以下表达式:mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )。这导致x3成为单级因素。model.matrix()然后调用mf,而不是原始数据,导致我们观察到错误。
Artem Sokolov

Answers:


2

您得到的错误是因为x3在模型中只有一个值= "men"(请参阅下面来自@Artem Sokolov的评论)

解决它的一种方法是提前子集:

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

或者,您可以在同一步骤中同时执行以下两项操作:

lm( y ~ ., dt[x3 == 'men',-"x3"])

总体而言,这是一个不错的解决方案。要纠正的一件事是,-x3在公式中不会导致lm您认为您要减去该列。正确传达了“不要在模型中使用x3”的意图,但是问题在于lm调用model.frame( ..., drop.unused.levels=TRUE )导致x3成为单层因素,从而导致的下游问题model.matrix()
Artem Sokolov

感谢您对Artem Sokolov的澄清,我从回答中删除了该错误的解释。
Dylan_Gomes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.