我有两个数组,一个是校正值 x 的数组,另一个是原始值(应用校正之前)y 的数组。我知道如果我想做一个双尾 ttest 来获得双尾 pvalue,我需要这样做:
t_statistic, pvlaue = scipy.stats.ttest_ind(x, y, nan_policy='omit')
然而,这只能告诉我这两个数组是否彼此显着不同。我想表明修正值 x 明显小于 y。为此,我似乎需要获取单尾 pvalue,但我似乎找不到执行此操作的函数。有什么想法吗?
最佳答案
考虑这两个数组:
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(-abs(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(...)
相同。
我假设数组具有相同的长度。如果不是,则需要修改自由度。
关于python - 如何在Python中计算单尾p值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045802/