广义双曲分布#

广义双曲分布定义为以广义逆高斯分布作为混合分布的法方差-均值混合分布。“双曲”特性指的是对数概率分布的形状可以描述为双曲线。双曲分布有时被称为半肥尾分布,因为它们的概率密度比“亚双曲”分布(例如,正态分布,其对数概率呈二次方递减)下降得慢,但比其他“极值”分布(例如,帕累托分布,其对数概率呈对数递减)下降得快。

函数#

文献中存在不同的参数化;SciPy 实现了 Prause (1999) 中的“第 4 个参数化”。

\begin{eqnarray*} f(x, p, a, b) & = & \frac{(a^2 - b^2)^{p/2}} {\sqrt{2\pi}a^{p-0.5} K_p\Big(\sqrt{a^2 - b^2}\Big)} e^{bx} \times \frac{K_{p - 1/2} (a \sqrt{1 + x^2})} {(\sqrt{1 + x^2})^{1/2 - p}} \end{eqnarray*}

对于

  • \(x, p \in ( - \infty; \infty)\)

  • \(|b| < a\) 如果 \(p \ge 0\)

  • \(|b| \le a\) 如果 \(p < 0\)

  • \(K_{p}(.)\) 表示第二类和 \(p\) 阶的修正贝塞尔函数 (scipy.special.kn)

上面的概率密度以“标准化”形式定义。要平移和/或缩放分布,请使用 \(\text{loc}\)\(\text{scale}\) 参数。具体来说,\(f(x, p, a, b, \text{loc}, \text{scale})\)\(\frac{1}{\text{scale}}f(y, p, a, b)\) 完全等价,其中 \(y = \frac{1}{\text{scale}}(x - \text{loc})\)

此参数化源自 Barndorff (1978) 中的原始 \((\lambda, \alpha, \beta, \delta, \mu)\) 参数化,通过设置

  • \(\lambda = p\)

  • \(\alpha = \frac{a}{\delta} = \frac{\hat{\alpha}}{\delta}\)

  • \(\beta = \frac{b}{\delta} = \frac{\hat{\beta}}{\delta}\)

  • \(\delta = \text{scale}\)

  • \(\mu = \text{location}\)

可以从上述的正态方差-均值混合有效地对 scipy.stats.genhyperbolic 的随机变量进行采样,其中 scipy.stats.geninvgauss 被参数化为 \(GIG\Big(p = p, b = \sqrt{\hat{\alpha}^2 - \hat{\beta}^2}, \text{loc} = \text{location}, \text{scale} = \frac{1}{\sqrt{\hat{\alpha}^2 - \hat{\beta}^2}}\Big)\),因此:\(GH(p, \hat{\alpha}, \hat{\beta}) = \hat{\beta} \cdot GIG + \sqrt{GIG} \cdot N(0,1)\)

“广义”特性表明此分布是几种其他概率分布的超类,例如

  • \(f(p = -\nu/2, a = 0, b = 0, \text{loc} = 0, \text{scale} = \sqrt{\nu})\) 具有自由度为 \(\nu\) 的学生 t 分布 (scipy.stats.t)。

  • \(f(p = 1, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)\) 具有双曲分布。

  • \(f(p = - 1/2, a = \hat{\alpha}, b = \hat{\beta}, \text{loc} = \mu, \text{scale} = \delta)\) 具有正态逆高斯分布 (scipy.stats.norminvgauss)。

  • \(f(p = 1, a = \delta, b = 0, loc = \mu, \text{scale} = \delta)\) 对于 \(\delta \rightarrow 0\),具有拉普拉斯分布 (scipy.stats.laplace)。

示例#

了解参数如何影响分布的形状很有用。虽然将 \(b\) 解释为偏度非常简单,但理解 \(a\)\(p\) 之间的区别并不那么明显,因为两者都会影响分布的峰度。\(a\) 可以解释为概率密度衰减的速度(其中 \(a > 1\) 时渐近衰减速度快于 \(log_e\),反之亦然)或者等效地,解释为对数概率双曲线渐近线的斜率(其中 \(a > 1\) 时衰减速度快于 \(|1|\),反之亦然)。\(p\) 可以看作是概率密度分布的肩宽(其中 \(p < 1\) 导致窄肩,反之亦然)或者等效地,看作是对数概率双曲线的形状,当 \(p < 1\) 时为凸形,否则为凹形。

import numpy as np
from matplotlib import pyplot as plt
from scipy import stats

p, a, b, loc, scale = 1, 1, 0, 0, 1
x = np.linspace(-10, 10, 100)

# plot GH for different values of p
plt.figure(0)
plt.title("Generalized Hyperbolic | -10 < p < 10")
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        label = 'GH(p=1, a=1, b=0, loc=0, scale=1)')
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'red', alpha = 0.5, label='GH(p>1, a=1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'red', alpha = 0.1) for p in np.linspace(1, 10, 10)]
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'blue', alpha = 0.5, label='GH(p<1, a=1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'blue', alpha = 0.1) for p in np.linspace(-10, 1, 10)]
plt.plot(x, stats.norm.pdf(x, loc, scale), label = 'N(loc=0, scale=1)')
plt.plot(x, stats.laplace.pdf(x, loc, scale), label = 'Laplace(loc=0, scale=1)')
plt.plot(x, stats.pareto.pdf(x+1, 1, loc, scale), label = 'Pareto(a=1, loc=0, scale=1)')
plt.ylim(1e-15, 1e2)
plt.yscale('log')
plt.legend(bbox_to_anchor=(1.1, 1))
plt.subplots_adjust(right=0.5)

# plot GH for different values of a
plt.figure(1)
plt.title("Generalized Hyperbolic | 0 < a < 10")
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        label = 'GH(p=1, a=1, b=0, loc=0, scale=1)')
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'blue', alpha = 0.5, label='GH(p=1, a>1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'blue', alpha = 0.1) for a in np.linspace(1, 10, 10)]
plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'red', alpha = 0.5, label='GH(p=1, 0<a<1, b=0, loc=0, scale=1)')
[plt.plot(x, stats.genhyperbolic.pdf(x, p, a, b, loc, scale),
        color = 'red', alpha = 0.1) for a in np.linspace(0, 1, 10)]
plt.plot(x, stats.norm.pdf(x, loc, scale),  label = 'N(loc=0, scale=1)')
plt.plot(x, stats.laplace.pdf(x, loc, scale), label = 'Laplace(loc=0, scale=1)')
plt.plot(x, stats.pareto.pdf(x+1, 1, loc, scale), label = 'Pareto(a=1, loc=0, scale=1)')
plt.ylim(1e-15, 1e2)
plt.yscale('log')
plt.legend(bbox_to_anchor=(1.1, 1))
plt.subplots_adjust(right=0.5)

plt.show()

参考#

实现:scipy.stats.genhyperbolic