两种在scipy.stats中执行ttest的结果不同

问题描述

这里有两种在scipy中进行独立t检验(焊接版)的方法。两者对于计算出的p值和t统计量本身是否给出不同的结果?为什么会这样?

import scipy
print(scipy.__version__)
# 1.4.1
from scipy.stats import ttest_ind,ttest_ind_from_stats
x1_a = [19.0924,19.1055,19.1192,19.1431,19.0970]
x1_b = [20.3323,20.3472,20.3417,20.3408,20.2849]
x1_c = [19.0448,18.9576,19.0171,19.0184,18.9534]
ttest_ind(x1_a,x1_c,equal_var=False)
# Ttest_indResult(statistic=5.568858312509857,pvalue=0.0014998806395224108)
ttest_ind_from_stats(np.mean(x1_a),np.std(x1_a),5,np.mean(x1_c),np.std(x1_c),equal_var=False)
# Ttest_indResult(statistic=6.226172871918404,pvalue=0.000844418100098984)
ttest_ind(x1_a,x1_b,equal_var=False)
# Ttest_indResult(statistic=-83.49461195258749,pvalue=1.3516515130741807e-12)
ttest_ind_from_stats(np.mean(x1_a),np.mean(x1_b),np.std(x1_b),equal_var=False)
# Ttest_indResult(statistic=-93.34981404047603,pvalue=5.764760941006529e-13)

我试图排除可能原因的事情包括通过提供np.sqrt(np.var(x))而不是np.std(x))来检查可能的舍入问题,使用Wikipedia解释编写自定义测试功能,其结果类似于ttest_ind_from_stats,尝试多个值,手动计算sds以避免出现n-1 / n问题,并尝试阅读源代码文档,但似乎ttest_ind使用{{ 1}}内部引起了我的困惑。这是我的自定义函数

_ttest_ind_from_stats

解决方法

np.std不执行Bessel's correction。如果将其替换为熊猫的std版本,则结果匹配:

ttest_ind(x1_a,x1_c,equal_var=False)                                                             
# Ttest_indResult(statistic=5.568858312509857,pvalue=0.0014998806395224108)

ttest_ind_from_stats(np.mean(x1_a),pd.Series(x1_a).std(),5,np.mean(x1_c),pd.Series(x1_c).std(),equal_var=False)                                                                               
# Ttest_indResult(statistic=5.568858312509857,pvalue=0.0014998806395224108)

或者,如果您不需要额外的导入,只需将标准乘以sqrt(n/n-1)

就位应用校正。