def deriv(self, t, *args): """First derivative of the dependence function implemented through numerical differentiation """ t = np.atleast_1d(t) return _approx_fprime_cs_scalar(t, self.evaluate)
def deriv2(self, p): """Second derivative of the link function g''(p) implemented through numerical differentiation """ from statsmodels.tools.numdiff import _approx_fprime_cs_scalar return _approx_fprime_cs_scalar(p, self.deriv)
def _deriv_score_obs_dendog(self, params): """derivative of score_obs w.r.t. endog Parameters ---------- params : ndarray parameter at which score is evaluated Returns ------- derivative : ndarray_2d The derivative of the score_obs with respect to endog. """ from statsmodels.tools.numdiff import _approx_fprime_cs_scalar def f(y): if y.ndim == 2 and y.shape[1] == 1: y = y[:, 0] sf = self.score_factor(params, endog=y) return np.column_stack(sf) dsf = _approx_fprime_cs_scalar(self.endog[:, None], f) # deriv is 2d vector d1 = dsf[:, :1] * self.exog d2 = dsf[:, 1:2] * self.exog_precision return np.column_stack((d1, d2))
def test_vectorized(): def f(x): return 2 * x desired = np.array([2, 2]) # vectorized parameter, column vector p = np.array([[1, 2]]).T assert_allclose(_approx_fprime_scalar(p, f), desired[:, None], rtol=1e-8) assert_allclose(_approx_fprime_scalar(p.squeeze(), f), desired, rtol=1e-8) assert_allclose(_approx_fprime_cs_scalar(p, f), desired[:, None], rtol=1e-8) assert_allclose(_approx_fprime_cs_scalar(p.squeeze(), f), desired, rtol=1e-8) # check 2-d row, see #7680 # not allowed/implemented for approx_fprime, raises broadcast ValueError # assert_allclose(approx_fprime(p.T, f), desired, rtol=1e-8) # similar as used in MarkovSwitching unit test assert_allclose(approx_fprime_cs(p.T, f).squeeze(), desired, rtol=1e-8)