@@ -310,16 +310,20 @@ def _hidden_states_from_data(self, data):
310
310
311
311
for i , (name , s ) in enumerate (zip (names , state_slices )):
312
312
obs_idx = info [name ]["obs_state_idx" ]
313
+
313
314
if obs_idx is None :
314
315
continue
315
316
316
317
X = data [..., s ]
318
+
317
319
if info [name ]["combine_hidden_states" ]:
318
- sum_idx = np .flatnonzero (obs_idx )
319
- result .append (X [..., sum_idx ].sum (axis = - 1 )[..., None ])
320
+ sum_idx_joined = np .flatnonzero (obs_idx )
321
+ sum_idx_split = np .split (sum_idx_joined , info [name ]["k_endog" ])
322
+ for sum_idx in sum_idx_split :
323
+ result .append (X [..., sum_idx ].sum (axis = - 1 )[..., None ])
320
324
else :
321
- comp_names = self .state_names [s ]
322
- for j , state_name in enumerate ( comp_names ):
325
+ n_components = len ( self .state_names [s ])
326
+ for j in range ( n_components ):
323
327
result .append (X [..., j , None ])
324
328
325
329
return np .concatenate (result , axis = - 1 )
@@ -332,7 +336,15 @@ def _get_subcomponent_names(self):
332
336
333
337
for i , (name , s ) in enumerate (zip (names , state_slices )):
334
338
if info [name ]["combine_hidden_states" ]:
335
- result .append (name )
339
+ if self .k_endog == 1 :
340
+ result .append (name )
341
+ else :
342
+ # If there are multiple observed states, we will combine per hidden state, preserving the
343
+ # observed state names. Note this happens even if this *component* has only 1 state for consistency,
344
+ # as long as the statespace model has multiple observed states.
345
+ result .extend (
346
+ [f"{ name } [{ obs_name } ]" for obs_name in info [name ]["observed_state_names" ]]
347
+ )
336
348
else :
337
349
comp_names = self .state_names [s ]
338
350
result .extend ([f"{ name } [{ comp_name } ]" for comp_name in comp_names ])
@@ -540,7 +552,7 @@ def __init__(
540
552
self ._component_info = {
541
553
self .name : {
542
554
"k_states" : self .k_states ,
543
- "k_enodg " : self .k_endog ,
555
+ "k_endog " : self .k_endog ,
544
556
"k_posdef" : self .k_posdef ,
545
557
"observed_state_names" : self .observed_state_names ,
546
558
"combine_hidden_states" : combine_hidden_states ,
0 commit comments