如何在 Python 中进行单尾 pvalue 计算?

HM1*_*M14 2 python arrays scipy

我有两个数组,一个是校正值数组 x,另一个是原始值数组(在应用校正之前),y。我知道如果我想做一个双尾 ttest 来获得双尾 pvalue,我需要这样做:

t_statistic, pvlaue = scipy.stats.ttest_ind(x, y, nan_policy='omit')
Run Code Online (Sandbox Code Playgroud)

然而,这只告诉我两个阵列是否彼此显着不同。我想证明修正后的值 x 明显小于 y。为此,我似乎需要获得单尾 pvalue,但似乎找不到执行此操作的函数。有任何想法吗?

ayh*_*han 6

考虑这两个数组:

import scipy.stats as ss
import numpy as np
prng = np.random.RandomState(0)
x, y = prng.normal([1, 2], 1, size=(10, 2)).T
Run Code Online (Sandbox Code Playgroud)

独立样本 t 检验返回:

t_stat, p_val = ss.ttest_ind(x, y, nan_policy='omit')
print('t stat: {:.4f}, p value: {:4f}'.format(t_stat, p_val))

# t stat: -1.1052, p value: 0.283617
Run Code Online (Sandbox Code Playgroud)

这个 p 值实际上是从累积密度函数计算出来的:

ss.t.cdf(-abs(t_stat), len(x) + len(y) - 2) * 2
# 0.28361693716176473
Run Code Online (Sandbox Code Playgroud)

这里,len(x) + len(y) - 2 是自由度的数量。

注意与 2 的乘法。如果测试是单尾的,则不要乘法。就这样。所以你的左尾检验的 p 值是

ss.t.cdf(t_stat, len(x) + len(y) - 2)
# 0.14180846858088236
Run Code Online (Sandbox Code Playgroud)

如果测试是右尾,您将使用生存函数

ss.t.sf(t_stat, len(x) + len(y) - 2)
# 0.85819153141911764
Run Code Online (Sandbox Code Playgroud)

这与1 - ss.t.cdf(...).

我假设数组具有相同的长度。如果不是,则需要修改自由度。