在R中进行线性回归时,如何有条件地放弃对因素的NA观察?

在R中进行线性回归时,如何有条件地放弃对因素的NA观察?,r,lm,factors,R,Lm,Factors,我想用R做一个简单的线性回归模型 模型中有三个因素变量 模型是 lm(Exercise ~ Econ + Job + Position) 如果“练习”是数值因变量,则为练习的时间量 “经济”、“工作”、“职位”都是因素变量 “经济”是指一个人是否受雇。(级别=已雇用/未雇用) “工作”是一个人的工作类型。此变量有五个级别 “职位”是指一个人在工作场所的职位。该变量也有五个级别 我试着做一个线性回归,结果出现了一个错误 "contrasts can be applied only to fact

我想用R做一个简单的线性回归模型

模型中有三个因素变量

模型是

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
)的行在拟合模型之前被删除。我举了一个可重现的例子。。