用R时间久了,确实非常方便,因为很多自定义的东西可以写。可能其他商业统计软件也可以吧,但没有R开源,长话短说。
比较两组数据的均值有无显著差异时,要选择适当的检验对其进行分析,如下表:
符合零假设 | 不符合零假设 | |
---|---|---|
比较两组独立样本 | 独立t检验 | Mann-Whitney检验 |
比较两组配对样本 | 配对t检验 | Wilcoxon检验 |
所以,首先要确定你的数据是独立的(unpaired
)还是配对的(paired
)。举个例子,有两杯水,一杯是纯净水A,一杯是自来水B,实验第一天我们测一下其中氯离子浓度,十天后,再测一次。如果你要比较第十天,A与B之间的差异,就要进行独立检验;如果你要比较第一天的B和第十天的B有什么不同,那就要进行配对检验。
选择好了数据形式之后,要检验其是否符合正态分布、方差齐性等t检验的零假设条件,才能最终确定使用哪种方法得到我们想要的p值。因此,这里就存在一个变数,如果各组数据都符合或都不符合零假设,都还好,就怕有的符合有的不符合,这样在有很多对数据都要进行两两比较时,就比较麻烦了。
我就针对我的个人需求写了个小函数,减少了工作量,提高了成就感,即先用levene
检验判断方差齐性,p > 0.05
的表示方差齐,然后才能进行t检验,否则进行相对应的非参数检验。在这里分享出来:
p_value = function(x,y,z){
x=data.frame(x)
y=data.frame(y)
c=nrow(x)
d=nrow(y)
colnames(x)='variable'
colnames(y)='variable'
a=data.frame(rep('A',c))
b=data.frame(rep('B',d))
colnames(a)='group'
colnames(b)='group'
data=data.frame(variable=rbind(x,y),group=rbind(a,b))
if(leveneTest(variable~group,data)$Pr[1] =='NaN'){
print(NA)
}else{
if(leveneTest(variable~group,data)$Pr[1] >0.05){
t.test(x,y,paired=z)$p.value
}else{
wilcox.test(data[1:c,1],data[(c+1):(c+d),1],paired=z)$p.value
}
}
}
使用起来很简单,从数据框中选择两组数据,然后标记是独立样本(TRUE
或 T
)还是配对样本(FALSE
或 F
)。例如,
> a=c(1,2,5,7,9,0)
> b=c(2,3,4,3,6,4)
> p_value(a,b,TRUE) #for unpaired data
[1] 0.8316408
> p_value(a,b,FALSE) #for paired data
[1] 0.9358497
最后,大家可以根据需要修改。