#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.