static int pca_save_components (VMatrix *cmat, gretl_matrix *E, gretl_matrix *C, DATASET *dset, int nsave, gretlopt opt) { int save_all = (opt & OPT_A); double x, **sZ = NULL; int m = 0, v = dset->v; int k = cmat->dim; int i, j, t, vi; int err = 0; if (save_all) { m = k; } else if (nsave > 0) { m = nsave > k ? k : nsave; } else { for (i=0; E->val[i] > 1.0; i++) { m++; } } err = dataset_add_series(dset, m); if (!err) { /* construct standardized versions of all variables */ sZ = doubles_array_new(k, dset->n); if (sZ == NULL) { err = E_ALLOC; } else { for (i=0; i<k && !err; i++) { vi = cmat->list[i+1]; err = standardize(sZ[i], dset->Z[vi], dset->n); } } } if (!err) { gchar *label; double load; for (i=0; i<m; i++) { vi = v + i; sprintf(dset->varname[vi], "PC%d", i+1); make_varname_unique(dset->varname[vi], vi, dset); label = g_strdup_printf(_("Component with eigenvalue = %.4f"), E->val[i]); series_set_label(dset, vi, label); g_free(label); for (t=0; t<dset->n; t++) { if (t < dset->t1 || t > dset->t2) { dset->Z[vi][t] = NADBL; continue; } dset->Z[vi][t] = 0.0; for (j=0; j<k; j++) { x = sZ[j][t]; if (na(x)) { dset->Z[vi][t] = NADBL; break; } else { load = gretl_matrix_get(C, j, i); dset->Z[vi][t] += load * x; } } } } } doubles_array_free(sZ, k); return err; }
static int arma_init_add_dummies (arma_info *ainfo, DATASET *dset) { int *misslist = NULL; int t1 = dset->t1; int i, t, err = 0; /* if we have a block of leading NAs, skip it */ for (t=t1; t<=dset->t2 && !err; t++) { int miss = 0; for (i=1; i<dset->v; i++) { if (na(dset->Z[i][t])) { miss = 1; break; } } if (miss) { t1++; } else { break; } } /* form list of observation indices of interior NAs */ for (t=t1; t<=dset->t2 && !err; t++) { for (i=1; i<dset->v; i++) { if (na(dset->Z[i][t])) { misslist = gretl_list_append_term(&misslist, t); if (misslist == NULL) { err = E_ALLOC; } break; } } } #if AINIT_DEBUG printlist(misslist, "arma_init_add_dummies: misslist"); #endif if (misslist != NULL) { /* For each observation with any missing values, add a specific dummy and zero out the missing data. */ int origv = dset->v; int j, v, nd = misslist[0]; err = dataset_add_series(dset, nd); if (!err) { for (i=1; i<=misslist[0]; i++) { v = origv + i - 1; t = misslist[i]; sprintf(dset->varname[v], "d%d", i); dset->Z[v][t] = 1.0; for (j=1; j<origv; j++) { if (na(dset->Z[j][t])) { dset->Z[j][t] = 0.0; } } } } } ainfo->misslist = misslist; return err; }