ทดสอบว่าการแจกแจงทวินามสองรายการนั้นแตกต่างกันหรือไม่


37

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

เพื่อให้การทดสอบง่ายขึ้นสมมติว่าฉันมี 2 กลุ่ม (3 สามารถขยายได้จากกรณีพื้นฐานนี้)

  • การทดลองกลุ่ม 1: = 2455n1
  • การทดลองกลุ่ม 2: = 2730n2

  • ความสำเร็จของกลุ่ม 1: = 1556k1
  • ความสำเร็จของกลุ่ม 2: = 1671k2

ฉันไม่ได้มีโอกาสประสบความสำเร็จที่คาดหวังเพียงสิ่งที่ฉันรู้จากตัวอย่าง ดังนั้นอัตราความสำเร็จโดยนัยของฉันสำหรับทั้งสองกลุ่มคือ:

  • อัตราความสำเร็จของกลุ่ม 1: = 1556/2455 = 63.4%พี1
  • อัตราความสำเร็จของกลุ่ม 2: = 1671/2730 = 61.2%พี2

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

ใน Excel:

1-BINOM.DIST (1556,2455,61.2%, TRUE) = 0.012

อย่างไรก็ตามสิ่งนี้ไม่ได้คำนึงถึงความแปรปรวนของผลการทดสอบครั้งแรกเพียง แต่ถือว่าผลลัพธ์แรกคือความน่าจะเป็นในการทดสอบ

มีวิธีที่ดีกว่าในการทดสอบว่าทั้งสองตัวอย่างของข้อมูลที่แตกต่างกันจริงหรือไม่?


อีกคำถามที่ฉันเจอซึ่งไม่ได้ช่วยอะไรมากจริง ๆ : stats.stackexchange.com/questions/82059/…
สกอตต์

คำถามนี้ช่วยได้ไหม stats.stackexchange.com/questions/25299/…
เอริค

2
ในการวิจัยคุณสามารถใช้:prop.test prop.test(c(1556, 1671), c(2455, 2730))
COOLSerdash

1
สามารถทำได้เป็นการทดสอบสัดส่วนแบบสองตัวอย่าง (ทวินาม) หรือ 2x2 ไคสแควร์
Glen_b

1
การขยายเคสพื้นฐานจากสองกลุ่มเป็นสามอาจเป็นปัญหาได้เนื่องจากการทดสอบจะพึ่งพาซึ่งกันและกัน: คุณจะต้องใช้ ANOVA เวอร์ชันทวินามเพื่อจัดการกับสิ่งนั้น
whuber

คำตอบ:


36

การแก้ปัญหาเป็นเรื่องง่าย ๆ ใน google: http://en.wikipedia.org/wiki/Statistical_hypothesis_testing

ดังนั้นคุณต้องการทดสอบสมมติฐานว่างต่อไปนี้กับทางเลือกที่ให้

เมื่อเทียบกับ H A : p 1p 2H0:พี1=พี2HA:พี1พี2

ดังนั้นคุณต้องคำนวณสถิติการทดสอบซึ่งก็คือ

Z=พี^1-พี^2พี^(1-พี^)(1n1+1n2)

ที่P = n 1 P 1 + n 2 P 2 2 พี^=n1พี^1+n2พี^2n1+n2

P 1 = 0.634 , P 2 = 0.612 , n 1 = 2,455และn 2 = 2730พี^1=0.634พี^2=0.612n1=2455n2=2730

เมื่อคุณคำนวณสถิติการทดสอบแล้วคุณจะต้องคำนวณค่าภูมิภาคที่สำคัญที่เกี่ยวข้องเพื่อเปรียบเทียบสถิติการทดสอบของคุณด้วย ตัวอย่างเช่นหากคุณกำลังทดสอบสมมติฐานนี้ที่ระดับความเชื่อมั่น 95% คุณต้องเปรียบเทียบสถิติการทดสอบของคุณกับค่าภูมิภาคที่สำคัญของ (สำหรับการทดสอบสองแบบนี้)Zα/2=1.96

ทีนี้ถ้าคุณอาจปฏิเสธสมมุติฐานว่างไม่เช่นนั้นคุณจะต้องไม่ปฏิเสธสมมติฐานว่าง Z>Zα/2

วิธีนี้ใช้ได้ผลกับกรณีเมื่อคุณเปรียบเทียบสองกลุ่ม แต่ไม่ได้พูดถึงกรณีที่คุณต้องการเปรียบเทียบ 3 กลุ่ม

อย่างไรก็ตามคุณสามารถใช้การทดสอบ Chi Squared เพื่อทดสอบว่าทั้งสามกลุ่มมีสัดส่วนเท่ากันตามที่ @Eric แนะนำในความคิดเห็นของเขาด้านบน: "คำถามนี้ช่วยได้หรือไม่ stats.stackexchange.com/questions/25299/ … - Eric"


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

@Scott หากสัดส่วนที่ตั้งสมมติฐานของคุณสำหรับสามกลุ่มนั้นเท่ากันทั้งหมดค่าที่คาดหวังควรเป็น 1/3 ของแต่ละกลุ่ม
ด่าน

1
คำอธิบายที่เกี่ยวข้องของการใช้การทดสอบนี้สามารถดูได้ที่นี่: itl.nist.gov/div898/handbook/prc/section3/prc33.htm (ปัจจุบันหน้า Wikipedia ไม่ได้ให้ตัวอย่างที่ชัดเจน)
wwwilliam

ใครสามารถช่วยฉันพิสูจน์ค่าเบี่ยงเบนมาตรฐานของความแตกต่างระหว่างการแจกแจงทวินามทั้งสองในคำอื่น ๆ พิสูจน์ได้ว่า:
พี^(1-พี^)(1n1+1n2)=พี^1(1-พี^1)n1+พี^2(1-พี^2)n2
Tanguy

สามารถตอบคำถามของฉันได้ที่นี่: stats.stackexchange.com/questions/361015/…
Tanguy

10

ใน R คำตอบจะถูกคำนวณดังนี้:

fisher.test(rbind(c(1556,2455-1556), c(1671,2730-1671)), alternative="less")

8
คุณคิดว่าจะเขียนมากกว่าฟังก์ชั่น R เล็กน้อยหรือไม่? การตั้งชื่อฟังก์ชั่นไม่ได้ช่วยในการทำความเข้าใจปัญหาและไม่ใช่ทุกคนที่ใช้ R ดังนั้นมันจะไม่ช่วยพวกเขา
ทิม

1
นี่คือคำตอบทางสถิติที่ถูกต้องที่สุดและใช้ได้กับการสังเกตจำนวนน้อย (ดูต่อไปนี้: itl.nist.gov/div898/handbook/prc/section3/prc33.htm )
Andrew Mao

ฟิชเชอร์การทดสอบที่แน่นอนen.wikipedia.org/wiki/Fisher's_exact_test
Keith

3

เป็นบทสรุป:

คำตอบของ Dan และ Abaumann แนะนำให้ทำการทดสอบภายใต้แบบจำลองทวินามที่สมมติฐานว่างเป็นรูปแบบทวินามเดียวแบบรวมศูนย์ที่มีค่าเฉลี่ยประมาณจากข้อมูลเชิงประจักษ์ คำตอบของพวกเขาถูกต้องในทางทฤษฎี แต่พวกเขาต้องการการประมาณโดยใช้การแจกแจงแบบปกติเนื่องจากการกระจายตัวของสถิติการทดสอบไม่ตรงตามการแจกแจงแบบปกติ ดังนั้นจึงถูกต้องสำหรับตัวอย่างขนาดใหญ่เท่านั้น

แต่คำตอบของเดวิดแสดงการทดสอบแบบไม่มีพารามิเตอร์โดยใช้การทดสอบของฟิชเชอร์ข้อมูลอยู่ที่นี่: https://en.wikipedia.org/wiki/Fisher%27s_exact_test%27s_exact_test และสามารถนำไปใช้กับตัวอย่างขนาดเล็ก

การทดสอบใดที่จะใช้และคุณเชื่อมั่นในค่า p ของคุณมากน้อยเพียงใดเป็นปริศนา แต่มีอคติอยู่เสมอในการทดสอบที่จะเลือก


2
1/2

1
สำหรับกรณีนี้ฉันคิดว่าคุณสามารถใช้วิธีของ Dan แต่คำนวณค่า p ในวิธีที่แน่นอน (ทวินาม) และวิธีประมาณ (ปกติ Z> Φ − 1 (1 − α / 2) Z> Φ − 1 (1 − α / 2) และ Z <Φ − 1 (α / 2)) เพื่อเปรียบเทียบว่าพวกเขาอยู่ใกล้เพียงพอหรือไม่
Dr_Hope

1

Z=พี1^-พี2^พี^(1-พี^)(1/n1+1/n2)พี^=n1พี1^+n2พี2^n1+n2

Z>Φ-1(1-α/2)Z<Φ-1(α/2)


1

ในหลาม, statsmodelsproportions_ztestมีฟังก์ชั่นที่เรียกว่า นี่คือตัวอย่างการใช้งาน:

import statsmodels.api as sm
import numpy as np
import rpy2.robjects.packages as rpackages
import rpy2.robjects as robjects
rstats = rpackages.importr('stats')

s1 = 1556
n1 = 2455

s2 = 1671
n2 = 2730

# manual calculation
p1 = s1 / n1
p2 = s2 / n2
p = (s1 + s2) / (n1 + n2)

z = (p1 - p2) / (p*(1-p)*((1/n1)+(1/n2)))**0.5

# using R in Python with rpy2
rmatrix = robjects.r.matrix(robjects.IntVector([s1, n1-s1, s2,n2-s2]), nrow=2)
fisher_test = rstats.fisher_test(rmatrix, alternative="two.sided")

zscore, pval = sm.stats.proportions_ztest([s1, s2], [n1, n2], alternative='two-sided')

print('Manual calculation of z: {:.6f}'.format(z))
print('Z-score from statsmodels: {:.6f}'.format(zscore))
print('R pvalue from fisher.test: {:.6f}'.format(fisher_test[0][0]))
print('Statsmodels pvalue: {:.6f}'.format(pval))

สิ่งนี้พิมพ์ออกมา:

Manual calculation of z: 1.610825
Z-score from statsmodels: 1.610825
R pvalue from fisher.test: 0.108268
Statsmodels pvalue: 0.107218

-1

โพสต์ต้นฉบับ: คำตอบของแดนนั้นไม่ถูกต้องจริงๆ การทดสอบ z จะใช้เฉพาะในกรณีที่ข้อมูลของคุณเป็นไปตามการแจกแจงแบบปกติมาตรฐาน ในกรณีนี้ข้อมูลของคุณตามการแจกแจงทวินามดังนั้นใช้การทดสอบไคสแควร์ถ้าตัวอย่างของคุณมีขนาดใหญ่หรือการทดสอบของชาวประมงถ้าตัวอย่างของคุณมีขนาดเล็ก

แก้ไข: ความผิดพลาดของฉันขอโทษ @Dan การทดสอบ z ใช้ได้ที่นี่หากตัวแปรของคุณเป็นอิสระ หากข้อสันนิษฐานนี้ไม่ตรงหรือไม่เป็นที่รู้จักการทดสอบ z อาจไม่ถูกต้อง


2
χ2

หากคุณเชื่อใน CLT การแจกแจงแบบปกติจะมีอยู่จริง
Ryan

2
@ ไรอันฉันเชื่อใน CLT แต่มันไม่ได้พูดอะไรเกี่ยวกับ n = 30 หรือ n = 300 หรือ n = 5,000 คุณจะไม่ได้รับภาวะปกติเว้นแต่ว่าคุณจะมีขนาดตัวอย่างที่ไม่สิ้นสุดหรือคุณเริ่มต้นด้วยความปกติ คำถามเกี่ยวกับว่าเราอยู่ในภาวะปกติได้อย่างไรเมื่อรับค่าเฉลี่ยไม่ได้ตอบโดย CLT .. (เราสามารถพิจารณาคำถามเหล่านั้น แต่เราไม่ได้ใช้ CLT เพื่อดูว่าการประมาณนั้นดีหรือไม่)
Glen_b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.