r 中交互分类变量的奇异性
Singularity in interacting categorical variables in r
我正在尝试估计一个具有许多相互作用的分类变量的模型。但是,我在执行 OLS 时遇到奇点错误。我想弄清楚为什么。我想我在 R 中设置变量时做错了。
模型如下。
Income ~ Gender + Age + Employed:Jobtype + Employed:Workdays + Employed:Position
此处,因变量为Income
,交互分类变量为Employed
、Jobtype
、Workdays
、Position
。
Employed
变量编码为0 = Unemployed
,1 = Employed
.
Jobtype
变量编码0 = Unemployed
,1 = Service
,2 = Salesman
.
Workdays
变量编码为0 = Unemployed
、1 = 5 days a week
、2 = 6 days a week
、3 = 7 days a week
。
Position
变量编码为0 = Unemployed
,1 = Temporary
,2 = Permanent
.
如您所见,所有分类变量的基线都是 0 = Unemployed
。我希望基线为 'Unemployed',因为我想查看每个交互变量与失业人员相比的影响。
我去掉了Employed的主效应,因为我只想看交互效应。
然而,当我回归时,我得到了许多奇点(仅在交互方面)。
我的三个主要问题是,
首先,对于交互虚拟变量,使用因子变量和使用编码为“0”和“1”的数值变量有区别吗?
我搜索了一下得知,正常的估计,一般只要设置变量为因子即可,R会自动为估计创建虚拟变量,所以和手动编码数字是一样的。但是在这种情况下,将 Employed
变量设置为因子与将其设置为值为 0 和 1 的数值变量之间的结果不同。
(如果我将它设置为因子变量,奇点变量增加)
其次,是否可以与数字编码的虚拟变量和因子变量进行交互?
我将Employed
变量设置为数值虚拟变量,它与因子变量Jobtype
、Workdays
、Position
相互作用。这会导致问题吗?
最后,是否有任何可能的原因导致我遇到 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
中的信息似乎也包含在Jobtype
、Workdays
和Position
中。当您将 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
现在回答您的具体问题:
是的,如果您将变量作为数值变量或因子变量输入到回归模型中,这会有很大的不同。 R 无法判断数字变量是否实际上是不在数字测量范围内的东西。因此,它将始终如此对待数字变量。因此:始终确保将名义上或顺序上缩放的变量作为因子输入。
就 R 而言,数字编码的虚拟变量必须是一个因子变量(或逻辑变量),其标签分别设置为 0 和 1。这样做是可以的,只是在解释结果时没有太大帮助。
奇点问题似乎来自于Employed
和其他三个变量包含相同信息的事实。如果您可以轻松地从另一个变量重新创建一个变量,那么这通常是一个坏兆头。缺失系数的另一个来源是案例数量少。
我正在尝试估计一个具有许多相互作用的分类变量的模型。但是,我在执行 OLS 时遇到奇点错误。我想弄清楚为什么。我想我在 R 中设置变量时做错了。
模型如下。
Income ~ Gender + Age + Employed:Jobtype + Employed:Workdays + Employed:Position
此处,因变量为Income
,交互分类变量为Employed
、Jobtype
、Workdays
、Position
。
Employed
变量编码为0 = Unemployed
,1 = Employed
.Jobtype
变量编码0 = Unemployed
,1 = Service
,2 = Salesman
.Workdays
变量编码为0 = Unemployed
、1 = 5 days a week
、2 = 6 days a week
、3 = 7 days a week
。Position
变量编码为0 = Unemployed
,1 = Temporary
,2 = Permanent
.
如您所见,所有分类变量的基线都是 0 = Unemployed
。我希望基线为 'Unemployed',因为我想查看每个交互变量与失业人员相比的影响。
我去掉了Employed的主效应,因为我只想看交互效应。
然而,当我回归时,我得到了许多奇点(仅在交互方面)。
我的三个主要问题是,
首先,对于交互虚拟变量,使用因子变量和使用编码为“0”和“1”的数值变量有区别吗?
我搜索了一下得知,正常的估计,一般只要设置变量为因子即可,R会自动为估计创建虚拟变量,所以和手动编码数字是一样的。但是在这种情况下,将 Employed
变量设置为因子与将其设置为值为 0 和 1 的数值变量之间的结果不同。
(如果我将它设置为因子变量,奇点变量增加)
其次,是否可以与数字编码的虚拟变量和因子变量进行交互?
我将Employed
变量设置为数值虚拟变量,它与因子变量Jobtype
、Workdays
、Position
相互作用。这会导致问题吗?
最后,是否有任何可能的原因导致我遇到 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
中的信息似乎也包含在Jobtype
、Workdays
和Position
中。当您将 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
现在回答您的具体问题:
是的,如果您将变量作为数值变量或因子变量输入到回归模型中,这会有很大的不同。 R 无法判断数字变量是否实际上是不在数字测量范围内的东西。因此,它将始终如此对待数字变量。因此:始终确保将名义上或顺序上缩放的变量作为因子输入。
就 R 而言,数字编码的虚拟变量必须是一个因子变量(或逻辑变量),其标签分别设置为 0 和 1。这样做是可以的,只是在解释结果时没有太大帮助。
奇点问题似乎来自于
Employed
和其他三个变量包含相同信息的事实。如果您可以轻松地从另一个变量重新创建一个变量,那么这通常是一个坏兆头。缺失系数的另一个来源是案例数量少。