static int *arma_info_get_x_list (arma_info *ainfo) { int *xlist = NULL; int start = arma_list_y_position(ainfo); int i; xlist = gretl_list_new(ainfo->nexo); if (xlist != NULL) { for (i=1; i<=xlist[0]; i++) { xlist[i] = ainfo->alist[i + start]; } } return xlist; }
static int arma_adjust_sample (arma_info *ainfo, const DATASET *dset, int *missv, int *misst) { int *list = ainfo->alist; int ypos = arma_list_y_position(ainfo); int t0, t1 = dset->t1, t2 = dset->t2; int i, vi, vlmax, k, t; int missing; int err = 0; #if ARMA_DEBUG fprintf(stderr, "arma_adjust_sample: at start, t1=%d, t2=%d, maxlag = %d\n", t1, t2, ainfo->maxlag); #endif t0 = t1 - ainfo->maxlag; if (t0 < 0) { t1 -= t0; } /* list position of last var to check for lags */ if (arma_xdiff(ainfo)) { vlmax = list[0]; } else { vlmax = ypos; } /* advance the starting point if need be */ for (t=t1; t<=t2; t++) { missing = 0; for (i=ypos; i<=list[0] && !missing; i++) { vi = list[i]; if (na(dset->Z[vi][t])) { /* current value missing */ missing = 1; } if (i <= vlmax) { for (k=1; k<=ainfo->maxlag && !missing; k++) { if (na(dset->Z[vi][t-k])) { /* lagged value missing */ missing = 1; } } } } if (missing) { t1++; } else { break; } } /* retard the ending point if need be */ for (t=t2; t>=t1; t--) { missing = 0; for (i=ypos; i<=list[0] && !missing; i++) { vi = list[i]; if (na(dset->Z[vi][t])) { missing = 1; } } if (missing) { t2--; } else { break; } } if (t2 < t1) { gretl_errmsg_set(_("No usable data were found")); return E_MISSDATA; } missing = 0; /* check for missing obs within the adjusted sample range */ for (t=t1; t<t2; t++) { int tmiss = 0; for (i=ypos; i<=list[0]; i++) { vi = list[i]; if (na(dset->Z[vi][t])) { if (missv != NULL && misst != NULL && *missv == 0) { /* record info on first missing obs */ *missv = vi; *misst = t + 1; } tmiss = 1; } } if (tmiss) { missing++; } } if (missing > 0 && !arma_na_ok(ainfo)) { err = E_MISSDATA; } if (!err) { ainfo->fullT = t2 - t1 + 1; ainfo->T = ainfo->fullT - missing; if (ainfo->T <= ainfo->nc) { /* insufficient observations */ err = E_DF; } } if (!err) { #if ARMA_DEBUG fprintf(stderr, "arma_adjust_sample: at end, t1=%d, t2=%d\n", t1, t2); #endif ainfo->t1 = t1; ainfo->t2 = t2; } return err; }