Сингулярность во взаимодействующих категориальных переменных в 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

Теперь к вашим конкретным вопросам:

  1. Да, это большая разница, если вы вводите переменную в регрессионную модель в виде числовой или факторной переменной. У R нет никакого способа сказать, является ли числовая переменная действительно чем-то, что не находится в числовой шкале измерения. Следовательно, он всегда будет относиться к числовой переменной как таковой. Поэтому: всегда проверяйте, чтобы переменные, которые номинально или обычно масштабируются, вводились как факторы.

  2. В терминах R фиктивная переменная с числовым кодом должна быть факторной (или логической) переменной, для которой метки установлены в 0 и 1 соответственно. Это нормально, просто не очень полезно при интерпретации результатов.

  3. Проблемы сингулярности, похоже, связаны с тем, что Employed а остальные три переменные содержат ту же информацию. Если вы можете тривиально воссоздать переменную из другой, то это обычно плохой признак. Другим источником ваших недостающих коэффициентов является небольшое количество случаев.

Другие вопросы по тегам