Небольшое несоответствие между встроенной функцией R Крускала-Уоллиса и ручным расчетом


9

Меня смущает следующее, и я не смог найти ответ в другом месте.

Я пытаюсь изучить R, выполняя некоторую статистику, и, в качестве упражнения, я пытаюсь перепроверить результаты встроенных функций R, также делая их «вручную», как это было в R. Однако , для теста Крускала-Уоллиса я продолжаю получать разные результаты, и я не могу понять, почему.

Например, я смотрю на следующие данные, полученные в упражнении

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)

И я хочу проанализировать деятельность по группам. Сначала я запускаю тест Крускала-Уоллиса, используя встроенную функцию R

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

Который возвращает .ЧАСзнак равно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

Что должно отражать следующую формулу:

ЧАСзнак равно12N(N+1)Σязнак равно1г(ря2Nя)-3(N+1)

Где - общее количество наблюдений, g - количество групп, n i - количество наблюдений в i- й группе, а R i - сумма рангов i- й группы.NгNяяряя

И теперь я получаю , что, в дополнение к моему замешательству, также является ответом на данное упражнение. Я пробовал это для пары различных наборов данных, и я стремлюсь получить немного более высокое значение для H, используя встроенную функцию.ЧАСзнак равно8,499ЧАС

Я пытался найти, чтобы понять, что я делаю неправильно или не понимаю, но безрезультатно. Может ли кто-нибудь помочь мне понять, почему встроенная kruskal.testфункция возвращает значение, отличное от того, которое я получаю, говоря об этом?

Ответы:


12

kruskal.testприменяет исправление для связей, как описано в этой статье Википедии (пункт 4):

1-Σязнак равно1г(Tя3-Tя)N3-N

Продолжая из вашего кода:

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 научили упрощению теста, который следует использовать только при отсутствии связей.
Роланд

4
@MichaelChernick Я не говорю, что это не будет соответствовать переполнению стека. Но я бы сказал, что он одинаково хорошо подходит для CV. Очевидно, было бы полезно, если бы OP поделился не только своим кодом, но и формулами, которые они используют.
Роланд

3
@Michael Статус этой темы - простой вызов: он находится в пределах нашей компетенции, потому что он пытается понять статистический тест.
whuber

2
Отредактировано, чтобы включить формулу, отраженную в коде. Должен был подумать об этом в первый раз. Извиняюсь.
MSR

3
Смотрите также функцию Hmiscпакета R , spearman2которая использует средние ранги для связей и Fтест для получения Крускала-Уоллиса. Я думаю, что это точнее, чем некоторые методы.
Фрэнк Харрелл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.