/* nag_mv_fac_score (g03ccc) Example Program. * * Copyright 1998 Numerical Algorithms Group. * * Mark 5, 1998. * Mark 8 revised, 2004. * */ #include #include #include #include #include #include #include #include #define FL(I, J) fl[(I) *tdfl + J] #define FS(I, J) fs[(I) *tdfs + J] #define R(I, J) r[(I) *tdr + J] #define X(I, J) x[(I) *tdx + J] int main(int argc, char *argv[]) { FILE *fpin, *fpout; char *outfile = 0; Integer exit_status = 0, i, *isx = 0, j, m, n, nfac, nvar, tdfl, tdfs, tdr; Integer tdx; NagError fail; Nag_E04_Opt options; Nag_FacMat matrix; Nag_FacScoreMethod method; Nag_Boolean weight; char nag_enum_arg[40]; double *com = 0, *e = 0, eps, *fl = 0, *fs = 0, *psi = 0, *r = 0; double *stat = 0, *wt = 0, *wtptr = 0, *x = 0; INIT_FAIL(fail); /* Check for command-line IO options */ fpin = nag_example_file_io(argc, argv, "-data", NULL); fpout = nag_example_file_io(argc, argv, "-results", NULL); (void) nag_example_file_io(argc, argv, "-nag_write", &outfile); if (!outfile) { outfile = NAG_ALLOC(7, char); strcpy(outfile, "stdout"); } fprintf(fpout, "nag_mv_fac_score (g03ccc) Example Program Results\n\n"); /* Skip headings in data file */ fscanf(fpin, "%*[^\n]"); fscanf(fpin, "%s", nag_enum_arg); /* nag_enum_name_to_value(x04nac). * Converts NAG enum member name to value */ matrix = (Nag_FacMat) nag_enum_name_to_value(nag_enum_arg); fscanf(fpin, "%s", nag_enum_arg); weight = (Nag_Boolean) nag_enum_name_to_value(nag_enum_arg); fscanf(fpin, "%ld", &n); fscanf(fpin, "%ld", &m); fscanf(fpin, "%ld", &nvar); fscanf(fpin, "%ld", &nfac); if (nvar >= 2 && m >= nvar && n > nvar && nvar >= nfac) { if (!(com = NAG_ALLOC(nvar, double)) || !(e = NAG_ALLOC(nvar, double)) || !(fl = NAG_ALLOC(nvar*nfac, double)) || !(fs = NAG_ALLOC(nvar*nfac, double)) || !(psi = NAG_ALLOC(nvar, double)) || !(r = NAG_ALLOC(m*m, double)) || !(stat = NAG_ALLOC(4, double)) || !(wt = NAG_ALLOC(n, double)) || !(x = NAG_ALLOC((matrix == Nag_MatCorr_Covar?m:n)*m, double)) || !(isx = NAG_ALLOC(m, Integer))) { fprintf(fpout, "Allocation failure\n"); exit_status = -1; goto END; } tdfl = nfac; tdfs = nfac; tdr = m; tdx = m; } else { fprintf(fpout, "Invalid nvar or m or n.\n"); exit_status = 1; return exit_status; } if (matrix == Nag_MatCorr_Covar) { for (i = 0; i < m; ++i) { for (j = 0; j < m; ++j) fscanf(fpin, "%lf", &X(i, j)); } } else { if (weight) { for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) fscanf(fpin, "%lf", &X(i, j)); fscanf(fpin, "%lf", &wt[i]); } wtptr = wt; } else { for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) fscanf(fpin, "%lf", &X(i, j)); } } } for (j = 0; j < m; ++j) fscanf(fpin, "%ld", &isx[j]); /* nag_opt_init (e04xxc). * Initialization function for option setting */ nag_opt_init(&options); options.max_iter = 500; options.optim_tol = 1e-3; strcpy(options.outfile, outfile); eps = 1e-5; /* nag_mv_factor (g03cac). * Maximum likelihood estimates of parameters */ if (strcmp(outfile, "stdout")) fclose(fpout); nag_mv_factor(matrix, n, m, x, tdx, nvar, isx, nfac, wtptr, e, stat, com, psi, r, fl, tdfl, &options, eps, &fail); if (strcmp(outfile, "stdout")) { fpout = fopen(outfile, "a"); } if (fail.code != NE_NOERROR) { fprintf(fpout, "Error from nag_mv_factor (g03cac).\n%s\n", fail.message); exit_status = 1; goto END; } fprintf(fpout, "\nLoadings, Communalities and PSI\n\n"); for (i = 0; i < nvar; ++i) { for (j = 0; j < nfac; ++j) fprintf(fpout, " %8.3f", FL(i, j)); fprintf(fpout, "%8.3f%8.3f\n", com[i], psi[i]); } fscanf(fpin, "%s", nag_enum_arg); method = (Nag_FacScoreMethod) nag_enum_name_to_value(nag_enum_arg); /* nag_mv_fac_score (g03ccc). * Factor score coefficients, following nag_mv_factor * (g03cac) */ nag_mv_fac_score(method, Nag_FacNoRotate, nvar, nfac, fl, tdfl, psi, e, r, tdr, fs, tdfs, &fail); if (fail.code != NE_NOERROR) { fprintf(fpout, "Error from nag_mv_fac_score (g03ccc).\n%s\n", fail.message); exit_status = 1; goto END; } fprintf(fpout, "\nFactor score coefficients\n\n"); for (i = 0; i < nvar; ++i) { for (j = 0; j < nfac; ++j) fprintf(fpout, " %8.3f", FS(i, j)); fprintf(fpout, "\n"); } END: if (fpin != stdin) fclose(fpin); if (fpout != stdout) fclose(fpout); if (com) NAG_FREE(com); if (e) NAG_FREE(e); if (fl) NAG_FREE(fl); if (fs) NAG_FREE(fs); if (psi) NAG_FREE(psi); if (r) NAG_FREE(r); if (stat) NAG_FREE(stat); if (wt) NAG_FREE(wt); if (x) NAG_FREE(x); if (isx) NAG_FREE(isx); if (outfile) NAG_FREE(outfile); return exit_status; }