使用计算机语言玩数理统计
使用Python进行单因素影响下的多组独立数据的比较
使用Python进行单因素影响下的多组独立数据的比较

使用Python进行单因素影响下的多组独立数据的比较

多组数据(大于或等于三组)的比较不可以用两组数据的比较方法(如t检验、MannWhitneyu检验等),可采用方差分析。通常生物学或基础医学实验只采用单个变量(如是否造模,是否给药治疗等),因此单因素方差分析使用更为普遍。当研究样本不全服从正态分布或方差不齐时,则应采用非参数检验。

多组数据的比较最好将数据整理成数据框的形式,这样会极大方便后续的多重比较。本文仅简单提供多组数据比较所需要的基本语句,数据框的创建会专门写文章说明。

正态性检验和方法齐性检验的相关方法已在如何用python进行两组数据的比较中提及,此处不再赘述。代码粘贴如下:

from statsmodels.stats.diagnostic import lilliefors  # 导入相应模块
lilliefors(data1, data2, data3, ......)  # 正态性检验

from scipy import stats  # 导入相应模块
stats.levene(data1, data2, data3, ...,  center="mean")  #方差齐性检验

与两组数据的比较不同,若有样本未通过方差齐性检验,即使所有的样本通过了正态性检验,也应该用非参数检验。

一、所有组别的数据均通过正态性检验与方差齐性检验:

所有样本若均服从正态分布,并且方差齐,可采用单因素方差分析(ANOVA)。Python实现ANOVA分析如下:

from statfrom scipy import stats  # 导入相应模块
stats.f_oneway(data1, data2, data3, ...)

stats.f_oneway()方法返回对象包括统计量和P 值,可通过类似列表切片的方式截取出P 值,如下所示:

stats.f_oneway(data1, data2, data3, ...)[1]

若单因素方差分析得出的P 值小于设定的检验水准(如P < 0.05),可进行多重比较。多重比较不能用t检验,Prism 8.0推荐使用Turkey检验。Python实现Turkey检验如下:

from statsmodels.stats.multicomp import MultiComparison
MultiComparison(data, group).tukeyhsd()

也可以在该方法后面加.summary()方法,二者输出结果一样,但若判断二者是否相同,python返回的布尔值为False,即:

MultiComparison(data, group).tukeyhsd().summary() == MultiComparison(data, group).tukeyhsd()
> False
str(MultiComparison(data, group).tukeyhsd().summary()) == str(MultiComparison(data, group).tukeyhsd())
> True

Turkey检验亦可通过如下语句实现:

from statsmodels.stats.multicomp import pairwise_tukeyhsd
pairwise_tukeyhsd(data, group)

有趣的是:

MultiComparison(data, group).tukeyhsd() == pairwise_tukeyhsd(data, group)
> False
MultiComparison(data, group).tukeyhsd().summary() == pairwise_tukeyhsd(data, group)
> False
str(MultiComparison(data, group).tukeyhsd()) == str(pairwise_tukeyhsd(data, group))
> True

turkeyhsd()检验返回值是一个详细的表格,包含每一组之间两两比较的统计量和P 值,以及根据设定的检验水准判断这两组之间是否存在统计学差异。

二、 有些组别的数据未通过正态性检验或方差齐性检验

若存在样本未通过正态性检验,或虽然通过了正态性检验但未通过方差齐性检验,则需要采用非参数检验。多组样本比较的非参数检验方法常采用Kruskal-Wallis检验(亦称H检验)。Python实现Kruskal-Wallis如下:

from scipy import stats
stats.mstats.kruskalwallis(data1, data2, data3, ...)

Prism 8.0推荐用Turkey检验进行多组数据参数检验后多次比较,Dunn’s检验进行多组数据非参数检验后多次比较。Python实现相应检验的方法如下如下:

# Turkey检验
from statsmodels.stats.multicomp import MultiComparison
MultiComparison(dataframe["datas"], dataframe["group_name"])

# Dunn's检验
import scikit_posthocs as sp
sp.posthoc_dunn(dataframe, col_val=datas, group_val=group_name, p_adjust='holm')

需要说明的是,Dunn’s检验需要输入的内容为数据框(dataframe)。数据框的创建方法已在前文《专题——使用Python创建可供多重比较的数据框》中进行了说明。

三、代码总结

# 所有的样本建议直接列为字典,使用时可根据需要,通过索引的形式从数据字典中读取出不同组别的数据列表的合集。
# 进行多组数据比较时建议提前生成供事后多重比较的数据框,方便后续工作。

from statsmodels.stats.diagnostic import lilliefors
from scipy import stats
from statsmodels.stats.multicomp import MultiComparison
import scikit_posthocs as sp
norm_pvalue_list = [lilliefors(sample, pvalmethod="table")[1] for sample in [data1, data2, data3, ...]]
norm_results = []
for p in norm_pvalue_list:
    if p > 0.1:
        norm_results.append(True)
    else:
        norm_results.append(False)
if False not in norm_results:
    print("正态")
    if stats.levene(data1, data2, data3, ..., center="mean")[1] > 0.1:
        print("正态,方差齐,参检")
        print(stats.f_oneway(data1, data2, data3, ...)[1])
        print("事后多重比较:turkey")
        print(MultiComparison(data["datas"], data["group"]))
    else:
        print("正态,方差不齐,非参")
        print(stats.mstats.kruskalwallis(data1, data2, data3, ...)[1])
        print("事后多重比较:Dunn's")
        print(sp.posthoc_dunn(data, val_col="datas", group_col="group", p_adjust='holm'))
else:
    print("非正态")
    print(stats.mstats.kruskalwallis(data1, data2, data3, ...)[1])
    print("事后多重比较:Dunn's")
    print(sp.posthoc_dunn(data, val_col="datas", group_col="group", p_adjust='holm'))

发表评论

您的电子邮箱地址不会被公开。