Подгонка данных с помощью собственного дистрибутива с использованием scipy.stats - PullRequest
0 голосов
/ 06 сентября 2018

Итак, я заметил, что в scipy отсутствует реализация обобщенного t-распределения Skewed.Было бы полезно, если бы это соответствовало распространению некоторых данных, которые у меня есть.К сожалению, 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:])) <= fatol): </p>

, и оно просто возвращает

Что я нахожу странным, так это то, что когда я реализую пример пользовательского гауссовского распределения, как показано в документах , у него не возникает проблем при запуске метода fit.

Anyидеи?

1 Ответ

0 голосов
/ 06 сентября 2018

Как говорит fit Документация,

Начальные оценки для подгонки задаются входными аргументами; для любых аргументов, не обеспеченных начальными оценками, self._fitstart(data) вызывается для генерации таких.

Вызов sgt_inst._fitstart(data) возвращает (1.0, 1.0, 1.0, 1.0, 1.0, 0, 1) (первые пять - параметры формы, последние два - loc и scale). Похоже, _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) для моих случайных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...