Как указать пользовательскую вероятность в statsmodel? - PullRequest
0 голосов
/ 28 января 2020

Я пытался свести к минимуму настраиваемую вероятность с помощью statsmodel, изменив класс GenericLikelihoodModel. Согласно веб-сайту (https://www.statsmodels.org/dev/examples/notebooks/generated/generic_mle.html) вам необходимо предоставить функцию nloglikeobs: «nloglikeobs: эта функция должна возвращать одну оценку функции отрицательного логарифмического правдоподобия на наблюдение в наборе данных». Однако форма моей вероятности зависит от каждого наблюдения (процесс Пуассона - нет общей вероятности), и я изо всех сил пытаюсь найти способ заставить программу использовать это различие.

Вот мой код:

def neg_ll_individual(x,theta):
    a=theta[0]
    b=theta[1]
    #find the bin where the measurement is from
    j=np.argmax(Mean_expression_bins>x)
    return(-np.log(stats.poisson.pmf(Sij[1,j],intensity_parameter(1,j,a,b)))/Sij[1,j])


class CustomGammaPoissonModel(GenericLikelihoodModel):
    def __init__(self, endog, exog=None, **kwds):
        if exog is None:
            exog = np.zeros_like(endog)

        super(CustomGammaPoissonModel, self).__init__(endog, exog, **kwds)

    def nloglikeobs(self, params):
        return(neg_ll_individual(self.endog,params))

    def fit(self, start_params=None, maxiter=1000, maxfun=5000, **kwds):
        if start_params is None:
            ab = self.endog.mean()
            abb=self.endog.var()

            start_params = np.array([(ab**2)/abb,abb/ab])
        return super(CustomGammaPoissonModel, self).fit(start_params=start_params,
                                                    maxiter=maxiter, maxfun=maxfun, **kwds)

model = CustomGammaPoissonModel(data_transformation_bins(Sij[1,:]))
theta_start=starting_point_binned(Sij[1,:])
results = model.fit(start_params=theta_start)

Мои входные данные (матрица endog / X) data_transformation_bins(Sij[1,:]) - это массив (604,) numpy, и в идеале мне бы хотелось, чтобы statsmodel обрабатывал каждую точку данных последовательно. Проблема заключается в том, как я создал функцию правдоподобия. neg_ll_individual: поиск индекса j приводит к проблеме широковещания, поскольку модель статистики подает во всей матрице data_transformation_bins(Sij[1,:]) как x вместо одного числового элемента данных, что приводит к несовместимости во время операции np.argmax (Mean_expression_bins - это ( 16,) матрица). Хотели бы вы дать совет по этой проблеме?

<ipython-input-92-43c31aa5830a> in neg_ll_individual(x, theta)
     13     b=theta[1]
     14     #find the bin where the measurement is from
---> 15     j=np.argmax(Mean_expression_bins>x)
     16     return(-np.log(stats.poisson.pmf(Sij[1,j],intensity_parameter(1,j,a,b)))/Sij[1,j])
     17 

ValueError: operands could not be broadcast together with shapes (16,) (604,) 
...