Güncelleme : 7 Nis 2011 Bu cevap oldukça uzun ve eldeki sorunun birçok yönünü kapsamaktadır. Ancak, şimdiye kadar, ayrı cevaplara böldüm.
En altta bu örnek için Pearson'un performansı hakkında bir tartışma ekledim .χ2
Bruce M. Hill, belki de Zipf benzeri bir bağlamda tahmin üzerine "seminal" makalesini yazdı. Konu ile ilgili olarak 1970'lerin ortalarında birçok makale yazdı. Bununla birlikte, "Hill tahmincisi" (şu anda adlandırıldığı gibi) esas olarak numunenin maksimum sıra istatistiklerine dayanmaktadır ve bu nedenle, mevcut kesme tipine bağlı olarak, sizi biraz sıkıntıya sokabilir.
Ana makale:
BM Hill, Bir dağılımın kuyruğu hakkında çıkarımda basit bir genel yaklaşım , Ann. Stat. , 1975.
Verileriniz başlangıçta Zipf ise ve daha sonra kesilirse, derece dağılımı ve Zipf grafiği arasındaki hoş bir yazışma sizin yararınıza kullanılabilir.
Özellikle, derece dağılımı her bir tamsayı yanıtının kaç kez görüldüğünün ampirik dağılımıdır,
di=#{j:Xj=i}n.
Bunu log-log grafiğinde ile işaretlersek, ölçeklendirme katsayısına karşılık gelen bir eğim ile doğrusal bir eğilim elde ederiz.i
Öte yandan, numuneyi en büyükten en küçüğe sıraladığımız ve daha sonra değerleri saflarına göre çizdiğimiz Zipf grafiğini çizersek , farklı bir eğime sahip farklı bir doğrusal eğilim elde ederiz . Ancak eğimler birbiriyle ilişkilidir.
Eğer Zipf dağıtımı için ölçekleme hukuk katsayısıdır, daha sonra birinci bölge içinde eğimidir ve ikinci arsa eğimi . Aşağıda ve için bir örnek grafik verilmiştir . Sol bölme derece dağılımıdır ve kırmızı çizginin eğimi . Sağ taraf Zipf grafiğidir, üst üste binen kırmızı çizgi eğime sahiptir .α−α−1/(α−1)α=2n=106−2−1/(2−1)=−1
Veri bazı eşik daha değerlerin büyük görebileceğiniz şekilde kesildi varsa Yani, , ancak veriler aksi Zipf-dağıtılan ve makul büyüktür, o zaman tahmin edebilir dan derecesi dağılımı . Çok basit bir yaklaşım, log-log grafiğine bir çizgi sığdırmak ve karşılık gelen katsayıyı kullanmaktır.ττα
Verileriniz küçük değerleri görmeyecek şekilde kesilirse (ör. Büyük web veri kümeleri için çok fazla filtreleme yapılması), o zaman bir günlük kaydı ölçeğindeki eğimi tahmin etmek için Zipf grafiğini ve ardından " ölçeklendirme üssü. Zipf grafiğindeki eğim tahmininizin olduğunu varsayalım . Ardından, ölçeklendirme yasası katsayısının basit bir tahmini dır
β^
α^=1−1β^.
@ csgillespie bu konuyla ilgili Michigan'da Mark Newman'ın ortak yazdığı bir makaleyi verdi. Bu konuda birçok benzer makale yayınlıyor gibi görünüyor. Aşağıda, ilgi çekici olabilecek birkaç referansla birlikte başka bir kaynak verilmiştir. Newman bazen en mantıklı şeyi istatistiksel olarak yapmaz, bu yüzden dikkatli olun.
MEJ Newman, Güç yasaları, Pareto dağılımları ve Zipf yasası , Contemporary Physics 46, 2005, s. 323-351.
M. Mitzenmacher, Güç Hukuku ve Lognormal Dağılımlar İçin Üretken Modellerin Kısa Tarihi , İnternet Matematiği. , cilt. 1, hayır. 2, 2003, s. 226-251.
K. Knight, Hill tahmincisinin sağlamlık ve sapma azaltma uygulamaları ile basit bir modifikasyonu , 2010.
Zeyilname :
Dağıtımınızdan boyutunda bir örnek aldıysanız (orijinal sorunuzun altındaki yorumunuzda açıklandığı gibi ) bekleyebileceğiniz basit bir simülasyon .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)
Ortaya çıkan çizim
, (veya benzeri) için derece dağılımının göreli hatasının çok iyi olduğunu görebiliriz. Sen resmi bir ki-kare testi yapabiliriz, ama bu yok değil veriler önceden belirlenmiş dağılımını izlemeniz kesinlikle söyleyecektir. Sadece onlar sonucuna hiçbir kanıt olduğunu anlatır yok .i≤30
Yine de, pratik açıdan, böyle bir arsa nispeten zorlayıcı olmalıdır.
Zeyilname 2 : Maurizio'nun aşağıdaki yorumlarında kullandığı örneği ele alalım. Maksimum değeri olan kesilmiş bir Zipf dağılımı ile ve olduğunu varsayacağız .n = 300α=2x m a x = 500n=300000xmax=500
Pearson istatistiğini iki şekilde hesaplayacağız . Standart yol,
;
burada , numunedeki değerinin gözlenen sayımlarıdır ve .X 2 = 500 ∑ i = 1 ( O i - E i ) 2χ2 OiiEi=npi=ni-α/∑ 500 j = 1 j-α
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
Ayrıca Maurizio'nun e-tablosunda gösterildiği gibi, ilk önce sayıları 40 büyüklüğündeki çöp kutularına bölerek oluşturulmuş ikinci bir istatistik hesaplayacağız (son bölme yalnızca yirmi ayrı sonuç değerinin toplamını içerir.
Şimdi bu dağılımdan 5000 boyutunda ayrı örnek çizelim ve bu iki farklı istatistiği kullanarak değerlerini hesaplayalım .pnp
-değerlerinin histogramları aşağıdadır ve oldukça tekdüze olduğu görülmektedir. Ampirik Tip I hata oranları sırasıyla 0.0716 (standart, birleştirilmemiş yöntem) ve 0.0502'dir (ikili yöntem) ve ikisi de seçtiğimiz 5000 örneklem büyüklüğü için hedef 0.05 değerinden istatistiksel olarak önemli ölçüde farklı değildir.p
İşte kodu.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 )