¿Cómo saber si mis datos se ajustan a la distribución de Pareto?

10

Tengo una muestra que es un vector con 220 números. Aquí hay un enlace a un histograma de mis datos. . Y deseo verificar si mis datos se ajustan a una distribución de Pareto, pero no quiero ver gráficos QQ con esa distribución, pero necesito una respuesta exacta con el valor p en R, como la prueba de normalidad de Anderson-Darling ( ad.test) . ¿Cómo podría hacer eso? Por favor se tan especifico como puedas.

fuerte
fuente
1
El resultado de una prueba estadística no le indicará que sus datos tienen una distribución de Pareto . De hecho, puede estar bastante seguro de que si se trata de datos reales, no tienen una distribución de Pareto. Todo lo que le mostrará una prueba es si tiene suficientes datos para recoger la desviación de la cantidad de Pareto que tiene. Es decir, si rechaza todo lo que dice es "sí, el tamaño de la muestra fue lo suficientemente grande como para decirle lo que ya sabía". ¿Por qué emprenderías tal ejercicio, uno que no puede responder la pregunta real que tienes?
Glen_b -Reinstala a Monica el
¿Su pregunta realmente no es más que "qué líneas de código escribo para que el programa R haga el procedimiento X"? Entonces está fuera de tema aquí. Se podría calificar como una cuestión de programación. Si hay un aspecto estadístico en su pregunta (como '¿tiene sentido hacer esto?'), Entonces debe aclarar y enfatizar esos aspectos
Glen_b -Reinstale a Monica el
1
Ahora a la prueba Anderson-Darling (o, para el caso, el Kolmogorov-Smirnov que @Zen sugirió anteriormente). Esas son pruebas para distribuciones completamente especificadas . Es decir, para que las pruebas tengan las propiedades deseadas, debe especificar a priori ( NO estimar ) todos los parámetros. Por lo tanto, no puede usar ninguno de ellos para este ejercicio porque no tiene parámetros previamente especificados. (Presumiblemente estás haciendo esto por sugerencia de otra persona. Es muy difícil explicar conceptos erróneos a alguien a través de un intermediario.)
Glen_b -Reinstalar a Monica el
¿Para qué estás haciendo esta prueba? por ejemplo, ¿qué acciones cambiarán dependiendo de si rechaza o no rechaza?
Glen_b -Reinstala a Monica el
Siempre debe mirar un diagrama QQ, independientemente de su motivo. Y no debe fetichizar un valor P "exacto". Una prueba diferente le daría un valor P "exacto" diferente.
Nick Cox

Respuestas:

13

(PS) En primer lugar, creo que Glen_b tiene razón en sus comentarios anteriores sobre la utilidad de tal prueba: los datos reales seguramente no están exactamente distribuidos por Pareto, y para la mayoría de las aplicaciones prácticas la pregunta sería "¿qué tan buena es la aproximación de Pareto?" - y el gráfico QQ es una buena manera de mostrar la calidad de tal aproximación.

De cualquier manera, puede hacer su prueba con la estadística de Kolmogorov-Smirnov, después de estimar los parámetros por máxima probabilidad. La estimación de este parámetro impide utilizar elp-value de ks.test, por lo que puede hacer bootstrap paramétrico para estimarlo. Como Glen_b dice en el comentario, esto se puede conectar a la prueba de Lilliefors .

Aquí hay algunas líneas de código R.

Primero defina las funciones básicas para manejar las distribuciones de Pareto.

# distribution, cdf, quantile and random functions for Pareto distributions
dpareto <- function(x, xm, alpha) ifelse(x > xm , alpha*xm**alpha/(x**(alpha+1)), 0)
ppareto <- function(q, xm, alpha) ifelse(q > xm , 1 - (xm/q)**alpha, 0 )
qpareto <- function(p, xm, alpha) ifelse(p < 0 | p > 1, NaN, xm*(1-p)**(-1/alpha))
rpareto <- function(n, xm, alpha) qpareto(runif(n), xm, alpha)

La siguiente función calcula el MLE de los parámetros (justificaciones en Wikipedia ).

pareto.mle <- function(x)
{
  xm <- min(x)
  alpha <- length(x)/(sum(log(x))-length(x)*log(xm))
  return( list(xm = xm, alpha = alpha))
}

Y estas funciones calculan la estadística KS, y usan bootstrap paramétrico para estimar el p-valor.

pareto.test <- function(x, B = 1e3)
{
  a <- pareto.mle(x)

  # KS statistic
  D <- ks.test(x, function(q) ppareto(q, a$xm, a$alpha))$statistic

  # estimating p value with parametric bootstrap
  B <- 1e5
  n <- length(x)
  emp.D <- numeric(B)
  for(b in 1:B)
  {
    xx <- rpareto(n, a$xm, a$alpha);
    aa <- pareto.mle(xx)
    emp.D[b] <- ks.test(xx, function(q) ppareto(q, aa$xm, aa$alpha))$statistic
  }

  return(list(xm = a$xm, alpha = a$alpha, D = D, p = sum(emp.D > D)/B))
}

Ahora, por ejemplo, una muestra proveniente de una distribución de Pareto:

> # generating 100 values from Pareto distribution
> x <- rpareto(100, 0.5, 2)
> pareto.test(x)
$xm
[1] 0.5007593

$alpha
[1] 2.080203

$D
         D 
0.06020594 

$p
[1] 0.69787

... y de un χ2(2):

> # generating 100 values from chi square distribution
> x <- rchisq(100, df=2)
> pareto.test(x)
$xm
[1] 0.01015107

$alpha
[1] 0.2116619

$D
        D 
0.4002694 

$p
[1] 0

Tenga en cuenta que no afirmo que esta prueba sea imparcial: cuando la muestra es pequeña, puede existir algún sesgo. El bootstrap paramétrico no tiene muy en cuenta la incertidumbre en la estimación del parámetro (piense en lo que sucedería al usar esta estrategia para probar ingenuamente si la media de alguna variable normal con varianza desconocida es cero).

PS Wikipedia dice algunas palabras sobre esto. Aquí hay otras dos preguntas para las cuales se sugirió una estrategia similar: prueba de bondad de ajuste para una mezcla , prueba de bondad de ajuste para una distribución gamma .

Elvis
fuente
3
Cuando ajusta la distribución del estadístico de prueba para la estimación de parámetros de esta manera, no es una prueba de KS (aunque se base en estadísticas de KS), es un tipo particular de prueba de Lilliefors . Esto ya no es no paramétrico, pero se puede construir uno mediante simulación para cualquier distribución dada. Lilliefors hizo esto específicamente para lo normal y exponencial ... en la década de 1960.
Glen_b -Reinstala a Monica el
Gracias por este comentario @Glen_b No lo sabía.
Elvis
No hay problema; no cambia nada sobre el contenido de lo que está haciendo (que está bien como está), solo lo que debería llamarse.
Glen_b -Reinstalar Monica
@Glen_b Hice algunos cambios sustanciales en mi respuesta, ¡gracias de nuevo!
Elvis