def test_3d_error(self): data = np.array(2) with pytest.raises(ValueError): tsatools.lagmat2ds(data, 5) data = np.zeros((100, 2, 2)) with pytest.raises(ValueError): tsatools.lagmat2ds(data, 5)
def test_lagmat2ds_numpy(self): data = self.macro_df npdata = data.values lagmat = tsatools.lagmat2ds(npdata, 2) expected = self._prepare_expected(npdata, 2) assert_array_equal(lagmat, expected) lagmat = tsatools.lagmat2ds(npdata[:, :2], 3) expected = self._prepare_expected(npdata[:, :2], 3) assert_array_equal(lagmat, expected) npdata = self.series.values lagmat = tsatools.lagmat2ds(npdata, 5) expected = self._prepare_expected(npdata[:, None], 5) assert_array_equal(lagmat, expected)
def test_lagmat2ds_pandas(self): data = self.macro_df lagmat = tsatools.lagmat2ds(data, 2) expected = self._prepare_expected(data.values, 2) assert_array_equal(lagmat, expected) lagmat = tsatools.lagmat2ds(data.iloc[:, :2], 3, trim='both') expected = self._prepare_expected(data.values[:, :2], 3) expected = expected[3:] assert_array_equal(lagmat, expected) data = self.series lagmat = tsatools.lagmat2ds(data, 5) expected = self._prepare_expected(data.values[:, None], 5) assert_array_equal(lagmat, expected)
def test_lagmat2ds_use_pandas(self): data = self.macro_df lagmat = tsatools.lagmat2ds(data, 2, use_pandas=True) expected = self._prepare_expected(data.values, 2) cols = [] for c in data: for lags in range(3): if lags == 0: cols.append(c) else: cols.append(c + '.L.' + str(lags)) expected = pd.DataFrame(expected, index=data.index, columns=cols) tm.assert_frame_equal(lagmat, expected) lagmat = tsatools.lagmat2ds(data.iloc[:, :2], 3, use_pandas=True, trim='both') expected = self._prepare_expected(data.values[:, :2], 3) cols = [] for c in data.iloc[:, :2]: for lags in range(4): if lags == 0: cols.append(c) else: cols.append(c + '.L.' + str(lags)) expected = pd.DataFrame(expected, index=data.index, columns=cols) expected = expected.iloc[3:] tm.assert_frame_equal(lagmat, expected) data = self.series lagmat = tsatools.lagmat2ds(data, 5, use_pandas=True) expected = self._prepare_expected(data.values[:, None], 5) cols = [] c = data.name for lags in range(6): if lags == 0: cols.append(c) else: cols.append(c + '.L.' + str(lags)) expected = pd.DataFrame(expected, index=data.index, columns=cols) tm.assert_frame_equal(lagmat, expected)
def grangercausalitytests(x, maxlag, addconst=True, verbose=True): """four tests for granger non causality of 2 timeseries all four tests give similar results `params_ftest` and `ssr_ftest` are equivalent based on F test which is identical to lmtest:grangertest in R Parameters ---------- x : array, 2d data for test whether the time series in the second column Granger causes the time series in the first column maxlag : integer the Granger causality test results are calculated for all lags up to maxlag verbose : bool print results if true Returns ------- results : dictionary all test results, dictionary keys are the number of lags. For each lag the values are a tuple, with the first element a dictionary with teststatistic, pvalues, degrees of freedom, the second element are the OLS estimation results for the restricted model, the unrestricted model and the restriction (contrast) matrix for the parameter f_test. Notes ----- TODO: convert to class and attach results properly The Null hypothesis for grangercausalitytests is that the time series in the second column, x2, does NOT Granger cause the time series in the first column, x1. Grange causality means that past values of x2 have a statistically significant effect on the current value of x1, taking past values of x1 into account as regressors. We reject the null hypothesis that x2 does not Granger cause x1 if the pvalues are below a desired size of the test. The null hypothesis for all four test is that the coefficients corresponding to past values of the second time series are zero. 'params_ftest', 'ssr_ftest' are based on F distribution 'ssr_chi2test', 'lrtest' are based on chi-square distribution References ---------- http://en.wikipedia.org/wiki/Granger_causality Greene: Econometric Analysis """ if verbose: # pragma: no cover raise NotImplementedError("Option `verbose` from upstream is " "not supported") x = np.asarray(x) if x.shape[0] <= 3 * maxlag + int(addconst): raise ValueError( "Insufficient observations. Maximum allowable " "lag is {0}".format(int((x.shape[0] - int(addconst)) / 3) - 1)) resli = {} for mlg in range(1, maxlag + 1): result = {} mxlg = mlg # create lagmat of both time series dta = lagmat2ds(x, mxlg, trim='both', dropex=1) if addconst: dtaown = add_constant(dta[:, 1:(mxlg + 1)], prepend=False) dtajoint = add_constant(dta[:, 1:], prepend=False) else: # TODO: Whats intended here? raise NotImplementedError # dtaown = dta[:, 1:mxlg] # dtajoint = dta[:, 1:] # Run ols on both models without and with lags of second variable res2down = OLS(dta[:, 0], dtaown).fit() res2djoint = OLS(dta[:, 0], dtajoint).fit() # for ssr based tests see: # http://support.sas.com/rnd/app/examples/ets/granger/index.htm # the other tests are made-up # Granger Causality test using ssr (F statistic) fgc1 = ((res2down.ssr - res2djoint.ssr) / res2djoint.ssr / mxlg * res2djoint.df_resid) result['ssr_ftest'] = (fgc1, stats.f.sf(fgc1, mxlg, res2djoint.df_resid), res2djoint.df_resid, mxlg) # Granger Causality test using ssr (ch2 statistic) fgc2 = res2down.nobs * (res2down.ssr - res2djoint.ssr) / res2djoint.ssr result['ssr_chi2test'] = (fgc2, stats.chi2.sf(fgc2, mxlg), mxlg) # likelihood ratio test pvalue: lr = -2 * (res2down.llf - res2djoint.llf) result['lrtest'] = (lr, stats.chi2.sf(lr, mxlg), mxlg) # F test that all lag coefficients of exog are zero rconstr = np.column_stack((np.zeros( (mxlg, mxlg)), np.eye(mxlg, mxlg), np.zeros((mxlg, 1)))) ftres = res2djoint.f_test(rconstr) result['params_ftest'] = (np.squeeze(ftres.fvalue)[()], np.squeeze(ftres.pvalue)[()], ftres.df_denom, ftres.df_num) resli[mxlg] = (result, [res2down, res2djoint, rconstr]) return resli