我想用gmm估算利率过程。
所以,我引用了这段代码。 https://github.com/josef-pkt/misc/blob/master/notebooks/ex_gmm_gamma.ipynb
以下是我的代码。
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)
但是,它会出现这样的错误。
ValueError: shapes (80,) and (4,4) not aligned: 80 (dim 0) != 4 (dim 0)
请你解决这个问题。
答案 0 :(得分:0)
形状问题是因为exog
是一个列数组(向量),索引的工具是1-D,它广播到80列。我添加了一个挤压exog,所以exog也是1-D
第二个问题是在时刻条件3的仪器索引中有一个拼写错误,应该使用
error3 = (endog - p0 - p1 * exog) * inst[:,1]
修复形状问题后,拟合会引发LinalgError,因为error1和error3是相同的。
在进行这两项更改后,它对我有用,但我不知道估计的参数在应用程序中是否有意义。
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中存在一个错误摘要,该错误基于错误且过短的参数名称列表。我们可以覆盖参数名称,然后汇总工作
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转换为2-d列数组,因此它匹配exog和instruments的形状。
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
mod = gmm(endog = dcd, exog = cd, instrument = inst, k_moms=4, k_params=4)
mod.momcond(beta0).shape