使用R语言进行两组数据的比较

发布于 2021-11-10  207 次阅读


首先我们复习一下两组数据比较的思路:

废话不多说了,我们直接开始吧:

一、正态性检验

R语言进行Lilliefors正态性检验依赖nortest包,代码如下:

library(nortest)  # 加载nortest包
lillie.test(data)  # 每次仅能传入一组data

lillie.test()返回的数据包括检验量D和P 值,如下所示:

lillie.test(data)
>	 Lilliefors (Kolmogorov-Smirnov) normality test
> data:  data
> D = xxxxx, p-value = xxxxx

若通过循环检验多组数据正态性并通过P 值判断数据是否服从正态分布,可以通过lillie.test(x0.5)$p.value的方法直接返回数值形式的P 值。

二、方差齐性检验

R语言进行Levene方差齐性检验依赖car包和carData包,其语法有些像Python做多组数据事后多重比较,传入的内容包括所有样本的数据集和分组。代码如下:

library(car)  # 加载car包
library(carData)
leveneTest(data, factor, center=mean)  
# xscale为多组样本依次排列在一起的数值型变量;factor为类似于SPSS的分组变量,可用1,2,3等整数表示
# center默认为median,当数据服从正态分布时,应该将center参数改为mean

leveneTest()返回的内容如下:

> Levene's Test for Homogeneity of Variance (center = mean)
>       Df F value Pr(>F)
> group  1  0.1491 0.7039
>       18 

需要注意的是,R语言中的leveneTest()不支持直接传入多组数据,否则会返回警告信息,如下所示:

leveneTest(data1, data2)
> Warning message:
> In leveneTest.default(data1, data2) : data2 coerced to factor.

自动生成分组的代码如下所示:

factor <- as.factor(c(seq(1,1,length.out=length(data1)), seq(2,2,length.out=length(data2))))

与正态性检验类似,若想直接获得方差齐性检验的P 值,可以通过leveneTest(xscale, group)$Pr(>F)[1]的方法。

三、t检验

R语言的t检验和t'检验(两组样本方差不齐时采用),以及两独立样本和两配对样本t检验都包含在t.test方法中,代码如下:

library(stats)
t.test(data1, data2, paired = FALSE, var.equal = TRUE)  # 配对样本t检验:将paired改为T;t'检验:将var.equal改为F

也可通过t.test(data1, data2, oaired = F, var.equal = T)$p.value直接获取P 值。

四、非参数检验

R语言的非参数检验只有一个语法wilcox.test(),通过paired参数来确定是进行两独立样本还是两相关样本的非参数检验。代码如下:

library(stats)
wilcox.test(data1, data2, paired = F)  # 两独立样本的非参数检验
wilcox.test(data1, data2, paired = T)  # 两相关样本的非参数检验

五、总结

R语言的循环和python不太一样,代码总结如下:

# 两独立样本的比较
# data1, data2为两个样本, alldata为data1和data2的合集,group为针对alldata的分组
library(nortest)
library(car)
library(carData)
library(stats)
if (lillie.test(data1)$p.value & lillie.test(data2)$p.value > 0.1) {
  print ("两组数据均服从正态分布")
  if (leveneTest(alldata, group=group, center = mean)$`Pr(>F)`[1] > 0.1) {
    print ("两组数据方差齐,将使用独立样本t检验")
    t.test(data1, data2, paired = F, var.equal = T)
  } else {
    print ("两组数据方差不齐,将使用独立样本t'检验")
    t.test(data1, data2, paired = F, var.equal = F)
  }
} else {
  print ("两组数据不全服从正态分布,将使用非参数检验")
  wilcox.test(data1, data2, paired = F)
}

# 两配对样本的比较
ibrary(nortest)
library(stats)
if (lillie.test(x0.5)$p.value & lillie.test(x1)$p.value > 0.1) {
  print ("两组数据均服从正态分布")
  t.test(x0.5, x1, paired = T)
} else {
  print ("两组数据不全服从正态分布,将使用非参数检验")
  wilcox.test(x0.5, x1, paired = T)
}