Kruskal-Wallis内置的R函数与手动计算之间略有不一致


9

我对以下内容感到困惑,并且无法在其他地方找到答案。

我试图在做一些统计的同时学习R,并且作为练习,我尝试通过像在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-Wallis测试

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

返回。H=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

它旨在反映以下公式:

H=12ññ+1个一世=1个G[R一世2ñ一世-3ñ+1个

其中是观察的总数,是组的数目,是第组的观察数,是第组的等级总和。ñGñ一世一世[R一世一世

现在我得到,这使我感到困惑,这也是有关练习的答案。我已经尝试了几个不同的数据集,并且使用内置函数时,我倾向于获得更高的值。H=8.499H

我试图搜索出自己在做什么错或无法理解,但无济于事。谁能帮助我理解为什么内置kruskal.test函数返回的值与我通过拼写得出的值不同?

Answers:


12

kruskal.test本维基百科文章所述(第4点),对联系进行更正:

如果使用上一点中描述的捷径公式,则可以通过将H除以1 - G i = 1t 3 i - t i来校正关系。,...1个-一世=1个GŤ一世3-Ť一世ñ3-ñ

继续执行您的代码:

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

您可以通过仔细研究代码来找出R函数的作用,您可以使用查看代码getAnywhere(kruskal.test.default)


4
@MichaelChernick不,不是。关键是OP被教导要简化测试,只有在没有联系时才应使用。
罗兰

4
@MichaelChernick我并不是说它不适用于Stack Overflow。但我认为它同样适合简历。显然,如果OP不仅共享他们的代码,而且还共享他们正在使用的公式,那将是有帮助的。
罗兰

3
@Michael这个线程的状态很容易调用:它完全在我们的权限之内,因为它试图理解统计检验。
whuber

2
编辑以包括反映在代码中的公式。应该以为是第一次。道歉。
MSR

3
另请参见R Hmiscspearman2函数,该函数使用中秩进行平局并进行F测试以获取Kruskal-Wallis。我认为这比某些方法更准确。
Frank Harrell'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.