Уравнение наблюдения
[img]https:// latex.codecogs.com/svg.image?&space;y_t=%5Cmu_t+%5Csum_%7Bj=1%7D%5E%7Bk%7D%5Cbeta_jx_%7Bjt%7D+%5Cvarepsilon_t[/img]
Уравнение уровня
Уравнение тренда
с < img alt="delta" src="https://latex.codecogs.com/svg.image?%5Cdelta_t" /> как разница во времени между наблюдениями или приращения времени, поскольку наблюдения не равноудалены во времени.Следуйте, у нас есть общая форма пространства состояний.
с
с
< /p>
Если оставить в стороне экзогенные переменные, ниже приведены матрицы соответствующей модели пространства состояний.
Матрица проектирования
[img]https://latex .codecogs.com/svg.image?%5Cbegin%7Bbmatrix%7D1&0%5Cend%7Bbmatrix%7D[/img]
Уравнение состояний
[img]https://latex. codecogs.com/svg.image?%5Cbegin%7Bbmatrix%7D%5Cmu_%7Bt+1%7D%5C%5C%5Cnu_%7Bt+1%7D%5Cend%7Bbmatrix%7D=%5Cbegin%7Bbmatrix%7D1&%5Cdelta_t% 5C%5C0&1%5Cend%7Bbmatrix%7D%5Cbegin%7Bbmatrix%7D%5Cmu_t%5C%5C%5Cnu_t%5Cend%7Bbmatrix%7D+%5Cbegin%7Bbmatrix%7D%5Ceta_t%5C%5C%5Czeta_t%5Cend%7Bbmatrix%7D[/img]
Матрица перехода
Матрица наблюдения ковариации
Матрица ковариационных состояний
[img]https:// latex.codecogs.com/svg.image?Q[/img]
Как вставить экзогенные переменные в матричное определение пространства состояний?
Я создаю экзогенный фрейм данных следующим образом:
Код: Выделить всё
f_year = DeterministicProcess(X.index, period=period, fourier=harmonics).in_sample()
X_exog = pd.concat([X, f_year], axis=1)
Код: Выделить всё
kwargs = {'delta_t': delta_time[start : end]}
mod = models.DiscreteTimeLocalLinearTrend(Y[start : end], X[start : end], **kwargs)
mod_fit = mod.fit(maxiter=500, method='powell', disp=0)
kwargs = {'delta_t': delta_time[end : end + steps_predictions]}
y_pred = mod_fit.forecast(steps=steps_predictions, exog=X[end : end + steps_predictions], **kwargs)
Код: Выделить всё
class DiscreteTimeLocalLinearTrend(sm.tsa.statespace.MLEModel):
def __init__(self, endog, exog, **kwargs):
# Model order
n_exog = exog.shape[1]
k_states = 2 + n_exog
k_posdef = k_states
exog = exog.values
delta_t = kwargs.get('delta_t').values
# Initialize the statespace
super(DiscreteTimeLocalLinearTrend, self).__init__(
endog=endog, exog=exog,
k_states=k_states, k_posdef=k_posdef,
initialization='approximate_diffuse',
loglikelihood_burn=k_states,
**kwargs
)
# Design matrix
self.ssm['design'] = np.zeros((1, k_states, len(endog)))
self.ssm['design'][0, :2, :] = 1
self.ssm['design'][0, 2:, :] = exog.T
# Transition matrix
self.ssm['transition'] = np.zeros((k_states, k_states, len(endog)))
for t in range(len(endog)):
self.ssm['transition'][:2, :2, t] = np.array([[1, delta_t[t]], [0, 1]])
self.ssm['transition'][0, 2:, t] = exog[t]
# Selection matrix
self.ssm['selection'] = np.eye(k_states)
# State covariance matrix
self.ssm['state_cov'] = np.eye(k_posdef)
@property
def param_names(self):
return ['sigma2.measurement', 'sigma2.level', 'sigma2.trend']
@property
def start_params(self):
return [np.std(self.endog)]*3
def transform_params(self, unconstrained):
return unconstrained**2
def untransform_params(self, constrained):
return constrained**0.5
def clone(self, endog, exog=None, **kwargs):
return self._clone_from_init_kwds(endog, exog=exog, **kwargs)
def update(self, params, *args, **kwargs):
delta_t = kwargs.get('delta_t').values
params = super(DiscreteTimeLocalLinearTrend, self).update(params, *args, **kwargs)
# Observation covariance matrix
self.ssm['obs_cov',0,0] = params[0]
# State covariance matrix
self.ssm['state_cov'] = np.zeros((self.ssm.k_states, self.ssm.k_states))
np.fill_diagonal(self.ssm['state_cov'], np.real(params[1:self.ssm.k_states+1]))
# Design matrix
self.ssm['design'][0, 2:, :] = self.exog.T
# Transition matrix
for t in range(len(self.endog)):
self.ssm['transition'][:2, :2, t] = np.array([[1, delta_t[t]], [0, 1]])
Код: Выделить всё
# Create extended model
if extend_kwargs is None:
extend_kwargs = {}
Код: Выделить всё
# Create extended model
if extend_kwargs is None:
extend_kwargs = kwargs
После решения этой проблемы я получите ошибку в методе update, поскольку delta_t не найден в kwargs. Если я прокомментирую матрицу перехода кода в методе обновления, код запускается, но на графике прогноза я замечаю, что влияние экзогенных переменных не учитывается.
Оставляем код обновления матрицы перехода закомментирован и используется инициализация матрицы перехода как обычный локальный линейный тренд из
Код: Выделить всё
for t in range(len(endog)):
self.ssm['transition'][:2, :2, t] = np.array([[1, delta_t[t]],
[0, 1]])
self.ssm['transition'][0, 2:, t] = exog[t]
Код: Выделить всё
self.ssm['transition'] = np.eye(k_states)
self.ssm['transition'][:2, :2] = np.array([[1, 1],
[0, 1]])
Где я ошибаюсь?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ion-matrix