我认为下面的两种方法会给出相同的结果,因为理论上它们是等效的。然而,它们在 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
。因此,该函数生成具有对称尾部的标准正态分布,因为它不是偏斜分布。结果,当我将一条尾巴下方的面积乘以二时,它应该与将左右尾巴下方的面积相加相同。那么,为什么会有差异呢?
你是对的。理论上,两种方法在计算标准正态分布中 z 分数的 p 值时应给出相同的结果。我相信您观察到的微小差异是 Python 中
norm.cdf
函数使用的精度限制和浮点运算。
Python 与大多数编程语言一样,遵循浮点运算的 IEEE 754 标准。这些浮点数并不总是准确地表示小数,因此每个数学运算可能会引入微小的差异,具体取决于运算顺序以及数字的内部表示方式。
虽然这些差异很小(大约为 10^(−14)),但它们仍然可以以您正在使用的精度水平出现。这解释了为什么您会看到最后几位小数的差异,即使这两种方法在理论上是等效的。
总结:
这两种方法调用相同的函数(
norm.cdf
),但运算顺序和中间计算导致浮点近似值略有不同。