statsmodels: как добавить метод в класс результата MLE - PullRequest
0 голосов
/ 23 июня 2019

(Это не проблема простого добавления метода к данному классу)

Что я хочу достичь

Использование Maximum Likelihood Estimation (Generic models) из statsmodelsЯ реализовал оценщик MLE и хочу добавить пользовательский метод, который использует exog и params, к классу подогнанного результата (не экземпляра), например, используя classmetod().Но возникает ошибка, потому что эти переменные недоступны.Как мне достичь своей цели?

Позвольте мне объяснить, что я сделал до сих пор, используя пример из здесь .

(я посмотрел на это для добавления метода в существующий класс.)

Пример

import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.base.model import GenericLikelihoodModel,GenericLikelihoodModelResults

data = sm.datasets.spector.load_pandas()
endog = data.endog
exog = sm.add_constant(data.exog)

class MyProbit(GenericLikelihoodModel):
    def loglike(self, params):
        exog = self.exog
        endog = self.endog
        q = 2 * endog - 1
        return stats.norm.logcdf(q*np.dot(exog, params)).sum()

# my attemp starts ---------------
def my_method(self):
    return print(self.exog, self.params, self.model)

GenericLikelihoodModelResults.my_method = classmethod(my_method)
# my attemp ends ----------------

res = MyProbit(endog, exog).fit()

res.my_method()

Это приводит к следующей ошибке.

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-29-a2d4f516bca7> in <module>
     23 res = MyProbit(endog, exog).fit()
     24 
---> 25 res.my_method()

<ipython-input-29-a2d4f516bca7> in my_method(self)
     17 # my attemp start ---------------
     18 def my_method(self):
---> 19     return print(self.exog, self.params, self.model)
     20 GenericLikelihoodModelResults.my_method = classmethod(my_method)
     21 # my attemp ends ----------------

AttributeError: type object 'GenericLikelihoodModelResults' has no attribute 'exog'

Это говорит о том, что exog (аналогично endog и params) недоступны в GenericLikelihoodModelResults.Действительно, добавление следующего кода не показывает ничего из exog и т. Д.

def my_check(self):
    return dir(self)

GenericLikelihoodModelResults.my_check = classmethod(my_check)

Это несмотря на тот факт, что они доступны в экземпляре, поскольку можно проверить с помощью

res.exog
res.endog
res.params

Я ценю любые конструктивные предложения / комментарии.

1 Ответ

0 голосов
/ 24 июня 2019

Сообщение об исключении

AttributeError: type object 'GenericLikelihoodModelResults' has no attribute 'exog'

относится к классу результатов, возвращаемому fit.
exog, endog и аналогичным атрибутам класса модели.,Но params является атрибутом результатов, потому что он является результатом fit метода

Так что либо обратитесь к атрибуту модели в классе результатов self.model.exog, если self является экземпляром результатов, либо используйте методдля класса модели, т.е. когда self является экземпляром MyProbit.

Я не уверен насчет использования метода класса в этом случае.Атрибуты доступны только для конкретного экземпляра класса.

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