Update : 7. April 2011 Diese Antwort wird ziemlich lang und deckt mehrere Aspekte des vorliegenden Problems ab. Bisher habe ich mich jedoch geweigert, es in separate Antworten aufzuteilen.
Ich habe ganz unten eine Diskussion über die Leistung von Pearson's für dieses Beispiel hinzugefügt .χ2
Bruce M. Hill hat vielleicht das "wegweisende" Papier über die Schätzung in einem Zipf-ähnlichen Kontext verfasst. Mitte der 1970er Jahre schrieb er mehrere Artikel zu diesem Thema. Der "Hill Estimator" (wie er jetzt genannt wird) stützt sich jedoch im Wesentlichen auf die maximale Ordnungsstatistik der Stichprobe. Je nach Art der vorhandenen Kürzung kann dies zu Problemen führen.
Das Hauptpapier ist:
BM Hill, Ein einfacher allgemeiner Ansatz zur Schlussfolgerung über den Schwanz einer Verteilung , Ann. Stat. 1975.
Wenn Ihre Daten anfänglich wirklich Zipf sind und dann abgeschnitten werden, kann eine nette Entsprechung zwischen der Gradverteilung und dem Zipf-Diagramm zu Ihrem Vorteil genutzt werden.
dich= # { j : X.j= i }n.
ich
Wenn wir dagegen das Zipf-Diagramm zeichnen , bei dem wir die Stichprobe vom größten zum kleinsten sortieren und dann die Werte gegen ihre Ränge zeichnen, erhalten wir einen anderen linearen Trend mit einer anderen Steigung. Die Pisten sind jedoch verwandt.
α−α−1/(α−1)α=2n=106−2−1/(2−1)=−1
ττα
β^
α^=1−1β^.
@csgillespie gab kürzlich einen von Mark Newman in Michigan mitverfassten Artikel zu diesem Thema. Er scheint viele ähnliche Artikel darüber zu veröffentlichen. Unten finden Sie eine weitere zusammen mit einigen anderen Referenzen, die von Interesse sein könnten. Newman macht statistisch gesehen manchmal nicht das Vernünftigste, seien Sie also vorsichtig.
MEJ Newman, Potenzgesetze, Pareto-Verteilungen und Zipf-Gesetz , Contemporary Physics 46, 2005, S. 323-351.
M. Mitzenmacher, Eine kurze Geschichte generativer Modelle für Potenzrecht und logarithmische Normalverteilungen , Internet Math. vol. 1, nein. 2, 2003, S. 226-251.
K. Knight, Eine einfache Modifikation des Hill-Schätzers mit Anwendungen auf Robustheit und Bias-Reduktion , 2010.
Nachtrag :
R105
> 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)
Das resultierende Diagramm ist
i≤30
Aus praktischer Sicht sollte eine solche Handlung jedoch relativ überzeugend sein.
α=2n=300000xmax=500
χ2
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
Wir berechnen auch eine zweite Statistik, die erstellt wird, indem zuerst die Anzahl in Bins der Größe 40 zusammengefasst wird, wie in Maurizios Tabelle gezeigt (der letzte Bin enthält nur die Summe von zwanzig separaten Ergebniswerten.
np
p
R
# 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 )