statsmodels - ARMA 拟合的打印摘要抛出错误
statsmodels - printing summary of ARMA fit throws error
我想将 ARMA(p,q) 模型拟合到模拟数据,y
,并检查不同估计方法对结果的影响。但是,像这样将模型拟合到同一个对象
model = tsa.ARMA(y,(1,1))
results_mle = model.fit(trend='c', method='mle', disp=False)
results_css = model.fit(trend='c', method='css', disp=False)
并打印结果
print result_mle.summary()
print result_css.summary()
生成以下错误
File "C:\Anaconda\lib\site-packages\statsmodels\tsa\arima_model.py", line 1572, in summary
smry.add_table_params(self, alpha=alpha, use_t=False)
File "C:\Anaconda\lib\site-packages\statsmodels\iolib\summary.py", line 885, in add_table_params
use_t=use_t)
File "C:\Anaconda\lib\site-packages\statsmodels\iolib\summary.py", line 475, in summary_params
exog_idx]
IndexError: index 3 is out of bounds for axis 0 with size 3
如果我这样做
model1 = tsa.ARMA(y,(1,1))
model2 = tsa.ARMA(y,(1,1))
result_mle = model1.fit(trend='c',method='css-mle',disp=False)
print result_mle.summary()
result_css = model2.fit(trend='c',method='css',disp=False)
print result_css.summary()
没有错误发生。这应该是错误还是应该修复?
BTW我生成的ARMA过程如下
from __future__ import division
import statsmodels.tsa.api as tsa
import numpy as np
# generate arma
a = -0.7
b = -0.7
c = 2
s = 10
y1 = np.random.normal(c/(1-a),s*(1+(a+b)**2/(1-a**2)))
e = np.random.normal(0,s,(100,))
y = [y1]
for t in xrange(e.size-1):
arma = c + a*y[-1] + e[t+1] + b*e[t]
y.append(arma)
y = np.array(y)
您可以将其报告为错误,即使它看起来像是当前设计的结果。
当估计方法改变时,模型的某些属性会发生变化,通常应避免这种情况。由于两个结果实例都访问相同的模型,因此在这种情况下旧的与它不一致。
http://www.statsmodels.org/dev/pitfalls.html#repeated-calls-to-fit-with-different-parameters
通常,statsmodels 会尝试将所有需要更改模型的参数保留在 model.__init__
中而不是 fit
中的参数,并将拟合结果和结果附加到 Results 实例.
然而,并非所有地方都遵循这一点,尤其是在沿途获得新选项的旧模型中。
trend
是一个应该进入 ARMA.__init__
的示例,因为它现在与 exog(它是一个 ARMAX 模型)一起处理,但不是在纯 ARMA 中。估计方法属于fit
,应该不会出现这样的问题。
旁白:有一个辅助函数可以模拟使用 scipy.signal.lfilter 的 ARMA 过程,并且应该比 Python 中的迭代循环快得多。
我想将 ARMA(p,q) 模型拟合到模拟数据,y
,并检查不同估计方法对结果的影响。但是,像这样将模型拟合到同一个对象
model = tsa.ARMA(y,(1,1))
results_mle = model.fit(trend='c', method='mle', disp=False)
results_css = model.fit(trend='c', method='css', disp=False)
并打印结果
print result_mle.summary()
print result_css.summary()
生成以下错误
File "C:\Anaconda\lib\site-packages\statsmodels\tsa\arima_model.py", line 1572, in summary
smry.add_table_params(self, alpha=alpha, use_t=False)
File "C:\Anaconda\lib\site-packages\statsmodels\iolib\summary.py", line 885, in add_table_params
use_t=use_t)
File "C:\Anaconda\lib\site-packages\statsmodels\iolib\summary.py", line 475, in summary_params
exog_idx]
IndexError: index 3 is out of bounds for axis 0 with size 3
如果我这样做
model1 = tsa.ARMA(y,(1,1))
model2 = tsa.ARMA(y,(1,1))
result_mle = model1.fit(trend='c',method='css-mle',disp=False)
print result_mle.summary()
result_css = model2.fit(trend='c',method='css',disp=False)
print result_css.summary()
没有错误发生。这应该是错误还是应该修复?
BTW我生成的ARMA过程如下
from __future__ import division
import statsmodels.tsa.api as tsa
import numpy as np
# generate arma
a = -0.7
b = -0.7
c = 2
s = 10
y1 = np.random.normal(c/(1-a),s*(1+(a+b)**2/(1-a**2)))
e = np.random.normal(0,s,(100,))
y = [y1]
for t in xrange(e.size-1):
arma = c + a*y[-1] + e[t+1] + b*e[t]
y.append(arma)
y = np.array(y)
您可以将其报告为错误,即使它看起来像是当前设计的结果。
当估计方法改变时,模型的某些属性会发生变化,通常应避免这种情况。由于两个结果实例都访问相同的模型,因此在这种情况下旧的与它不一致。
http://www.statsmodels.org/dev/pitfalls.html#repeated-calls-to-fit-with-different-parameters
通常,statsmodels 会尝试将所有需要更改模型的参数保留在 model.__init__
中而不是 fit
中的参数,并将拟合结果和结果附加到 Results 实例.
然而,并非所有地方都遵循这一点,尤其是在沿途获得新选项的旧模型中。
trend
是一个应该进入 ARMA.__init__
的示例,因为它现在与 exog(它是一个 ARMAX 模型)一起处理,但不是在纯 ARMA 中。估计方法属于fit
,应该不会出现这样的问题。
旁白:有一个辅助函数可以模拟使用 scipy.signal.lfilter 的 ARMA 过程,并且应该比 Python 中的迭代循环快得多。