Leggera incoerenza tra la funzione R integrata di Kruskal-Wallis e il calcolo manuale


9

Sono confuso da quanto segue e non sono stato in grado di trovare la risposta altrove.

Sto cercando di imparare R mentre faccio alcune statistiche e, come esercizio, provo a ricontrollare i risultati delle funzioni R incorporate facendo anche queste "manualmente", per così dire, in R. Tuttavia , per il test Kruskal-Wallis continuo a ottenere risultati diversi e non riesco a capire perché.

Ad esempio, sto esaminando i seguenti dati forniti in un esercizio

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)

E voglio analizzare l'attività per gruppo. Per prima cosa eseguo un test Kruskal-Wallis usando la funzione R integrata

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

Che restituisce .H=8,9056

Per ricontrollare, provo a fare lo stesso "a mano" in R, con il seguente codice (senza dubbio impotente)

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

Che vuole riflettere la seguente formula:

H=12N(N+1)Σio=1g(Rio2nio)-3(N+1)

Dove è il numero totale di osservazioni, g è il numero di gruppi, n_i è il numero di osservazioni nel primo gruppo e R_i è la somma dei ranghi del primo gruppo.NgnioioRioio

E ora ottengo , che, aggiungendo alla mia confusione, è anche la risposta data per l'esercizio in questione. Ho provato questo per un paio di set di dati diversi e tendo a ottenere un valore leggermente più alto per usando la funzione integrata.H=8,499H

Ho provato a cercare di capire cosa sto sbagliando o non riuscendo a capire, ma senza risultati. Qualcuno può aiutarmi a capire perché la kruskal.testfunzione integrata restituisce un valore diverso da quello che ottengo spiegando le cose?

Risposte:


12

kruskal.testapplica una correzione per i legami come descritto in questo articolo di Wikipedia (punto 4):

Una correzione per i legami se si utilizza la formula di scelta rapida descritta nel punto precedente può essere effettuata dividendo H per , ...1-Σio=1sol(tio3-tio)N3-N

Continuando dal tuo codice:

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

Puoi scoprire cosa fa la funzione R studiando attentamente il codice, che puoi vedere usando getAnywhere(kruskal.test.default).


4
@MichaelChernick No, non lo è. Il punto è che a OP è stata insegnata una semplificazione del test che dovrebbe essere usata solo se non ci sono legami.
Roland

4
@MichaelChernick Non sto dicendo che non si adatterebbe allo Stack Overflow. Ma direi che si adatta ugualmente bene al CV. Ovviamente, sarebbe stato utile se OP avesse condiviso non solo il loro codice ma anche le formule che stavano usando.
Roland

3
@Michael Lo stato di questa discussione è una chiamata facile: rientra perfettamente nelle nostre competenze perché cerca di capire un test statistico.
whuber

2
Modificato per includere la formula riflessa nel codice. Avrei dovuto pensare di farlo la prima volta. Scuse.
MSR

3
Vedi anche la funzione del Hmiscpacchetto R spearman2che utilizza i midrank per i pareggi e un Ftest per ottenere Kruskal-Wallis. Penso che questo sia più preciso di alcuni metodi.
Frank Harrell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.