在R中进行线性回归时,如何有条件地放弃对因素的NA观察?
我想用R做一个简单的线性回归模型 模型中有三个因素变量 模型是在R中进行线性回归时,如何有条件地放弃对因素的NA观察?,r,lm,factors,R,Lm,Factors,我想用R做一个简单的线性回归模型 模型中有三个因素变量 模型是 lm(Exercise ~ Econ + Job + Position) 如果“练习”是数值因变量,则为练习的时间量 “经济”、“工作”、“职位”都是因素变量 “经济”是指一个人是否受雇。(级别=已雇用/未雇用) “工作”是一个人的工作类型。此变量有五个级别 “职位”是指一个人在工作场所的职位。该变量也有五个级别 我试着做一个线性回归,结果出现了一个错误 "contrasts can be applied only to fact
lm(Exercise ~ Econ + Job + Position)
如果“练习”是数值因变量,则为练习的时间量
“经济”、“工作”、“职位”都是因素变量
“经济”是指一个人是否受雇。(级别=已雇用/未雇用)
“工作”是一个人的工作类型。此变量有五个级别
“职位”是指一个人在工作场所的职位。该变量也有五个级别
我试着做一个线性回归,结果出现了一个错误
"contrasts can be applied only to factors with 2 or more levels"
我认为这个错误是由于因子水平上的NA,因为如果“经济”等于“失业”,“工作”和“职位”都有NA值。(显然,失业人员没有工作类型和职位)
如果我像下面那样分别回归两个模型,就不会发生错误
lm(Exercise ~ Econ)
lm(Exercise ~ Job + Position)
但是,我需要一个模型,可以根据需要自动使用变量,以及一个结果表。所以,如果“Econ”是“employed”,那么“Job”、“Position”变量用于回归。如果“经济”为“失业”,则“工作”、“职位”变量将自动从模型中删除
我想要一个模型而不是两个模型的原因是,通过将所有变量放入模型中,我可以看到“经济”(就业或失业)对“就业”人群的影响
如果我只是倒退
lm(Exercise ~ Job + Position)
我不知道就业的影响
我想到了一个解决方案,将“工作”和“职位”的所有NA值设为0=“失业水平”,但我不确定这是否能解决问题,并认为这可能导致多重共线性问题
有没有办法根据其他因素变量自动/有条件地删除NA观测值
下面是我重复的例子
Exercise <- c(50, 30, 25, 44, 32, 50 ,22, 14)
Econ <- as.factor(c(1, 0, 1, 1, 0, 0, 1, 1))
# 0 = unemployed, 1 = employed
Job <- as.factor(c("A", NA, "B", "B", NA, NA, "A", "C"))
Position <- as.factor(c("Owner", NA,"Employee", "Owner",
NA, NA, "Employee", "Director"))
data <- data.frame(Exercise, Econ, Job, Position)
str(data)
lm(Exercise ~ Econ + Job + Position)
lm(Exercise ~ Econ)
lm(Exercise ~ Job + Position)
Exercise如果您真的希望第一个模型运行时没有错误(假设您正在使用相同的缺失值处理),那么您可以这样做
lm(Exercise ~ as.integer(Econ) + Job + Position)
请注意,您所做的一切都与第三个模型的结果相同
lm(Exercise ~ Job + Position) # third model
lm(Exercise ~ as.integer(Econ) + Job + Position) # first model
coef(lm(Exercise ~ Job + Position))
coef(lm(Exercise ~ as.integer(Econ) + Job + Position))
除非您改变处理缺失值的方式,否则您想要的第一个模型lm(Exercise~Econ+Job+Position)
将等同于第三个模型lm(Exercise~Job+Position)
原因如下
默认情况下,na.action=na.omit
在lm
函数中。这意味着将删除任何缺少预测器或响应变量值的行。你可以通过多种方式看到这一点。一种是应用model.matrix
,这就是lm
在引擎盖下的作用
model.matrix(Exercise ~ Econ + Job + Position)
(Intercept) Econ1 JobB JobC PositionEmployee PositionOwner
1 1 1 0 0 0 1
3 1 1 1 0 1 0
4 1 1 1 0 0 1
7 1 1 0 0 1 0
8 1 1 0 1 0 0
正如您已经正确指出的,Econ=0
与position=NA
完全一致。因此,lm
正在删除这些观察值,结果是Econ
有一个值,lm
不知道如何用单个级别处理因子。我通过使用as.integer()
绕过了这个错误,但是,最终还是得到了一个只有一个值的预测器
接下来,lm
将自动删除此类预测值,这就是为什么as.integer(Econ)
上的系数会得到NA
。这是因为singular.ok=TRUE
的默认值
如果您设置singular.ok=FALSE
,您将得到一个错误,基本上是说您试图拟合一个只有一个预测值的模型
lm(Exercise ~ as.integer(Econ) + Job + Position, singular.ok = FALSE)
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
singular fit encountered
可能是您设置错误,而是将其写成:lm_模型谢谢您的更正。写在这里是个错误。。我确实用R正确地编写了代码。所以情况并非如此……请尝试提供一个可复制的示例……我无法复制您的错误。我创建了一个与您的描述相对应的数据集,然后lm
运行正常。但是考虑到na.action=na.omit
是的“出厂新鲜”默认值,Econ
的估计值是na
,具有na
值(Econ==0
)的行在拟合模型之前被删除。我举了一个可重现的例子。。