(PS) Tout d'abord, je pense que Glen_b a raison dans ses commentaires ci-dessus sur l'utilité d'un tel test: les données réelles ne sont certainement pas exactement distribuées par Pareto, et pour la plupart des applications pratiques, la question serait "quelle est la qualité de l'approximation de Pareto?" - et le tracé QQ est un bon moyen de montrer la qualité d'une telle approximation.
De toute façon, vous pouvez faire votre test avec la statistique de Kolmogorov-Smirnov, après avoir estimé les paramètres par maximum de vraisemblance. Cela empêche d'estimation des paramètres à utiliser le -value de , de sorte que vous pouvez faire bootstrap paramétrique pour estimer. Comme Glen_b le dit dans le commentaire, cela peut être connecté au test de Lilliefors .pks.test
Voici quelques lignes de code R.
Définissez d'abord les fonctions de base pour gérer les distributions 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 fonction suivante calcule le MLE des paramètres (justifications dans Wikipedia ).
pareto.mle <- function(x)
{
xm <- min(x)
alpha <- length(x)/(sum(log(x))-length(x)*log(xm))
return( list(xm = xm, alpha = alpha))
}
Et ces fonctions calculent la statistique KS et utilisent le bootstrap paramétrique pour estimer la valeur .p
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))
}
Maintenant, par exemple, un échantillon provenant d'une distribution 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
... et à partir d'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
Notez que je ne prétends pas que ce test est non biaisé: lorsque l'échantillon est petit, un biais peut exister. Le bootstrap paramétrique ne prend pas bien en compte l'incertitude sur l'estimation des paramètres (pensez à ce qui se passerait lors de l'utilisation de cette stratégie pour tester naïvement si la moyenne d'une variable normale avec une variance inconnue est nulle).
PS Wikipedia en dit quelques mots. Voici deux autres questions pour lesquelles une stratégie similaire a été suggérée: test d'adéquation pour un mélange , test d'adéquation pour une distribution gamma .