所以我注意到没有实施偏态广义 t 分布 https://en.wikipedia.org/wiki/Skewed_generalized_t_distribution in scipy
。将这个分布拟合到我拥有的一些数据对我来说会很有用。很遗憾fit
在这种情况下似乎对我不起作用。为了进一步解释我已经像这样实现了
import numpy as np
import pandas as pd
import scipy.stats as st
from scipy.special import beta
class sgt(st.rv_continuous):
def _pdf(self, x, mu, sigma, lam, p, q):
v = q ** (-1 / p) * \
((3 * lam ** 2 + 1) * (
beta(3 / p, q - 2 / p) / beta(1 / p, q)) - 4 * lam ** 2 *
(beta(2 / p, q - 1 / p) / beta(1 / p, q)) ** 2) ** (-1 / 2)
m = 2 * v * sigma * lam * q ** (1 / p) * beta(2 / p, q - 1 / p) / beta(
1 / p, q)
fx = p / (2 * v * sigma * q ** (1 / p) * beta(1 / p, q) * (
abs(x - mu + m) ** p / (q * (v * sigma) ** p) * (
lam * np.sign(x - mu + m) + 1) ** p + 1) ** (
1 / p + q))
return fx
def _argcheck(self, mu, sigma, lam, p, q):
s = sigma > 0
l = -1 < lam < 1
p_bool = p > 0
q_bool = q > 0
all_bool = s & l & p_bool & q_bool
return all_bool
这一切都工作正常,我可以毫无问题地生成具有给定参数的随机变量。这_argcheck
是必需的,因为仅检查简单的正参数是不合适的。
sgt_inst = sgt(name='sgt')
vars = sgt_inst.rvs(mu=1, sigma=3, lam = -0.1, p = 2, q = 50, size = 100)
然而,当我尝试fit
这些参数我收到错误
sgt_inst.fit(vars)
RuntimeWarning:减法中遇到无效值
numpy.max(numpy.abs(fsim[0] - fsim[1:]))
它就回来了
我觉得奇怪的是,当我实现示例自定义高斯分布时,如图所示docs https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.html,运行没有问题fit
method.
有任何想法吗?