statsmodels - ARMA fit的抛出摘要抛出错误

时间:2015-11-30 18:33:56

标签: python time-series statsmodels

我想将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()

没有错误发生。这应该是或应该修复的Bug吗?

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)

1 个答案:

答案 0 :(得分:0)

您可以将此报告为错误,即使它看起来像是当前设计的结果。

当估计方法改变时,模型的某些属性会发生变化,这通常应该避免。由于两个结果实例都访问相同的模型,因此在这种情况下较旧的结果实例与它不一致。

http://www.statsmodels.org/dev/pitfalls.html#repeated-calls-to-fit-with-different-parameters

通常,statsmodels会尝试保留所有需要在model.__init__中更改模型的参数,而不是fit中的参数,并将fit和results的结果附加到Results实例。 然而,这并没有随处可见,尤其是那些在此过程中获得新选择的老款车型。

trend是一个应该进入ARMA.__init__的例子,因为它现在与exog(这是一个ARMAX模型)一起处理,但不是纯粹的ARMA。估算方法属于fit,不应导致这类问题。

除此之外:有一个辅助函数可以模拟使用scipy.signal.lfilter的ARMA进程,并且应该比Python中的迭代循环快得多。