2014-06-27 18 views
10

Próbuję dopasować rozkład Poissona do moich danych przy użyciu statmodels, ale jestem zdezorientowany przez wyniki, które otrzymuję i jak korzystać z biblioteki.Dopasowywanie rozkładu Poissona do danych w statsmodels

Moje prawdziwe dane będą serią liczb, które moim zdaniem powinienem móc opisać jako posiadające rozkład poissona plus kilka wartości odstających, więc ostatecznie chciałbym zrobić solidne dopasowanie do danych.

ale dla celów testowych, po prostu utworzyć zestaw danych za pomocą scipy.stats.poisson

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

Tak, aby dopasować ten pomocą statsmodels myślę, że po prostu trzeba mieć stałą „endog”

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

druku 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 
============================================================================== 

Ok, to nie wygląda dobrze, ale jeśli to zrobię

res.predict() 

Otrzymuję tablicę 4,03 (która była średnią dla tej próbki testowej). Tak więc, po pierwsze, bardzo myliłem się, jak interpretować ten wynik ze statsmodelu, a po drugie prawdopodobnie powinienem robić coś zupełnie innego, jeśli interesuje mnie niezawodna ocena parametrów dystrybucji, a nie dopasowywanie trendów, ale jak mam to zrobić?

Edytuj Naprawdę powinienem podać więcej szczegółów, aby odpowiedzieć na drugą część mojego pytania.

Mam zdarzenie, które występuje losowo po czasie rozpoczęcia. Kiedy wykreślam histogram czasów opóźnienia dla wielu zdarzeń, widzę, że dystrybucja wygląda jak skalowana dystrybucja Poissona plus kilka punktów odstających, które są normalnie spowodowane przez problemy w moim bazowym systemie. Tak więc po prostu chciałem znaleźć spodziewane opóźnienie dla zestawu danych, z wyłączeniem wartości odstających. Gdyby nie te odstające, mógłbym po prostu znaleźć średni czas. Przypuszczam, że mógłbym je wykluczyć ręcznie, ale pomyślałem, że mogę znaleźć coś bardziej wymagającego.

Edit W dalszej refleksji, będę rozważać inne dystrybucje zamiast trzymać z Poissonion i szczegółach mojego problemu są prawdopodobnie rozpraszać z oryginalnego pytanie, ale zostawiłem je tutaj tak.

+1

Co masz na myśli mówiąc "solidny"? odporny na wartości odstające, odporny na błędy w specyfikacji, odporny na problemy numeryczne, ...? – user333700

+0

Miałem na myśli mocne dla wartości odstających – robochat

+0

Dodałem kilka komentarzy na temat dalekiej oceny wiarygodności mojej odpowiedzi. Zacząłem zaglądać do niego jakiś czas temu, ale wciąż pozostaje wiele do zrobienia, dopóki nie będziemy go mieli w statsmodelach. – user333700

Odpowiedz

6

Model Poissona, jak większość innych modeli w uogólnionych rodzinach modeli liniowych lub innych danych dyskretnych, zakłada, że ​​mamy transformację, która ogranicza przewidywanie w odpowiednim zakresie.

Poissona działa dla liczb nieujemnych i transformacja jest exp, więc model, który szacuje się zakłada, że ​​wartość oczekiwana obserwacji, uzależnione od zmiennych objaśniających jest

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

Aby uzyskać parametr lambda rozkład Poissona, musimy użyć exp, czyli

>>> np.exp(1.3938) 
4.0301355071650118 

predict robi to domyślnie, ale można zwrócić tylko część liniową (X dot params) z argumentem kluczowego.

okazji: kontrowersyjne terminologia endog statsmodels' oznacza Y exog wynosi x (posiada X w nim) (http://statsmodels.sourceforge.net/devel/endog_exog.html)

Outlier dokładne oszacowanie

Odpowiedź na ostatniej części pytania jest to, że obecnie nie ma wiarygodnego oszacowania w Pythonie dla Poissona lub innych modeli zliczania, o ile wiem.

Dla nadmiernie zdyspergowanych danych, gdzie wariancja jest większa niż średnia, możemy użyć regresji negatywnej. Dla wartości odstających w Poissonie będziemy musieli użyć R/Rpy lub wykonać ręczne przycinanie wartości odstających. Identyfikacja odstresowująca może opierać się na jednym ze standaryzowanych reszt.

Nie będzie dostępna w modelach statsmodelu przez pewien czas, chyba że ktoś to wnosi.

+0

Dziękuję, więc to odpowiada na moje pierwsze pytanie. Najwyraźniej potrzebowałbym więcej statystyk, zanim powrócę do nomenklatury statsmodel. – robochat

+0

endog/exog to po prostu coś do zapamiętania (z pomocą tego egzoga jest "ex"). Odmawiałem dotychczas, aby wprowadzić jedną literę w kodzie statsmodeli. – user333700

+0

Jako nowy użytkownik, znaczenie endog/exog nie myliło mnie tak bardzo, jak określić exog i byłem zmieszany pomiędzy wykonaniem regresji a parametrem dopasowującym dystrybucję. Wielkie dzięki za twoje odpowiedzi, a nawet za statmodele. – robochat

Powiązane problemy