Last active
August 5, 2016 16:43
-
-
Save yogabonito/d6c0fd64f41adc6727f5a6295253107e to your computer and use it in GitHub Desktop.
test_causality_bug
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def test_causality(self, equation, variables, kind='f', signif=0.05, | |
verbose=True): | |
"""Compute test statistic for null hypothesis of Granger-noncausality, | |
general function to test joint Granger-causality of multiple variables | |
Parameters | |
---------- | |
equation : string or int | |
Equation to test for causality | |
variables : sequence (of strings or ints) | |
List, tuple, etc. of variables to test for Granger-causality | |
kind : {'f', 'wald'} | |
Perform F-test or Wald (chi-sq) test | |
signif : float, default 5% | |
Significance level for computing critical values for test, | |
defaulting to standard 0.95 level | |
Notes | |
----- | |
Null hypothesis is that there is no Granger-causality for the indicated | |
variables. The degrees of freedom in the F-test are based on the | |
number of variables in the VAR system, that is, degrees of freedom | |
are equal to the number of equations in the VAR times degree of freedom | |
of a single equation. | |
Returns | |
------- | |
results : dict | |
""" | |
if isinstance(variables, (string_types, int, np.integer)): | |
variables = [variables] | |
k, p = self.neqs, self.k_ar | |
# number of restrictions | |
N = len(variables) * self.k_ar | |
# Make restriction matrix | |
# bug: "+ k" should read "+ k * number_of_det_terms" | |
C = np.zeros((N, k ** 2 * p + k), dtype=float) # bug | |
eq_index = self.get_eq_index(equation) | |
vinds = mat([self.get_eq_index(v) for v in variables]) | |
# remember, vec is column order! | |
# bug: "k + k ** 2" should read "k * num_of_det_terms + k ** 2" | |
offsets = np.concatenate([k + k ** 2 * j + k * vinds + eq_index | |
for j in range(p)]) # bug | |
C[np.arange(N), offsets] = 1 | |
# Lutkepohl 3.6.5 | |
Cb = np.dot(C, vec(self.params.T)) | |
middle = L.inv(chain_dot(C, self.cov_params, C.T)) | |
# wald statistic | |
lam_wald = statistic = chain_dot(Cb, middle, Cb) | |
if kind.lower() == 'wald': | |
df = N | |
dist = stats.chi2(df) | |
elif kind.lower() == 'f': | |
statistic = lam_wald / N | |
df = (N, k * self.df_resid) | |
dist = stats.f(*df) | |
else: | |
raise Exception('kind %s not recognized' % kind) | |
pvalue = dist.sf(statistic) | |
crit_value = dist.ppf(1 - signif) | |
conclusion = 'fail to reject' if statistic < crit_value else 'reject' | |
results = { | |
'statistic' : statistic, | |
'crit_value' : crit_value, | |
'pvalue' : pvalue, | |
'df' : df, | |
'conclusion' : conclusion, | |
'signif' : signif | |
} | |
if verbose: | |
summ = output.causality_summary(results, variables, equation, kind) | |
print(summ) | |
return results |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment