Сингулярность во взаимодействующих категориальных переменных в 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
, Я хочу, чтобы базовый уровень был "Безработным", потому что я хочу видеть влияние каждой взаимодействующей переменной по сравнению с безработными.
Я удалил основной эффект Employed, потому что хочу видеть только эффект взаимодействия.
Однако, когда я регрессирую, я получаю много особенностей (только в терминах взаимодействия).
У меня есть три основных вопроса:
Во-первых, для взаимодействующей фиктивной переменной существует ли разница между использованием факторной переменной и числовой переменной с кодировкой "0" и "1"?
Я искал и узнал, что для нормальной оценки вы можете просто установить переменную как факторы, и R автоматически создаст фиктивные переменные для оценки, так что это то же самое, что и кодирование чисел вручную. Однако в этом случае результат отличается между настройками Employed
переменная в качестве факторов и установка ее в качестве числовой переменной со значениями 0 и 1.
Во-вторых, нормально ли взаимодействовать с фиктивно-фиктивной переменной и факторной переменной?
Я поставил Employed
переменная как числовая фиктивная переменная, и она взаимодействует с факторными переменными Jobtype
, Workdays
, Position
, Может ли это вызвать проблемы?
Наконец, есть ли возможные причины, по которым у меня возникают проблемы с Сингулярностью?
Я предполагаю, что установка базовой линии всех переменных как 0 = Unemployed
вызывает проблему, но я не уверен. И пока я устанавливаю 0 = Unemployed
в качестве базовой линии результат регрессии показывает взаимодействие базовых переменных. Я думал, что базовые переменные не должны отображаться в таблице результатов регрессии (потому что она уже включена в перехват). Почему это так?
Ниже приведен воспроизводимый код.
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.
1 ответ
Из вашего описания это выглядит как информация в Employed
также содержится в Jobtype
, Workdays
, а также Position
, Это легко увидеть, когда вы перекодируете Jobtype, чтобы 0
если безработный и 1
еще; перекодированные значения идентичны значениям в 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 не может рассчитать коэффициенты, люди, которые работают семь дней в неделю и занимают временные и постоянные должности. Кажется, это потому, что просто недостаточно наблюдений. Но я предполагаю, что у вас есть более 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
а остальные три переменные содержат ту же информацию. Если вы можете тривиально воссоздать переменную из другой, то это обычно плохой признак. Другим источником ваших недостающих коэффициентов является небольшое количество случаев.