Come sapere se un dato segue una distribuzione di Poisson in R?


25

Sono uno studente universitario e ho un progetto per la mia classe di probabilità. Fondamentalmente, ho un set di dati sugli uragani che hanno colpito il mio paese per una serie di anni.

Nel mio libro delle probabilità, (Probabilità e statistiche con R) c'è un esempio (non completo) di come verificare se i dati seguono una distribuzione di Poisson, iniziano a provare a seguire questi 3 criteri: (Dal mio libro, pagina 120 (criteri) pagina 122-123 esempio)

1- Il numero di risultati in intervalli non sovrapposti è indipendente. In altre parole, il numero di risultati nell'intervallo di tempo (0, t] è indipendente dal numero di risultati nell'intervallo di tempo (t, t + h], h> 0

2- La probabilità di due o più risultati in un intervallo sufficientemente breve è praticamente zero. In altre parole, se h è sufficientemente piccolo, la probabilità di ottenere due o più risultati nell'intervallo (t, t + h] è trascurabile rispetto alla probabilità di ottenere uno o zero risultati nello stesso intervallo di tempo.

3- La probabilità di un esito esatto in un intervallo sufficientemente breve o in una piccola regione è proporzionale alla lunghezza dell'intervallo o della regione. In altre parole, la probabilità di un risultato in un intervallo di lunghezza h è lambda * h.

Ma il criterio 3 è lasciato "come esercizio".

A- Qualcuno può dirmi se esiste un modo più "semplice" per vedere se il mio set di dati segue una distribuzione di Poisson?

B- Qualcuno può spiegarmi i criteri 1 e 3 con qualche tipo di esempio (se è con R, fantastico)?

Grazie!

Nota: scusate il lungo post. Inoltre, devo convertire i dati in modo da avere una tabella come:

  number of hurricanes       | 0 | 1 | 2  etc.
  -----------------------------------------
  total years that have      |   |   |
  that number of hurricanes  |   |   |

I criteri nel tuo libro sono per i dati sugli intervalli; sarebbe utile se tu avessi le date in cui si verificano gli uragani ... inoltre questi criteri sono per i processi di Poisson a tasso costante , il che ovviamente (o lo spero) non è il caso degli uragani. Per verificare se i tuoi dati di conteggio seguono una distribuzione di Poisson, un primo approccio elementare è il test chi-quadro.
Elvis,

Risposte:


33

Esistono infiniti modi in cui una distribuzione può essere leggermente diversa da una distribuzione di Poisson; non è possibile identificare che un insieme di dati viene estratto da una distribuzione di Poisson. Quello che puoi fare è cercare l'incoerenza con ciò che dovresti vedere con un Poisson, ma una mancanza di evidente incoerenza non lo rende Poisson.

Tuttavia, ciò di cui stai parlando verificando questi tre criteri non è verificare che i dati provengano da una distribuzione di Poisson con mezzi statistici (cioè guardando i dati), ma valutando se il processo che i dati sono generati soddisfa i condizioni di un processo di Poisson; se le condizioni fossero tutte o quasi trattenute (e ciò è una considerazione del processo di generazione dei dati), potresti avere qualcosa da o molto vicino a un processo di Poisson, che a sua volta sarebbe un modo per ottenere dati che sono disegnati da qualcosa di vicino a un Distribuzione di Poisson.

Ma le condizioni non valgono in molti modi ... e il più lontano dall'essere vero è il numero 3. Non vi è alcun motivo particolare su quella base per affermare un processo di Poisson, anche se le violazioni potrebbero non essere così gravi che i dati risultanti sono lontani da Poisson.

Quindi torniamo agli argomenti statistici che derivano dall'esame dei dati stessi. In che modo i dati mostrerebbero che la distribuzione era Poisson, piuttosto che qualcosa del genere?

Come accennato all'inizio, ciò che puoi fare è verificare se i dati non sono ovviamente incoerenti con la distribuzione sottostante Poisson, ma ciò non ti dice che sono stati estratti da un Poisson (puoi già essere sicuro che siano non).

È possibile eseguire questo controllo tramite test di bontà di adattamento.

Il chi-quadrato che è stato menzionato è uno di questi, ma non consiglierei io stesso il test del chi-quadrato per questa situazione **; ha un basso potere contro deviazioni interessanti. Se il tuo obiettivo è avere un buon potere, non lo otterrai in questo modo (se non ti interessa il potere, perché dovresti testarlo?). Il suo valore principale è nella semplicità e ha valore pedagogico; al di fuori di questo, non è competitivo come un test di bontà di adattamento.

** Aggiunti nella modifica successiva: ora che è chiaro che si tratta di compiti a casa, le probabilità che tu debba fare un test chi-quadrato per verificare che i dati non siano incoerenti con un Poisson aumentano abbastanza. Vedi il mio esempio di bontà chi-quadro del test di adattamento, eseguito sotto il primo diagramma di Poissonness


Le persone spesso fanno questi test per la ragione sbagliata (ad esempio perché vogliono dire "quindi va bene fare qualche altra cosa statistica con i dati che presuppongono che i dati siano Poisson"). La vera domanda è "quanto male potrebbe andare?" ... e la bontà dei test di adattamento non è di grande aiuto per questa domanda. Spesso la risposta a questa domanda è nella migliore delle ipotesi indipendente (/ quasi indipendente) dalla dimensione del campione - e in alcuni casi, una con conseguenze che tendono ad andare via con la dimensione del campione ... mentre un test di bontà di adattamento è inutile con piccoli campioni (in cui il rischio derivante da violazioni di ipotesi è spesso al massimo).

Se devi testare una distribuzione di Poisson ci sono alcune alternative ragionevoli. Uno sarebbe fare qualcosa di simile a un test Anderson-Darling, basato sulla statistica AD ma usando una distribuzione simulata sotto il valore null (per tenere conto dei problemi gemelli di una distribuzione discreta e che è necessario stimare i parametri).

Un'alternativa più semplice potrebbe essere un Smooth Test per la bontà dell'adattamento: si tratta di una raccolta di test progettati per le singole distribuzioni modellando i dati utilizzando una famiglia di polinomi che sono ortogonali rispetto alla funzione di probabilità nel nulla. Le alternative di ordine inferiore (cioè interessanti) vengono testate verificando se i coefficienti dei polinomi sopra quello di base sono diversi da zero e questi possono di solito gestire la stima dei parametri omettendo i termini di ordine più basso dal test. C'è un simile test per il Poisson. Posso trovare un riferimento se ne hai bisogno.

Potresti anche usare la correlazione (o, per essere più simile a un test di Shapiro-Francia, forse ) in un diagramma di Poissonness - ad esempio un diagramma di vs (vedi Hoaglin, 1980) - come statistica test.n(1-r2)log(XK)+log(K!)K

Ecco un esempio di quel calcolo (e trama), fatto in R:

y=rpois(100,5)
n=length(y)
(x=table(y))
y
 0  1  2  3  4  5  6  7  8  9 10 
 1  2  7 15 19 25 14  7  5  1  4 

k=as.numeric(names(x))
plot(k,log(x)+lfactorial(k))

inserisci qui la descrizione dell'immagine

Ecco la statistica che ho suggerito potrebbe essere utilizzata per un test di adattamento di un Poisson:

n*(1-cor(k,log(x)+lfactorial(k))^2)
[1] 1.0599

Ovviamente, per calcolare il valore p, avresti anche bisogno di simulare la distribuzione della statistica test sotto il valore null (e non ho discusso su come si potrebbero gestire i conteggi zero all'interno dell'intervallo di valori). Ciò dovrebbe produrre un test ragionevolmente potente. Esistono numerosi altri test alternativi.

Ecco un esempio di come realizzare un diagramma di Poissonness su un campione di dimensione 50 da una distribuzione geometrica (p = .3):

inserisci qui la descrizione dell'immagine

Come vedi, mostra un chiaro "nodo", che indica la non linearità


I riferimenti per la trama di Poissonness sarebbero:

David C. Hoaglin (1980),
"A Poissonness Plot",
The American Statistician
Vol. 34, n. 3 (agosto,), pagg. 146-149

e

Hoaglin, D. e J. Tukey (1985),
"9. Verifica della forma delle distribuzioni discrete",
esplorazione di tabelle di dati, tendenze e forme ,
(edizioni di Hoaglin, Mosteller e Tukey)
John Wiley & Sons

Il secondo riferimento contiene un adattamento alla trama per piccoli conteggi; probabilmente vorresti incorporarlo (ma non ho il riferimento a portata di mano).


Esempio di test di bontà chi-quadrato di adattamento:

A parte eseguire la bontà chi-quadrato dell'adattamento, il modo in cui ci si aspetterebbe di solito in molte classi (anche se non nel modo in cui lo farei):

1: a partire dai tuoi dati, (che prenderò per essere i dati che ho generato casualmente in 'y' sopra, genera la tabella dei conteggi:

(x=table(y))
y
 0  1  2  3  4  5  6  7  8  9 10 
 1  2  7 15 19 25 14  7  5  1  4 

2: calcola il valore atteso in ogni cella, assumendo un Poisson montato da ML:

 (expec=dpois(0:10,lambda=mean(y))*length(y))
 [1]  0.7907054  3.8270142  9.2613743 14.9416838 18.0794374 17.5008954 14.1173890  9.7611661
 [9]  5.9055055  3.1758496  1.5371112

3: notare che le categorie finali sono piccole; questo rende la distribuzione del chi-quadrato meno buona come approssimazione alla distribuzione della statistica del test (una regola comune è che tu desideri valori attesi di almeno 5, anche se numerosi articoli hanno dimostrato che la regola è inutilmente restrittiva; lo prenderò vicino, ma l'approccio generale può essere adattato a una regola più rigorosa). Comprimi le categorie adiacenti, in modo che i valori minimi previsti siano almeno non troppo al di sotto di 5 (una categoria con un conto alla rovescia atteso vicino a 1 su più di 10 categorie non è male, due è piuttosto borderline). Si noti inoltre che non abbiamo ancora tenuto conto della probabilità oltre "10", quindi è necessario includere anche questo:

expec[1]=sum(expec[1:2])
expec[2:8]=expec[3:9]
expec[9]=length(y)-sum(expec[1:8])
expec=expec[1:9]
expec
sum(expec) # now adds to n

4: allo stesso modo, comprimi categorie sull'osservato:

(obs=table(y))
obs[1]=sum(obs[1:2])
obs[2:8]=obs[3:9]
obs[9]=sum(obs[10:11])
obs=obs[1:9]

5: Metti in una tabella, (facoltativamente) insieme al contributo a chi-quadrato e il residuo di Pearson (la radice quadrata firmata del contributo), questi possono essere utili quando cerchi di vedere dove non si adatta così bene:(Oio-Eio)2/Eio

print(cbind(obs,expec,PearsonRes=(obs-expec)/sqrt(expec),ContribToChisq=(obs-expec)^2/expec),d=4)
  obs  expec PearsonRes ContribToChisq
0   3  4.618   -0.75282      0.5667335
1   7  9.261   -0.74308      0.5521657
2  15 14.942    0.01509      0.0002276
3  19 18.079    0.21650      0.0468729
4  25 17.501    1.79258      3.2133538
5  14 14.117   -0.03124      0.0009761
6   7  9.761   -0.88377      0.7810581
7   5  5.906   -0.37262      0.1388434
8   5  5.815   -0.33791      0.1141816

6: Calcola , con perdita di 1df per il totale previsto corrispondente al totale osservato e 1 altro per la stima del parametro:X2=Σio(Eio-Oio)2/Eio

(chisq = sum((obs-expec)^2/expec))
[1] 5.414413
(df = length(obs)-1-1) # lose an additional df for parameter estimate
[1] 7
(pvalue=pchisq(chisq,df))
[1] 0.3904736

Sia la diagnostica che il valore p non mostrano alcuna mancanza di adattamento qui ... cosa che ci aspetteremmo, dato che i dati che abbiamo generato in realtà erano Poisson.


Modifica: ecco un link al blog di Rick Wicklin che discute della trama di Poissonness e parla delle implementazioni in SAS e Matlab

http://blogs.sas.com/content/iml/2012/04/12/the-poissonness-plot-a-goodness-of-fit-diagnostic/


Edit2: Se ho ragione, la trama di Poissonness modificata dal riferimento del 1985 sarebbe *:

y=rpois(100,5)
n=length(y)
(x=table(y))
k=as.numeric(names(x))
x=as.vector(x)
x1 = ifelse(x==0,NA,ifelse(x>1,x-.8*x/n-.67,exp(-1)))
plot(k,log(x1)+lfactorial(k))

* Anche loro regolano l'intercettazione, ma non l'ho fatto qui; non influisce sull'aspetto della trama, ma bisogna fare attenzione se si implementa qualcos'altro dal riferimento (come gli intervalli di confidenza) se lo si fa in modo completamente diverso dal loro approccio.

(Per l'esempio sopra, l'aspetto non cambia quasi dal primo diagramma di Poissonness.)


2
Grazie per la tua risposta! Ma devo dire che non conosco nessun argomento di cui stai parlando. Mi chiedevo se un QQplot diventasse una manciata per questo. Cosa pensi? Dalle alternative che dai, che pensi che dovrei usare? la bontà si adatta? Dove posso trovare informazioni e / o i test di cui stai parlando? (del Smooth Test per il godness fit) Inoltre, sapevi se qualcuno ha il codice R per il codice del blog? (Non conosco Matlab o SAS). E molte grazie per la tua risposta!
Shariff

Inoltre, quale distribuzione ritieni che i miei dati possano "adattarsi"? (non fa parte dei miei compiti, ma sarà bello saperlo :))
Shariff

Come generereste un QQplot per Poisson senza assumere il parametro? (Suppongo che potresti lavorare con una trasformazione di Poisson se il parametro non è troppo piccolo. O potresti usare MLE per il parametro sconosciuto, ma poi la trama tende ad apparire "migliore" di quanto altrimenti farebbe - devi regolare il tuo giudizio quando lo fai). La trama di Poissonness ha lo scopo di agire in modo simile a un QQplot e deve essere interpretata in modo simile. Se vuoi una valutazione diagnostica, suggerirei quel diagramma (preferibilmente con le modifiche menzionate se uno di noi può individuarle).
Glen_b -Restate Monica

Non posso dire quali dati di distribuzione non ho visto potrebbero adattarsi, ma a meno che non ce ne siano molti, molte distribuzioni potrebbero aver plausibilmente generato i dati.
Glen_b -Restate Monica

bene, forse posso usare una lambda stimata dei valori osservati per i dati per il QQplot ma ho letto un po 'e sembra che i QQplot siano migliori per i dati continui (non così buono per i dati discreti). Sai tradurre il codice? Sarà molto apprezzato! Fammi sapere se hai il codice! (Ti darò il credito per il codice, ovviamente :))
Shariff

5

Eseguire la bontà chi-quadrata del test di adattamento. In caso di dati di conteggio, possiamo usare goodfit()inclusi nel pacchetto vcd. Si noti che se il valore p è maggiore di 0,05, non possiamo rifiutare h0: il processo è un processo di Poisson. Altrimenti, non è un processo di Poisson.

# load the vcd package
library(vcd) ## loading vcd package

# generate two processes for test
set.seed(2014);y=rpois(200,5)
set.seed(2014);y=rnorm(100, 5, 0.3) # goodfit asks for non-negative values
# output the results
gf = goodfit(y,type= "poisson",method= "ML")
plot(gf,main="Count data vs Poisson distribution")
summary(gf)

# to automatically get the pvalue
gf.summary = capture.output(summary(gf))[[5]]
pvalue = unlist(strsplit(gf.summary, split = " "))
pvalue = as.numeric(pvalue[length(pvalue)]); pvalue

# to mannualy compute the pvalue
chisq = sum(  (gf$observed-gf$fitted)^2/gf$fitted )

df = length(gf$observed)-1-1
pvalue = pchisq(chisq,df)
pvalue

3
pchisqP(XX)P(XX)pvalue=1-pchisq(chisq,df)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.