การทดสอบสมมติฐานสำหรับความแตกต่างของค่ามัธยฐานในกลุ่มตัวอย่างมากกว่าสองตัวอย่าง


12

คำถาม

คะแนนการทดสอบของคนสามกลุ่มจะถูกบันทึกเป็นเวกเตอร์แยกในอาร์

set.seed(1)
group1 <- rnorm(100, mean = 75, sd = 10)
group2 <- rnorm(100, mean = 85, sd = 10)
group3 <- rnorm(100, mean = 95, sd = 10)

ฉันต้องการทราบว่ามีความแตกต่างที่สำคัญในค่ามัธยฐานระหว่างกลุ่มเหล่านี้หรือไม่ ฉันรู้ว่าฉันสามารถทดสอบกลุ่ม 1 กับกลุ่ม 2 ได้โดยใช้การทดสอบ Wilcoxon เช่นนั้น

wilcox.test(group1, group2)

อย่างไรก็ตามการเปรียบเทียบครั้งนี้มีเพียงสองกลุ่มเท่านั้นและฉันต้องการเปรียบเทียบทั้งสามกลุ่มพร้อมกัน ฉันต้องการทดสอบสถิติที่ให้ค่า ap ที่ระดับนัยสำคัญ 0.05 มีคนช่วยได้ไหม

แก้ไข # 1 - การทดสอบค่ามัธยฐานของอารมณ์

ฉันได้ลองทดสอบค่ามัธยฐานของ Mood ตามผู้ใช้ไฮเบอร์เนต

median.test <- function(x, y){
    z <- c(x, y)
    g <- rep(1:2, c(length(x), length(y)))
    m <- median(z)
    fisher.test(z < m, g)$p.value
}

median.test(group1, group2)

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

แก้ไข # 2 - การทดสอบ Kruskal-Wallis

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

kruskal.test(list(group1, group2, group3))

แก้ไข # 3

ผู้ใช้เกร็กสโนว์ตั้งข้อสังเกตไว้อย่างเป็นประโยชน์ในคำตอบของเขาว่าการทดสอบ Kruskal-Wallis นั้นเหมาะสมตราบใดที่มันมีสมมติฐานที่เข้มงวดซึ่งทำให้เป็นวิธีทดสอบ


มีคำถามที่คล้ายกันจำนวนมากในไซต์นี้แล้ว median testโปรดมองหา คำตอบของตัวเอง / ความคิดเห็นคือที่นี่
ttnphns

ในการเปรียบเทียบค่ามัธยฐานของทั้งสามพร้อมกันดูการแก้ไขของฉันสำหรับรหัส R ที่ปรับเปลี่ยนเล็กน้อย
ไฮเบอร์เนต

คำตอบ:


4

สามารถใช้การทดสอบ Kruskal-Wallis เนื่องจากเป็น ANOVA ที่ไม่ใช่พารามิเตอร์ นอกจากนี้ก็มักจะคิดว่าจะมีประสิทธิภาพมากขึ้นกว่าการทดสอบค่ามัธยฐานของอารมณ์ มันสามารถนำมาใช้ใน R โดยใช้ฟังก์ชั่นkruskal.testในแพคเกจสถิติในอาร์

เพื่อตอบสนองต่อการแก้ไขของคุณการตีความ KW คล้ายกับ ANOVA แบบทางเดียว ค่า p ที่สำคัญจะสอดคล้องกับการปฏิเสธค่า Null ที่ค่าเฉลี่ยทั้งสามค่าเท่ากัน คุณต้องใช้การทดสอบติดตามผล (เช่นเดียวกับ ANOVA) อีกครั้งเพื่อตอบคำถามเกี่ยวกับกลุ่มเฉพาะ โดยทั่วไปแล้วจะทำตามคำถามการวิจัยที่คุณอาจมี เพียงแค่ดูที่พารามิเตอร์ของการจำลองทั้งสามกลุ่มควรแตกต่างจากกันอย่างมากถ้าคุณทำการทดสอบติดตาม


1
เพื่อชี้แจงสองสิ่ง 1) Kruskal-Wallis ไม่ได้เป็นสื่อกลางในการทดสอบเว้นแต่ว่าการแจกแจงของการสังเกตในกลุ่มเป็นไปตามสมมติฐานที่กำหนดไว้ หากคุณต้องการเปรียบเทียบค่ามัธยฐานอาจไม่ใช่การทดสอบที่เหมาะสม เป็นการดีที่สุดที่จะเลือกการทดสอบที่ทดสอบสมมติฐานที่คุณสนใจในการทดสอบจริง ๆ 2) Kruskal-Wallis ไม่ใช่ "ANOVA" นั่นคือมันไม่ได้เป็นการวิเคราะห์ความแปรปรวน 3) การกล่าวถึง "หมายถึง" ในคำตอบนี้ไม่ถูกต้อง
Sal Mangiafico

10

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

เนื่องจากการทดสอบ Wilcoxon เป็นเพียงกรณีพิเศษของการทดสอบการเปลี่ยนรูปและคุณมีความสนใจเป็นพิเศษในค่าเฉลี่ยฉันจึงขอแนะนำให้ทดสอบการเปลี่ยนรูปแบบของค่ามัธยฐาน

ก่อนอื่นให้เลือกการวัดความแตกต่างสิ่งที่ใหญ่ที่สุดของ 3 ค่ามัธยฐานลบด้วยค่าที่น้อยที่สุดของ 3 ค่า (หรือค่าความแปรปรวนของค่ามัธยฐาน 3 ค่าหรือค่า MAD เป็นต้น)

ตอนนี้คำนวณสถิติของคุณสำหรับข้อมูลต้นฉบับ

รวบรวมข้อมูลทั้งหมดในชุดเดียวแล้วทำการสุ่มค่าพาร์ติชั่นออกเป็น 3 กลุ่ม

ขนาดเดียวกันกับต้นฉบับและคำนวณสถิติเดียวกัน

ทำซ้ำหลายครั้ง (เช่น 9998)

เปรียบเทียบว่าสถิติจากข้อมูลจริงเปรียบเทียบกับการกระจายของสถิติทั้งหมดสำหรับการทดสอบของคุณอย่างไร


สมมติว่าฉันยินดีที่จะตั้งสมมติฐานอย่างเข้มงวดที่จำเป็นสำหรับการทดสอบ Wilcox ที่จะทำให้มันเป็นวิธีการทดสอบ จะต้องเปลี่ยนรหัส R ที่ฉันเขียนข้างต้นหรือไม่ สิ่งนี้สามารถทำได้สำหรับการทดสอบ Kruskal-Wallis หรือไม่?
Alexander

1
@ อเล็กซานเดอร์หากคุณเต็มใจที่จะตั้งสมมติฐานเหล่านั้นรหัส R ก็ใช้ได้และ Kruskal Wallis ก็น่าจะดีเช่นกัน แต่แล้วถ้าคุณมีความยินดีที่จะให้สมมติฐานเหล่านั้นแล้วt.testและaovอาจจะดีเช่นกัน
Greg Snow

+1 หากคุณกำลังพูดถึงWilcoxon sum-rank testคุณไม่ควรแปลง "Wilcox" เป็นชื่อนั้นหรือไม่?
ttnphns

@GregSnow +1 สำหรับจุดที่ทำ ... แต่ฉันถือว่า 'Wilcox' คุณหมายถึงการทดสอบที่ตั้งชื่อตาม Frank Wilcoxon (ความสับสนนี้น่าเสียดายที่ประกอบไปด้วย R ซึ่ง - ทำให้เข้าใจผิด - เรียกการทดสอบที่เกี่ยวข้องwilcox.test) คุณสามารถแก้ไขได้ไหม
Glen_b -Reinstate Monica

8

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

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

แก้ไข: สำหรับสามกลุ่มคุณอาจพิจารณาความเรียบง่ายทั่วไปของรหัส R ที่ฉันเชื่อมโยงกับ:

median.test2 <- function(x, y, z) {
  a <- c(x, y, z)
  g <- rep(1:3, c(length(x), length(y), length(z)))
  m <- median(a)
  fisher.test(a < m, g)$p.value
}

1
+1 สำหรับการตั้งชื่อการทดสอบ ฉันไม่รู้ว่าการทดสอบค่ามัธยฐานเรียกอีกอย่างว่าการทดสอบอารมณ์
ttnphns

+1 ขอบคุณที่ช่วยฉันด้วยฉันขอบคุณจริงๆ!
Alexander

ฉันรู้ว่ามีการใช้งานสองสามอย่างใน R. mood.medtestในแพ็คเกจ RVAideMemoire ดูเหมือนจะเป็นการทดสอบปกติยกเว้นว่าจะใช้การทดสอบแบบฟิชเชอร์ตามค่าเริ่มต้นสำหรับขนาดตัวอย่างที่เล็กลง median_testฟังก์ชั่นในแพคเกจเหรียญสามารถให้การทดสอบ asymptotic หรือใช้ Monte Carlo
Sal Mangiafico

0

ฉันรู้ว่านี่มันสายไปแล้ว แต่ฉันก็ไม่สามารถหาชุดทดสอบ Mian's median ที่ดีได้ดังนั้นฉันจึงใช้มันเพื่อสร้างฟังก์ชั่นใน R ที่ดูเหมือนจะใช้กลอุบาย

#Mood's median test for a data frame with one column containing data (d),
#and another containing a factor/grouping variable (f)

moods.median = function(d,f) {

    #make a new matrix data frame
    m = cbind(f,d)
    colnames(m) = c("group", "value")


    #get the names of the factors/groups
    facs = unique(f)

    #count the number of factors/groups
    factorN = length(unique(f))


    #Make a 2 by K table that will be saved to the global environment by using "<<-":
    #2 rows (number of values > overall median & number of values <= overall median)
    #K-many columns for each level of the factor
    MoodsMedianTable <<- matrix(NA, nrow = 2, ncol = factorN)

    rownames(MoodsMedianTable) <<- c("> overall median", "<= overall median")
    colnames(MoodsMedianTable) <<- c(facs[1:factorN])
    colnames(MoodsMedianTable) <<- paste("Factor: ",colnames(MoodsMedianTable))


    #get the overall median
    overallmedian = median(d)



    #put the following into the 2 by K table:
    for(j in 1:factorN){ #for each factor level

        g = facs[j] #assign a temporary "group name"


        #count the number of observations in the factor that are greater than
        #the overall median and save it to the table
        MoodsMedianTable[1,j] <<- sum(m[,2][ which(m[,1]==g)] > overallmedian)


        #count the number of observations in the factor that are less than
        # or equal to the overall median and save it to the table
        MoodsMedianTable[2,j] <<- sum(m[,2][ which(m[,1]==g)] <= overallmedian)

    }


    #percent of cells with expected values less than 5
    percLT5 = ((sum(chisq.test(MoodsMedianTable)$expected < 5)) /
        (length(chisq.test(MoodsMedianTable)$expected)))


    #if >20% of cells have expected values less than 5
    #then give chi-squared stat, df, and Fisher's exact p.value
    if (percLT5 > 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Fisher's exact p.value" = fisher.test(MoodsMedianTable)$p.value))

    }


    #if <= 20% of cells have expected values less than 5
    #then give chi-squared stat, df, and chi-squared p.value
    if (percLT5 <= 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Chi-squared p.value" = chisq.test(MoodsMedianTable)$p.value))

    }

}

สำหรับคำถามของ OP คุณจะต้องรันสิ่งนี้เพื่อสร้าง data frame ใหม่เพื่อเก็บค่าจากเวกเตอร์กลุ่มสามกลุ่มของคุณด้วยตัวแปร "group" ที่ตรงกัน

require(reshape2)
df = cbind(group1, group2, group3)
df = melt(df)
colnames(df) = c("observation", "group", "value")

และเรียกใช้ฟังก์ชันสำหรับการทดสอบค่ามัธยฐานของอารมณ์ด้วย moods.median(df$value, df$group)


ดูเหมือนว่าการทดสอบ Kruskal-Wallis เป็นคำตอบ OP ต้องการโซลูชันที่มี 3 กลุ่ม ปรากฏว่า ttnphns ได้ให้รหัส R สำหรับการทดสอบอารมณ์แล้ว
Michael R. Chernick

1
รหัส ttnphns ที่ให้ค่า ap เท่านั้นสิ่งที่ฉันเขียนยังให้ค่าไคสแควร์กับ df และมันใช้ได้กับกลุ่มทุกกลุ่ม ฉันเพิ่งโพสต์ที่นี่เป็นส่วนใหญ่เนื่องจากโพสต์นี้เป็นครั้งแรกที่เกิดขึ้นเมื่อค้นหาวิธีการทดสอบค่ามัธยฐานของ Mood ใน R.
JRF1111
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.