def test_cases(self): # Test against known results for unconstrained, error_variance, constrained in self.cases: result = tools.constrain_stationary_multivariate( unconstrained, error_variance) assert_allclose(result[0], constrained) # Test that the constrained results correspond to companion matrices # with eigenvalues less than 1 in modulus for unconstrained in self.eigval_cases: if type(unconstrained) == list: cov = np.eye(unconstrained[0].shape[0]) else: cov = np.eye(unconstrained.shape[0]) constrained, _ = tools.constrain_stationary_multivariate(unconstrained, cov) companion = tools.companion_matrix( [1] + [-constrained[i] for i in range(len(constrained))] ).T assert_equal(np.max(np.abs(np.linalg.eigvals(companion))) < 1, True)
def test_cases(self): for constrained in self.constrained_cases: if type(constrained) == list: cov = np.eye(constrained[0].shape[0]) else: cov = np.eye(constrained.shape[0]) unconstrained, _ = tools.unconstrain_stationary_multivariate(constrained, cov) reconstrained, _ = tools.constrain_stationary_multivariate(unconstrained, cov) assert_allclose(reconstrained, constrained) for unconstrained in self.unconstrained_cases: if type(unconstrained) == list: cov = np.eye(unconstrained[0].shape[0]) else: cov = np.eye(unconstrained.shape[0]) constrained, _ = tools.constrain_stationary_multivariate(unconstrained, cov) reunconstrained, _ = tools.unconstrain_stationary_multivariate(constrained, cov) # Note: low tolerance comes from last example in unconstrained_cases, # but is not a real problem assert_allclose(reunconstrained, unconstrained, atol=1e-4)
def test_cases(self): # Test against known results for unconstrained, error_variance, constrained in self.cases: result = tools.constrain_stationary_multivariate( unconstrained, error_variance) assert_allclose(result[0], constrained) # Test that the constrained results correspond to companion matrices # with eigenvalues less than 1 in modulus for unconstrained in self.eigval_cases: if type(unconstrained) == list: cov = np.eye(unconstrained[0].shape[0]) else: cov = np.eye(unconstrained.shape[0]) constrained, _ = tools.constrain_stationary_multivariate( unconstrained, cov) companion = tools.companion_matrix( [1] + [-constrained[i] for i in range(len(constrained))]).T assert_equal( np.max(np.abs(np.linalg.eigvals(companion))) < 1, True)
def test_cases(self): for constrained in self.constrained_cases: if type(constrained) == list: cov = np.eye(constrained[0].shape[0]) else: cov = np.eye(constrained.shape[0]) unconstrained, _ = tools.unconstrain_stationary_multivariate( constrained, cov) reconstrained, _ = tools.constrain_stationary_multivariate( unconstrained, cov) assert_allclose(reconstrained, constrained) for unconstrained in self.unconstrained_cases: if type(unconstrained) == list: cov = np.eye(unconstrained[0].shape[0]) else: cov = np.eye(unconstrained.shape[0]) constrained, _ = tools.constrain_stationary_multivariate( unconstrained, cov) reunconstrained, _ = tools.unconstrain_stationary_multivariate( constrained, cov) # Note: low tolerance comes from last example in unconstrained_cases, # but is not a real problem assert_allclose(reunconstrained, unconstrained, atol=1e-4)
def transform_params(self, unconstrained): """ Transform unconstrained parameters used by the optimizer to constrained parameters used in likelihood evaluation Parameters ---------- unconstrained : array_like Array of unconstrained parameters used by the optimizer, to be transformed. Returns ------- constrained : array_like Array of constrained parameters which may be used in likelihood evalation. Notes ----- Constrains the factor transition to be stationary and variances to be positive. """ unconstrained = np.array(unconstrained, ndmin=1) constrained = np.zeros(unconstrained.shape, dtype=unconstrained.dtype) # 1. Intercept terms: nothing to do constrained[self._params_trend] = unconstrained[self._params_trend] # 2. AR terms: optionally force to be stationary if self.k_ar > 0 and self.enforce_stationarity: # Create the state covariance matrix if self.error_cov_type == 'diagonal': state_cov = np.diag(unconstrained[self._params_state_cov]**2) elif self.error_cov_type == 'unstructured': state_cov_lower = np.zeros(self.ssm['state_cov'].shape, dtype=unconstrained.dtype) state_cov_lower[self._idx_lower_state_cov] = ( unconstrained[self._params_state_cov]) state_cov = np.dot(state_cov_lower, state_cov_lower.T) # Transform the parameters coefficients = unconstrained[self._params_ar].reshape( self.k_endog, self.k_endog * self.k_ar) coefficient_matrices, variance = ( constrain_stationary_multivariate(coefficients, state_cov)) constrained[self._params_ar] = coefficient_matrices.ravel() else: constrained[self._params_ar] = unconstrained[self._params_ar] # 3. MA terms: optionally force to be invertible if self.k_ma > 0 and self.enforce_invertibility: # Transform the parameters, using an identity variance matrix state_cov = np.eye(self.k_endog, dtype=unconstrained.dtype) coefficients = unconstrained[self._params_ma].reshape( self.k_endog, self.k_endog * self.k_ma) coefficient_matrices, variance = ( constrain_stationary_multivariate(coefficients, state_cov)) constrained[self._params_ma] = coefficient_matrices.ravel() else: constrained[self._params_ma] = unconstrained[self._params_ma] # 4. Regression terms: nothing to do constrained[self._params_regression] = ( unconstrained[self._params_regression]) # 5. State covariance terms # If we have variances, force them to be positive if self.error_cov_type == 'diagonal': constrained[self._params_state_cov] = ( unconstrained[self._params_state_cov]**2) # Otherwise, nothing needs to be done elif self.error_cov_type == 'unstructured': constrained[self._params_state_cov] = ( unconstrained[self._params_state_cov]) # 5. Measurement error variance terms if self.measurement_error: # Force these to be positive constrained[self._params_obs_cov] = ( unconstrained[self._params_obs_cov]**2) return constrained