Проверка гипотезы на разницу в медиане между более чем двумя образцами

12

Вопрос

Результаты тестов трех групп людей сохраняются в виде отдельных векторов в R.

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)

Тем не менее, это сравнивает только две группы одновременно, и я хотел бы сравнить все три одновременно. Я хотел бы статистический тест, который дает значение р на уровне значимости 0,05. Может ли кто-нибудь помочь, пожалуйста?

Редактировать # 1 - Медиана тест настроения

Следуя предложенному пользователю ответу Hibernating, я попробовал медианный тест 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 - тест Крускала-Уоллиса

Предложенный пользователем dmartin ответ выглядит более или менее тем, что мне нужно, и позволяет мне тестировать все три группы одновременно.

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

Редактировать № 3

Пользователь Грег Сноу услужливо отмечает в своем ответе, что тест Крускала-Уоллиса уместен, если он делает строгие предположения, которые делают его также проверкой средств.

Александр
источник
На этом сайте уже было несколько похожих вопросов. Пожалуйста, ищите median test. Мой собственный ответ / комментарии здесь .
ttnphns
Что касается сравнения медиан всех трех одновременно, см. Мою правку для слегка модифицированного кода R.
Спящий режим

Ответы:

4

Можно также использовать критерий Крускала-Уоллиса, так как это непараметрический ANOVA. Кроме того, его часто считают более мощным, чем средний тест Муда . Это может быть реализовано в R с помощью функции kruskal.test в пакете stats в R.

Чтобы ответить на ваши изменения, интерпретация KW похожа на одностороннюю ANOVA. Значительное значение p соответствует отклоненному нулю, что все три средства равны. Вы должны использовать дополнительный тест (опять же, как ANOVA), чтобы ответить на вопросы о конкретных группах. Это обычно следует за конкретными вопросами исследования, которые могут у вас возникнуть. Просто взглянув на параметры симуляции, все три группы должны значительно отличаться друг от друга, если вы выполните дополнительный тест (так как они все 1 SD друг от друга с N = 100).

dmartin
источник
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, не могли бы вы преобразовать «Уилкокс» в это имя?
ttnphns
@GregSnow +1 за набранные очки ... но я предполагаю, что под словом "Уилкокс" вы подразумеваете тест имени Фрэнка Уилкоксона. (Эта путаница, к сожалению, усугубляется R, который - вводит в заблуждение - вызывает соответствующий тест wilcox.test). Не могли бы вы отредактировать?
Glen_b
8

Медианный тест Mood - это непараметрический тест, который используется для проверки равенства медиан из двух или более групп населения. Смотрите здесь для R части вашего вопроса. Смотрите также связанный вопрос здесь . Также отсюда :

Медианный тест Mood легче всего выполнить вручную: определите общую медиану (из всех данных) и посчитайте, сколько значений выше и ниже медианы в каждой группе. Если все группы примерно одинаковы, наблюдения должны быть примерно на 50-50 выше и ниже общей медианы в каждой группе ... Показатели ниже медианы и выше медианы ... образуют двустороннюю таблицу, которая затем анализируется с использованием критерия хи-квадрат. Медианный тест Mood во многом похож на тест знака, обобщенный для двух или более групп.

Изменить: Для трех групп, вы можете рассмотреть это простое обобщение кода 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
}
Hibernating
источник
1
+1 за наименование теста. Я не знал, что медианный тест также называется тестом настроения.
ttnphns
+1 Спасибо за помощь в этом, я очень ценю это!
Александр
Мне известно, что пара реализаций в R. mood.medtestв пакете RVAideMemoire является обычным тестом, за исключением того, что он использует точный тест Фишера по умолчанию для меньших размеров выборки. median_testФункция в пакете монет может обеспечить асимптотический тест или использовать Монт - Карло.
Sal Mangiafico
0

Я знаю, что это слишком поздно, но я не смог найти хороший пакет для медианного теста Mood, поэтому я взял на себя задачу создать функцию в 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, вы сначала запустите его, чтобы создать новый фрейм данных, в котором будут храниться значения из трех векторов групп с соответствующей переменной «group».

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

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

JRF1111
источник
Похоже, что тест Крускала-Уоллиса был ответом. ОП нуждался в решении с 3 группами. Похоже, что ttnphns уже предоставил R-код для теста Mood.
Михаил Р. Черник
1
Код, предоставленный ttnphns, предоставляет только значение ap, тот, который я написал, также дает хи-квадрат stat и df, и он работает для любого числа групп. В основном я только что написал здесь, так как этот пост является первым, когда я ищу, как выполнить медианное тестирование Mood в R.
JRF1111