用scipy.t.sf求双样本t检验的p值

0vvn1miw  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在尝试使用scipy.t.sf来计算双样本T检验的p值。我知道最简单的方法是使用scipy.stats.ttest_ind,但我希望加深我的理解,看看数学并想出替代方法。
我的原始代码是:

import scipy.stats as st
test1 = (8,7,10,5,7)
test2 = (9,5,12,8)
result = st.ttest_ind(test1, #men's sample data
                       test2, #women's sample data
                       alternative = 'less', #alternative hypothesis is that women's waiting time is longer than men's
                       equal_var=False) #perform Welch’s t-test, which does not assume equal population variance.
pvalue = result.pvalue

字符串
输出为Ttest_indResult(统计值=-0.6641304531560304,p值=0.2684710269367842)
然而,当我尝试使用scipy.t.sf求解p值时,我无法得到0.26847的统计值。

test_1 = np.array(test1)
test_2 = np.array(test2) 
test_mean = test_1.mean()
ctrl_mean = test_2.mean()
mean_diff = test_mean - ctrl_mean
test_var = test_1.var()/(test_1.shape[0]-1)
ctrl_var = test_2.var()/(test_2.shape[0]-1)

tt = mean_diff/math.sqrt(test_var + ctrl_var) # (test_mean - ctrl_mean) / sqrt(var(test_mean - ctrl_mean))
n = min(test_1.shape[0],test_2.shape[0])
pval = st.t.sf(np.abs(tt), n-1)


现在的输出是(t =-0.6641304531560304,pvalue = 0.2770449975228821)。正如你所看到的,t与我们从scipy.stats.ttest_ind方法中观察到的一致;然而,pvalue不是。我可以对代码做任何修改来获得0.26847的数字吗?谢谢!!

dced5bon

dced5bon1#

不同之处在于不同方法的自由度不同。在第一种方法中,您使用Welch t检验,这意味着您的自由度约为4.8377。您可以使用result.df看到这一点(需要Scipy版本>=1.11)或使用下面代码中的公式。在第二种方法中,您使用df = n-1,它等于3。这就是为什么您得到不同的p值。
如果要手动重现相同的测试,则需要首先计算正确的自由度。请注意,scipy.stats.ttest_ind使用delta自由度= 1的校正方差来计算df(参见ttest_ind中的参考Wikipedia entry on Welch t-test,其中说明使用校正的样品标准偏差,因此,当计算df时,我们需要使用校正方差var(ddof=1))。

# Compute s^2/N (this makes the df equation a bit clearer)
test_1_nvar = test_1.var(ddof = 1)/test_1.shape[0]  
test_2_nvar = test_2.var(ddof = 1)/test_2.shape[0]
df = (test_1_nvar + test_2_nvar)**2 / (test_1_nvar**2/(test_1.shape[0]-1) + test_2_nvar**2/(test_2.shape[0]-1))

字符串

相关问题