@@ -196,27 +196,25 @@ function simulate(
196
196
@assert seasonal_innovation_simulation >= 0 " seasonal_innovation_simulation must be a non-negative integer"
197
197
@assert isfitted (model) " Model must be fitted before simulation"
198
198
199
- prediction = StateSpaceLearning. forecast (
200
- model, steps_ahead; Exogenous_Forecast= Exogenous_Forecast
201
- )
199
+ prediction = forecast (model, steps_ahead; Exogenous_Forecast= Exogenous_Forecast)
202
200
203
- is_univariate = typeof (model. output) == StateSpaceLearning . Output
201
+ is_univariate = typeof (model. output) == Output
204
202
205
203
simulation_X = zeros (steps_ahead, 0 )
206
204
valid_indexes =
207
205
is_univariate ? model. output. valid_indexes : model. output[1 ]. valid_indexes
208
206
components_matrix = zeros (length (valid_indexes), 0 )
209
207
N_components = 1
210
208
211
- model_innovations = StateSpaceLearning . get_model_innovations (model)
209
+ model_innovations = get_model_innovations (model)
212
210
for innovation in model_innovations
213
211
simulation_X = hcat (
214
212
simulation_X,
215
- StateSpaceLearning . get_innovation_simulation_X (model, innovation, steps_ahead)[
213
+ get_innovation_simulation_X (model, innovation, steps_ahead)[
216
214
(end - steps_ahead): (end - 1 ), (end - steps_ahead + 1 ): end
217
215
],
218
216
)
219
- comp = StateSpaceLearning . fill_innovation_coefs (model, innovation, valid_indexes)
217
+ comp = fill_innovation_coefs (model, innovation, valid_indexes)
220
218
components_matrix = hcat (components_matrix, comp)
221
219
N_components += 1
222
220
end
@@ -242,7 +240,11 @@ function simulate(
242
240
end
243
241
244
242
if seasonal_innovation_simulation == 0
245
- ∑ = cov (components_matrix)
243
+ ∑ = if is_univariate
244
+ Diagonal ([var (components_matrix[:, i]) for i in 1 : N_components])
245
+ else
246
+ Diagonal ([var (components_matrix[:, i]) for i in 1 : N_mv_components])
247
+ end
246
248
for i in 1 : steps_ahead
247
249
MV_dist_vec[i] = if is_univariate
248
250
MvNormal (zeros (N_components), ∑)
@@ -270,12 +272,27 @@ function simulate(
270
272
end
271
273
else
272
274
start_seasonal_term = (size (components_matrix, 1 ) % seasonal_innovation_simulation)
273
- for i in 1 : steps_ahead
274
- ∑ = cov (
275
- components_matrix[
276
- (i + start_seasonal_term): seasonal_innovation_simulation: end , :,
277
- ],
278
- )
275
+ for i in 1 : seasonal_innovation_simulation
276
+ ∑ = if is_univariate
277
+ Diagonal ([
278
+ var (
279
+ components_matrix[
280
+ (i + start_seasonal_term): seasonal_innovation_simulation: end ,
281
+ j,
282
+ ],
283
+ ) for j in 1 : N_components
284
+ ])
285
+ else
286
+ Diagonal ([
287
+ var (
288
+ components_matrix[
289
+ (i + start_seasonal_term): seasonal_innovation_simulation: end ,
290
+ j,
291
+ ],
292
+ ) for j in 1 : N_mv_components
293
+ ])
294
+ end
295
+
279
296
MV_dist_vec[i] = if is_univariate
280
297
MvNormal (zeros (N_components), ∑)
281
298
else
@@ -313,6 +330,20 @@ function simulate(
313
330
end
314
331
end
315
332
end
333
+ for i in (seasonal_innovation_simulation + 1 ): steps_ahead
334
+ MV_dist_vec[i] = MV_dist_vec[i - seasonal_innovation_simulation]
335
+ if model. outlier
336
+ if is_univariate
337
+ o_noises[i, :] = o_noises[i - seasonal_innovation_simulation, :]
338
+ else
339
+ for j in eachindex (model. output)
340
+ o_noises[j][i, :] = o_noises[j][
341
+ i - seasonal_innovation_simulation, :,
342
+ ]
343
+ end
344
+ end
345
+ end
346
+ end
316
347
end
317
348
318
349
simulation = if is_univariate
0 commit comments