วิธีการประมาณพารามิเตอร์สำหรับการกระจาย Zipf ตัดทอนจากตัวอย่างข้อมูล?


10

ฉันมีปัญหากับพารามิเตอร์การประมาณสำหรับ Zipf สถานการณ์ของฉันมีดังต่อไปนี้:

ฉันมีชุดตัวอย่าง (วัดจากการทดลองที่สร้างการโทรที่ควรทำตามการแจกแจงแบบ Zipf) ฉันต้องแสดงให้เห็นว่าเครื่องกำเนิดนี้สร้างสายด้วยการกระจาย zipf จริงๆ ฉันอ่านคำถาม & คำตอบนี้แล้วจะคำนวณค่าสัมประสิทธิ์ของกฎหมายของ Zipf จากความถี่สูงสุดหนึ่งชุดได้อย่างไร แต่ฉันไปถึงผลลัพธ์ที่ไม่ดีเพราะฉันใช้การแจกแจงที่ถูกตัดทอน ตัวอย่างเช่นถ้าฉันตั้งค่า "s" เป็น "0.9" สำหรับกระบวนการสร้างถ้าฉันพยายามประเมินค่า "s" ตามที่เขียนไว้ใน Q&A ที่รายงานฉันได้รับ "s" เท่ากับ 0.2 ca ฉันคิดว่านี่เป็นเพราะความจริงที่ว่าฉันใช้การกระจาย TRUNCATED (ฉันต้อง จำกัด zipf ด้วยจุดที่ถูกตัดทอนมันถูกตัดทอน)

ฉันจะประมาณค่าพารามิเตอร์ด้วยการกระจาย zipf ที่ถูกตัดทอนได้อย่างไร


เพื่อความชัดเจนสิ่งที่ถูกต้องคุณตัดทอน? การกระจายของค่าหรือพล็อต Zipf เอง? คุณรู้จุดตัดไหม การตัดทอนเป็นสิ่งประดิษฐ์ของข้อมูลหรือสิ่งประดิษฐ์ของการประมวลผลข้อมูล (เช่นมีการตัดสินใจบางอย่างที่คุณหรือผู้ทดลองทำ)? รายละเอียดเพิ่มเติมใด ๆ จะเป็นประโยชน์
พระคาร์ดินัล

@cardinal (ตอนที่ 1/2) ขอขอบคุณพระคาร์ดินัล ฉันจะให้รายละเอียดเพิ่มเติม: ฉันมีตัวสร้าง VoIP ที่สร้างสายหลังจาก Zipf (และการกระจายอื่น ๆ ) สำหรับระดับเสียงต่อผู้โทร ฉันต้องตรวจสอบว่าตัวกำเนิดนี้ติดตามการกระจายตัวเหล่านี้จริงๆ สำหรับการแจกแจง Zipf ฉันจำเป็นต้องกำหนดจุดตัด (ซึ่งเป็นที่รู้จักและหมายถึงการกระจายของค่า) ซึ่งเป็นจำนวนสูงสุดของการโทรที่สร้างขึ้นโดยผู้ใช้และพารามิเตอร์สเกล โดยเฉพาะอย่างยิ่งในกรณีของฉันค่านี้เท่ากับ 500 ซึ่งบ่งชี้ว่าผู้ใช้หนึ่งคนสามารถโทรได้สูงสุด 500 ครั้ง
Maurizio

(ตอนที่ 2/2) พารามิเตอร์อื่น ๆ ที่จะตั้งค่าคือพารามิเตอร์สเกลสำหรับ Zipf ที่กำหนดการแพร่กระจายของการแจกแจง (ค่านี้ในกรณีของฉันคือ 0.9) ฉันมีพารามิเตอร์ทั้งหมด (ขนาดตัวอย่างความถี่ต่อผู้ใช้ ฯลฯ ) แต่ฉันต้องตรวจสอบว่าชุดข้อมูลของฉันเป็นไปตามการกระจาย zipf
Maurizio

ดังนั้นคุณเห็นได้ชัดว่าการเปลี่ยนการกระจายโดยเนื่องจากสิ่งที่ฉันคิดว่าเป็น "การตัดทอน Zipf" พารามิเตอร์การปรับขนาด 0.9 จะเป็นไปไม่ได้ . หากคุณสามารถสร้างข้อมูลเหล่านี้จำนวนมากและคุณ "เท่านั้น" มีผลลัพธ์ 500 รายการที่เป็นไปได้ทำไมไม่ใช้การทดสอบความดีแบบไคสแควร์พอดี? เนื่องจากการกระจายของคุณมีหางยาวคุณอาจต้องมีขนาดตัวอย่างที่ค่อนข้างใหญ่ แต่นั่นจะเป็นวิธีหนึ่ง อีกวิธีที่รวดเร็วและสกปรกก็คือการตรวจสอบว่าคุณได้รับการกระจายเชิงประจักษ์ที่ถูกต้องสำหรับค่าจำนวนเล็กน้อยของการโทร i=1500i0.9
พระคาร์ดินัล

คำตอบ:


14

ปรับปรุง : 7 เม.ย. 2554 คำตอบนี้ใช้เวลานานและครอบคลุมปัญหาหลายด้านในมือ อย่างไรก็ตามฉันได้ต่อต้านจนถึงตอนนี้แบ่งมันออกเป็นคำตอบที่แยกจากกัน

ฉันได้เพิ่มการสนทนาเกี่ยวกับประสิทธิภาพของ Pearson's สำหรับตัวอย่างนี้χ2


บรูซเอ็มฮิลล์ประพันธ์บางทีอาจเป็นกระดาษ "น้ำเชื้อ" เกี่ยวกับการประมาณค่าในบริบทแบบ Zipf เขาเขียนบทความหลายฉบับในช่วงกลางทศวรรษ 1970 ในหัวข้อ อย่างไรก็ตาม "ตัวประมาณค่าฮิลล์" (ตามที่เรียกกันในขณะนี้) ส่วนใหญ่จะขึ้นอยู่กับสถิติการสั่งซื้อสูงสุดของตัวอย่างและดังนั้นขึ้นอยู่กับประเภทของการตัดทอนปัจจุบันที่อาจทำให้คุณมีปัญหาบางอย่าง

กระดาษหลักคือ:

BM ฮิลล์, วิธีการทั่วไปที่ง่ายในการอนุมานเกี่ยวกับหางของการจัดจำหน่าย , แอน สถิติ พ.ศ. 2518

หากข้อมูลของคุณแท้จริงแล้วเริ่มต้นจาก Zipf และถูกตัดทอนแล้วการโต้ตอบที่ดีระหว่างการกระจายระดับและพล็อต Zipfสามารถถูกควบคุมเพื่อประโยชน์ของคุณ

โดยเฉพาะการแจกแจงระดับคือการแจกแจงเชิงประจักษ์จำนวนครั้งที่เห็นการตอบสนองจำนวนเต็มแต่ละตัว

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

ถ้าเราพล็อตเรื่องนี้กับบนพล็อตการบันทึกล็อกเราจะได้เทรนด์เชิงเส้นที่มีความชันที่สอดคล้องกับค่าสเกลi

ในทางกลับกันถ้าเราพล็อตพล็อตZipfซึ่งเราจัดเรียงตัวอย่างจากมากไปหาน้อยที่สุดและจากนั้นพล็อตค่าเทียบกับอันดับของพวกเขาเราจะได้รับแนวโน้มเชิงเส้นที่แตกต่างกันกับความชันที่แตกต่างกัน อย่างไรก็ตามเนินลาดนั้นเกี่ยวข้องกัน

ถ้าเป็นค่าสัมประสิทธิ์การปรับกฎหมายสำหรับการกระจาย Zipf แล้วความลาดชันในพล็อตแรกเป็น- αและความลาดชันในพล็อตที่สองคือ- 1 / ( α - 1 ) ด้านล่างนี้เป็นพล็อตตัวอย่างสำหรับα = 2และn = 10 6 บานหน้าต่างด้านซ้ายมือคือการกระจายการศึกษาระดับปริญญาและความลาดชันของเส้นสีแดงคือ- 2 ด้านขวามือคือพล็อต Zipf โดยมีเส้นสีแดงซ้อนทับมีความชัน- 1 / ( 2 - 1 ) = -αα1/(α1)α=2n=1062 .1/(21)=1

การกระจายองศา (ซ้าย) และแผนการ Zipf (ขวา) สำหรับตัวอย่าง iid จากการแจกแจง Zipf

ττα

β^

α^=11β^.

@csgillespie มอบบทความล่าสุดหนึ่งฉบับร่วมเขียนโดย Mark Newman ที่ Michigan เกี่ยวกับหัวข้อนี้ ดูเหมือนว่าเขาจะตีพิมพ์บทความที่คล้ายกันจำนวนมากในเรื่องนี้ ด้านล่างนี้เป็นอีกหนึ่งแหล่งที่มาพร้อมกับคู่อ้างอิงอื่น ๆ ที่อาจเป็นที่สนใจ นิวแมนบางครั้งก็ไม่ทำสิ่งที่สมเหตุสมผลที่สุดในเชิงสถิติดังนั้นควรระมัดระวัง

MEJ Newman, กฎหมายพลังงาน, การแจกแจงพาเรโตและกฎของ Zipf , ฟิสิกส์ร่วมสมัย 46, 2005, pp. 323-351

M. Mitzenmacher ประวัติโดยย่อของแบบจำลองทั่วไปสำหรับกฎกำลังไฟฟ้าและการแจกแจงล็อกนอร์มอล , คณิตศาสตร์อินเทอร์เน็ต ฉบับ 1 หมายเลข 2, 2003, pp. 226-251

เค. อัศวินการเปลี่ยนแปลงแบบง่าย ๆ ของตัวประมาณค่าฮิลล์ด้วยแอพพลิเคชั่นเพื่อความทนทานและการลดอคติปี 2010


ภาคผนวก :

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)

พล็อตที่เกิดขึ้นคือ

พล็อต Zipf "ถูกตัดทอน (ตัดที่ i = 500)

i30

ถึงกระนั้นจากมุมมองเชิงปฏิบัติพล็อตดังกล่าวควรจะค่อนข้างน่าสนใจ


α=2n=300000xmax=500

χ2

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

นอกจากนี้เรายังจะคำนวณสถิติที่สองที่เกิดขึ้นจากการนับจำนวนครั้งแรกในถังขยะขนาด 40 ดังที่แสดงในสเปรดชีตของ Maurizio (ถังสุดท้ายจะมีผลรวมยี่สิบค่าผลลัพธ์แยกต่างหากเท่านั้น

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 )

+1 คำตอบที่ยอดเยี่ยมตามปกติ คุณควรเสนอชื่อตัวเองเป็นผู้ดำเนินรายการยังมีเวลาเหลืออีก 1 ชั่วโมง :)
mpiktas

@mpiktas ขอบคุณสำหรับคำชมและกำลังใจ ฉันไม่แน่ใจว่าฉันสามารถพิสูจน์ตัวเองด้วยการเสนอชื่อผู้สมัครที่แข็งแกร่งมากซึ่งมีความสม่ำเสมอมีส่วนร่วมอย่างกว้างขวางและนานกว่าที่ฉันมี
พระคาร์ดินัล

@cardinal ที่นี่มีการเชื่อมโยงบางทางเลือกในการประมาณการฮิลล์: บทความต้นฉบับโดย Paulauskas และติดตามโดยVaiciulisและGadeikis และ Paulauskas ตัวประมาณนี้น่าจะมีคุณสมบัติที่ดีกว่าของฮิลล์ดั้งเดิม
mpiktas

@mpiktas ขอบคุณสำหรับลิงค์ มีตัวประมาณค่าแบบใหม่และปรับปรุงหลายรุ่น ข้อเสียเปรียบหลักของวิธีการดั้งเดิมคือต้องใช้ตัวเลือก "cutoff" เพื่อหยุดการเฉลี่ย ฉันคิดว่าส่วนใหญ่ทำโดย "การมองด้วยตา" ซึ่งเปิดขึ้นหนึ่งครั้งต่อการคิดเรื่องส่วนตัว หนังสือเล่มหนึ่งของ Resnick เกี่ยวกับการแจกแจงระยะยาวพูดถึงเรื่องนี้ในรายละเอียดบางอย่างถ้าฉันจำได้ ฉันคิดว่านี่เป็นสิ่งล่าสุดของเขา
พระคาร์ดินัล

@ cardinal ขอบคุณมากคุณใจดีมากและมีรายละเอียดมาก! ตัวอย่างของคุณใน R มีประโยชน์มากสำหรับฉัน แต่ฉันจะทำการทดสอบไคสแควร์อย่างเป็นทางการในกรณีนี้ได้อย่างไร (ฉันใช้การทดสอบไคสแควร์กับการแจกแจงอื่น ๆ เช่นชุดเอกซ์โพเนนเชียลปกติ แต่ฉันมีข้อสงสัยมากมายเกี่ยวกับ zipf..Sorry แต่นี่เป็นแนวทางแรกของฉันในหัวข้อเหล่านี้) คำถามสำหรับผู้ดำเนินการ: ให้ฉันเขียน Q&A อื่นเช่น "วิธีทดสอบไคสแควร์สำหรับการกระจาย zipf ที่ถูกตัดทอนอย่างไร" หรือดำเนินการต่อในคำถาม & การอัปเดตแท็กและชื่อเรื่องนี้หรือไม่
Maurizio

5

กระดาษ

Clauset, A , et al , การกระจายอำนาจกฎหมายในเชิงประจักษ์ข้อมูล 2009

มีคำอธิบายที่ดีมากเกี่ยวกับรูปแบบของกฎหมายพลังงานที่เหมาะสม หน้าเว็บที่เกี่ยวข้องมีตัวอย่างโค้ด น่าเสียดายที่มันไม่ได้ให้รหัสสำหรับการแจกแจงแบบถูกตัดทอน แต่มันอาจเป็นตัวชี้ให้คุณ


บทความนี้กล่าวถึงข้อเท็จจริงที่ว่า "ชุดข้อมูลพลังงาน - กฎหมาย" หลาย ๆ แบบสามารถทำได้ดีเท่ากัน (และในบางกรณีดีกว่า) ด้วย Log การแจกแจงแบบปกติหรือเลขชี้กำลัง!


น่าเสียดายที่บทความนี้ไม่ได้พูดอะไรเกี่ยวกับการแจกแจงที่ถูกตัดทอน .. ฉันได้พบแพ็คเกจบางอย่างใน R ที่จัดการกับพารามิเตอร์การประมาณ Zipf ในแบบง่ายๆ (zipfR, VGAM) แต่การกระจายที่ถูกตัดทอนต้องมี "การดูแลเป็นพิเศษ" ด้วยประโยคสุดท้ายของคุณคุณหมายถึงความเป็นไปได้ที่จะสร้างแบบจำลองชุดข้อมูลพลังงาน - กฎหมายด้วยการแจกแจงแบบเอ็กซ์โพเนนเชียลแล้วใช้กระบวนการประมาณค่าพารามิเตอร์สำหรับการแจกแจงเอ็กซ์โพเนนเชียลแบบ "ถูกตัดทอน" ฉันเป็นมือใหม่มากในหัวข้อนี้!
Maurizio

ในบทความผู้เขียนวิเคราะห์ชุดข้อมูลที่แตกต่างกันซึ่งมีการติดตั้งกฎหมายพลังงาน ผู้เขียนชี้ให้เห็นว่าในหลายกรณีรูปแบบกฎหมายพลังงานนั้นไม่ดีและการกระจายทางเลือกจะดีกว่า
csgillespie

2

ทำตามคำตอบอย่างละเอียดของผู้ใช้ที่สำคัญฉันทำการทดสอบไคสแควร์ในการกระจาย zipf ที่ถูกตัดทอนสมมุติฐานของฉัน ผลของการทดสอบไคสแควร์ถูกรายงานในตารางต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่StartIntervalและEndIntervalแสดงช่วงของการโทรและObservedคือจำนวนผู้โทรที่สร้างจากการโทร 0 ถึง 19 และอื่น ๆ การทดสอบไคสแควร์จะดีจนกระทั่งคอลัมน์สุดท้ายถึงพวกเขาจะเพิ่มขั้นสุดท้าย การคำนวณมิฉะนั้นจนกระทั่งถึงจุดนั้นยอมรับค่าไคสแควร์ "บางส่วน" เป็นที่ยอมรับ!

ด้วยการทดสอบอื่นผลลัพธ์จะเหมือนกันคอลัมน์สุดท้าย (หรือ 2 คอลัมน์สุดท้าย) จะเพิ่มค่าสุดท้ายเสมอและฉันไม่รู้ว่าทำไมและฉันไม่รู้ว่า (และวิธี) ใช้การทดสอบการตรวจสอบอื่นอีกหรือไม่

PS: เพื่อความสมบูรณ์ในการคำนวณค่าที่คาดหวัง ( คาดว่า ) ฉันทำตามคำแนะนำของพระคาร์ดินัลด้วยวิธีนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่X_iใช้ในการคำนวณ: x <- (1:n)^-S, P_iเพื่อคำนวณp <- x / sum(x)และสุดท้ายคือE_i (คาดว่าจะมีผู้ใช้ nr ของผู้ใช้สำหรับการโทรแต่ละครั้ง)P_i * Total_Caller_Observed

และด้วยดีกรีอิสระ = 13 ความดีของ Chi-Square จะปฏิเสธสมมติฐานในการสุ่มตัวอย่างที่ตั้งตามการกระจาย Zipf เสมอเนื่องจากสถิติทดสอบ (64,14 ในกรณีนี้) มีขนาดใหญ่กว่าที่รายงานไว้ในตารางไคสแควร์ "demerit" สำหรับคอลัมน์สุดท้าย รายงานผลลัพธ์แบบกราฟิกที่นี่: ป้อนคำอธิบายรูปภาพที่นี่

แม้ว่าจุดตัดจะถูกตั้งไว้ที่ 500 ค่าสูงสุดที่ได้รับคือ 294 ฉันคิดว่าการกระจายตัวสุดท้ายเป็นสาเหตุของความล้มเหลวของการทดสอบไคสแควร์

UPDATE !!

ฉันพยายามทำการทดสอบไคสแควร์ในตัวอย่างข้อมูล zipf ที่สันนิษฐานว่าสร้างขึ้นด้วยรหัส R ที่รายงานในคำตอบข้างต้น

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

พล็อตที่เกี่ยวข้องมีดังต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

ผลการทดสอบไคสแควร์มีการรายงานในรูปต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

และสถิติการทดสอบไคสแควร์ (44,57) สูงเกินไปสำหรับการตรวจสอบความถูกต้องด้วยดีกรีความอิสระที่เลือก นอกจากนี้ในกรณีนี้การ "กระจาย" สุดท้ายของข้อมูลเป็นสาเหตุของค่าไคสแควร์สูง แต่มีขั้นตอนในการตรวจสอบการกระจาย zipf นี้ (ไม่ว่าเครื่องกำเนิด "ผิด" ของฉันฉันต้องการที่จะมุ่งเน้นไปที่ตัวอย่างข้อมูล R)


@Maurizio ด้วยเหตุผลบางอย่างฉันพลาดโพสต์นี้ไปจนถึงตอนนี้ มีอยู่แล้วคุณสามารถแก้ไขได้และเพิ่มพล็อตที่คล้ายกับโพสต์สุดท้ายในโพสต์ของฉัน แต่ใช้ข้อมูลที่คุณสังเกตเห็น? ที่อาจช่วยวินิจฉัยปัญหา ฉันคิดว่าฉันเห็นคำถามอื่นเกี่ยวกับคุณที่คุณมีปัญหาในการสร้างการกระจายแบบสม่ำเสมอดังนั้นบางทีนั่นอาจเป็นการวิเคราะห์เหล่านี้เช่นกัน (?) ความนับถือ.
พระคาร์ดินัล

@cardinal ฉันอัพเดตผลลัพธ์! คุณคิดอย่างไร? คำถามเกี่ยวกับการกระจายชุดเป็นอีกสิ่งหนึ่งที่ฉันต้องระบุในทางที่ดีและฉันจะทำมันในวันนี้หรือวันพรุ่งนี้;)
Maurizio

S=0.9

p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675. สังเกตว่าใกล้เคียงกับการจำลองข้างต้นมากน้อยเพียงใด
พระคาร์ดินัล

@ cardinal ฉันคิดว่ามีบางอย่าง "ผิดปกติ" ในขั้นตอนการสร้าง (เป้าหมายของฉันคือการตรวจสอบว่าตัวกำเนิดนี้ติดตามการกระจาย Zipf จริงๆ) ฉันต้องพูดคุยกับนักออกแบบของโครงการในวันนี้
Maurizio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.