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