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

标签 r lm factors

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

模型中有三个因子变量。

模型是

lm(Exercise ~ Econ + Job + Position)

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

“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)

但是,我想要一个可以根据需要自动使用变量的模型,以及一个结果表。因此,如果“Econ”是“employed”,则“Job”、“Position”变量用于回归。如果“经济”是“失业”,那么“工作”、“职位”变量会自动从模型中删除。

我想要一个模型而不是两个模型的原因是通过将所有变量放入模型中,我可以看到“经济”(就业或失业)对“就业”人群的影响

如果我只是倒退

lm(Exercise ~ Job + Position)

不知道就业效果如何。

我想到了一个解决方案,为“工作”和“职位”的所有 NA 值设置 0 = 'unemployed level',但我不确定这是否会解决问题,并认为这可能会导致多重共线性问题。

是否有任何方法可以根据其他一些因素变量自动/有条件地删除 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。

最佳答案

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

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 ~工作 + 职位) 这就是原因。

默认情况下,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

关于r - 在 R 中进行线性回归时如何有条件地删除 NA 观察因素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493639/

相关文章:

r - 聚合具有相同 ID 的行并仅保留 R 中的唯一条目

r - 在 heatmap.2 中将行标签设为斜体

performance - 整数 n 的除数列表 (Haskell)

r - 创建一个列,该列将从另一列的最小值开始取值 1,然后增加 1 直到最大值

r - 计算预测值时发出警告

r - 如何在lm中使用除法

r - 快速分组简单线性回归

javascript - 在 JavaScript 中从一组数字中获取公因数

python - 获取 sympy 解决方案的某些部分

r - 什么时候用 dplyr (tidyverse) 编码比基本 R 更复杂?