Подгонка распределения Пуассона к данным в statsmodels

#python #statsmodels

#python #статсмодели

Вопрос:

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

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

Однако для целей тестирования я просто создаю набор данных, используя scipy.stats.poisson

 samp = scipy.stats.poisson.rvs(4,size=200)
 

Поэтому, чтобы соответствовать этому с помощью statsmodels, я думаю, что мне просто нужно иметь постоянный «конечный»

 res = sm.Poisson(samp,np.ones_like(samp)).fit()
 

распечатать res.summary()

                           Poisson Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  200
Model:                        Poisson   Df Residuals:                      199
Method:                           MLE   Df Model:                            0
Date:                Fri, 27 Jun 2014   Pseudo R-squ.:                   0.000
Time:                        14:28:29   Log-Likelihood:                -404.37
converged:                       True   LL-Null:                       -404.37
                                        LLR p-value:                       nan
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const          1.3938      0.035     39.569      0.000         1.325     1.463
==============================================================================
 

Хорошо, это выглядит неправильно, но если я это сделаю

 res.predict()
 

Я получаю массив 4,03 (который был средним для этого тестового образца).
Итак, по сути, во-первых, я очень смущен тем, как интерпретировать этот результат из statsmodel, а во-вторых, я, вероятно, должен делать что-то совершенно другое, если меня интересует надежная оценка параметров распределения, а не подгонка тенденций, но как мне это сделать?

Редактировать Я действительно должен был дать более подробную информацию, чтобы ответить на вторую часть моего вопроса.

У меня есть событие, которое происходит случайным образом через некоторое время после начала. Когда я строю гистограмму времени задержки для многих событий, я вижу, что распределение выглядит как масштабированное распределение Пуассона плюс несколько точек выбросов, которые обычно вызваны проблемами в моей базовой системе. Итак, я просто хотел найти ожидаемую временную задержку для набора данных, исключая выбросы. Если бы не выбросы, я мог бы просто найти среднее время. Я полагаю, что я мог бы исключить их вручную, но я подумал, что мог бы найти что-то более требовательное.

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

Комментарии:

1. Что вы подразумеваете под «надежным»? устойчив к выбросам, устойчив к ошибкам в определении, устойчив к численным задачам, …?

2. Я имел в виду устойчивость к выбросам

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

Ответ №1:

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

Пуассон работает для неотрицательных чисел, и преобразование таково exp , поэтому оцениваемая модель предполагает, что ожидаемое значение наблюдения, зависящее от объясняющих переменных, равно

  E(y | x) = exp(X dot params)
 

Чтобы получить лямбда-параметр распределения Пуассона, нам нужно использовать exp, т.е.

 >>> np.exp(1.3938)
4.0301355071650118
 

predict делает это по умолчанию, но вы можете запросить только линейную часть (X dot params) с аргументом ключевого слова.

Кстати: противоречивая терминология statsmodels endog — это y exog — это x (в нем есть x) (http://statsmodels.sourceforge.net/devel/endog_exog.html )

Более надежная оценка выбросов

Ответ на последнюю часть вопроса заключается в том, что в настоящее время в Python нет более надежной оценки выбросов для моделей Пуассона или других моделей подсчета, насколько я знаю.

Для сверхдисперсных данных, где дисперсия больше среднего, мы можем использовать отрицательную биномиальную регрессию. Для выбросов в Пуассоне нам пришлось бы использовать R / Rpy или выполнять ручную обрезку выбросов. Идентификация выбросов может быть основана на одном из стандартизированных остатков.

Он не будет доступен в statsmodels в течение некоторого времени, если только кто-то не внесет свой вклад в это.

Комментарии:

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

2. endog / exog — это просто то, что нужно запомнить (с помощью exog ex ). До сих пор я отказывался вводить однобуквенные имена в код statsmodels.

3. Как нового пользователя, значение endog / exog смутило меня не так сильно, как то, как указать exog, и я был сбит с толку между выполнением регрессии и параметром, соответствующим распределению. Большое спасибо за ваши ответы и, действительно, за statsmodels.