

以下の書籍を参考にして時系列解析を勉強中です。

[時系列解析-自己回帰型モデル・状態空間モデル・異常検知](https://www.kyoritsu-
pub.co.jp/bookdetail/9784320125018) / 島田直希 著

サンプルデータとサンプルコードでは動くのですが、  
自分で作成した時系列データを代入するとエラーが出てしまいます。  
ソースコードにはリンク先からアクセスできます。  
3.3.3_particle_filter.ipynb

第3章の3.3.3 粒子フィルタを用いた線形季節調整モデルの実装例のところで、下記のコマンドを実行するとエラーが出ます。

**エラーメッセージ:**

[code]

    IndexError: index 0 is out of bounds for axis 0 with size 0
    
[/code]

**ソースコード:**

[code]

    # 観測値の次元数
    n_dim_obs = 1
    # トレンドの次元数
    n_dim_trend = 2
    # 季節成分の次元数
    n_dim_series = 12
    # 粒子数
    n_particles = 200
    # システムノイズの分散共分散行列の対角要素の値
    system_sigma2 = 150
    
    # 推移行列などの定義
    n_dim_state, F, H, Q = FGHset(n_dim_trend,
                                  n_dim_obs,
                                  n_dim_series,
                                  Q_sigma2=system_sigma2)
    
    observation_sigma2 = 100
    transition_func = lambda x: F.dot(x)
    observation_func = lambda x: H.dot(x)
    system_noise = GaussianNoise(Q)
    observation_noise = GaussianNoise(np.eye(n_dim_obs)*observation_sigma2)
    
    pf = ParticleFilter(n_dim_state=n_dim_state, 
                        n_dim_obs=n_dim_obs,
                        transition_func=transition_func,
                        observation_func=observation_func,
                        system_noise=system_noise,
                        observation_noise=observation_noise,
                        n_particles=n_particles)
    
    n_train = 120
    predicted_value = np.empty(len(y[:n_train]))
    for i, d in enumerate(y[:n_train]):
        pf.update(d)
        predicted_value[i] = pf.predict()
    
    rng = range(len(predicted_value))
    plt.plot(rng, y[:n_train], label="observation")
    plt.plot(rng, predicted_value, '--', label="predict")
    
[/code]

自分で作成した時系列データは、  
要素数132、取り得る値が8,000～50,000の月次データです。  
データ形式は、サンプルデータと合わせています。  
取り得る最大値を500以下にするとエラーは出ないので、  
時系列データの値の大きさによるエラーだと思われます。  
ただ、その場合どこを修正すればいいのかよくわからず、困っています。

エラーの詳細について追記します。

[code]

    IndexError                                Traceback (most recent call last)
    <ipython-input-163-a33942154354> in <module>
         33 predicted_value = np.empty(len(y[:n_train]))
         34 for i, d in enumerate(y[:n_train]):
    ---> 35     pf.update(d)
         36     predicted_value[i] = pf.predict()
         37 
    
    <ipython-input-141-5c9ab45cc0af> in update(self, y)
         70         self._update_particles()
         71         self._update_particles_weight(y)
    ---> 72         self._resample()
         73 
         74     def forecast(self):
    
    <ipython-input-141-5c9ab45cc0af> in _resample(self)
        114 
        115         # 粒子の選定
    --> 116         self.selected_idx = [np.where(cum>=p)[0][0] for p in pointers]
        117         self.particles = self.predicted_particles[:, self.selected_idx]
        118 
    
    <ipython-input-141-5c9ab45cc0af> in <listcomp>(.0)
        114 
        115         # 粒子の選定
    --> 116         self.selected_idx = [np.where(cum>=p)[0][0] for p in pointers]
        117         self.particles = self.predicted_particles[:, self.selected_idx]
        118 
    
    IndexError: index 0 is out of bounds for axis 0 with size 0
    
[/code]

エラーの出ているy, pf, d, rngは、  
y.shape : (132,)  
pf : < **main**.ParticleFilter at 0x228f28ba9c8>  
d : 28817.0  
rng : range(0,132)  
となっています。


CC BY-SA 4.0
2021-08-29T11:38:51.780
81102
2021-08-30T00:36:37.200
2021-08-30T00:36:37.200
3060
43743
question
python
配列のサイズによるエラー