Aktualizacja : 7 kwietnia 2011 r. Ta odpowiedź jest dość długa i obejmuje wiele aspektów aktualnego problemu. Jednak jak dotąd opierałem się, dzieląc go na osobne odpowiedzi.
Na samym dole dodałem dyskusję na temat wydajności Pearsona dla tego przykładu.χ2)
Być może Bruce M. Hill jest autorem „przełomowego” artykułu na temat szacunków w kontekście podobnym do Zipf. W połowie lat 70. napisał na ten temat kilka artykułów. Jednak „estymator Hill” (jak się teraz nazywa) zasadniczo opiera się na statystykach maksymalnego rzędu próbki, a zatem, w zależności od rodzaju obcięcia, może sprawić ci kłopotów.
Główny artykuł to:
BM Hill, Proste ogólne podejście do wnioskowania na temat ogona dystrybucji , Ann. Stat. , 1975.
Jeśli twoje dane naprawdę są początkowo Zipf, a następnie są obcinane, to dobra korespondencja między rozkładem stopni a działką Zipf może zostać wykorzystana na Twoją korzyść.
W szczególności rozkład stopni jest po prostu rozkładem empirycznym liczby wyświetleń każdej odpowiedzi całkowitej,
reja= # { j : Xjot= i }n.
Jeśli narysujemy to względem na wykresie log-log, otrzymamy trend liniowy o nachyleniu odpowiadającym współczynnikowi skalowania.ja
Z drugiej strony, jeśli wykreślimy wykres Zipf , w którym sortujemy próbkę od największej do najmniejszej, a następnie wykreślamy wartości względem ich rang, otrzymujemy inny trend liniowy z innym nachyleniem. Jednak stoki są powiązane.
α- α- 1 / ( α - 1 )α = 2n = 106- 2- 1 / ( 2 - 1 ) = - 1
ττα
β^
α^= 1 - 1β^.
@csgillespie opublikował jeden z ostatnich artykułów współautora Marka Newmana z Michigan na ten temat. Wydaje się, że publikuje wiele podobnych artykułów na ten temat. Poniżej znajduje się kolejna wraz z kilkoma innymi referencjami, które mogą być interesujące. Newman czasami nie robi statystycznie najbardziej sensownej rzeczy, więc bądź ostrożny.
MEJ Newman, Prawa potęgi, rozkłady Pareto i prawo Zipfa , Contemporary Physics 46, 2005, s. 323–351.
M. Mitzenmacher, Krótka historia modeli generatywnych dla prawa mocy i rozkładów logarytmicznych , matematyka internetowa. , vol. 1, nr 2, 2003, s. 226–251.
K. Knight, Prosta modyfikacja estymatora Hill'a z aplikacjami do odporności i redukcji uprzedzeń , 2010.
Dodatek :
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)
Powstały wykres to
i ≤ 30
Jednak z praktycznego punktu widzenia taka fabuła powinna być względnie atrakcyjna.
α = 2n = 300000xm a x= 500
χ2)
X2)= ∑i = 1500( Oja- Eja)2)mija
Ojajamija= n pja= n i- α/ ∑500j = 1jot- α
Obliczymy również drugą statystykę utworzoną przez pierwsze binowanie liczb w pojemnikach o rozmiarze 40, jak pokazano w arkuszu kalkulacyjnym Maurizio (ostatni bin zawiera tylko sumę dwudziestu oddzielnych wartości wyników.
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 )