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

时间:2017-07-11 23:02:40

标签: python arrays scipy

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

t_statistic, pvlaue = scipy.stats.ttest_ind(x, y, nan_policy='omit')

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

1 个答案:

答案 0 :(得分:2)

考虑这两个数组:

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

独立样本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

该p值实际上是根据累积密度函数计算得出的:

ss.t.cdf(t_stat, len(x) + len(y) - 2) * 2
# 0.28361693716176473

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

注意乘以2.如果测试是单尾的,则不要乘以。这就是全部。所以你的左尾测试的p值是

ss.t.cdf(t_stat, len(x) + len(y) - 2)
# 0.14180846858088236

如果测试是正确的,你将使用生存函数

ss.t.sf(t_stat, len(x) + len(y) - 2)
# 0.85819153141911764

1 - ss.t.cdf(...)相同。

我认为数组的长度相同。如果没有,您需要修改自由度。