static void compute_VAR_dataset (irfboot *b, GRETL_VAR *var, const GRETL_VAR *vbak) { double x; int i, j, k, t; int nl = var_n_lags(var); #if BDEBUG gretl_matrix_print(var->Y, "var->Y before resampling"); gretl_matrix_print(var->X, "var->X before resampling"); #endif for (t=0; t<var->T; t++) { /* extract row of var->X at t */ gretl_matrix_extract_matrix(b->Xt, var->X, t, 0, GRETL_MOD_NONE); /* multiply Xt into original coeff matrix, forming Yt */ gretl_matrix_multiply(b->Xt, vbak->B, b->Yt); /* extract resampled residuals at t */ gretl_matrix_extract_matrix(b->Et, b->rE, t, 0, GRETL_MOD_NONE); /* add resampled residual to Yt */ gretl_matrix_add_to(b->Yt, b->Et); /* write into big Y matrix */ gretl_matrix_inscribe_matrix(var->Y, b->Yt, t, 0, GRETL_MOD_NONE); /* revise lagged Y columns in X */ k = var->ifc; for (i=0; i<var->neqns; i++) { x = b->Yt->val[i]; for (j=1; j<=nl && t+j < var->T; j++) { gretl_matrix_set(var->X, t+j, k++, x); } } } #if BDEBUG > 1 gretl_matrix_print(var->Y, "var->Y after resampling"); gretl_matrix_print(var->X, "var->X after resampling"); #endif }
gretl_matrix *HAC_XOX (const gretl_matrix *uhat, const gretl_matrix *X, VCVInfo *vi, int use_prior, int *err) { gretl_matrix *XOX = NULL; gretl_matrix *Wtj = NULL; gretl_matrix *Gj = NULL; gretl_matrix *H = NULL; gretl_matrix *A = NULL; gretl_matrix *w = NULL; int prewhiten; int data_based; int kern; int T = X->rows; int k = X->cols; int p, j, t; double bt = 0; if (use_prior) { kern = vi->vmin; prewhiten = vi->flags & HAC_PREWHITEN; if (kern == KERNEL_QS) { bt = vi->bw; p = T - 1; } else { p = vi->order; } data_based = 0; } else { kern = libset_get_int(HAC_KERNEL); data_based = data_based_hac_bandwidth(); prewhiten = libset_get_bool(PREWHITEN); } #if NW_DEBUG fprintf(stderr, "*** HAC: kern = %d, prewhiten = %d ***\n", kern, prewhiten); #endif if (use_prior) { H = newey_west_H(X, uhat, NULL); } else if (prewhiten || data_based) { H = newey_west_H(X, uhat, &w); } else { H = newey_west_H(X, uhat, NULL); } if (H == NULL) { *err = E_ALLOC; return NULL; } else if (prewhiten) { *err = nw_prewhiten(H, &A); } if (!*err) { XOX = gretl_zero_matrix_new(k, k); Wtj = gretl_matrix_alloc(k, k); Gj = gretl_matrix_alloc(k, k); if (XOX == NULL || Wtj == NULL || Gj == NULL) { *err = E_ALLOC; } } if (*err) { goto bailout; } /* determine the bandwidth setting */ if (!use_prior) { if (data_based) { *err = newey_west_bandwidth(H, w, kern, prewhiten, &p, &bt); if (*err) { goto bailout; } } else if (kern == KERNEL_QS) { bt = libset_get_double(QS_BANDWIDTH); p = T - 1; } else { p = get_hac_lag(T); } } if (!*err) { double wj; for (j=0; j<=p; j++) { /* cumulate running sum of Gamma-hat terms */ gretl_matrix_zero(Gj); for (t=j; t<T; t++) { /* W(t)-transpose * W(t-j) */ wtw(Wtj, H, k, t, j); gretl_matrix_add_to(Gj, Wtj); } if (j > 0) { /* Gamma(j) = Gamma(j) + Gamma(j)-transpose */ gretl_matrix_add_self_transpose(Gj); if (kern == KERNEL_QS) { wj = qs_hac_weight(bt, j); } else { wj = hac_weight(kern, p, j); } gretl_matrix_multiply_by_scalar(Gj, wj); } gretl_matrix_add_to(XOX, Gj); } } if (A != NULL) { hac_recolor(XOX, A); } if (!use_prior) { vi->vmaj = VCV_HAC; vi->vmin = kern; vi->flags = prewhiten ? HAC_PREWHITEN : 0; if (kern == KERNEL_QS) { vi->order = 0; vi->bw = bt; } else { vi->order = p; vi->bw = NADBL; } } bailout: gretl_matrix_free(H); gretl_matrix_free(Wtj); gretl_matrix_free(Gj); gretl_matrix_free(A); gretl_matrix_free(w); if (*err && XOX != NULL) { gretl_matrix_free(XOX); XOX = NULL; } return XOX; }