2014-06-27 21 views
10

Ich versuche, eine Poisson-Verteilung an meine Daten mit Hilfe von Statistikmodellen anzupassen, aber ich bin verwirrt über die Ergebnisse, die ich erhalte und wie ich die Bibliothek verwende.Anpassen einer Poisson-Verteilung an Daten in statsmodels

Meine realen Daten werden eine Reihe von Zahlen sein, von denen ich denke, dass ich eine Poisson-Verteilung und einige Ausreißer beschreiben könnte, damit ich schließlich eine robuste Anpassung an die Daten vornehmen kann.

jedoch zu Testzwecken erstellen I scipy.stats.poisson

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

So dies mit statsmodels passen Ich denke, dass ich brauche nur eine Konstante 'ENDOG'

res = sm.Poisson(samp,np.ones_like(samp)).fit() 
nur einen Datensatz mit

Druck 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, das, nicht richtig aussehen, aber wenn ich es tue

res.predict() 

Ich bekomme ein Array von 4,03 (was der Mittelwert für dieses Testmuster war). Also im Grunde bin ich zuerst sehr verwirrt, wie man dieses Ergebnis von statsmodel interpretiert und zweitens sollte ich wahrscheinlich etwas völlig anderes machen, wenn ich an einer robusten Parameterschätzung einer Distribution interessiert bin und nicht an Trends, aber wie soll ich das machen?

Bearbeiten Ich hätte wirklich mehr Details gegeben, um den zweiten Teil meiner Frage zu beantworten.

Ich habe ein Ereignis, das eine zufällige Zeit nach einer Startzeit auftritt. Wenn ich ein Histogramm der Verzögerungszeiten für viele Ereignisse zeichne, sehe ich, dass die Verteilung wie eine skalierte Poisson-Verteilung plus einige Ausreißerpunkte aussieht, die normalerweise durch Probleme in meinem zugrunde liegenden System verursacht werden. Also wollte ich einfach die erwartete Zeitverzögerung für den Datensatz finden, ohne die Ausreißer. Ohne die Ausreißer könnte ich einfach die mittlere Zeit finden. Ich nehme an, dass ich sie manuell ausschließen könnte, aber ich dachte, dass ich etwas genaueres finden könnte.

bearbeiten Auf weitere Überlegungen, werde ich andere Distributionen in Erwägung ziehen, anstatt mit einem Poissonion und den Einzelheiten meiner Ausgabe des Klebens eine Ablenkung von der ursprünglichen Frage wahrscheinlich, aber ich habe trotzdem sie hier links.

+1

Was meinen Sie mit "robust"? robust gegenüber Ausreißern, robust gegenüber Fehlangaben, robust gegenüber numerischen Problemen, ...? – user333700

+0

Ich meinte robust zu Ausreißern – robochat

+0

Ich fügte meine Antwort einige Kommentare über Ausreißer robuste Schätzung. Ich habe vor einiger Zeit angefangen, darüber zu schauen, aber es ist noch ein weiter Weg, bis wir ihn in den Statsmodellen verfügbar haben. – user333700

Antwort

6

Das Poisson-Modell nimmt, wie die meisten anderen Modelle in verallgemeinerten linearen Modellfamilien oder für andere diskrete Daten, an, dass wir eine Transformation haben, die die Vorhersage im geeigneten Bereich begrenzt.

Poisson arbeitet für nicht-negative Zahlen und die Transformation ist exp, so das Modell, das geschätzt wird, geht davon aus, dass der Erwartungswert einer Beobachtung, bedingt auf den erklärenden Variablen ist

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

die Lambda-Parameter des erhalten poisson-Verteilung, müssen wir exp verwenden, dh

>>> np.exp(1.3938) 
4.0301355071650118 

predict tut dies standardmäßig, aber Sie können nur den linearen Teil (X dot params) mit einem Schlüsselwort Argument beantragen.

BTW: statsmodels' kontroverse Terminologie ENDOG y exog x ist (hat x in ihm) (http://statsmodels.sourceforge.net/devel/endog_exog.html)

Ausreißer Robust Estimation

Die Antwort auf den letzten Teil der Frage ist, dass es derzeit in Python für Poisson oder andere Zählmodelle keine ausreißerstabile Schätzung gibt, soweit ich weiß.

Für überdispergierte Daten, bei denen die Varianz größer ist als der Mittelwert, können wir NegativeBinomial Regression verwenden. Für Ausreißer in Poisson müssten wir R/Rpy verwenden oder Ausreißer manuell trimmen. Die Ausreißeridentifizierung könnte auf einem der standardisierten Residuen basieren.

Es wird in statsmodels für einige Zeit nicht verfügbar sein, es sei denn, jemand trägt dazu bei.

+0

Danke, so beantwortet das meine erste Frage. Natürlich müsste ich noch viel mehr Statistiken machen, bevor ich mich mit der Nomenklatur von statsmodels vertraut mache. – robochat

+0

endog/exog ist nur etwas zu merken (mit der Hilfe, dass exog ist "ex"). Ich habe mich bisher geweigert, einen Buchstabennamen in den statsmodels-Code aufzunehmen. – user333700

+0

Als ein neuer Benutzer verwechselte mich die Bedeutung von endog/exog nicht so sehr, wie exog zu spezifizieren, und ich war verwirrt, eine Regression gegen einen Parameter durchzuführen, der zu einer Verteilung passte. Vielen Dank für deine Antworten und in der Tat für statsmodels. – robochat