Вы на правильном пути. Проблема в том, что params
- это массив параметров, а params[0]
относится к первому параметру. По этой причине строки:
self.ssm['obs_cov', 0, 0] = params[0]
self.ssm['obs_cov', 1, 1] = params[0]
установить оба диагональных элемента ковариационной матрицы наблюдения на одно и то же значение.
Вы хотите добавить новый параметр, который вы делаете, добавляя новый параметр в свойства * param_names
и start_params
. Например, вы хотите что-то вроде:
@property
def param_names(self):
return ['sigma2.measurement.v1', 'sigma2.measurement.v2', 'sigma2.level', 'sigma2.trend']
@property
def start_params(self):
std = np.std(self.endog, axis=0)
return np.r_[std, 1., 1.]
Тогда в вашем методе update
вы бы хотели что-то вроде:
def update(self, params, **kwargs):
params = super(LocalLinearTrend, self).update(params, **kwargs)
# Observation covariance
self.ssm['obs_cov',0,0] = params[0]
self.ssm['obs_cov',1,1] = params[1]
# State covariance
self.ssm[self._state_cov_idx] = params[2:]
(Примечание: при добавлении новых параметров вы, как правило, также хотите настроить transform_params
и untransform_params
для применения любых ограничений на пространство параметров. Однако версии этих функций в примере класса LocalLinearTrend
, который вы связали to будет продолжать работать для нового вектора параметров, определенного как выше, поэтому в этом случае вам не нужно ничего делать там).