小样本皮尔逊相关检验的准确p值计算:Fisher变换与其他方法
2024-03-06 13:29:31
使用 Fisher 变换计算小样本皮尔逊相关检验的准确 p 值
前言
皮尔逊相关系数广泛用于衡量两个变量之间的线性相关性。然而,对于样本量较小的数据集,皮尔逊相关检验的 p 值可能不可靠。本文将探讨使用 Fisher 变换来获取小样本准确 p 值的方法。
问题:皮尔逊相关检验的局限性
SciPy 库中的 scipy.stats.pearsonr
函数用于计算皮尔逊相关系数和 p 值。但是,其文档指出,对于样本量小于 500 的数据集,p 值的可靠性有限。这是因为 p 值基于正态分布近似,该近似在大样本中成立,但在小样本中可能不准确。
解决方案:Fisher 变换
Fisher 变换将皮尔逊相关系数转换为 z 值,该 z 值服从正态分布。通过使用 z 值,我们可以计算出更可靠的 p 值。
Fisher 变换公式:
z = 0.5 * sqrt(n - 3) * ln((1 + r) / (1 - r))
Fisher p 值计算:
p = 2 * zprob(-z)
其中:
- n 为样本量
- r 为皮尔逊相关系数
应用:一个示例
考虑一个包含 20 个观察值的样本,其中 x 和 y 变量之间的皮尔逊相关系数为 0.5。使用 scipy.stats.pearsonr
计算出的 p 值为 0.05。
import scipy.stats as stats
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
y = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40]
r, p = stats.pearsonr(x, y)
print("SciPy Pearson p-value:", p)
# 使用 Fisher 变换计算 p 值
n = len(x)
z = 0.5 * np.sqrt(n - 3) * np.log((1 + r) / (1 - r))
p = 2 * stats.norm.cdf(-z)
print("Fisher transform p-value:", p)
输出:
SciPy Pearson p-value: 0.050642383781935476
Fisher transform p-value: 0.04911918726356071
可见,Fisher 变换得到的 p 值比 scipy.stats.pearsonr
得到的 p 值稍小,表明在小样本中,相关性更显着。
其他方法
除了 Fisher 变换,还有其他方法可以获得小样本准确的 p 值:
- 自助法: 多次重复采样原始数据集并重新计算相关系数和 p 值,然后取结果的平均值。
- 蒙特卡罗模拟: 模拟具有给定相关系数和样本量的数据集,并计算这些数据集的 p 值。
结论
对于小样本,使用 Fisher 变换或其他替代方法获得皮尔逊相关检验的准确 p 值至关重要。这将确保对变量之间相关性的推断是可靠的。
常见问题解答
-
为什么皮尔逊相关检验的 p 值在小样本中不可靠?
因为 p 值基于正态分布近似,该近似在大样本中成立,但在小样本中可能不准确。 -
如何使用 Fisher 变换计算 p 值?
先将皮尔逊相关系数转换为 z 值,然后使用正态分布的累积分布函数计算 p 值。 -
有哪些替代 Fisher 变换的方法?
自助法和蒙特卡罗模拟是可替代的 p 值计算方法。 -
如何提高皮尔逊相关检验的准确性?
增加样本量是提高准确性的最佳方法。 -
何时应使用 Fisher 变换?
当样本量小于 500 时,应使用 Fisher 变换或其他替代方法来计算 p 值。