菜鸟学R语言:如何比较两组均值有无显著差异

June 29, 2013

Tags:菜鸟学R语言

用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
    }
  }
}

使用起来很简单,从数据框中选择两组数据,然后标记是独立样本(TRUET)还是配对样本(FALSEF)。例如,

> 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

最后,大家可以根据需要修改。

· The end ·