使用“scipy.stats”计算 t 统计量

Calculating t-statistics using `scipy.stats`

我有两个值样本,在两种不同条件下对同一组进行测量:

import numpy as np
import scipy.stats as st

v1 = np.array([ 152.65285 ,   97.011475,   77.56722 ,  120.19234 ])
v2 = np.array([ 149.19984,  172.08975,  143.92285,  108.60255])

我想做的是对这个特定的数据集执行 dependent t-test for paired examples。正如在维基百科 link 中看到的那样,这是通过使用以下公式计算 t 值来执行的:

其中mu_0设置为0。我进行了这个计算,计算出t_value等于

>>> (np.average(v1 - v2) * np.sqrt(len(v1))) / (np.std(v1 - v2))
-1.6061552162815307

但是,使用 scipy.stats 包,我得到的结果略有不同:

>>> st.ttest_rel(v1,v2)
(-1.3909712197206947, 0.25844779134312651)

st.ttest_rel(v1,v2)returns应该的第一个数字,根据scipymanual,等于t-值,但它是不是。我是不是遗漏了什么,还是 scipy.stats 计算的统计数据不正确?

我在 python 文件夹的 site-packages 目录中查看了 scipy 的源代码。在文件 scipy/stats/stats.py 中显示了 ttest_rel 是如何计算的。我发现它的完成方式与您手动计算的情况有所不同。但由于我不是统计专家,你可能想自己看看实现。这是我目前能给的最好的建议...

不同之处似乎在于 np.std 使用 N 自由度计算标准偏差,而 ttest_rel 使用有偏估计器计算它(N-1 度的自由)。

您可以通过将 np.std 中的自由度差异指定为 1:

来解决此问题
>>> (np.average(v1 - v2) * np.sqrt(len(v1))) / (np.std(v1 - v2, ddof=1))
-1.3909712197206947

这两个计算一致。