Ошибка при выполнении регрессии Пуассона с двоичным исходом

Я пытаюсь запустить пуассоновскую регрессию, чтобы предсказать общий бинарный результат.

Это моя первая попытка использования dput - если я использовал это ненадлежащим образом, пожалуйста, дайте мне знать, чтобы я мог исправить это.

Пример данных:

df <- structure(list(id = 1:30, sex = structure(c(1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 
2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L), .Label = c("Female", "Male"
), class = "factor"), migStat = structure(c(1L, 2L, 1L, 1L, 1L, 
1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L), .Label = c("Australian-born", 
"Migrant"), class = "factor"), mhAreaBi = structure(c(1L, 1L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 
1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("Metropolitan", 
"Regional"), class = "factor"), empStatBi = structure(c(2L, 2L, 
1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 
2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Student / employed", 
"Unemployed"), class = "factor"), pensBenBi = structure(c(1L, 
2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 
1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L), .Label = c("No benefit", 
"In receipt of pension benefit"), class = "factor"), maritStatBi = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L), .Label = c("Married (including de facto)", 
"Not married"), class = "factor"), cto = structure(c(1L, 2L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 
2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L), .Label = c("No", 
"Yes"), class = "factor")), .Names = c("id", "sex", "migStat", 
"mhAreaBi", "empStatBi", "pensBenBi", "maritStatBi", "cto"), row.names = c(NA, 
-30L), class = "data.frame")

При запуске регрессии с помощью glm в R я получаю сообщение об ошибке:

fit <- glm(cto ~ sex + migStat + mhAreaBi + empStatBi + pensBenBi + maritStatBi, df, family = poisson)

Error in if (any(y < 0)) stop("negative values not allowed for the 'Poisson' family") : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In Ops.factor(y, 0) : ‘<’ not meaningful for factors

Эта же ошибка была кратко объяснена в этой теме:

Поскольку оператор "<" не определен для факторов, результат, который передается if имеет длину 0. Установка факторной переменной на RHS и использование целочисленных значений на LHS успешны.

Ошибка не появляется, когда я преобразовываю результат в целое число; однако это:

  1. кажется, что она побеждает цель предсказания двоичного результата (если числовая переменная с диапазоном 0-1 не рассматривается как факторная переменная с двумя уровнями); а также
  2. не кажется необходимым (по крайней мере, согласно этому посту, который использует geeglm от geepack предсказать двоичный результат [к сожалению, я получаю ту же ошибку, когда я адаптирую код к своему собственному набору данных])

Вопросы:

Могу ли я получить дальнейшее объяснение ошибки?

Если я преобразую свой результат в целое число в диапазоне 0-1, будет glm относиться к нему так же, как к двоичной переменной? Если нет, то есть ли подход, более подходящий для проведения регрессии для общего двоичного результата?

1 ответ

Решение

Я думаю, что лучший вариант здесь:

df$cto_binary <- as.numeric(df$cto == "Yes")
fit <- glm(cto_binary ~ sex + migStat + mhAreaBi + empStatBi + pensBenBi + maritStatBi, 
           df, family = poisson)

Таким образом, вы явно показываете в своем коде, что будет 1/ успехом в вашем двоичном результате, и вас не смущают такие вещи, как упорядочение уровней факторов. Обратите внимание, что в R as.numeric(c(FALSE, TRUE)) дает c(0, 1)Таким образом, вы всегда знаете, что вы получите от логического сравнения.

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