首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用statsmodels.sandbox.regression.gmm.GMM的问题

使用statsmodels.sandbox.regression.gmm.GMM的问题
EN

Stack Overflow用户
提问于 2018-03-14 08:32:57
回答 1查看 2.2K关注 0票数 0

我想用gmm来估计利率过程。

所以,我引用了这段代码。gamma.ipynb

下面是我的密码。

代码语言:javascript
复制
import numpy as np
import pandas as pd
from statsmodels.sandbox.regression.gmm import GMM

cd = np.array([1.5, 1.5, 1.7, 2.2, 2.0, 1.8, 1.8, 2.2, 1.9, 1.6, 1.8, 2.2, 2.0, 1.5, 1.1, 1.5, 1.4, 1.7, 1.42, 1.9])
dcd = np.array([0, 0.2 ,0.5, -0.2, -0.2, 0, 0.4, -0.3, -0.3, 0.2, 0.4, -0.2, -0.5, -0.4, 0.4, -0.1, 0.3, -0.28, 0.48, 0.2])
inst = np.column_stack((np.ones(len(cd)), cd))

class gmm(GMM):
    def momcond(self, params):
        p0, p1, p2, p3 = params
        endog = self.endog
        exog = self.exog
        inst = self.instrument   

        error1 = endog - p0 - p1 * exog
        error2 = (endog - p0 - p1 * exog) ** 2 - p2 * (exog ** (2 * p3)) / 12
        error3 = (endog - p0 - p1 * exog) * inst[:,0]
        error4 = ((endog - p0 - p1 * exog) ** 2 - p2 * (exog ** (2 * p3)) / 12) * inst[:,1]
        g = np.column_stack((error1, error2, error3, error4))
        return g


beta0 = np.array([0.1, 0.1, 0.01, 1])

gmm(endog = dcd, exog = cd, instrument = inst, k_moms=4, k_params=4).fit(beta0)

但是,它会产生这样一个错误。

代码语言:javascript
复制
ValueError: shapes (80,) and (4,4) not aligned: 80 (dim 0) != 4 (dim 0)

你能解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-14 13:58:02

形状问题是因为exog是一个列数组(向量),索引仪器是1-D,它向80列广播。我增加了一个挤压外挂,所以外挂也是1-D。

第二个问题是,力矩条件3的仪器索引中有一个错误,应该使用它。

error3 = (endog - p0 - p1 * exog) * inst[:,1]

修正形状问题后,fit会产生LinalgError,因为error1和error3是相同的。

在进行这两项更改之后,它对我有效,但我不知道估计的参数在应用程序中是否有意义。

代码语言:javascript
复制
cd = np.array([1.5, 1.5, 1.7, 2.2, 2.0, 1.8, 1.8, 2.2, 1.9, 1.6, 1.8, 2.2, 2.0, 1.5, 1.1, 1.5, 1.4, 1.7, 1.42, 1.9])
dcd = np.array([0, 0.2 ,0.5, -0.2, -0.2, 0, 0.4, -0.3, -0.3, 0.2, 0.4, -0.2, -0.5, -0.4, 0.4, -0.1, 0.3, -0.28, 0.48, 0.2])
inst = np.column_stack((np.ones(len(cd)), cd))

class gmm(GMM):
    def momcond(self, params):
        p0, p1, p2, p3 = params
        endog = self.endog
        exog = self.exog.squeeze()
        inst = self.instrument   

        error1 = endog - p0 - p1 * exog
        error2 = (endog - p0 - p1 * exog) ** 2 - p2 * (exog ** (2 * p3)) / 12
        error3 = (endog - p0 - p1 * exog) * inst[:,1]
        error4 = ((endog - p0 - p1 * exog) ** 2 - p2 * (exog ** (2 * p3)) / 12) * inst[:,1]
        g = np.column_stack((error1, error2, error3, error4))
        return g


beta0 = np.array([0.1, 0.1, 0.01, 1])
res = gmm(endog = dcd, exog = cd, instrument = inst, k_moms=4, k_params=4).fit(beta0)

GMM中有一个用于摘要的错误,它基于一个不正确且太短的参数名称列表。我们可以重写参数名,然后进行摘要工作。

代码语言:javascript
复制
res.model.exog_names[:] = 'p0 p1 p2 p3'.split()
print(res.summary())




                                gmm Results                                  
==============================================================================
Dep. Variable:                      y   Hansen J:                    1.487e-10
Model:                            gmm   Prob (Hansen J):                   nan
Method:                           GMM                                         
Date:                Wed, 14 Mar 2018                                         
Time:                        09:38:38                                         
No. Observations:                  20                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
p0             0.9890      0.243      4.078      0.000       0.514       1.464
p1            -0.5524      0.129     -4.281      0.000      -0.805      -0.299
p2             1.2224      0.940      1.300      0.193      -0.620       3.065
p3            -0.3376      0.641     -0.527      0.598      -1.593       0.918
==============================================================================

额外

在校正版本中,不再使用仪器中的常量。因此,它可以被移除,或者瞬间条件可以在仪器中被矢量化,如下所示。注意,我将endog转换为二维列数组,因此它与外挂和仪器的形状相匹配。

代码语言:javascript
复制
class gmm(GMM):
    def momcond(self, params):
        p0, p1, p2, p3 = params
        endog = self.endog[:, None]
        exog = self.exog
        inst = self.instrument   

        error3 = (endog - p0 - p1 * exog) * inst
        error4 = ((endog - p0 - p1 * exog) ** 2 - p2 * (exog ** (2 * p3)) / 12) * inst
        g = np.column_stack((error3, error4))
        return g


beta0 = np.array([0.1, 0.1, 0.01, 1])
res = gmm(endog = dcd, exog = cd, instrument = inst, k_moms=4, k_params=4).fit(beta0)
res.model.exog_names[:] = 'p0 p1 p2 p3'.split()
print(res.summary())

调试

我们可以检查用户提供的矩条件是否具有正确的形状,但只需创建模型实例并调用momcond

代码语言:javascript
复制
mod = gmm(endog = dcd, exog = cd, instrument = inst, k_moms=4, k_params=4)
mod.momcond(beta0).shape
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49272902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档