假设检验之 :单因素方差分析

发布时间 2023-04-12 14:08:27作者: 天使不设防

秩和检验:

  • 用于比较两组独立样本的中位数是否有明显差异。它不需要对数据的分布进行任何假设,适用于任何两组样本大小相等或不等、符合连续性变量的情况。
  • 在进行 Mann-Whitney U 检验时,需要根据研究问题确定备择假设类型来选择使用双侧检验还是单侧检验。
  • 如果没有明确的预测或假设关于哪个样本的中位数更高或更低,那么应该使用双侧检验。
    • 双侧检验的备择假设是两组样本的中位数不相等,即 μx ≠ μy。这种情况通常适用于探究两组样本之间是否存在差异或者对两组样本进行对比的目的。
  • 而如果有特定的预测或假设表明一个样本的中位数要大于或小于另一个样本,那么应该使用单侧检验。
    • 例如,在某个药物疗效研究中,研究者可能会预测使用药物的组的中位数显著高于使用安慰剂的组,因此应该采用单侧检验,即备择假设为 μx > μy。

导入数据处理常用相关包

import numpy as np
import pandas as pd
from scipy.stats import describe
from scipy.stats import normaltest
from scipy.stats import levene
from scipy.stats import ttest_ind
from scipy.stats import f_oneway
from scipy.stats import mannwhitneyu

读取数据添加一列作为基因名

data = pd.read_excel("express.xlsx")
data.insert(0, column='Gene', value=["gene"+str(x) for x in range(1,1+data.shape[0])])
data.head(3)
Gene FPKM TPM
0 gene1 367.120483 458.200928
1 gene2 204.922272 255.762268
2 gene3 516.293945 644.383423

正态性检验:

tpm = normaltest(data['TPM']) 
fpkm= normaltest(data['FPKM'])
print(f'{tpm}')
print(f'{fpkm}')

print("\n输出其他描述信息:")
print(describe(tpm))
print(describe(fpkm))
out: p 值 << 0.05 拒绝H0假设 不符合正态分布
NormaltestResult(statistic=57.70339700520858, pvalue=2.95030249660953e-13)
NormaltestResult(statistic=57.7037787800525, pvalue=2.949739374720097e-13)

输出其他描述信息:
DescribeResult(nobs=2, minmax=(2.95030249660953e-13, 57.70339700520858), mean=28.85169850260444, variance=1664.8410129703402, skewness=-2.2721514099690834e-16, kurtosis=-2.0)
DescribeResult(nobs=2, minmax=(2.949739374720097e-13, 57.7037787800525), mean=28.8518893900264, variance=1664.8630427486016, skewness=-2.2721063118214863e-16, kurtosis=-2.0)

方差齐性检验:

var = levene(data['TPM'],data['FPKM']) # p >> 0.05 接受H0 方差齐
print(var)

LeveneResult(statistic=0.0709691736536265, pvalue=0.7907140177866699)

数据方差齐,但不满足正态分布,样本量超过30,不能用t检验,方差分析也不行,不能进行参数检验,需采用非参数检验。这里先用秩和检验,然后强行上参数检验看下结果

秩和检验:

res = mannwhitneyu(data['FPKM'],data['TPM']) # alternative=None 默认转双侧检验, 设置less表示单侧检验
print(res)
print(res.pvalue)

MannwhitneyuResult(statistic=566.0, pvalue=0.3586216453583554)
0.3586216453583554

p > 0.05 接受原假设H0,两组数据无显著差别

T检验:

res = ttest_ind(data['FPKM'],data['TPM'],equal_var=True) # 默认方差相等
print(res)
print(res.pvalue)

Ttest_indResult(statistic=-0.2682272511918144, pvalue=0.7893132644009568)
0.7893132644009568

单因素方差分析:

res = f_oneway(data['TPM'],data['FPKM']) 
print(res)
print(res.pvalue)

F_onewayResult(statistic=0.07194585828191666, pvalue=0.7893132644009524)
0.7893132644009524