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

时间:2017-11-26 06:32:25

标签: r lm factors

我试图在R中做一个简单的线性回归模型。

模型中有三个因子变量。

模型是

lm(Exercise ~ Econ + Job + Position)

其中"练习"是数字因变量,是锻炼的时间量。

" Econ"," Job"," Position"都是因子变量。

"经济舱"是一个人是否受雇。 (等级=雇用/未雇用)

"工作"是一个人的工作类型。这个变量有五个级别。

"位置"是一个人在工作场所的地位。这个变量也有五个级别。

我尝试进行线性回归并得到错误,

"contrasts can be applied only to factors with 2 or more levels"

我认为这个错误是由于因子级别的NA,因为如果" Econ"等于失业',"工作"和"职位"有NA值。 (显然,失业人员没有工作类型和工作岗位)

如果我像下面一样单独回归两个模型,则不会发生错误。

lm(Exercise ~ Econ)

lm(Exercise ~ Job + Position)

但是,我想要一个可以根据需要自动使用变量的模型和一个结果表。所以如果" Econ"是'雇用'然后"工作","职位"变量用于回归。如果" Econ"失业'然后"工作","职位"变量自动从模型中删除。

我想要一个模型而不是两个模型的原因是通过将所有变量放在模型中,我可以看到" Econ"(就业或失业)在受雇人员中的影响#39;

如果我退步

lm(Exercise ~ Job + Position)

我不知道就业的影响。

我想到了一个解决方案,将0 ='失业水平'对于" Job"的所有NA值和"位置",但我不确定这会解决问题,并认为这可能会导致多重共线性问题。

有没有办法根据一些其他因子变量自动/有条件地丢弃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)

这里我想要的是第一个模型lm(Exercise~Econ + Job + Position),但是我得到一个错误,因为对于所有Econ = 0(Unemployed),Job和Position值都是NA。

1 个答案:

答案 0 :(得分:2)

如果你真的只是希望第一个模型运行没有错误(假设你正在使用相同的缺失值处理),那么你可以这样做。

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 = 0position = NA完全一致。因此,lm正在删除这些观察结果,最终Econ只有一个值lm不知道如何处理单个级别的因子。我使用as.integer()绕过了这个错误,但是,您仍然只得到一个只有一个值的预测变量。

接下来,lm将默默地删除此类预测变量,这就是为NA获得系数as.integer(Econ)的原因。这是因为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