为什么Python中的t-test(使用scipy和statsmodels)给出的结果与R、Stata或Excel不同?

11

问题已解决;x、y和s1、s2的大小不同。

R语言中:

x <- c(373,398,245,272,238,241,134,410,158,125,198,252,577,272,208,260)
y <- c(411,471,320,364,311,390,163,424,228,144,246,371,680,384,279,303)
t.test(x,y)
t = -1.6229, df = 29.727, p-value = 0.1152

在STATA和Excel中获得了相同的数字

t.test(x,y,alternative="less")
t = -1.6229, df = 29.727, p-value = 0.05758

无论我尝试使用哪种选项,statsmodels.stats.weightstats.ttest_ind或scipy.stats.ttest_ind都不能复制相同的结果。

statsmodels.stats.weightstats.ttest_ind(s1,s2,alternative="two-sided",usevar="unequal")
(-1.8912081781378358, 0.066740317997990656, 35.666557473974343)

scipy.stats.ttest_ind(s1,s2,equal_var=False)
(array(-1.8912081781378338), 0.066740317997990892)

scipy.stats.ttest_ind(s1,s2,equal_var=True)
(array(-1.8912081781378338), 0.066664507499812745)

有成千上万的人使用Python进行t检验计算。我们所有人都得到了错误的结果吗?(我通常依赖Python,但这次我用STATA检查了我的结果)。


3
我刚刚运行了stats.ttest_ind(x,y,equal_var=True)并得到了array(-1.6229, 0.1152)。在您的示例中,请检查s1/s2 == x/y。 - tnknepp
你使用的scipy版本是什么? - Warren Weckesser
进一步研究问题,我发现虽然R给出df = 29.727,但Python给出的是df = 35.666。因此我怀疑错误一定是由于df计算引起的... Warren,我仍然得到stats.ttest_ind(s1,s2,equal_var=True) (array(-1.8912081781378338), 0.066664507499812745)。我正在使用最新的Enthought Canopy Python安装程序。 - Oleg
1
和@tnknepp一样,我从ttest_ind(x, y, equal_var=True)得到(array(-1.62292672368488), 0.11506840827144681) - Warren Weckesser
2
展示完整的Python代码。也许s1s2与R示例中的xy不同。 - Warren Weckesser
你是正确的,s1和s2与x和y相同,但向量末尾有一个额外的值。对于找出问题并提供帮助的每个人,我感到非常抱歉并非常感激。 - Oleg
2个回答

10

这是我使用默认变量得到的结果:

>>> x_ = (373,398,245,272,238,241,134,410,158,125,198,252,577,272,208,260)
>>> y_ = (411,471,320,364,311,390,163,424,228,144,246,371,680,384,279,303)

>>> from scipy import stats
>>> stats.ttest_ind(x_, y_)
(array(-1.62292672368488), 0.11506840827144681)

>>> import statsmodels.api as sm
>>> sm.stats.ttest_ind(x_, y_)
(-1.6229267236848799, 0.11506840827144681, 30.0)

并且存在不相等的变量:

>>> statsmodels.stats.weightstats.ttest_ind(x_, y_,alternative="two-sided",usevar="unequal")
(-1.6229267236848799, 0.11516398707890187, 29.727196553288369)
>>> stats.ttest_ind(x_, y_, equal_var=False)
(array(-1.62292672368488), 0.11516398707890187)

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接