俺的学习笔记

Wednesday, December 5, 2018

Kruskal-Wallis test/Friedman test

对于Ordinal Data的多群检测。可以用Kruskal-Wallis test或Friedman test来测中间值(median)的同一性。
※注意,多群检验,重复做两-两之间的两群检验是不行的,原因在学习ANOVA的时候解释过了。
如果多群是独立的数据,就用Kruskal-Wallis test
如果是相关的(paired),就用Friedman test

这里的第12.5章,有个pdf文件说的比较清楚,还有例子。
The Mann-Whitney Test looks for differences in median values between two samples.
Both the Kruskal-Wallis and Friedman Tests look for differences in median values between more than two samples.
The Kruskal-Wallis Test is used to analyse the effects of more than two levels of just one factor on the experimental result. It is the non-parametric equivalent of the One Way ANOVA.
The Friedman Test analyses the effect of two factors, and is the nonparametric
equivalent of the Two Way ANOVA.
也就是说,Kruskal-Wallis Test是测试受1个因素影响的,多个样本的median的差异(独立多群)。而Friedman Test则是2个因素(paired多群?)。
这两个检测方法都是针对Ordinal Data的,比如排序啊,满足度啊之类的顺序尺度而不是实际的数值。
例子:
对医院的12名新护士的技术水准打分,得到的结果如下:
※注意,各个组的人数完全可以不等
内科50805881
外科67697288
眼科54627577
请问这三个科室的护士技术水平有差异吗?
这个因为是受一个因素影响的,多群的平均值判定,而且是ordinal data,所以用Kruskal-Wallis Test。
因为是Ordinal data,所以计算方法如下:
1.先俺上述得分从小到大排列好,并列出其排名
科室
得分505458626769727577808188
名次123456789101112
※注:得分相同的名次按平均值计算,比如如果第3和第4得分相同,则第三第四名次都是(3+4)/2=3.5。
2.然后把各个科室的名次列出来,并计算其名次的和以及平均值

平均
内科110311256.25
外科56712307.5
眼科2489235.75
然后用如下公式计算出其H值:
其中N是数据的总个数,k是群数,Ri是各个群组的名次和。上式计算得到H=0.500。
由于有3个群组,因此自由度=(3-1)=2。
计算出H值以后,在于样本数较小的情况,Hcrit可以通过查表得到。
对于样本数较大的情况(一说大于5),Hcrit可以用Χ平方代替。
当然了,这些都很麻烦,其实用R就可以简单地计算出来了。
> vx=c(50,80,58,81)
> vy=c(67,69,72,88)
> vz=c(54,62,75,77)
> kruskal.test(x=list(vx,vy,vz))

  Kruskal-Wallis rank sum test

data: list(vx, vy, vz)
Kruskal-Wallis chi-squared = 0.5, df = 2, p-value = 0.7788
上面是直接输入数据。当然了,输入名次也可以得到相同的结果
> vx=c(1,10,3,11)
> vy=c(5,6,7,12)
> vz=c(2,4,8,9)
> kruskal.test(x=list(vx,vy,vz))

  Kruskal-Wallis rank sum test

data: list(vx, vy, vz)
Kruskal-Wallis chi-squared = 0.5, df = 2, p-value = 0.7788

下面看看Friedman test
这篇文章说的似乎比较清楚,而且和Kruskal-Wallis test进行了比较。
它说Friedman test检测的是两个要素的影响。
比如:药物的浓度和时间对细菌数量的影响。
0(h)
1(h)
2(h)
3(h)
濃度a(%)
100
90
80
73
濃度b(%)
100
80
70
60
濃度c(%)
100
60
45
34
这种情况就可以用Friedman test来做。
具体做法略过,可以用R的friedman.test来做。
> va=c(1.00, 0.90, 0.80, 0.73)
> vb=c(1.00, 0.80, 0.70, 0.60)
> vc=c(1.00, 0.60, 0.45, 0.34)
> friedman.test(y=matrix(c(va,vb,vc),ncol=3))

    Friedman rank sum test

data: matrix(c(va, vb, vc), ncol = 3)
Friedman chi-squared = 6, df = 2, p-value = 0.04979
※当然了,直接输入数字而不是百分比也是同样的结果。
> va=c(100.0, 90.0, 80.0, 73.0)
> vb=c(100.0, 80.0, 70.0, 60.0)
> vc=c(100.0, 60.0, 45.0, 34.0)
> friedman.test(y=matrix(c(va,vb,vc),ncol=3))

    Friedman rank sum test

data: matrix(c(va, vb, vc), ncol = 3)
Friedman chi-squared = 6, df = 2, p-value = 0.04979
再进一步,直接输入排序,也可以得到同样的结果。
0(h)
1(h)
2(h)
3(h)
濃度a(%)
100
90
80
73
2
35.56
濃度b(%)
100
80
70
60
2
5.579.5
濃度c(%)
100
60
45
34
2
9.51011
> va=c(2,3,5.5,6)
> vb=c(2,5.5,7,9.5)
> vc=c(2,9.5,10,11)
> friedman.test(y=matrix(c(va,vb,vc),ncol=3))

    Friedman rank sum test

data: matrix(c(va, vb, vc), ncol = 3)
Friedman chi-squared = 6, df = 2, p-value = 0.04979

https://plaza.umin.ac.jp/~health-stat/wpsystem/wp-content/uploads/2017/01/chapter8_slide.pdf
https://data-science.gr.jp/implementation/ist_r_kruskal_wallis_test.html
https://towardsdatascience.com/what-is-a-p-value-b9e6c207247f
https://towardsdatascience.com/statistical-significance-hypothesis-testing-the-normal-curve-and-p-values-93274fa32687

Labels: , ,

0 Comments:

Post a Comment

<< Home