使用scipy.stats来拟合自定义分布的数据

7

我发现在 scipy 中没有实现偏斜广义 t 分布。对于我拟合一些数据来说,这个分布将会非常有用。不幸的是,在这种情况下,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)

然而,当我尝试适配这些参数时,出现了错误。
sgt_inst.fit(vars)

运行警告:减法中出现无效值
numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol):

只是返回这个结果。

我觉得奇怪的是,当我按照文档中所示实现自定义的高斯分布时,它在运行fit方法时没有任何问题。

有什么想法吗?

1个回答

4
fit文档所述,
起始估计值由输入参数提供;对于未提供起始估计值的任何参数,将调用self._fitstart(data)生成这些值。
调用sgt_inst._fitstart(data)会返回(1.0, 1.0, 1.0, 1.0, 1.0, 0, 1)(前五个是形状参数,最后两个是位置和比例)。看起来_fitstart不是一个复杂的过程。它选择的参数l不符合您的argcheck要求。
结论:为fit提供自己的起始参数,例如,
sgt_inst.fit(data, 0.5, 0.5, -0.5, 2, 10)

我的随机数据返回值为 (1.4587093459289049, 5.471769032259468, -0.02391466905874927, 7.07289326147152 4, 0.741434497805832, -0.07012808188413872, 0.5308181287869771)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接