Ligera inconsistencia entre la función R incorporada de Kruskal-Wallis y el cálculo manual

9

Estoy confundido por lo siguiente, y no he podido encontrar la respuesta en otro lado.

Estoy tratando de aprender R mientras hago algunas estadísticas, y, como ejercicio, trato de verificar los resultados de las funciones R incorporadas al hacerlas 'a mano', por así decirlo, en R. Sin embargo, , para la prueba de Kruskal-Wallis sigo obteniendo resultados diferentes, y no puedo entender por qué.

Por ejemplo, estoy viendo los siguientes datos entregados en un ejercicio

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)

Y quiero analizar la actividad por grupo. Primero ejecuto una prueba de Kruskal-Wallis usando la función R incorporada

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

Lo que devuelve .H=8.9056

Para verificar dos veces, intento hacer lo mismo 'a mano' en R, con el siguiente código (sin duda indefenso)

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

Lo cual debe reflejar la siguiente fórmula:

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

Donde es el número total de observaciones, es el número de grupos, es el número de observaciones en el ésimo grupo, y es la suma de los rangos del ésimo grupo.g n i i R i iNgniiRii

Y ahora obtengo , que, además de mi confusión, es también la respuesta dada para el ejercicio en cuestión. He intentado esto para un par de conjuntos de datos diferentes, y tiendo a obtener un valor ligeramente mayor para usando la función incorporada.HH=8.499H

He intentado buscar averiguar qué estoy haciendo mal o no puedo entender, pero fue en vano. ¿Alguien puede ayudarme a entender por qué la kruskal.testfunción incorporada devuelve un valor diferente del que obtengo al deletrear las cosas?

MSR
fuente

Respuestas:

12

kruskal.testaplica una corrección por lazos como se describe en este artículo de Wikipedia (punto 4)

1i=1G(ti3ti)N3N

Continuando con su código:

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

Puede averiguar qué hace la función R estudiando cuidadosamente el código, que puede ver usando getAnywhere(kruskal.test.default).

Roland
fuente
44
@MichaelChernick No, no lo es. El punto es que a OP se le ha enseñado una simplificación de la prueba que debe usarse solo si no hay vínculos.
Roland
44
@MichaelChernick No estoy diciendo que no encajaría en Stack Overflow. Pero diría que encaja igualmente bien en CV. Obviamente, hubiera sido útil si OP no solo hubiera compartido su código sino también las fórmulas que están utilizando.
Roland
3
@Michael El estado de este hilo es una llamada fácil: está dentro de nuestro alcance porque busca comprender una prueba estadística.
whuber
2
Editado para incluir la fórmula reflejada en el código. Debería haber pensado hacerlo la primera vez. Disculpas
MSR
3
Vea también la función del Hmiscpaquete R spearman2que usa midranks para los lazos y una Fprueba para obtener Kruskal-Wallis. Creo que esto es más preciso que algunos métodos.
Frank Harrell el