我正在尝试使用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的数字吗?谢谢!!
1条答案
按热度按时间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)
)。字符串