r 中交互分类变量的奇异性

Singularity in interacting categorical variables in r

我正在尝试估计一个具有许多相互作用的分类变量的模型。但是,我在执行 OLS 时遇到奇点错误。我想弄清楚为什么。我想我在 R 中设置变量时做错了。

模型如下。

Income ~ Gender + Age + Employed:Jobtype + Employed:Workdays + Employed:Position

此处,因变量为Income,交互分类变量为EmployedJobtypeWorkdaysPosition

如您所见,所有分类变量的基线都是 0 = Unemployed。我希望基线为 'Unemployed',因为我想查看每个交互变量与失业人员相比的影响。

我去掉了Employed的主效应,因为我只想看交互效应。

然而,当我回归时,我得到了许多奇点(仅在交互方面)。

我的三个主要问题是,

首先,对于交互虚拟变量,使用因子变量和使用编码为“0”和“1”的数值变量有区别吗?

我搜索了一下得知,正常的估计,一般只要设置变量为因子即可,R会自动为估计创建虚拟变量,所以和手动编码数字是一样的。但是在这种情况下,将 Employed 变量设置为因子与将其设置为值为 0 和 1 的数值变量之间的结果不同。 (如果我将它设置为因子变量,奇点变量增加)

其次,是否可以与数字编码的虚拟变量和因子变量进行交互?

我将Employed变量设置为数值虚拟变量,它与因子变量JobtypeWorkdaysPosition相互作用。这会导致问题吗?

最后,是否有任何可能的原因导致我遇到 Singularity 问题?

我猜是将所有变量的基线设置为 0 = Unemployed 导致了问题,但我不确定。当我将 0 = Unemployed 设置为基线时,回归结果显示基线变量的交互作用。我认为基线变量不应该显示在回归结果中table(因为它已经包含在截距中)。为什么会这样?

以下是可重现的代码。

Income <- c(100, 150, 20, 30, 40, 60, 70, 50)
Gender <- as.factor(c(0, 1, 1, 1, 0, 1, 0, 1)) # 0 = Man, 1 = Woman
Age <- c(54, 35, 24, 43, 23, 50, 66, 54)
Employed <- c(1, 0, 0, 1, 0, 0, 1, 1) # 0 = Unemployed, 1 = Employed
Jobtype <- as.factor(c(1, 0, 0, 2, 0, 0, 2, 1)) # 0 = Unemployed, 1 = Service,                2 = Salesman
Workdays <- as.factor(c(1, 0, 0, 2, 0, 0, 3, 2)) # 0 = Unemployed, 1 = 5 days     a week, 2 = 6 days a week, 3 = 7 days a week.
Position <- as.factor(c(1, 0, 0, 2, 0, 0, 1, 1)) #0 = Unemployed, 1 =     Temporary, 2 = Permanent

data <- data.frame(Income, Gender, Age, Employed, Jobtype, Workdays, Position)

reg <- lm(Income ~ Gender + Age + Employed:(Jobtype + Workdays + Position),     data = data)
summary(reg) # regression with numerically coded Employed variable.

data$Employed <- as.factor(data$Employed)
reg2 <- lm(Income ~ Gender + Age + Employed:(Jobtype + Workdays + Position),     data = data)
summary(reg2) # regression with Employed variable as factor variable.

根据您的描述,Employed中的信息似乎也包含在JobtypeWorkdaysPosition中。当您将 Jobtype 重新编码为 0 if unemployed 和 1 else 时,您可以很容易地看到这一点;重新编码的值与 Employed:

中的值相同
ifelse(Jobtype == 0, 0, 1) == Employed
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

因此,即使没有交互作用,如果将 Employment 与其他变量一起包含,也会出现奇点问题。我建议简单地从模型中省略 Employment:

m1 <- lm(Income ~ Gender + Age + Jobtype + Workdays + Position, data = data)
summary(m1)

仍然有一些因素水平 R 无法计算系数,人们每周工作 7 天,并担任临时和永久职位。这似乎是因为没有足够的观察。但我假设你有超过 8 个观察值,所以如果你在整个数据集上 运行 它应该开始消失。

另一个问题是您对因子变量的使用。虽然没有错,但您没有在这里实际使用 R 的功能。我建议您实际标记数据以使您的生活更容易解释结果:

Gender <- factor(c(0, 1, 1, 1, 0, 1, 0, 1), levels = 0:1,
                 labels = c("Man", "Woman"))
Jobtype <- factor(c(1, 0, 0, 2, 0, 0, 2, 1), levels = 0:2,
                  labels = c("Unemployed", "Service", "Salesman"))
Workdays <- factor(c(1, 0, 0, 2, 0, 0, 3, 2), levels = c(0:3),
                   labels = c("Unemployed", "5 days", "6 days", "7 days"))
Position <- factor(c(1, 0, 0, 2, 0, 0, 1, 1), levels = c(0:2),
                   labels = c("Unemployed", "Temporary", "Permanent"))

现在,如果您将这些正确标记的数据绑定在一起并再次 运行 模型,输出会变得更好一些。

data2 <- data.frame(Income, Gender, Age, Employed, Jobtype, Workdays, Position)
m2 <- lm(Income ~ Gender + Age + Jobtype + Workdays + Position, data = data2)
summary(m2)

# Coefficients: (3 not defined because of singularities)
#                   Estimate Std. Error t value Pr(>|t|)
# (Intercept)         14.795    146.938   0.101    0.936
# GenderWoman         22.055    125.261   0.176    0.889
# Age                  1.096      4.983   0.220    0.862
# JobtypeService      -9.178    325.920  -0.028    0.982
# JobtypeSalesman    -17.123    250.637  -0.068    0.957
# Workdays5 days      35.205    216.710   0.162    0.897
# Workdays6 days     -36.849    246.912  -0.149    0.906
# Workdays7 days          NA         NA      NA       NA
# PositionTemporary       NA         NA      NA       NA
# PositionPermanent       NA         NA      NA       NA

现在回答您的具体问题:

  1. 是的,如果您将变量作为数值变量或因子变量输入到回归模型中,这会有很大的不同。 R 无法判断数字变量是否实际上是不在数字测量范围内的东西。因此,它将始终如此对待数字变量。因此:始终确保将名义上或顺序上缩放的变量作为因子输入。

  2. 就 R 而言,数字编码的虚拟变量必须是一个因子变量(或逻辑变量),其标签分别设置为 0 和 1。这样做是可以的,只是在解释结果时没有太大帮助。

  3. 奇点问题似乎来自于Employed和其他三个变量包含相同信息的事实。如果您可以轻松地从另一个变量重新创建一个变量,那么这通常是一个坏兆头。缺失系数的另一个来源是案例数量少。