Невелика невідповідність між вбудованою функцією 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)

І я хочу проаналізувати діяльність по групах. Спочатку я запускаю тест Крускала-Уолліса за допомогою вбудованої функції 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)i=1г(Ri2нi)-3(N+1)

Де - загальна кількість спостережень, - кількість груп, - кількість спостережень в й групі, а - сума рангів ї групи.NгнiiRii

І тепер я отримую , що, додаючи моєї плутанини, також є відповіддю, що дається для відповідної вправи. Я спробував це для декількох різних наборів даних, і я, як правило, отримую трохи більше значення для за допомогою вбудованої функції.Н=8.499Н

Я намагався шукати, щоб зрозуміти, що я роблю неправильно чи не розумію, але безрезультатно. Чи може хто-небудь допомогти мені зрозуміти, чому вбудована kruskal.testфункція повертає значення, відмінне від того, яке я отримую, написавши речі?

Відповіді:


12

kruskal.testзастосовує виправлення зв’язків, як описано в цій статті Вікіпедії (пункт 4):

Виправлення зв’язків, якщо використовувати скорочену формулу, описану в попередньому пункті, можна здійснити діленням Н на 1-i=1Г(тi3-тi)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 Ні, це не так. Справа в тому, що ОП навчили спрощення тесту, який слід використовувати лише у тому випадку, якщо зв’язків немає.
Роланд

4
@MichaelChernick Я не кажу, що він не підходить для переповнення стека. Але я б заперечував, що він однаково добре вписується в резюме. Очевидно, було б корисно, якби ОП не поділилося не лише своїм кодом, але й формулами, якими вони користуються.
Роланд

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

2
Відредаговано, щоб включити формулу, відображену в коді. Повинен був би зробити це вперше. Вибачення.
MSR

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