Ошибка при выполнении регрессии Пуассона с двоичным исходом
Я пытаюсь запустить пуассоновскую регрессию, чтобы предсказать общий бинарный результат.
Это моя первая попытка использования 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 успешны.
Ошибка не появляется, когда я преобразовываю результат в целое число; однако это:
- кажется, что она побеждает цель предсказания двоичного результата (если числовая переменная с диапазоном 0-1 не рассматривается как факторная переменная с двумя уровнями); а также
- не кажется необходимым (по крайней мере, согласно этому посту, который использует
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)
Таким образом, вы всегда знаете, что вы получите от логического сравнения.