ความไม่สอดคล้องกันเล็กน้อยระหว่างฟังก์ชัน R ในตัว Kruskal-Wallis และการคำนวณด้วยตนเอง


9

ฉันสับสนในเรื่องต่อไปนี้และฉันไม่สามารถหาคำตอบที่อื่นได้

ฉันพยายามเรียนรู้ R ในขณะที่ทำสถิติและในการออกกำลังกายฉันพยายามตรวจสอบผลลัพธ์ของฟังก์ชั่น R ในตัวอีกครั้งโดยทำสิ่งเหล่านี้ 'ด้วยมือ' ตามที่เป็นอยู่ในอาร์อย่างไรก็ตาม สำหรับการทดสอบ Kruskal-Wallis ฉันได้รับผลลัพธ์ที่แตกต่างกันไปและฉันไม่สามารถหาสาเหตุได้

ตัวอย่างเช่นฉันกำลังดูข้อมูลต่อไปนี้ที่แจกในแบบฝึกหัด

activity <- c(2, 4, 3, 2, 3, 3, 4, 0, 4, 3, 4, 0, 0, 1, 3, 1, 2, 0, 3, 1, 0, 3, 4, 0, 1, 2, 2, 2, 3, 2) 
group <- c(rep("A", 11), rep("B", 10), rep("C", 9))
group <- factor(group)
data.raw <- data.frame(activity, group)

และฉันต้องการวิเคราะห์กิจกรรมตามกลุ่ม ก่อนอื่นฉันรันการทดสอบ Kruskal-Wallis โดยใช้ฟังก์ชั่น R ในตัว

kruskal.test(activity ~ group, data = data.raw)

ซึ่งผลตอบแทน8.9056H=8.9056

ในการตรวจสอบอีกครั้งฉันลองทำแบบเดียวกันด้วยมือใน R โดยใช้โค้ดต่อไปนี้

rank <- rank(activity)
data.rank <- data.frame(rank, group)
rank.sum <- aggregate(rank ~ group, data = data.rank, sum)

x <- rank.sum[1,2]^2 / 11 + rank.sum[2,2]^2 / 10 + rank.sum[3,2]^2 / 9
H <- (12 / (length(activity) * (length(activity) + 1))) * x - 3 * (length(activity) + 1)
H

ซึ่งมีความหมายเพื่อสะท้อนสูตรต่อไปนี้:

H=12N(N+1)i=1g(Ri2ni)3(N+1)

ที่ไหนคือจำนวนของการสังเกตเป็นจำนวนของกลุ่มที่เป็นจำนวนของการสังเกตในที่กลุ่ม, th และคือผลรวมของการจัดอันดับของกลุ่ม THNgniiRii

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

ฉันพยายามค้นหาเพื่อค้นหาสิ่งที่ฉันทำผิดหรือไม่เข้าใจ แต่ก็ไม่มีประโยชน์ ทุกคนสามารถช่วยฉันเข้าใจว่าทำไมkruskal.testฟังก์ชั่นinbuilt จึงส่งกลับค่าที่แตกต่างจากที่ฉันได้รับจากการสะกดคำ

คำตอบ:


12

kruskal.testใช้การแก้ไขความสัมพันธ์ตามที่อธิบายไว้ในบทความ Wikipedia (จุดที่ 4):

การแก้ไขความสัมพันธ์ถ้าใช้สูตรทางลัดที่อธิบายไว้ในจุดก่อนหน้านี้สามารถทำได้โดยการหาร H ด้วย , ...1i=1G(ti3ti)N3N

ดำเนินการต่อจากรหัสของคุณ:

TIES <- table(activity)
H / (1 - sum(TIES^3 - TIES)/(length(activity)^3 - length(activity)))
#[1] 8.9056

คุณสามารถค้นหาสิ่งที่ฟังก์ชั่น R ทำได้โดยศึกษาโค้ดอย่างรอบคอบซึ่งคุณสามารถดูgetAnywhere(kruskal.test.default)ได้


4
@MichaelChernick ไม่ไม่ใช่ ประเด็นก็คือว่า OP ได้รับการสอนให้ง่ายขึ้นของการทดสอบที่ควรใช้เฉพาะในกรณีที่ไม่มีความสัมพันธ์
Roland

4
@MichaelChernick ฉันไม่ได้บอกว่ามันไม่เหมาะกับ Stack Overflow แต่ฉันยืนยันว่ามันเหมาะกับ CV อย่างเท่าเทียมกัน เห็นได้ชัดว่ามันจะมีประโยชน์ถ้า OP ไม่เพียง แต่แชร์รหัส แต่ยังสูตรที่ใช้อยู่
Roland

3
@Michael สถานะของเธรดนี้เป็นการเรียกที่ง่าย: มันอยู่ในขอบเขตของเราเพราะมันพยายามที่จะเข้าใจการทดสอบทางสถิติ
whuber

2
แก้ไขเพื่อรวมสูตรที่แสดงในรหัส ควรคิดว่าจะทำเช่นนี้เป็นครั้งแรกในรอบ ขอโทษ.
MSR

3
ดูฟังก์ชันR Hmiscpackage spearman2ที่ใช้ midranks สำหรับความสัมพันธ์และการFทดสอบเพื่อรับ Kruskal-Wallis ฉันคิดว่านี่แม่นยำกว่าวิธีการบางอย่าง
Frank Harrell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.