R语言执行两组间差异分析T检验
做统计学分析的其中一个重要目的就是寻找组间差异,在研究中,我们最常关注的问题莫过于处理组与对照组是否存在了显著不同。就两组间比较而言,t检验是常见的分析方法之一。
本文简介怎样在R中进行t检验,以实现两组间差异分析。
本文使用的作图数据的网盘链接(提取码 6268):
https://pan.baidu.com/s/108oBkDTkuJ1HGBPX0h5Osg
文件“alpha.txt”为某16S细菌群落测序所获得的部分alpha多样性指数数据,包含3列信息:sample,样本名称;observed_species和shannon分别为两种类型的alpha多样性指数。文件“group.txt”为各样本分组信息,第一列(sample)为各样本名称;第二列(group)为各样本的分组信息。
接下来,我们期望在R中运行t检验,以查看不同分组间(两两分组之间)的各alpha多样性指数是否存在显著不同。
数据预处理及正态性假设检验
数据预处理
library(reshape2)
#读入文件,合并分组信息,数据重排
alpha <- read.table('alpha.txt', sep = '\t', header = TRUE, stringsAsFactors = FALSE, check.names = FALSE)
group <- read.table('group.txt', sep = '\t', header = TRUE, stringsAsFactors = FALSE, check.names = FALSE)
alpha <- melt(merge(alpha, group, by = 'sample'), id = c('sample', 'group'))
#我们期望查看 group1 和 group2 的 observed_species 指数是否存在显著差异
#选择要比较的分组
richness_12 <- subset(alpha, variable == 'observed_species' & group %in% c('1', '2'))
richness_12$group <- factor(richness_12$group)
head(richness_12, 10)
选取的数据框“richness_12”内容如下所示。第一列(sample),两组数据中所含样本名称;第二列(group),两组分组名称,且分组列已转化为因子类型;第三列(variable),alpha多样性指数observed_species;第四列(value),observed_species指数的数值。
正态性假设检验
正态QQ图
以下使用car包中的qqPlot(),绘制QQ图查看数值分布。结果中,横坐标是标准的正态分布值,纵坐标是我们数据的值。如果两者基本相等,或者说所有的点都离直线很近,落在置信区间内(图中虚线部分,默认展示95%置信区间),即表明正态性假设符合得很好。
##正态 qq 图验证数据正态性
library(car)
#QQ-plot
qqPlot(lm(value~group, data = richness_12), simulate = TRUE, main = 'QQ Plot', labels = FALSE)
Shapiro-Wilk检验
Shapiro-Wilk类似于线性回归的方法,是检验其于回归曲线的残差,据此验证数据分布的正态性。R中提供了可用于执行Shapiro-Wilk检验的函数shapiro.test(),原假设(或称零假设)为数据集符合正态分布,若结果中p值大于0.05,则接受原假设,数据分布符合正态性。
##Shapiro-Wilk 检验,当且仅当两者 p 值均大于 0.05 时表明数据符合正态分布
shapiro <- tapply(richness_12$value, richness_12$group, shapiro.test)
shapiro
shapiro$'1'$p.value
shapiro$'2'$p.value
T检验
综上,我们的数据分布通过了正态假设检验,即可执行t检验。可分为独立样本的t检验与非独立样本的t检验。
独立样本的t检验
如果样本间是相互独立的,可选用独立样本t检验。R语言t检验函数t.test()中默认两组间相互独立(默认参数paired = FALSE),执行独立样本的t检验。同时需注意,在R中的t检验默认假定方差不相等(默认参数var.equal = FALSE),并使用Welsh的修正自由度;可以通过参数“var.equal= TRUE”假定方差相等,并使用合并方差估计。此外,t.test()默认的备择假设是双侧的(默认参数alternative = 'two.sided'),即执行双侧检验;可分别使用“alternative= 'less'”或“alternative = 'greater'”执行单侧t检验。
我们执行了一个假设方差不相等的双侧检验,如下示例。
##独立样本的 t 检验
t_test <- t.test(value~group, richness_12, paired = FALSE, alternative = 'two.sided')
t_test
t_test$p.value
由于p值远小于0.05,即拒绝了原假设(原假设两组间没有差异),group1和group2的observed_species指数间存在显著不同。
非独立样本的t检验
如果样本间并非相互独立的,可选用非独立样本t检验。例如,非独立组设计(dependent groups design),前-后测设计(per-post design),或重复测量设计(repeated measures design)等。尽管此时你选用独立t检验的方法也可以。
此时在t.test()中设定参数“paired = TRUE”即可执行非独立样本的t检验,如下示例,同样为假设方差不相等的双侧检验。
##非独立样本的 t 检验
t_test <- t.test(value~group, richness_12, paired = TRUE, alternative = 'two.sided')
t_test
t_test$p.value
由于p值远小于0.05,即拒绝了原假设(原假设两组间没有差异),group1和group2的observed_species指数间存在显著不同。
可视化展示
考虑作图将两组差异进行可视化展示。
#boxplot() 箱线图示例
boxplot(value~group, data = richness_12, col = c('blue', 'orange'), ylab = 'Observed_species', xlab = 'Group', main = 't-test: p-value < 0.001')
#ggplot2 柱形图示例
#分别计算各组中的均值以及标准差,展示为均值 ± 标准差的柱形图样式
library(doBy) #使用其中的 summaryBy() 以方便按分组计算
library(ggplot2) #ggplot2 作图
dat <- summaryBy(value~group, richness_12, FUN = c(mean, sd))
ggplot(dat, aes(group, value.mean, fill = group)) +
geom_col(width = 0.4, show.legend = FALSE) +
geom_errorbar(aes(ymin = value.mean - value.sd, ymax = value.mean + value.sd), width = 0.15, size = 0.5) +
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), plot.title = element_text(hjust = 0.5)) +
labs(x = 'Group', y = 'Observed_species', title = 't-test: p-value < 0.001')
友情链接