SciPy如何计算pearsonr()函数中的p值?

时间:2018-04-30 00:07:26

标签: python scipy p-value

我已经搜索了很多,但没有解释SciPy如何计算相关系数的p值以及为什么它对于小于500的数据集而言不可靠(在功能页面上由SciPy启动)。

1 个答案:

答案 0 :(得分:0)

scipy.stats.pearsonr使用t distribution计算p值。 (你可以检查the source code in the file stats.py on github。)这绝对应该在docstring中提到。

这是一个例子。首先,导入pearsonr和scipy的t分发实现:

In [334]: from scipy.stats import pearsonr, t as tdist

为此示例定义xy

In [335]: x = np.array([0, 1, 2, 3, 5, 8, 13])

In [336]: y = np.array([1.2, 1.4, 1.6, 1.7, 2.0, 4.1, 6.6])

为此数据计算rp

In [337]: r, p = pearsonr(x, y)

In [338]: r
Out[338]: 0.9739566302403544

In [339]: p
Out[339]: 0.0002073053505382502

现在再次计算p,首先计算t统计量,然后找到该t值的两倍生存函数:

In [340]: df = len(x) - 2

In [341]: t = r * np.sqrt(df/(1 - r**2))

In [342]: 2*tdist.sf(t, df)  # This is the p value.
Out[342]: 0.0002073053505382502

我们得到了与预期相同的p值。

我不知道声明的来源" p值并不完全可靠,但对于大于500左右的数据集来说可能是合理的"。如果有人知道可引用的引用,则应将其添加到pearsonr docstring。