Тест гіпотези на різницю медіанів серед більш ніж двох зразків


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, використовуючи тест Вілкоксона, як це було.

wilcox.test(group1, group2)

Однак це порівнює лише дві групи одночасно, і я хотів би порівняти всі три одночасно. Я хотів би статистичний тест, який дає значення ap на рівні значущості 0,05. Може хтось, будь ласка, допоможе?

Редагувати №1 - медіанний тест Муда

Після запропонованої відповіді користувача Hibernating я спробував медіанний тест Муду.

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 - тест Крускаля-Уолліса

Запропонований користувачем dmartin відповідь виявляється більш-менш тим, що мені потрібно, і дозволяє мені перевірити всі три групи одночасно.

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

Правка №3

Користувач Грег Сноу корисно зазначає у своїй відповіді, що тест Крускаля-Уолліса є доцільним, якщо він робить суворі припущення, що також перетворюють його на перевірку засобів.


На цьому сайті вже було ряд подібних питань. Будь ласка, шукайте median test. Моя відповідь / коментарі є тут .
ttnphns

Щодо порівняння медіанів усіх трьох одночасно, дивіться мою редакцію щодо трохи модифікованого коду R.
Зимує

Відповіді:


4

Тест Крускала-Уолліса також може бути використаний, оскільки це непараметрична ANOVA. Крім того, його часто вважають більш потужним, ніж медіанна проба Муда . Він може бути реалізований в R за допомогою функції kruskal.test в пакеті статистики в Р.

Щоб відповісти на вашу редакцію, інтерпретація KW схожа на односторонню ANOVA. Значне р-значення відповідає відхиленому нулю, що всі три засоби рівні. Ви повинні використовувати подальший тест (знову, як і ANOVA), щоб відповісти на запитання про конкретні групи. Зазвичай випливає з конкретних дослідницьких питань, які можуть виникнути. Лише переглядаючи параметри моделювання, всі три групи повинні істотно відрізнятися одна від одної, якщо ви робите подальший тест (оскільки всі вони 1 SD один від одного з N = 100).


1
Щоб уточнити пару речей. 1) Крускал-Уолліс не є тестом на медіанів, якщо тільки розподіли спостережень у групах не відповідають певним припущенням. Якщо ви дійсно хочете порівняти медіанів, можливо, це не буде відповідним тестом. Найкраще вибрати тест, який насправді тестує гіпотезу, яку ти зацікавив тестувати. 2) Крускал-Уолліс - це не "ANOVA". Тобто це не аналіз дисперсії. 3) згадка про "засоби" у цій відповіді невірна.
Sal Mangiafico

10

По-перше, тест Вілкоксона (або тест Манна-Вітні) не є випробуванням медіанів (якщо тільки ви не робите дуже суворих припущень, які також роблять його випробуванням засобів). І для порівняння більш ніж двох груп тест Вілкоксона може призвести до певних парадоксальних результатів (див . Кістки Ефрона ).

Оскільки тест Вілкоксона - це лише особливий випадок перестановки на перестановку, і ви конкретно цікавитесь медіанами, я б запропонував тест на перестановку на медіанах.

Спочатку вибирайте міру різниці - щось на зразок найбільшої з 3 медіанів мінус найменшої з 3 (або дисперсії 3 медіанів, або MAD тощо).

Тепер обчисліть статистику для вихідних даних.

об'єднати всі дані в один набір, а потім випадковим чином розподілити значення на 3 групи

ті ж розміри, що й оригінал, і обчислюють ту саму статистику.

повторити багато разів (як 9998)

Порівняйте порівняння статистики з реальними даними з розподілом усіх статистичних даних для вашого тесту.


Скажімо, що я готовий зробити суворі припущення, необхідні для тесту Вілкокса, які також зробили б це випробуванням засобів. Чи потрібно це змінити код R, про який я писав вище? Чи можна це зробити і для тесту Крускала-Уолліса?
Олександр

1
@ Олександр, Якщо ви готові зробити ці припущення, тоді код R добре, і Крускал Уолліс також буде добре. Але якщо ви готові зробити ці припущення , то t.testі aovбуде , ймовірно , буде добре , як добре.
Грег Сніг

+1. Якщо ви говорите про те, Wilcoxon sum-rank testчи не проти було б перетворити "Wilcox" на це ім'я?
ttnphns

@GregSnow +1 за отримані бали ... але я припускаю, що під "Wilcox" ви маєте на увазі тест, названий на честь Френка Вілкоксона. (Цю плутанину, на жаль, ускладнює R, який - оману - викликає відповідний тест wilcox.test). Чи можете ви редагувати?
Glen_b -Встановіть Моніку

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 Дякую, що допомогли мені у цьому, я дуже ціную це!
Олександр

Мені відомо, що пара реалізацій у Р. mood.medtestв пакеті RVAideMemoire є звичайним тестом за винятком того, що він використовує точний тест Фішера за замовчуванням для менших розмірів вибірки. median_testФункція в пакеті монет може забезпечити асимптотический тест або використовувати Монт - Карло.
Sal Mangiafico

0

Я знаю, що це вже пізно, але я не зміг знайти гарного пакета для медіанового тесту Муда, тому я взяв на себе, щоб зробити функцію в 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))

    }

}

Що стосується питання щодо ОП, ви спершу запустили це, щоб створити новий кадр даних, який містить значення з ваших трьох групових векторів зі збіжною змінною "групи".

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

і запустити функцію для медіанного тесту Муда з moods.median(df$value, df$group)


Схоже, тест Крускала-Уолліса був відповіддю. ОП потребувало рішення з 3 груп. Схоже, ttnphns вже надав код R для тесту Mood.
Майкл Р. Черник

1
Код, який дав ttnphns, надає лише значення ap, той, який я написав, також дає chi квадрат stat і df, і він працює для будь-якої кількості груп. Я здебільшого щойно розміщував тут, оскільки ця публікація вперше з'явилася, коли шукали, як зробити медіану середнього тесту
Муда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.