我正在读这篇文章article他们使用以下代码从数据中删除变量/列:
data(airquality)
# using subset()
summary(lm(Ozone ~., data = subset(airquality, select = -Solar.R)))
# direct manipulation
summary(lm(Ozone ~. -Solar.R, data = airquality))
我最初的想法是,两者通过从 lm
中删除变量 Solar.R
来完成相同的操作,但它们似乎产生不同的结果。这两种方法有什么区别?为什么他们会产生不同的回归结果?
最佳答案
在您的公式中,.
指的是所有其他变量(Ozone
除外)。然后从 .
中减去 Solar.R
(即 Ozone~.-Solar.R
),您就可以有效地做到这一点:
lm(Ozone~Wind-Solar.R+Temp-Solar.R+Month-Solar.R + Day-Solar.R + Solar.R-Solar.R, data=airquality)
请注意,此结果与您的第二个模型相同。
所以,简而言之,这两种方法(您的第二个模型和我写出的它的版本)只是与您的第一个模型执行相同的操作,但导致更多的行丢失..因为还有五个额外的数据集中缺少 Solar.R 的行(但没有缺少 Ozone),通过从 Wind 到 Day 中减去 Solar.R,这 5 行将被删除,从而使删除的总数从 37 行增加到 42 行。
请注意,如果 Solar.R 没有任何缺失值(假设我用非缺失 Solar.R 值的平均值填充缺失值,如下所示,或使用任何值),那么您的第一个和第二个模型将相同;具体来说:
lm(Ozone~., data=select(airquality,-Solar.R))
Call:
lm(formula = Ozone ~ ., data = select(airquality, -Solar.R))
Coefficients:
(Intercept) Wind Temp Month Day
-70.1051 -3.0516 2.0984 -3.5209 0.2747
对比:
lm(Ozone~.-Solar.R, data=
airquality %>%
mutate(Solar.R = if_else(is.na(Solar.R), mean(Solar.R, na.rm=T), as.double(Solar.R)))
)
Call:
lm(formula = Ozone ~ . - Solar.R, data = airquality %>% mutate(Solar.R = if_else(is.na(Solar.R),
mean(Solar.R, na.rm = T), as.double(Solar.R))))
Coefficients:
(Intercept) Wind Temp Month Day
-70.1051 -3.0516 2.0984 -3.5209 0.2747
关于r - 使用subset()删除列和直接在R中的公式中删除变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72997527/