如何在Scipy中模拟双样本t检验

3

我正在尝试在Python中模拟MS Excel的t-probe函数。我需要这样做是因为我必须自动化一些之前在Excel中完成的计算。以下是我的测试程序:

import scipy.stats
a = [5, 0.9,  -0.4, -0.9, 0.5, 0.8, 0.2, 0.2, 0, -0.8]
b = [1.1, 0.9, -0.5, -0.7, 0.6, 0.7, 0.3, 0.1, -0.1, -0.7]

print scipy.stats.ttest_ind(a,b, equal_var=True)

这是结果:
(array(0.6661542796363409), 0.51376033318001801)

然而,对于相同的输入,Excel给出了这个值:0.35844407。
我注意到他们使用了tail=2参数(请参见http://office.microsoft.com/en-us/excel-help/ttest-HP005209325.aspx)。不幸的是,我不知道如何用scipy计算双尾t检验。(事实上我不知道这是什么。)
另一个非常奇怪的事情是,在scipy中,当我改变样本顺序时,结果会略有不同。例如,如果我将-0.7移动到b的开头,那么我得到的结果是0.51376033318001824,而不是0.51376033318001801。虽然差别不大,但还是存在。
对于Excel来说,情况完全不同——看起来,当样本顺序不同时,双尾t检验会给出显著不同的结果。
问题是:我该如何在scipy中模拟Excel版本的双尾t检验?
1个回答

5

看起来像是 Excel 正在计算 ttest_rel:

In [15]: import scipy.stats as stats

In [20]: stats.ttest_rel(a, b)
Out[20]: (array(0.9677712267394081), 0.35844406902161985)

ab相关时,请使用stats.ttest_rel文档表示:

使用[ttest_rel]的示例是同一组学生在不同考试中的分数,或从相同单位进行重复抽样。

ab独立时,请使用stats.ttest_ind

如果我们观察来自相同或不同人群的两个独立样本,例如男孩和女孩或两个种族的考试成绩,则可以使用[ttest_ind]。


还有一件事我不明白。在Python版本中,样本的顺序并不重要。例如,如果我调用a.sort(),b.sort(),那么ttest_rel的返回值是相同的。然而,如果我在Excel中进行排序,则会得到完全不同的结果。为什么会这样呢?(我知道这不再是一个真正的编程问题了) - nagylzs
2
顺序很重要,即使对于ttest_rel也是如此。例如,ttest_rel(a, sorted(b))ttest_rel(a, b)给出不同的结果。ttest_rel(sorted(a), sorted(b))恰好与ttest_rel(a, b)给出相同的结果是巧合。在ttest_rel的源代码中,有一行代码d = (a - b).astype(np.float64),因此很明显顺序很重要。如果你将完全相同的数据提供给Excel和ttest_rel,却得到不同的结果,那么就需要重新检查了... - unutbu
谢谢。所以这只是偶然发生的。 :-) 不过我注意到,对于ttest_ind而言,顺序并不重要。但我能理解这一点。 - nagylzs
在这个例子中(stats.ttest_rel(a, b)),小的p值代表什么意思? - SdSaati

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