Как улучшить модель отрицательной биноминальной регрессии с нулевой раздувкой? - PullRequest
1 голос
/ 19 января 2020

все!

Distribution of Count Data

У меня есть переменная ответа, которая считает успешные дни в месяце и распределяется в особой форме (см. Выше). Около 50% составляют нули, и есть тяжелый хвост. Из-за чрезмерной дисперсии и избытка нулей мне посоветовали прогнозировать ее с помощью модели регрессии с отрицательной биноминальной отрицательной инфляцией.

Тем не менее, независимо от того, насколько важна модель, которую я получаю, она мало отражает эти функции распределения (см. Ниже). Например, пики всегда находятся около 4, и никакие прогнозы не выходят за пределы 20.

Distribution of Predictions

Это обычно для подгонки данных подсчета с избыточным распределением и данными с тяжелыми хвостами ? Есть ли другие способы улучшить примерку? Мы ценим любые предложения. Спасибо!


PS Я также попробовал логистическую регрессию c, чтобы предсказать только ноль / не ноль. Но ни одна из подходящих моделей не работает лучше, чем просто угадывание нулей для всех случаев.

1 Ответ

0 голосов
/ 08 февраля 2020

Я полагаю, что вы сделали гистограмму установленных значений, так что это будет отражать только установленные значения и, возможно, умножится на отношение нуля в зависимости от используемой модели. Не предполагается воссоздавать это распределение, потому что степень распространения ваших данных встроена в параметр дисперсии.

Мы можем использовать пример из пакета pscl:

library(pscl)
data("bioChemists")
fit <- hurdle(art ~ ., data = bioChemists,dist="negbin",zero.dist="binomial")
par(mfrow=c(1,2))

hist(fit$y,main="Observed")
hist(fit$fitted.values,main="Fitted")

enter image description here

Как уже упоминалось ранее, в этой модели препятствий приведенные значения соответствуют прогнозируемым средним, умноженным на коэффициент, равный нулю (см. подробнее здесь ):

head(fit$fitted.values)
        1         2         3         4         5         6 
1.9642025 1.2887343 1.3033753 1.3995826 2.4560884 0.8783207 

head(predict(fit,type="zero")*predict(fit,type="count"))
        1         2         3         4         5         6 
1.9642025 1.2887343 1.3033753 1.3995826 2.4560884 0.8783207 

Чтобы смоделировать данные, основанные на подобранной модели, мы извлекаем параметры:

Theta=fit$theta
Means=predict(fit,type="count")
Zero_p = predict(fit,type="prob")[,1]

Имеем функцию для моделирования счета:

simulateCounts = function(mu,theta,zero_p){
N = length(mu)
x = rnbinom(N,mu=mu,size=THETA)
x[runif(x)<zero_p] = 0
x
}

Так что запустите эту симуляцию несколько раз, чтобы получить спектр значений:

set.seed(100)
simulated = replicate(10,simulateCounts(Means,Theta,Zero_p))
simulated = unlist(simulated)

par(mfrow=c(1,2))
hist(bioChemists$art,main="Observed")
hist(simulated,main="simulated")

enter image description here

...