statsmodels:如何向MLE结果类添加方法

时间:2019-06-23 02:08:58

标签: python class methods statsmodels

(这不是简单地将方法添加到给定类的问题)

我想实现的目标

使用Maximum Likelihood Estimation (Generic models)中的statsmodels,我实现了MLE估计器,并希望将使用exogparams的用户自定义方法添加到拟合结果(不是实例),例如使用classmetod()。但是会发生错误,因为这些变量不可用。我如何实现我的目标?

让我用here中的示例来说明到目前为止我所做的事情。

(我看过this,它向现有类添加了方法。)

示例

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(类似地,paramsGenericLikelihoodModelResults)。实际上,添加以下代码不会显示exog等任何内容。

def my_check(self):
    return dir(self)

GenericLikelihoodModelResults.my_check = classmethod(my_check)

尽管事实是它们可以在一个实例上使用,因为可以使用

进行检查
res.exog
res.endog
res.params

我感谢任何有建设性的建议/意见。

1 个答案:

答案 0 :(得分:0)

异常消息

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

引用fit返回的结果类。
exogendog等是模型类的属性。但是params是results属性,因为它是fit方法的结果

因此,如果self是结果实例,则访问结果类self.model.exog中的model属性,或者将方法用于模型类,即selfMyProbit实例时

在这种情况下,我不确定使用类方法。这些属性仅适用于该类的特定实例。