Bir veri örneğinden Zipf kesik dağılımı için parametreleri nasıl tahmin edebilirim?


10

Zipf için tahmin parametresiyle ilgili bir sorunum var. Benim durumum şudur:

(Zipf dağıtımını takip etmesi gereken çağrıları üreten bir denemeden ölçülen) bir örnek kümesi var. Bu jeneratörün zipf dağıtımı ile gerçekten aramalar yaptığını göstermek zorundayım. Zaten bu soru ve cevapları okudum Zipf'in yasa katsayısını bir dizi üst frekanstan nasıl hesaplayabilirim? ama kesilmiş bir dağıtım kullandığım için kötü sonuçlara ulaşıyorum. Örneğin, üretim süreci için "s" değerini "0.9" olarak ayarlarsam, raporlanan Soru-Cevap bölümünde yazıldığı gibi "s" değerini tahmin etmeye çalışırsam 0,2 ca'ya eşit "s" elde ederim. Bunun bir TRUNCATED dağıtım kullandığım gerçeği olduğunu düşünüyorum (zipf bir kesme noktası ile sınırlamak zorunda, sağ kesilmiş).

Kesilmiş bir zipf dağılımıyla parametreleri nasıl tahmin edebilirim?


açık olmak gerekirse, tam olarak neyi kesiyorsunuz? Değerlerin dağılımı mı yoksa Zipf grafiğinin kendisi mi? Kesme noktasını biliyor musunuz? Kesme, verilerin bir yapaylığı mı, yoksa veri işlemenin bir yapaylığı mı (örneğin, sizin veya deneyi yapan kişinin verdiği bazı kararlar)? Ek ayrıntılar yardımcı olacaktır.
kardinal

@cardinal. (bölüm 1/2) Teşekkürler kardinal. Daha fazla ayrıntı vereceğim: Arayan başına hacim için Zipf (ve diğer dağıtım) aşağıdaki çağrıları üreten bir VoIP jeneratör var. Bu jeneratörün bu dağıtımları gerçekten takip ettiğini doğrulamalıyım. Zipf Dağılımı için kullanıcı ve scale parametresi tarafından oluşturulan maksimum çağrı sayısı olan kesme noktasını tanımlamam gerekir (bu nedenle bilinir ve değerlerin dağılımını ifade eder). Özellikle benim durumumda bu değer 500'e eşittir, bu da bir kullanıcının maksimum 500 çağrı üretebileceğini gösterir.
Maurizio

(bölüm 2/2) Ayarlanacak diğer parametre, dağıtımın yayılmasını tanımlayan Zipf için ölçek parametresidir (benim durumumda bu değer 0.9'dur). Tüm parametreleri (örnek boyutu, kullanıcı başına sıklık, vb.) Var ama veri kümemin zipf dağıtım izlediğini doğrulamak zorunda.
Maurizio

yani görünüşe göre dağılımı yeniden , çünkü "kısaltılmış Zipf" olarak düşündüğüm, 0.9'luk bir ölçekleme parametresi imkansız olurdu . Bu verilerin çoğunu oluşturabilir ve "sadece" 500 olası sonuca sahipseniz, neden sadece ki-kare uyum iyiliği testi kullanmıyorsunuz? Dağıtımınızın uzun kuyruğu olduğundan, oldukça büyük bir numune boyutuna ihtiyacınız olabilir. Ancak, bu bir yol olabilir. Başka bir hızlı ve kirli yöntem , çağrı sayısının küçük değerleri için doğru ampirik dağılımı elde edip etmediğinizi kontrol etmek olacaktır . i=1500i0.9
kardinal

Yanıtlar:


14

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=10621/(21)=1

Zipf dağılımından bir iid örneği için derece dağılımı (solda) ve Zipf (sağda) grafikleri.

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 β^

α^=11β^.

@ 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

"Kesilmiş" Zipf grafiği (i = 500'de kesildi)

, (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 .i30

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(OiEi)2Ei
OiiEi=npi=niα/j=1500jα

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

resim açıklamasını buraya girin

İş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 )

+1, her zamanki gibi harika cevap. Kendinizi bir moderatör olarak aday göstermelisiniz, hala 1 saat kaldı :)
mpiktas

@mpiktas, övgü ve cesaret için teşekkürler. Eşit olarak daha kapsamlı ve benden daha uzun süredir katılan çok güçlü adaylar listesiyle kendimi aday göstermeyi haklı çıkarabileceğimden emin değilim.
kardinal

@cardinal, Hill'in tahmincisine alternatif için bazı bağlantılar: Paulauskas'ın orijinal makalesi ve Vaiciulis ve Gadeikis ve Paulauskas'ın takipleri . Bu tahminci, orijinal Hill'lerden daha iyi özelliklere sahipti.
mpiktas

@mpiktas, bağlantılar için teşekkürler. Hill tahmincisinin oldukça az sayıda "yeni ve geliştirilmiş" versiyonu var. Orijinal yaklaşımın ana dezavantajı, ortalamanın nerede durulacağı konusunda bir "kesme" seçeneği gerektirmesidir. Bence bu çoğunlukla, öznellik suçlamalarına yol açan "gözbebekleri" ile yapıldı. Resnick'in uzun kuyruklu dağıtımlarla ilgili kitaplarından biri, hatırlıyorsam, bunu ayrıntılı olarak tartışıyor. Bence onun daha yeni olanı.
kardinal

@cardinal, çok teşekkür ederim, çok kibar ve çok detaylısınız! R'deki örneğiniz benim için çok yararlı oldu, ancak bu durumda resmi bir ki-kare testi nasıl yapabilirim? (Ben üniforma, üstel, normal gibi diğer dağılımları ile ki-kare testi kullanılır, ancak zipf hakkında pek çok şüphem var ... Üzgünüm ama bu benim bu konulara ilk yaklaşımım). Moderatörler için soru: "Kesilmiş zipf dağıtımı için ki-kare testi nasıl yapılır?" veya bu soru-cevap bölümünde etiketleri ve başlığı güncelleyebilir misiniz?
Maurizio

5

Kağıt

Clauset, A ve ark. , Ampirik Verilerde Güç Hukuku Dağılımları . 2009

güç yasası modellerinin takılması hakkında çok iyi bir açıklama içerir. İlişkilendirilmiş web sayfasında kod örnekleri var. Ne yazık ki, kesik dağılımlar için kod vermez, ancak size bir işaretçi verebilir.


Bir kenara, makale birçok "güç hukuku veri setinin" Log normal veya üstel dağılımları ile eşit olarak (ve bazı durumlarda daha iyi) modellenebileceği gerçeğini tartışıyor!


Ne yazık ki bu makale kesik dağılım hakkında bir şey söylemiyor ... R'de Zipf tahmin parametresiyle basit bir şekilde (zipfR, VGAM) ilgilenen bazı paketler buldum, ancak kesik dağılımın "özel bir işleme" ihtiyacı var. Son cümlenizle, örneğin, üstel dağılımlı bir güç yasası veri kümesini modellemenin ve sonra "kısaltılmış" üstel dağılım için bazı tahmin parametresi sürecinin uygulanmasının mümkün olduğunu mu kastediyordunuz? Bu konuda çok yeniyim!
Maurizio

Bu makalede, yazarlar bir güç yasasının yerleştirildiği farklı veri kümelerini yeniden analiz etmektedir. Yazarlar, bazı durumlarda güç hukuku modelinin o kadar da iyi olmadığını ve alternatif bir dağıtımın daha iyi olacağını belirtiyorlar.
csgillespie

2

Kullanıcı kardinalinin ayrıntılı cevabını takiben tahmin edilen kesik zipf dağılımımda ki-kare testi yaptım. Ki-kare testinin sonuçları aşağıdaki tabloda bildirilmektedir:

resim açıklamasını buraya girin

Nerede StartInterval ve EndInterval örneğin aramaların aralığını temsil eden ve Gözlenen 0 ile 19 aramaların ve böylece ki-kare testi geçen sütunlar ulaşmak kadar, bunlar nihai artırmak iyidir .. üzerindeki üreten arayanların sayısıdır hesaplama, aksi takdirde bu noktaya kadar "kısmi" ki-kare değeri kabul edilebilir!

Diğer testlerle sonuç aynıdır, son sütun (veya son 2 sütun) her zaman nihai değeri artırır ve neden bilmiyorum ve başka bir doğrulama testi kullanıp kullanmadığını bilmiyorum (ve nasıl).

Not: tamlık için, beklenen değerleri hesaplamak için ( Beklenen ) ben kardinalin önerisini şu şekilde takip ediyorum:

resim açıklamasını buraya girin

nerede x_i 'ın hesapla için kullanılır: x <- (1:n)^-S, P_i ' hesaplamak için s p <- x / sum(x)ve nihayet E_i (aramaların her nr için kullanıcıların Beklenen nr) elde edilirP_i * Total_Caller_Observed

Özgürlük Derecesi = 13 ile, Ki-Kare iyiliği her zaman örnek kümesinin Zipf Dağılımını izlediği Hipotesis'i reddeder çünkü Test İstatistikleri (bu durumda 64,14) ki-kare tablolarında "demerit" son sütun için. Grafik sonuç burada bildirilir: resim açıklamasını buraya girin

Kesme noktası 500 olarak ayarlanmış olmasına rağmen elde edilen maksimum değer 294'tür. Son "dağılımın" ki-kare testinin başarısızlığının nedeni olduğunu düşünüyorum.

GÜNCELLEME!!

Yukarıdaki cevapta bildirilen R koduyla oluşturulan tahmin edilebilir bir zipf veri örneği üzerinde ki-kare testi yapmaya çalışıyorum.

> 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)

İlişkili çizim aşağıdaki gibidir: resim açıklamasını buraya girin

Ki-kare test sonuçları aşağıdaki şekilde rapor edilmiştir: resim açıklamasını buraya girin

ki-kare testi istatistiği (44,57) seçilen Serbestlik Derecesi ile onaylanamayacak kadar yüksektir. Ayrıca bu durumda verilerin son "dağılımı" yüksek ki-kare değerinin nedenidir. Ama bu zipf dağıtımını doğrulamak için bir prosedür var (ne olursa olsun benim "yanlış" jeneratör, ben R veri örneği odaklanmak istiyorum) ???


@Maurizio, nedense şu ana kadar bu yayını kaçırdım. Yine de onu düzenleyebilir ve yazımdaki sonuncuya benzer bir çizim ekleyebilir, ancak gözlemlenen verilerinizi kullanabilir misiniz? Bu, sorunun teşhis edilmesine yardımcı olabilir. Tekdüze bir dağıtım yapmakta sorun yaşadığınız başka bir sorunuz olduğunu düşünüyorum, belki de bu analizlere de devam ediyor. (?) Saygılarımızla.
kardinal

@cardinal, sonuçları güncelledim! Ne düşünüyorsun? Tek tip dağılım ile ilgili soru, daha iyi bir şekilde belirtmem gereken başka bir şeydir ve bugün veya yarın yapacağım;)
Maurizio

@Maurizio, bunlar rastgele mi üretildi? Sizin ölçek parametresi Was eskisi gibi? 8454 örnek büyüklüğü ve 500 kesme noktası kullandım ve 10000 örnek oluşturdum. Bu 10000'den numunede gözlemlenen maksimum değer, 9658 deney için 500, 324 deney için 499, 16 deney için 498 ve 2 deney için 497'dir. Buna dayanarak, oluşturma prosedürünüzde hala bir şeyler yanlış olduğunu düşünüyorum. Farklı bir ölçek parametresi kullanmadığınız sürece. S=0.9
kardinal

@Maurizio, gönderdiğim sonuçları açıklamak için olduğunu düşünün . Dolayısıyla, örnek boyutunda, 500 değeri ile beklenen sonuç sayısı . Bu tür en az bir sonucu görme olasılığı . Bunun yukarıdaki simülasyonla ne kadar yakından eşleştiğine dikkat edin. 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
kardinal

@cardinal, ben de üretim prosedüründe "yanlış" bir şey olduğunu düşünüyorum (amacım bu jeneratör gerçekten Zipf dağıtımını takip olduğunu doğrulamaktır). Bu günlerde projenin tasarımcılarıyla konuşmam gerekiyor.
Maurizio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.