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

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

Это моя первая попытка использовать 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. Установка факторной переменной на правой стороне и использование целочисленных значений на левой правой стороне выполняется успешно.

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

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

Вопросы:

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

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


person C_H    schedule 13.07.2017    source источник
comment
as.numeric(df$cto == "Yes") даст вам 0 и 1, которые будут хорошо работать в glm. Но обычно вы используете логистическую регрессию для таких двоичных результатов и регрессию Пуассона для переменных подсчета или скорости, где результат может принимать любые целочисленные значения> 0. Вы уверены, что Пуассон - хороший выбор для вашего анализа?   -  person Marius    schedule 13.07.2017
comment
@Marius Я ценю совет! Во время учебы в университете меня учили, что логистическая регрессия используется для двоичных результатов, а регрессия Пуассона - для данных подсчета. Совсем недавно статистик в моем университете сообщил мне, что логистическая регрессия подходит для использования, когда бинарные исходы редки, но что у нее возникают проблемы, когда результаты являются общими. В таких случаях предположительно лучше использовать регрессию Пуассона. Вот ветка резюме - ссылка   -  person C_H    schedule 13.07.2017
comment
Что касается вашего пункта 1 выше, утверждение после if является правильным - преобразование в двоичную переменную 0,1 (т.е. фиктивную переменную) - это именно то, что вы хотите сделать. В вашем связанном примере geeglm результат кодируется как TRUE и FALSE, то есть 1 и _5 _, поэтому они не преобразовали в этом сообщении, но смогли выполнить регрессию.   -  person paqmo    schedule 13.07.2017
comment
Чтобы быть ясным - для любой данной переменной 0/1 они будут эквивалентны, если закодированы как фактор или числовые значения? Следовательно, R будет надежно различать две числовые переменные, закодированные 0/1 (двоичная) и 0, 1, 2, ... (счетчик)?   -  person C_H    schedule 13.07.2017
comment
Когда коэффициент приводится к числовому, вы должны опасаться порядка, в котором это делается. Сравните levels(factor(letters[1:3])) и levels(factor(letters[1:3], levels = c("c", "a", "b"))) и приведите их к числу.   -  person Roman Luštrik    schedule 13.07.2017
comment
Хорошо, просто хотел проверить логистику / пуассон, но, как вы говорите, есть веские причины для использования Пуассона. Вы должны быть очень осторожны при использовании факторов в R и проверять порядок уровней и т.д. перед их использованием, поэтому мне нравится использовать as.numeric(df$cto == "Yes"), который явно показывает, что такое успех / 1.   -  person Marius    schedule 13.07.2017


Ответы (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), поэтому вы всегда знаете, что получите от логического сравнения.

person Marius    schedule 13.07.2017