📜  Python中的 sympy.stats.FisherZ()(1)

📅  最后修改于: 2023-12-03 15:04:34.174000             🧑  作者: Mango

Python中的 sympy.stats.FisherZ()

简介

sympy.stats.FisherZ() 是 sympy 的一个统计学库,用于计算 Fisher 变换。

Fisher 变换是一种常用的统计学变换,它将一个在 (-1, 1) 范围内的随机变量 x 转换为一个在整个实轴上均匀分布的变量 z:

$$ z = \frac{1}{2}\log\frac{1+x}{1-x} $$

Fisher 变换的一个重要应用是将相关系数转换为一个更适合统计分析的变量。在相关分析中,我们通常研究两个变量之间的关系,这种关系可以用一个称为"相关系数"的指标来度量。相关系数的取值范围是 (-1, 1),如果直接对相关系数进行统计分析则相当困难。因此,我们通常将相关系数进行 Fisher 变换,使其转换为一个在整个实轴上均匀分布的变量,然后再进行分析。

使用方法
创建 Fisher 变换对象

使用 sympy.stats.FisherZ() 方法创建 Fisher 变换对象:

from sympy.stats import FisherZ

z = FisherZ()
计算 Fisher 变换

使用 doit() 方法计算 Fisher 变换:

import numpy as np

x = np.random.uniform(-1, 1, 10)
z = FisherZ()

z_vals = z.doit(*x)
反向计算 Fisher 变换

使用 inv() 方法对 Fisher 变换进行反向操作:

x_vals = z.inv(*z_vals)
获取 Fisher 变换的期望和方差

可以使用 compute_exp()compute_variance() 方法计算 Fisher 变换的期望和方差:

mean = z.compute_expectation()
variance = z.compute_variance()
示例

下面通过一个示例来演示 Fisher 变换的使用方法。

示例数据

假设我们有两个变量 x 和 y,它们之间的相关系数为 0.8:

x = np.array([3, 5, 7, 10, 12])
y = np.array([5, 7, 9, 12, 14])
r = np.corrcoef(x, y)[0,1]

print("r =", r)

输出为:

r = 0.994611510630725
Fisher 变换

我们可以使用 Fisher 变换将相关系数进行转换:

z = FisherZ()
z_val = z.doit(r)

print("z_val =", z_val)

输出为:

z_val = 1.3178040772033342
反向计算

将 Fisher 变换的结果进行反向操作,即可得到相关系数:

r_val = z.inv(z_val)

print("r_val =", r_val)

输出为:

r_val = 0.8

可以看到,反向计算结果与原始数据相同。

绘制 Fisher 变换结果的概率分布图

下面我们将绘制 Fisher 变换结果的概率分布图。

import matplotlib.pyplot as plt

x_vals = np.linspace(-5, 5, 1000)
y_vals = [z.pdf(z_val) for z_val in x_vals]

plt.plot(x_vals, y_vals)
plt.title("PDF of Fisher transformation for r={:3f}".format(r))
plt.xlabel("Fisher transformation")
plt.ylabel("Density")
plt.show()

输出结果如下图所示:

PDF of Fisher transformation

从图中可以看到,Fisher 变换结果的概率分布近似于标准正态分布。这意味着,我们可以使用标准正态分布对 Fisher 变换进行统计分析。

总结

sympy.stats.FisherZ() 是 sympy 的一个统计学库,用于计算 Fisher 变换。Fisher 变换可以将一个在 (-1, 1) 范围内的随机变量转换为一个在整个实轴上均匀分布的变量,常被用于将相关系数转换为一个更适合统计分析的变量。使用 sympy.stats.FisherZ() 可以方便快捷地进行 Fisher 变换的计算和反向计算。