Ligeira inconsistência entre a função R interna de Kruskal-Wallis e o cálculo manual

9

Estou confuso com o seguinte e não consegui descobrir a resposta em nenhum outro lugar.

Estou tentando aprender R ao fazer algumas estatísticas e, como exercício, tento verificar novamente os resultados das funções R incorporadas, fazendo-as também 'à mão', por assim dizer, na R. , para o teste de Kruskal-Wallis, continuo obtendo resultados diferentes e não consigo entender o porquê.

Por exemplo, estou vendo os seguintes dados distribuídos em um exercício

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 eu quero analisar a atividade por grupo. Primeiro, eu executo um teste de Kruskal-Wallis usando a função R integrada

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

O que retorna .H=8.9056

Para verificar novamente, tento fazer o mesmo 'à mão' em R, com o seguinte código (sem dúvida, indefeso)

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

O que deve refletir a seguinte fórmula:

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

Onde é o número total de observações, é o número de grupos, é o número de observações no ésimo grupo e é a soma das classificações do ésimo grupo.g n i i R i iNgniiRii

E agora recebo , o que, aumentando a minha confusão, também é a resposta dada para o exercício em questão. Eu tentei isso para alguns conjuntos de dados diferentes e tenho a tendência de obter um valor um pouco mais alto para usando a função incorporada.HH=8.499H

Eu tentei procurar descobrir o que estou fazendo de errado ou não entendendo, mas sem sucesso. Alguém pode me ajudar a entender por que a kruskal.testfunção embutida retorna um valor diferente daquele que recebo explicando as coisas?

MSR
fonte

Respostas:

12

kruskal.testaplica uma correção para empates, conforme descrito neste artigo da Wikipedia (ponto 4):

Uma correção para empates se usar a fórmula de atalho descrita no ponto anterior pode ser feita dividindo H por , ...1i=1G(ti3ti)N3N

Continuando com seu código:

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

Você pode descobrir o que a função R faz estudando cuidadosamente o código, que você pode ver usando getAnywhere(kruskal.test.default).

Roland
fonte
4
@MichaelChernick Não, não é. O ponto é que o OP aprendeu uma simplificação do teste que deve ser usada apenas se não houver vínculos.
Roland
4
@MichaelChernick Não estou dizendo que não caberia no Stack Overflow. Mas eu argumentaria que isso se encaixa igualmente bem no CV. Obviamente, teria sido útil se o OP não tivesse compartilhado apenas seu código, mas também as fórmulas que estão usando.
Roland
3
@ Michael O status deste tópico é fácil: está diretamente dentro do nosso alcance, porque procura entender um teste estatístico.
whuber
2
Editado para incluir a fórmula refletida no código. Deveria ter pensado em fazê-lo pela primeira vez. Desculpas.
MSR 9/01
3
Veja também a função do Hmiscpacote R , spearman2que usa midranks para empates e um Fteste para obter o Kruskal-Wallis. Eu acho que isso é mais preciso do que alguns métodos.
Frank Harrell