scipy.stats提供了许多统计检验方法
-
单样本t检验
python scipy.stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate', alternative="two-sided") -
配对样本t检验
python scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative="two-sided") -
两独立样本t检验
python scipy.stats.ttest_ind( a, b, axis=0, equal_var=True, nan_policy='propagate',permutations=None, random_state=None, alternative="two-sided", trim=0) -
完全随机设计的方差分析
python scipy.stats.f_oneway(*samples, axis=0) -
随机区组设计的方差分析 在
scipy.stats中似乎未提供可使用的函数,我尝试实现了一下,水平有限且一般使用用不到高维度的数据,所以仅支持1维的数据。python import numpyfrom scipy import special def f_twoway(*samples): all_data = numpy.asarray(samples) k, m = all_data.shape # 计算均值,exp:各处理组,block:各处理组 total_avg = all_data.mean() exp_avgs = all_data.mean(1) block_avgs = all_data.mean(0) # 计算平方和,err:误差 total_ss = numpy.power(all_data - total_avg, 2).sum() exp_ss = (numpy.power(exp_avgs - total_avg, 2)*m).sum() block_ss = (numpy.power(block_avgs - total_avg, 2)*k).sum() err_ss = total_ss - exp_ss - block_ss # 计算均方 exp_ms = exp_ss/(k-1) err_ms = err_ss/((k-1)*(m-1)) # 计算F值与P值 statistic = exp_ms/err_ms p_value = special.fdtrc(k-1, (k-1)*(m-1), statistic) return statistic, p_value -
卡方检验
python scipy.stats.chi2_contingency(observed, correction=True, lambda_=None)observed: 表格state1 state2 group1 a b group2 c d python observed = [ [a, b], [c, d],] -
Fisher确切概率法
python scipy.stats.fisher_exact(table, alternative='two-sided') -
配对设计资料的符号秩和检验
python scipy.stats.wilcoxon( x, y=None, zero_method="wilcox", correction=False, alternative="two-sided", method='auto') -
两独立样本的符号秩和检验
python scipy.stats.mannwhitneyu( x, y, use_continuity=True, alternative="two-sided", axis=0, method="auto")该函数返回的是检验统计量
,然而,我们一般更倾向使用统计量 ,其计算公式如下 其中,
其中,
分别为两组样本的样本数, 。 指并列第 的个数。 当不存在并列的情况时, 可以简化为 通过如下代码,即可算出统计量
: python from collections import Counter n1 = len(samples1)n2 = len(samples2) # 将两组样本合并,用Counter计算每一个值的个数counter = Counter(samples1 + samples2) # 计算与并列相关的那一项sigma_ties = sum(map(lambda item: item**3-item, counter.values()))sigma_ties = (sigma_ties*n1*n2) / (12*(n1+n2)*(n1+n2-1))sigma_ties = (n1*n2*(n1+n2+1)/12 - sigma_ties)**0.5 # 计算统计量Zz = (statistic - n1*n2*0.5) / sigma_ties -
多个独立样本的符合秩和检验
python scipy.stats.kruskal(*samples, nan_policy='propagate'):