def _cov_params_approx(self, approx_complex_step=True, approx_centered=False): evaluated_hessian = self.nobs_effective * self.model.hessian( params=self.params, transformed=True, includes_fixed=True, method="approx", approx_complex_step=approx_complex_step, approx_centered=approx_centered, ) # TODO: Case with "not approx_complex_step" is not hit in # tests as of 2017-05-19 if len(self.fixed_params) > 0: mask = np.ix_(self._free_params_index, self._free_params_index) if len(self.fixed_params) < self.k_params: (tmp, singular_values) = pinv_extended(evaluated_hessian[mask]) else: tmp, singular_values = np.nan, [np.nan] neg_cov = np.zeros_like(evaluated_hessian) * np.nan neg_cov[mask] = tmp else: (neg_cov, singular_values) = pinv_extended(evaluated_hessian) self.model.update(self.params, transformed=True, includes_fixed=True) if self._rank is None: self._rank = np.linalg.matrix_rank(np.diag(singular_values)) return -neg_cov
def test_extendedpinv(self): X = standard_normal((40, 10)) np_inv = np.linalg.pinv(X) np_sing_vals = np.linalg.svd(X, 0, 0) sm_inv, sing_vals = pinv_extended(X) assert_almost_equal(np_inv, sm_inv) assert_almost_equal(np_sing_vals, sing_vals)