【问题标题】:statsmodels: how to add a method to a class of MLE resultstatsmodels:如何将方法添加到 MLE 结果类
【发布时间】:2019-11-05 07:32:27
【问题描述】:

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

我想要实现的目标

使用statsmodels 中的Maximum Likelihood Estimation (Generic models),我实现了一个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(类似地,endogparams)在 GenericLikelihoodModelResults 中不可用。确实,添加以下代码不会显示exog等。

def my_check(self):
    return dir(self)

GenericLikelihoodModelResults.my_check = classmethod(my_check)

尽管它们在实例中可用,但可以使用

res.exog
res.endog
res.params

感谢任何建设性的建议/cmets。

【问题讨论】:

    标签: python class methods statsmodels


    【解决方案1】:

    异常信息

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

    指的是fit返回的结果类。
    exogendog和类似的都是模型类的属性。但是params 是一个结果属性,因为它是fit 方法的结果

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

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

    【讨论】:

    • 在我的问题中使用my_check() 函数,我在结果类中找不到model。在模型课上也没有机会。无论如何,感谢您的评论。
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2012-08-21
    • 2015-05-26
    相关资源
    最近更新 更多