如何使用Python计算双尾备择假设检验的p值?

问题描述 投票:0回答:1

我认为下面的两种方法会给出相同的结果,因为理论上它们是等效的。然而,它们在 Python 中略有不同!

from scipy.stats import norm

# let's assume that our z-statistic = 3
z_score = 3

# method 1:
print(2 * min(norm.cdf(z_score), 1-norm.cdf(z_score)))    # outputs: 0.002699796063260207

# method 2:
print(norm.cdf(-abs(z_score)) + 1-norm.cdf(abs(z_score))) # outputs: 0.002699796063260096

# Notice that they differ in the last 3 digits!

我的想法是,

loc
中的
scale
norm.cdf
的默认值分别是
0
1
。因此,该函数生成具有对称尾部的标准正态分布,因为它不是偏斜分布。结果,当我将一条尾巴下方的面积乘以二时,它应该与将左右尾巴下方的面积相加相同。那么,为什么会有差异呢?

python statistics p-value hypothesis-test scipy.stats
1个回答
0
投票

你是对的。理论上,两种方法在计算标准正态分布中 z 分数的 p 值时应给出相同的结果。我相信您观察到的微小差异是 Python 中

norm.cdf
函数使用的精度限制和浮点运算。

Python 与大多数编程语言一样,遵循浮点运算的 IEEE 754 标准。这些浮点数并不总是准确地表示小数,因此每个数学运算可能会引入微小的差异,具体取决于运算顺序以及数字的内部表示方式。

虽然这些差异很小(大约为 10^(−14)),但它们仍然可以以您正在使用的精度水平出现。这解释了为什么您会看到最后几位小数的差异,即使这两种方法在理论上是等效的。

总结:

这两种方法调用相同的函数(

norm.cdf
),但运算顺序和中间计算导致浮点近似值略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.