Comment estimer les paramètres de la distribution tronquée Zipf à partir d'un échantillon de données?

10

J'ai un problème avec le paramètre d'estimation pour Zipf. Ma situation est la suivante:

J'ai un jeu d'échantillons (mesuré à partir d'une expérience qui génère des appels qui devraient suivre une distribution Zipf). Je dois démontrer que ce générateur génère vraiment des appels avec la distribution zipf. J'ai déjà lu ce Q&R Comment calculer le coefficient de loi de Zipf à partir d'un ensemble de fréquences supérieures? mais j'atteins de mauvais résultats car j'utilise une distribution tronquée. Par exemple, si je règle la valeur "s" sur "0,9" pour le processus de génération, si j'essaie d'estimer la valeur "s" comme écrit dans le Q&R rapporté, j'obtiens "s" égal à 0,2 ca. Je pense que cela est dû au fait que j'utilise une distribution TRONCÉE (je dois limiter le zipf avec un point de troncature, il est tronqué à droite).

Comment estimer les paramètres avec une distribution zipf tronquée?

Maurizio
la source
pour être clair, que voulez-vous précisément tronquer à droite? La distribution des valeurs ou le tracé Zipf lui-même? Connaissez-vous le point de troncature? La troncature est-elle un artefact des données ou un artefact du traitement des données (par exemple, une décision que vous ou l'expérimentateur avez prise)? Tout détail supplémentaire serait utile.
cardinal
@cardinal. (partie 1/2) Merci cardinal. Je donnerai plus de détails: j'ai un générateur VoIP qui génère des appels suivant le Zipf (et autre distribution) pour le volume par appelant. Je dois vérifier que ce générateur suit vraiment ces distributions. Pour Zipf Distribution, je dois définir le point de troncature (c'est pourquoi il est connu et se réfère à la distribution des valeurs) qui est le nombre maximum d'appels générés par l'utilisateur et le paramètre d'échelle. En particulier dans mon cas, cette valeur est égale à 500, ce qui indique qu'un utilisateur peut générer un maximum de 500 appels.
Maurizio
(partie 2/2) L'autre paramètre à définir est le paramètre d'échelle pour Zipf qui définit la propagation de la distribution (cette valeur dans mon cas est 0,9). J'ai tous les paramètres (taille de l'échantillon, fréquence par utilisateur, etc.) mais je dois vérifier que mon jeu de données suit la distribution zipf.
Maurizio
donc vous êtes apparemment en train de renormaliser la distribution par , car pour ce que je considérerais comme un "Zipf tronqué", un paramètre d'échelle de 0.9 serait impossible . Si vous pouvez générer beaucoup de ces données et que vous n'avez "que" 500 résultats possibles, pourquoi ne pas simplement utiliser un test de qualité d'ajustement chi carré? Étant donné que votre distribution a une longue queue, vous devrez peut-être un assez grand échantillon. Mais ce serait une façon. Une autre méthode rapide et sale serait de vérifier que vous obtenez la bonne distribution empirique pour les petites valeurs du nombre d'appels. i=1500i0.9
cardinal

Réponses:

14

Mise à jour : 7 avril 2011 Cette réponse devient assez longue et couvre plusieurs aspects du problème à résoudre. Cependant, j'ai résisté, jusqu'à présent, à le diviser en réponses distinctes.

J'ai ajouté tout en bas une discussion sur les performances du de Pearson pour cet exemple.χ2


Bruce M. Hill est peut-être l'auteur de l'article «fondateur» sur l'estimation dans un contexte de type Zipf. Il a écrit plusieurs articles au milieu des années 70 sur le sujet. Cependant, «l'estimateur de Hill» (comme il s'appelle maintenant) s'appuie essentiellement sur les statistiques d'ordre maximal de l'échantillon et ainsi, selon le type de troncature présent, cela pourrait vous causer des ennuis.

Le document principal est:

BM Hill, Une approche générale simple de l'inférence sur la queue d'une distribution , Ann. Stat. , 1975.

Si vos données sont vraiment initialement Zipf et sont ensuite tronquées, une belle correspondance entre la distribution des degrés et le tracé Zipf peut être exploitée à votre avantage.

Plus précisément, la distribution des degrés est simplement la distribution empirique du nombre de fois que chaque réponse entière est vue,

di=#{j:Xj=i}n.

Si nous traçons ceci contre sur un tracé log-log, nous obtiendrons une tendance linéaire avec une pente correspondant au coefficient d'échelle.i

D'un autre côté, si nous traçons le tracé Zipf , où nous trions l'échantillon du plus grand au plus petit, puis traçons les valeurs en fonction de leurs rangs, nous obtenons une tendance linéaire différente avec une pente différente . Cependant les pentes sont liées.

Si est le coefficient de loi d'échelle pour la distribution Zipf, alors la pente dans le premier tracé est et la pente dans le deuxième tracé est . Vous trouverez ci-dessous un exemple de tracé pour et . Le volet de gauche est la distribution des degrés et la pente de la ligne rouge est . Le côté droit est le tracé Zipf, avec la ligne rouge superposée ayant une pente de .- α - 1 / ( α - 1 ) α = 2 n = 10 6 - 2 - 1 / ( 2 - 1 ) = - 1αα1/(α1)α=2n=10621/(21)=1

Diagrammes de distribution des degrés (à gauche) et Zipf (à droite) pour un échantillon iid d'une distribution Zipf.

Donc, si vos données ont été tronquées de sorte que vous ne voyez aucune valeur supérieure à un certain seuil , mais que les données sont autrement distribuées par Zipf et que est raisonnablement grande, alors vous pouvez estimer partir de la distribution des degrés . Une approche très simple consiste à ajuster une ligne au tracé log-log et à utiliser le coefficient correspondant.τ αττα

Si vos données sont tronquées de sorte que vous ne voyez pas de petites valeurs (par exemple, la façon dont le filtrage est effectué pour les grands ensembles de données Web), vous pouvez utiliser le tracé Zipf pour estimer la pente sur une échelle log-log puis " reculer "l'exposant de mise à l'échelle. Supposons que votre estimation de la pente à partir du tracé Zipf soit . Ensuite, une simple estimation du coefficient de la loi d'échelle est alpha =une-uneβ^

α^=11β^.

@csgillespie a donné un article récent co-écrit par Mark Newman au Michigan sur ce sujet. Il semble publier beaucoup d'articles similaires à ce sujet. Ci-dessous est un autre avec quelques autres références qui pourraient être intéressantes. Newman ne fait parfois pas la chose la plus sensée statistiquement, alors soyez prudent.

MEJ Newman, Power lois, distributions de Pareto et loi de Zipf , Contemporary Physics 46, 2005, pp. 323-351.

M. Mitzenmacher, A Brief History of Generative Models for Power Law and Lognormal Distributions , Internet Math. , vol. 1, non. 2, 2003, p. 226-251.

K. Knight, Une simple modification de l'estimateur de Hill avec des applications à la robustesse et à la réduction du biais , 2010.


Addendum :

Voici une simulation simple dans pour démontrer ce à quoi vous pourriez vous attendre si vous preniez un échantillon de taille dans votre distribution (comme décrit dans votre commentaire ci-dessous votre question d'origine).10 5R105

> x <- (1:500)^(-0.9)
> p <- x / sum(x)
> y <- sample(length(p), size=100000, repl=TRUE, prob=p)
> tab <- table(y)
> plot( 1:500, tab/sum(tab), log="xy", pch=20, 
        main="'Truncated' Zipf simulation (truncated at i=500)",
        xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)

Le tracé résultant est

Graphique Zipf "tronqué" (tronqué à i = 500)

De l'intrigue, nous pouvons voir que l'erreur relative de la distribution des degrés pour (ou ainsi) est très bonne. Vous pouvez faire un test chi carré formel, mais cela ne vous dit pas strictement que les données suivent la distribution prédéfinie. Il vous indique seulement que vous n'avez aucune preuve pour conclure que non .i30

Pourtant, d'un point de vue pratique, une telle intrigue devrait être relativement convaincante.


Addendum 2 : Considérons l'exemple que Maurizio utilise dans ses commentaires ci-dessous. Nous supposerons que et , avec une distribution Zipf tronquée ayant une valeur maximale .n = 300α=2x m a x = 500n=300000xmax=500

Nous allons calculer la statistique Pearson de deux manières. La méthode standard est via la statistique où est le nombre observé de la valeur dans l'échantillon et .X 2 = 500 i = 1 ( O i - E i ) 2χ2 OiiEi=npi=ni-α/ 500 j = 1 j-α

X2=i=1500(OiEi)2Ei
OiiEi=npi=niα/j=1500jα

Nous calculerons également une deuxième statistique formée en regroupant d'abord les nombres dans des bacs de taille 40, comme indiqué dans la feuille de calcul de Maurizio (le dernier bac ne contient que la somme de vingt valeurs de résultat distinctes.

Tirons 5000 échantillons distincts de taille de cette distribution et calculons les valeurs utilisant ces deux statistiques différentes.pnp

Les histogrammes des valeurs sont ci-dessous et sont considérés comme assez uniformes. Les taux d'erreur empiriques de type I sont respectivement de 0,0716 (méthode standard non combinée) et 0,0502 (méthode combinée) et aucun n'est statistiquement significativement différent de la valeur cible de 0,05 pour la taille d'échantillon de 5000 que nous avons choisie.p

entrez la description de l'image ici

Voici le codeR

# Chi-square testing of the truncated Zipf.

a <- 2
n <- 300000
xmax <- 500

nreps <- 5000

zipf.chisq.test <- function(n, a=0.9, xmax=500, bin.size = 40)
{
  # Make the probability vector
  x <- (1:xmax)^(-a)
  p <- x / sum(x)

  # Do the sampling
  y <- sample(length(p), size=n, repl=TRUE, prob=p)

  # Use tabulate, NOT table!
  tab <- tabulate(y,xmax)

  # unbinned chi-square stat and p-value
  discrepancy <- (tab-n*p)^2/(n*p)
  chi.stat <- sum(discrepancy)
  p.val    <- pchisq(chi.stat, df=xmax-1, lower.tail = FALSE)

  # binned chi-square stat and p-value
  bins <- seq(bin.size,xmax,by=bin.size)
  if( bins[length(bins)] != xmax )
    bins <- c(bins, xmax)

  tab.bin  <- cumsum(tab)[bins]
  tab.bin <- c(tab.bin[1], diff(tab.bin))

  prob.bin <- cumsum(p)[bins] 
  prob.bin <- c(prob.bin[1], diff(prob.bin))

  disc.bin <- (tab.bin - n*prob.bin)^2/(n * prob.bin)
  chi.stat.bin <- sum(disc.bin)
  p.val.bin <- pchisq(chi.stat.bin, df=length(tab.bin)-1, lower.tail = FALSE)

  # Return the binned and unbineed p-values
  c(p.val, p.val.bin, chi.stat, chi.stat.bin)
}

set.seed( .Random.seed[2] )

all <- replicate(nreps, zipf.chisq.test(n, a, xmax))

par(mfrow=c(2,1))
hist( all[1,], breaks=20, col="darkgrey", border="white",
      main="Histogram of unbinned chi-square p-values", xlab="p-value")
hist( all[2,], breaks=20, col="darkgrey", border="white",
      main="Histogram of binned chi-square p-values", xlab="p-value" )

type.one.error <- rowMeans( all[1:2,] < 0.05 )
cardinal
la source
+1, excellente réponse comme d'habitude. Vous devez vous nommer modérateur, il reste encore 1 heure :)
mpiktas
@mpiktas, merci pour les compliments et les encouragements. Je ne suis pas sûr de pouvoir justifier de ma candidature avec la liste déjà très forte de candidats qui, de manière uniforme, ont participé plus largement et plus longtemps que moi.
cardinal
@cardinal, voici quelques liens vers une alternative à l'estimateur de Hill: article original de Paulauskas et suivis de Vaiciulis et Gadeikis et Paulauskas . Cet estimateur aurait de meilleures propriétés que le Hill's d'origine.
mpiktas
@mpiktas, merci pour les liens. Il existe de nombreuses versions «nouvelles et améliorées» de l'estimateur de Hill. Le principal inconvénient de l'approche originale est qu'elle nécessite un choix de "coupure" sur l'endroit où arrêter la moyenne. Je pense que la plupart du temps, cela a été fait en le «regardant», ce qui ouvre la porte à des accusations de subjectivité. Un des livres de Resnick sur les distributions à longue queue en discute en détail, si je me souviens bien. Je pense que c'est son plus récent.
cardinal
@cardinal, merci beaucoup, vous êtes très gentil et très détaillé! Votre exemple en R m'a été très utile, mais comment puis-je effectuer un test chi carré formel dans ce cas? (J'ai utilisé le test du chi carré avec d'autres distributions comme uniforme, exponentielle, normale, mais j'ai de nombreux doutes sur le zipf..Désolé mais c'est ma première approche de ces sujets). Question aux modérateurs: dois-je écrire un autre Q&R comme "comment effectuer un test chi carré pour la distribution zipf tronquée?" ou continuer dans ce Q&R peut-être mettre à jour les balises et le titre?
Maurizio
5

Le papier

Clauset, A et al , Power-law Distributions in Empirical Data . 2009

contient une très bonne description de la marche à suivre pour ajuster des modèles de loi de puissance. La page Web associée contient des exemples de code. Malheureusement, il ne donne pas de code pour les distributions tronquées, mais il peut vous donner un pointeur.


Soit dit en passant, l'article discute du fait que de nombreux "ensembles de données de loi de puissance" peuvent être modélisés aussi bien (et dans certains cas mieux) avec les distributions log normales ou exponentielles!

csgillespie
la source
Malheureusement, cet article ne dit rien sur la distribution tronquée ... J'ai trouvé quelques paquets dans R qui traitent simplement du paramètre d'estimation Zipf (zipfR, VGAM) mais la distribution tronquée a besoin d'un "traitement spécial". Avec votre dernière phrase, vouliez-vous dire qu'il est possible de modéliser un ensemble de données de loi de puissance avec une distribution exponentielle, par exemple, puis d'appliquer un processus de paramètre d'estimation pour une distribution exponentielle "tronquée"? Je suis très novice dans ce sujet!
Maurizio
Dans l'article, les auteurs ré-analysent différents ensembles de données où une loi de puissance a été ajustée. Les auteurs soulignent que dans un certain nombre de cas, le modèle de loi de puissance n'est pas si bon et qu'une distribution alternative serait préférable.
csgillespie
2

Suite à la réponse détaillée du cardinal utilisateur, j'ai effectué le test du chi carré sur ma distribution présumée zipf tronquée. Les résultats du test du chi carré sont rapportés dans le tableau suivant:

entrez la description de l'image ici

StartInterval et EndInterval représentent par exemple la gamme d'appels et Observed est le nombre d'appels générant de 0 à 19 appels, et ainsi de suite. Le test du khi carré est bon jusqu'à ce que les dernières colonnes soient atteintes, elles augmentent la finale calcul, sinon jusqu'à ce point, la valeur "partielle" du chi carré était acceptable!

Avec d'autres tests, le résultat est le même, la dernière colonne (ou les 2 dernières colonnes) augmente toujours la valeur finale et je ne sais pas pourquoi et je ne sais pas si (et comment) utiliser un autre test de validation.

PS: pour être complet, pour calculer les valeurs attendues ( attendues ), je suis la suggestion du cardinal de cette manière:

entrez la description de l'image ici

où les X_i sont utilisés pour calculer :,x <- (1:n)^-S les P_i à calculer p <- x / sum(x)et enfin le E_i (nr attendu d'utilisateurs pour chaque nr d'appels) est obtenu parP_i * Total_Caller_Observed

et avec un degré de liberté = 13, la bonté du chi carré rejette toujours l'hypothèse selon laquelle le jeu d'échantillons suit la distribution Zipf parce que les statistiques de test (64, 14 dans ce cas) sont plus grandes que celles rapportées dans les tableaux du chi carré, "démérite" pour la dernière colonne. Le résultat graphique est rapporté ici: entrez la description de l'image ici

bien que le point de troncature soit fixé à 500, la valeur maximale obtenue est 294. Je pense que la "dispersion" finale est la cause de l'échec du test du chi carré.

METTRE À JOUR!!

J'essaie d'effectuer le test du chi carré sur un échantillon de données zipf présumé généré avec le code R signalé dans la réponse ci-dessus.

> x <- (1:500)^(-2)
> p <- x / sum(x)
> y <- sample(length(p), size=300000, repl=TRUE, prob=p)
> tab <- table(y)
> length(tab)
[1] 438
> plot( 1:438, tab/sum(tab), log="xy", pch=20, 
        main="'Truncated' Zipf simulation (truncated at i=500)",
        xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)

Le tracé associé est le suivant: entrez la description de l'image ici

Les résultats du test du chi carré sont présentés dans la figure suivante: entrez la description de l'image ici

et la statistique du test du chi carré (44,57) est trop élevée pour la validation avec le degré de liberté choisi. Dans ce cas également, la "dispersion" finale des données est la cause de la valeur élevée du chi carré. Mais il existe une procédure pour valider cette distribution zipf (quel que soit mon "mauvais" générateur, je veux me concentrer sur l'échantillon de données R) ???

Maurizio
la source
@Maurizio, pour une raison quelconque, j'ai manqué ce message jusqu'à présent. Existe-t-il de toute façon que vous pouvez le modifier et ajouter un tracé similaire au dernier de mon message, mais en utilisant vos données observées? Cela pourrait aider à diagnostiquer le problème. Je pense avoir vu une autre de vos questions où vous aviez du mal à produire une distribution uniforme, alors cela se retrouve peut-être également dans ces analyses. (?) Cordialement.
Cardinal
@cardinal, j'ai mis à jour les résultats! Qu'est-ce que tu penses? La question de la distribution uniforme est une autre chose que je dois préciser de façon plus précise et je le ferai aujourd'hui ou demain;)
Maurizio
@Maurizio, ont-ils été générés de manière aléatoire? Votre paramètre d'échelle comme avant? J'ai utilisé une taille d'échantillon de 8454 et un point de troncature de 500 et généré 10 000 de ces échantillons. De ces 10000, la valeur maximale observée dans l'échantillon était de 500 pour 9658 des essais, 499 pour 324 essais, 498 pour 16 essais et 497 pour 2 essais. Sur cette base, je pense que quelque chose ne va pas avec votre procédure de génération. Sauf si vous avez utilisé un paramètre d'échelle différent. S=0.9
Cardinal
@Maurizio, pour expliquer les résultats que j'ai publiés, considérez que . Ainsi, dans un échantillon de , le nombre attendu de résultats avec la valeur 500 est . La probabilité de voir au moins un de ces résultats est de . Notez à quel point cela correspond à la simulation ci-dessus. n = 8454 8454 4,05 10 - 43,43 1 - ( 1 - 0,000405 ) 84540,9675p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675
cardinal
@cardinal, je pense aussi qu'il y a quelque chose de "faux" dans la procédure de génération (mon objectif est de valider que ce générateur suit vraiment la distribution Zipf). Je dois parler avec les concepteurs du projet ces jours-ci.
Maurizio