Leichte Inkonsistenz zwischen der in Kruskal-Wallis integrierten R-Funktion und der manuellen Berechnung

9

Das Folgende verwirrt mich und ich konnte die Antwort an keiner anderen Stelle finden.

Ich versuche, R zu lernen, während ich einige Statistiken mache, und als Übung versuche ich, die Ergebnisse der eingebauten R-Funktionen zu überprüfen, indem ich diese auch sozusagen 'von Hand' in R mache Für den Kruskal-Wallis-Test erhalte ich immer wieder unterschiedliche Ergebnisse, und ich kann nicht herausfinden, warum.

Zum Beispiel betrachte ich die folgenden Daten, die in einer Übung ausgegeben wurden

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)

Und ich möchte die Aktivität nach Gruppen analysieren. Zuerst führe ich einen Kruskal-Wallis-Test mit der eingebauten R-Funktion durch

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

WasH=8.9056 .

Zur Überprüfung versuche ich, dasselbe in R von Hand mit dem folgenden (zweifellos hilflosen) Code zu tun

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

Welches soll die folgende Formel widerspiegeln:

H=12N(N+1)i=1g(Ri2ni)3(N+1)

NgniiRii

H=8.499H

Ich habe versucht zu suchen, um herauszufinden, was ich falsch mache oder nicht verstehe, aber ohne Erfolg. Kann mir jemand helfen zu verstehen, warum die eingebaute kruskal.testFunktion einen anderen Wert zurückgibt als den, den ich durch Rechtschreibung erhalte?

MSR
quelle

Antworten:

12

kruskal.testwendet eine Korrektur für Bindungen an, wie in diesem Wikipedia-Artikel beschrieben (Punkt 4):

1i=1G(ti3ti)N3N

Fortsetzung von Ihrem Code:

TIES <- table(activity)
H / (1 - sum(TIES^3 - TIES)/(length(activity)^3 - length(activity)))
#[1] 8.9056

Sie können herausfinden, was die R-Funktion tut, indem Sie den Code, den Sie sehen können, sorgfältig studieren getAnywhere(kruskal.test.default).

Roland
quelle
4
@ MichaelChernick Nein, das ist es nicht. Der Punkt ist, dass OP eine Vereinfachung des Tests beigebracht wurde, die nur verwendet werden sollte, wenn keine Bindungen bestehen.
Roland
4
@ MichaelChernick Ich sage nicht, dass es bei Stack Overflow nicht passen würde. Aber ich würde argumentieren, dass es genauso gut zum Lebenslauf passt. Natürlich wäre es hilfreich gewesen, wenn OP nicht nur ihren Code, sondern auch die von ihnen verwendeten Formeln geteilt hätte.
Roland
3
@Michael Der Status dieses Threads ist ein einfacher Aufruf: Er liegt genau in unserem Zuständigkeitsbereich, da er versucht, einen statistischen Test zu verstehen.
whuber
2
Bearbeitet, um die im Code wiedergegebene Formel aufzunehmen. Hätte beim ersten Mal daran denken sollen. Entschuldigung.
MSR
3
Siehe auch die R - HmiscPaket - spearman2Funktion , die midranks für Bindungen und einer nutzt FTest Kruskal-Wallis zu erhalten. Ich denke, das ist genauer als einige Methoden.
Frank Harrell