33 votos

¿Cómo saber si un dato sigue una distribución de Poisson en R?

Soy estudiante de grado y tengo un proyecto para mi clase de probabilidad. Básicamente, tengo un conjunto de datos sobre los huracanes que afectaron a mi país durante una serie de años.

En mi libro de probabilidad, (Probabilidad y Estadística con R) hay un ejemplo (no completo) de cómo comprobar si los datos siguen una distribución de Poisson, empiezan a intentar demostrar que se siguen estos 3 criterios: (De mi libro, página 120 (criterios) página 122-123 ejemplo)

1- El número de resultados en los intervalos no superpuestos son independientes. En otras palabras, el número de resultados en el intervalo de tiempo (0,t] son independientes del número de resultados en el intervalo de tiempo (t, t+h], h > 0

2- La probabilidad de que se produzcan dos o más resultados en un intervalo suficientemente corto es prácticamente nula. En otras palabras, siempre que h sea suficientemente pequeño, la probabilidad de obtener dos o más resultados en el intervalo (t,t+h] es despreciable en comparación con la probabilidad de obtener uno o cero resultados en el mismo intervalo de tiempo.

3- La probabilidad de que se produzca exactamente un resultado en un intervalo suficientemente corto o en una región pequeña es proporcional a la longitud del intervalo o de la región. En otras palabras, la probabilidad de un resultado en un intervalo de longitud h es lambda*h.

Pero el criterio 3 se deja "como ejercicio".

A- ¿Puede alguien decirme si hay una forma más "fácil" de ver si mi conjunto de datos sigue una distribución de Poisson?

B- ¿Puede alguien explicarme los criterios 1 y 3 con algún tipo de ejemplo (si es con R, fantástico)?

Gracias.

Nota: Perdón por el largo post. Además, tengo que convertir los datos para que tenga una tabla como:

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

41voto

AdamSane Puntos 1825

Hay un número infinito de maneras de que una distribución sea ligeramente diferente de una distribución de Poisson; no se puede identificar que un conjunto de datos es extraído de una distribución de Poisson. Lo que puedes hacer es buscar incoherencias con lo que deberías ver con una Poisson, pero una falta de incoherencia obvia no la convierte en Poisson.

Sin embargo, de lo que hablas ahí al comprobar esos tres criterios no es de comprobar que los datos provienen de una distribución de Poisson por medios estadísticos (es decir, mirando los datos), sino de evaluar si el proceso por el que se generan los datos satisface las condiciones de un proceso de Poisson; si las condiciones se mantuvieran todas o casi (y eso es una consideración del proceso de generación de datos), podrías tener algo de un proceso de Poisson o muy cercano a él, lo que a su vez sería una forma de obtener datos que se extraen de algo cercano a una distribución de Poisson.

Pero las condiciones no se cumplen de varias maneras... y la más alejada de ser cierta es la número 3. No hay ninguna razón en particular sobre esa base para afirmar un proceso de Poisson, aunque las violaciones pueden no ser tan graves que los datos resultantes están lejos de Poisson.

Así que volvemos a los argumentos estadísticos que provienen del examen de los propios datos.

Como se mencionó al principio, lo que puedes hacer es comprobar si los datos no son obviamente inconsistentes con que la distribución subyacente sea Poisson, pero eso no te dice que se extraigan de una Poisson (ya puedes estar seguro de que no lo son).

Se puede hacer esta comprobación mediante pruebas de bondad de ajuste.

La prueba de chi-cuadrado que se ha mencionado es una de ellas, pero yo mismo no recomendaría la prueba de chi-cuadrado para esta situación**; tiene poca potencia contra lo que mucha gente vería como las desviaciones más relevantes (por ejemplo, un cambio en la dispersión en relación con un Poisson con la misma media, cambios en la asimetría, etc.). Si su objetivo es tener una buena potencia contra ese tipo de efectos, no lo conseguirá así.

El principal valor de la chi-cuadrado está en la simplicidad, y tiene un valor pedagógico; fuera de eso, no suele considerarse especialmente competitiva como prueba de bondad de ajuste.

** Añadido en la edición posterior: Ahora que está claro que esto es una tarea, las posibilidades de que se espera que haga un prueba de chi-cuadrado para comprobar que los datos no son inconsistentes con un Poisson sube bastante. Véase mi ejemplo de prueba de bondad de ajuste de chi-cuadrado, realizada debajo del primer gráfico de Poisson


La gente suele hacer estas pruebas por la razón equivocada (por ejemplo, porque quieren decir "por lo tanto, está bien hacer alguna otra cosa estadística con los datos que supone que los datos son de Poisson"). La verdadera pregunta es "¿hasta qué punto podría ser erróneo?" ... y las pruebas de bondad de ajuste no ayudan mucho a responder a esa pregunta. A menudo, la respuesta a esa pregunta es, en el mejor de los casos, independiente (o casi independiente) del tamaño de la muestra y, en algunos casos, con consecuencias que tienden a desaparecer con el tamaño de la muestra... mientras que una prueba de bondad de ajuste es inútil con muestras pequeñas (donde el riesgo de violación de los supuestos suele ser mayor).

Si tiene que probar una distribución de Poisson, hay algunas alternativas razonables. Una de ellas sería hacer algo parecido a una prueba Anderson-Darling, basada en el estadístico AD pero utilizando una distribución simulada bajo la nula (para tener en cuenta los problemas gemelos de una distribución discreta y que hay que estimar los parámetros).

Una alternativa más sencilla podría ser una prueba suave de bondad de ajuste: se trata de un conjunto de pruebas diseñadas para distribuciones individuales mediante la modelización de los datos con una familia de polinomios que son ortogonales con respecto a la función de probabilidad en el nulo. Las alternativas de bajo orden (es decir, interesantes) se prueban comprobando si los coeficientes de los polinomios por encima de la base uno son diferentes de cero, y normalmente pueden tratar la estimación de parámetros omitiendo los términos de menor orden de la prueba. Hay una prueba de este tipo para el Poisson. Puedo buscar una referencia si la necesitas.

También podría utilizar la correlación (o, para ser más como una prueba de Shapiro-Francia, tal vez $n(1-r^2)$ ) en un gráfico de Poissonness - por ejemplo, un gráfico de $\log(x_k)+\log(k!)$ vs $k$ (véase Hoaglin, 1980) - como estadística de prueba.

Aquí hay un ejemplo de ese cálculo (y gráfico), hecho en 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))

enter image description here

Aquí está la estadística que sugerí que podría usarse para una prueba de bondad de ajuste de un Poisson:

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

Por supuesto, para calcular el valor p, también hay que simular la distribución del estadístico de la prueba bajo la nulidad (y no he discutido cómo se podría tratar con los recuentos de cero dentro del rango de valores). Esto debería producir una prueba razonablemente potente. Hay muchas otras pruebas alternativas.

Este es un ejemplo de cómo hacer un gráfico de Poisson en una muestra de tamaño 50 de una distribución geométrica (p=.3):

enter image description here

Como se ve, muestra un claro "pliegue", que indica la no linealidad


Las referencias para el gráfico de Poissonness serían:

David C. Hoaglin (1980),
"Una parcela de Poissonness",
El Estadístico Americano
Vol. 34, No. 3 (Ago., ), pp. 146-149

y

Hoaglin, D. y J. Tukey (1985),
"9. Comprobación de la forma de las distribuciones discretas",
Exploración de tablas de datos, tendencias y formas ,
(Hoaglin, Mosteller & Tukey eds)
John Wiley & Sons

La segunda referencia contiene un ajuste de la trama para recuentos pequeños; probablemente querrás incorporarlo (pero no tengo la referencia a mano).


Ejemplo de realización de una prueba de bondad de ajuste chi-cuadrado:

Además de realizar la bondad de ajuste de chi-cuadrado, la forma en que normalmente se espera que se haga en muchas clases (aunque no la forma en que yo lo haría):

1: partiendo de tus datos, (que tomaré como los datos que generé aleatoriamente en 'y' más arriba, genera la tabla de recuentos:

(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: calcular el valor esperado en cada celda, suponiendo un Poisson ajustado por 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: observe que las categorías finales son pequeñas; esto hace que la distribución chi-cuadrado sea menos buena como aproximación a la distribución de la estadística de la prueba (una regla común es que se quieren valores esperados de al menos 5, aunque numerosos trabajos han demostrado que esa regla es innecesariamente restrictiva; yo me acercaré, pero el enfoque general puede adaptarse a una regla más estricta). Colapsar las categorías adyacentes, de modo que los valores mínimos esperados no sean demasiado inferiores a 5 (una categoría con un recuento esperado cerca de 1 de más de 10 categorías no está tan mal, dos está bastante al límite). También hay que tener en cuenta que todavía no hemos tenido en cuenta la probabilidad más allá de "10", así que también tenemos que incorporar eso:

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: del mismo modo, colapsar las categorías en lo observado:

(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: Poner en una tabla, (opcionalmente) junto con la contribución al chi-cuadrado $(O_i-E_i)^2/E_i$ y el residuo de Pearson (la raíz cuadrada con signo de la contribución), estos pueden ser útiles cuando se trata de ver dónde no encaja tan bien:

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: Calcular $X^2 = \sum_i (E_i-O_i)^2/E_i$ , con una pérdida de 1df para que el total esperado coincida con el total observado, y 1 más para estimar el parámetro:

(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

Tanto el diagnóstico como el valor p no muestran ninguna falta de ajuste aquí... lo cual era de esperar, ya que los datos que generamos eran realmente de Poisson.


Edición: aquí hay un enlace al blog de Rick Wicklin en el que se discute el gráfico de Poissonness, y se habla de las implementaciones en SAS y Matlab

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


Edit2: Si lo tengo claro, el gráfico de Poissonness modificado de la referencia de 1985 sería*:

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))

* En realidad también ajustan el intercepto, pero no lo he hecho aquí; no afecta a la apariencia del gráfico, pero hay que tener cuidado si se implementa cualquier otra cosa de la referencia (como los intervalos de confianza) si se hace de forma diferente a su enfoque.

(En el ejemplo anterior, el aspecto apenas cambia con respecto al primer gráfico de Poisson).

8voto

trlovejoy Puntos 33

Realice la prueba de bondad de ajuste chi-cuadrado. En el caso de los datos de recuento, podemos utilizar goodfit() incluido en el paquete vcd. Tenga en cuenta que si el valor p es mayor que 0,05, no podemos rechazar h0: el proceso es un proceso de Poisson. O bien, no es un proceso de 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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X