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

Dropping variable in lm formula still triggers contrast error

我正在尝试 运行 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

这是公式中 "minus sign" 符号的问题?请指教。注意:当然我可以用不同的方式来做;例如,我可以在将变量放入 lm() 之前排除这些变量。但是我正在教 class 这方面的知识,我不想让学生感到困惑,因为我已经告诉他们可以在公式中使用减号来排除变量。

您得到的错误是因为 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"])