Zha*_* He 9 r formula factors lm
我正在尝试仅对我的数据子集运行 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)
Run Code Online (Sandbox Code Playgroud)
以上不起作用,因为数据集现在只有男性,因此我们不能将性别变量 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
Run Code Online (Sandbox Code Playgroud)
这是公式中“减号”符号的问题吗?请指教。注意:当然我可以用不同的方式来做;例如,我可以在将变量放入 lm() 之前排除它们。但是我正在教这门课,我不想让学生们感到困惑,因为我已经告诉他们可以使用公式中的减号来排除变量。
您收到的错误是因为 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)
Run Code Online (Sandbox Code Playgroud)
或者您可以在同一步骤中执行这两项操作:
lm( y ~ ., dt[x3 == 'men',-"x3"])
Run Code Online (Sandbox Code Playgroud)