4

このプログラムを 5000 回実行し、AR(1) と AR(2) をモデルに適合させようとしているこの割り当てを行っています。まず、時系列を生成する関数を次のように定義しました。

def ts_gen_ar1(size,sigma,alpha1):
    wt = np.random.normal(0,sigma**2,size=size)
    x = np.zeros(size)
    for i in np.arange(1,size):
        x[i] = 0.2 + alpha1*x[i-1] + wt[i]
return x

次に、作業に非常に時間がかかる次のステートメントを実行しました

sample_ar1 = []
sample_ar2 = []
for i in range(0,5000):
    rt = ts_gen_ar1(2500,1,0.8)
    coeff_ar1 = sm.tsa.ARMA(rt,order=(1,0)).fit().params[1]
    coeff_ar2 = sm.tsa.ARMA(rt,order=(2,0)).fit().params[1:]
    sample_ar1.append(coeff_ar1)
    sample_ar2.append(coeff_ar2)

誰かがこれをスピードアップする方法を提案できますか? また、プログラムが MLE が特定の反復で収束に失敗したと言うフィッティング エラーも発生しています。

ありがとう

4

1 に答える 1

2

プレーンな Python での時系列分析の再帰ループは遅いです。

この場合、サンプルを生成するための最も簡単な解決策はscipy.signal.lfilter、statsmodels arma_generate_sample http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_process.arma_generate_sample.htmlのラッパーを使用することです。

乱数生成を高速化するもう 1 つの可能性は、多数のサンプルに対してベクトル化して実行することです。たとえば、100 プロセスのブロックに対して実行します。タイム ループはまだありますが、より多くのメモリを使用することを犠牲にして、レプリケーション ループの数を減らすことができます。

sm.tsa.ARMAcython で記述されたカルマン フィルターを使用し、高速に実行されますが、AR モデルの推定に必要な以上の作業を行う一般的な ARMA プロセス用です。 sm.ts.AR定常性仮定 (デフォルト) の下で完全な最尤法によって AR プロセスのパラメーターを推定します。

最も簡単で最速の方法は、非線形最適化を必要としない OLS によって AR プロセスを推定するか、Yule-Walker statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.yule_walker.html を使用することです。

最後の 2 つは、最初の観測を条件としてパラメーターを推定できますが、AR および ARMA モデルが持つ予測などの完全な推定後機能は備えていません。

于 2015-02-19T14:45:56.803 に答える