在 R 中进行线性回归时如何有条件地删除 NA 观察因素?

How to drop NA observation of factors conditionally when doing linear regression in R?

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

模型中有三个因子变量。

模型是

lm(Exercise ~ Econ + Job + Position)

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

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

"Econ"是一个人是否有工作。 (水平=就业/未就业)

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

"Position"是一个人在职场中所处的位置。此变量也有五个级别。

我尝试进行线性回归但出现错误,

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

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

如果我像下面这样分别回归两个模型,不会发生错误。

lm(Exercise ~ Econ)

lm(Exercise ~ Job + Position)

但是,我想要一个可以根据需要自动使用变量的模型,以及一个结果table。所以如果"Econ"是'employed',那么"Job","Position"变量用于回归。如果 "Econ" 为 'unemployed',则 "Job"、"Position" 变量会自动从模型中删除。

我想要一个模型而不是两个模型的原因是通过将所有变量放入模型中,我可以看到 "Econ"(就业或失业)对 'employed'[ 的人的影响=15=]

如果我倒退

lm(Exercise ~ Job + Position)

不知道就业效果如何。

我想到了一个解决方案,将 0 = 'unemployed level' 用于 "Job" 和 "Position" 的所有 NA 值,但我不确定这是否会解决问题,并认为这可能导致多重共线性问题。

有什么方法可以 automatically/conditionally 根据其他因素变量删除 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 and Position 值为 NA。

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

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.omitlm 函数中。这意味着任何包含预测变量或响应变量缺失值的行都将被删除。您可以通过多种方式看到这一点。一种是应用 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 将默默地删除此类预测变量,这就是为什么您在 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