(Это не проблема простого добавления метода к данному классу)
Что я хочу достичь
Использование 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
Я ценю любые конструктивные предложения / комментарии.