在R语言里可以很容易地使用
t.test(X1, X2,paired = T)
进行成对样本T检验,并且给出95%的置信区间,但是在Python里,我们只能很容易地找到成对样本T检验的P值,也就是使用scipy库,这里补充一点成对样本t检验的结果和直接检验两个样本的差值和0的区别是完全一样的
from scipy import stats
X1, X2 = np.array([1,2,3,4,5]), np.array([1.1,2,3,4,5])
stats.ttest_rel(X1,X2)
X3 = X1-X2
stats.ttest_1samp(X3,0)
但是这个方法并不会返回置信区间,因此我又找了Python里另一个统计库statsmodels
import statsmodels.stats.api as sms
X1, X2 = np.array([1,2,3,4,5]), np.array([1.1,2,3,4,5])
cm = sms.CompareMeans(sms.DescrStatsW(X1), sms.DescrStatsW(X2))
print(cm.tconfint_diff())
print(cm.ttest_ind())
X3 = X1-X2
sms.DescrStatsW(X3).tconfint_mean()
但是ttest_ind这个方法并不是成对样本的检验,而是独立样本检验,因此计算出来的值往往更加保守,不能准确反映两者的差异,但是statsmodels确实没有成对样本检验的函数,在别的论坛上大家说因为scipy有了这个函数,所以statsmodels就没写…感觉挺无语的,不过想到其实直接做单样本的t检验其实就ok了,所以直接做差后,用tconfint_mean这个方法就可以得到了,我在R语言里做出来的结果和Python中是一致的。不得不说statsmodels真的是Python统计之光。
#-------------210827----------------------
今天再次使用这个函数,发现了一个之前没有注意到的点,本来以为这个函数第一步会先将weights进行标准化,没想到函数里并不是这么做的,而是将weights直接相加,这样得到的数作为t检验时的自由度,大家在用的时候要谨慎给weights的值。