Я пытаюсь запустить регрессию Пуассона, чтобы предсказать общий двоичный результат.
Это моя первая попытка использовать 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. Установка факторной переменной на правой стороне и использование целочисленных значений на левой правой стороне выполняется успешно.
Ошибка не появляется, когда я конвертирую результат в целое число; однако это:
- похоже, не оправдывает ожиданий двоичного результата (если числовая переменная с диапазоном 0–1 не обрабатывается так же, как факторная переменная с двумя уровнями); а также
- не кажется необходимым (по крайней мере, согласно этому сообщению, в котором используется
geeglm
изgeepack
для прогнозирования двоичного результата [к сожалению, я получаю ту же ошибку, когда адаптирую код к моему собственному набору данных])
Вопросы:
Могу ли я получить дальнейшее объяснение ошибки?
Если я конвертирую свой результат в целое число с диапазоном 0–1, будет ли glm
обрабатывать его так же, как двоичную переменную? Если нет, то есть ли подход, лучше подходящий для проведения регрессии для общего двоичного результата?
as.numeric(df$cto == "Yes")
даст вам 0 и 1, которые будут хорошо работать вglm
. Но обычно вы используете логистическую регрессию для таких двоичных результатов и регрессию Пуассона для переменных подсчета или скорости, где результат может принимать любые целочисленные значения> 0. Вы уверены, что Пуассон - хороший выбор для вашего анализа? - person Marius   schedule 13.07.2017geeglm
результат кодируется какTRUE
иFALSE
, то есть1
и _5 _, поэтому они не преобразовали в этом сообщении, но смогли выполнить регрессию. - person paqmo   schedule 13.07.2017levels(factor(letters[1:3]))
иlevels(factor(letters[1:3], levels = c("c", "a", "b")))
и приведите их к числу. - person Roman Luštrik   schedule 13.07.2017as.numeric(df$cto == "Yes")
, который явно показывает, что такое успех / 1. - person Marius   schedule 13.07.2017