From 3a21788dd4f7a4f10d12a12e83c8890f857b5e98 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 18 Dec 2014 15:37:22 +0100 Subject: [PATCH] FACTOR: Added PROMAX rotation. --- doc/statistics.texi | 12 +- src/language/stats/factor.c | 313 +++++++++++++++++++++++++++++++-- tests/automake.mk | 3 +- tests/language/stats/factor.at | 143 ++++++++++++++- tests/language/stats/llz.zsav | Bin 0 -> 24245 bytes 5 files changed, 447 insertions(+), 24 deletions(-) create mode 100644 tests/language/stats/llz.zsav diff --git a/doc/statistics.texi b/doc/statistics.texi index 9cc49557ea..f17a9ece9c 100644 --- a/doc/statistics.texi +++ b/doc/statistics.texi @@ -684,7 +684,7 @@ FACTOR VARIABLES=@var{var_list} [ /EXTRACTION=@{PC, PAF@}] - [ /ROTATION=@{VARIMAX, EQUAMAX, QUARTIMAX, NOROTATE@}] + [ /ROTATION=@{VARIMAX, EQUAMAX, QUARTIMAX, PROMAX[(@var{k})], NOROTATE@}] [ /PRINT=[INITIAL] [EXTRACTION] [ROTATION] [UNIVARIATE] [CORRELATION] [COVARIANCE] [DET] [KMO] [SIG] [ALL] [DEFAULT] ] @@ -708,9 +708,13 @@ If @subcmd{PAF} is specified, then Principal Axis Factoring is used. By default Principal Components Analysis will be used. The @subcmd{/ROTATION} subcommand is used to specify the method by which the extracted solution will be rotated. -Three methods are available: @subcmd{VARIMAX} (which is the default), @subcmd{EQUAMAX}, and @subcmd{QUARTIMAX}. -If don't want any rotation to be performed, the word @subcmd{NOROTATE} will prevent the command from performing any -rotation on the data. Oblique rotations are not supported. +Three orthogonal rotation methods are available: +@subcmd{VARIMAX} (which is the default), @subcmd{EQUAMAX}, and @subcmd{QUARTIMAX}. +There is one oblique rotation method, @i{viz}: @subcmd{PROMAX}. +Optionally you may enter the power of the promax rotation @var{k}, which must be enclosed in parentheses. +The default value of @var{k} is 5. +If you don't want any rotation to be performed, the word @subcmd{NOROTATE} will prevent the command from performing any +rotation on the data. The @subcmd{/METHOD} subcommand should be used to determine whether the covariance matrix or the correlation matrix of the data is to be analysed. By default, the correlation matrix is analysed. diff --git a/src/language/stats/factor.c b/src/language/stats/factor.c index 4094a22b43..c3a7e8ee24 100644 --- a/src/language/stats/factor.c +++ b/src/language/stats/factor.c @@ -96,6 +96,7 @@ enum rotation_type ROT_VARIMAX = 0, ROT_EQUAMAX, ROT_QUARTIMAX, + ROT_PROMAX, ROT_NONE }; @@ -131,13 +132,65 @@ quartimax_coefficients (double *x, double *y, *y = c ; } -static const rotation_coefficients rotation_coeff[3] = { +static const rotation_coefficients rotation_coeff[] = { varimax_coefficients, equamax_coefficients, - quartimax_coefficients + quartimax_coefficients, + varimax_coefficients /* PROMAX is identical to VARIMAX */ }; +/* return diag (C'C) ^ {-0.5} */ +static gsl_matrix * +diag_rcp_sqrt (const gsl_matrix *C) +{ + int j; + gsl_matrix *d = gsl_matrix_calloc (C->size1, C->size2); + gsl_matrix *r = gsl_matrix_calloc (C->size1, C->size2); + + assert (C->size1 == C->size2); + + gsl_linalg_matmult_mod (C, GSL_LINALG_MOD_TRANSPOSE, + C, GSL_LINALG_MOD_NONE, + d); + + for (j = 0 ; j < d->size2; ++j) + { + double e = gsl_matrix_get (d, j, j); + e = 1.0 / sqrt (e); + gsl_matrix_set (r, j, j, e); + } + + gsl_matrix_free (d); + + return r; +} + + + +/* return diag ((C'C)^-1) ^ {-0.5} */ +static gsl_matrix * +diag_rcp_inv_sqrt (const gsl_matrix *CCinv) +{ + int j; + gsl_matrix *r = gsl_matrix_calloc (CCinv->size1, CCinv->size2); + + assert (CCinv->size1 == CCinv->size2); + + for (j = 0 ; j < CCinv->size2; ++j) + { + double e = gsl_matrix_get (CCinv, j, j); + e = 1.0 / sqrt (e); + gsl_matrix_set (r, j, j, e); + } + + return r; +} + + + + + struct cmd_factor { size_t n_vars; @@ -153,6 +206,7 @@ struct cmd_factor enum plot_opts plot; enum rotation_type rotation; int rotation_iterations; + int promax_power; /* Extraction Criteria */ int n_factors; @@ -262,7 +316,7 @@ ssq_od_n (const gsl_matrix *m, int n) -#if 0 +#if 1 static void dump_matrix (const gsl_matrix *m) { @@ -622,7 +676,9 @@ static void rotate (const struct cmd_factor *cf, const gsl_matrix *unrot, const gsl_vector *communalities, gsl_matrix *result, - gsl_vector *rotated_loadings + gsl_vector *rotated_loadings, + gsl_matrix *pattern_matrix, + gsl_matrix *factor_correlation_matrix ) { int j, k; @@ -731,6 +787,125 @@ rotate (const struct cmd_factor *cf, const gsl_matrix *unrot, gsl_matrix_free (h_sqrt); gsl_matrix_free (normalised); + if (cf->rotation == ROT_PROMAX) + { + /* general purpose m by m matrix, where m is the number of factors */ + gsl_matrix *mm1 = gsl_matrix_calloc (unrot->size2, unrot->size2); + gsl_matrix *mm2 = gsl_matrix_calloc (unrot->size2, unrot->size2); + + /* general purpose m by p matrix, where p is the number of variables */ + gsl_matrix *mp1 = gsl_matrix_calloc (unrot->size2, unrot->size1); + + gsl_matrix *pm1 = gsl_matrix_calloc (unrot->size1, unrot->size2); + + gsl_permutation *perm = gsl_permutation_alloc (unrot->size2); + + int signum; + + int i, j; + + /* The following variables follow the notation by SPSS Statistical Algorithms + page 342 */ + gsl_matrix *L = gsl_matrix_calloc (unrot->size2, unrot->size2); + gsl_matrix *P = clone_matrix (result); + gsl_matrix *D ; + gsl_matrix *Q ; + + + /* Vector of length p containing (indexed by i) + \Sum^m_j {\lambda^2_{ij}} */ + gsl_vector *rssq = gsl_vector_calloc (unrot->size1); + + for (i = 0; i < P->size1; ++i) + { + double sum = 0; + for (j = 0; j < P->size2; ++j) + { + sum += gsl_matrix_get (result, i, j) + * gsl_matrix_get (result, i, j); + + } + + gsl_vector_set (rssq, i, sqrt (sum)); + } + + for (i = 0; i < P->size1; ++i) + { + for (j = 0; j < P->size2; ++j) + { + double l = gsl_matrix_get (result, i, j); + double r = gsl_vector_get (rssq, i); + gsl_matrix_set (P, i, j, pow (fabs (l / r), cf->promax_power + 1) * r / l); + } + } + + gsl_vector_free (rssq); + + gsl_linalg_matmult_mod (result, + GSL_LINALG_MOD_TRANSPOSE, + result, + GSL_LINALG_MOD_NONE, + mm1); + + gsl_linalg_LU_decomp (mm1, perm, &signum); + gsl_linalg_LU_invert (mm1, perm, mm2); + + gsl_linalg_matmult_mod (mm2, GSL_LINALG_MOD_NONE, + result, GSL_LINALG_MOD_TRANSPOSE, + mp1); + + gsl_linalg_matmult_mod (mp1, GSL_LINALG_MOD_NONE, + P, GSL_LINALG_MOD_NONE, + L); + + D = diag_rcp_sqrt (L); + Q = gsl_matrix_calloc (unrot->size2, unrot->size2); + + gsl_linalg_matmult_mod (L, GSL_LINALG_MOD_NONE, + D, GSL_LINALG_MOD_NONE, + Q); + + gsl_matrix *QQinv = gsl_matrix_calloc (unrot->size2, unrot->size2); + + gsl_linalg_matmult_mod (Q, GSL_LINALG_MOD_TRANSPOSE, + Q, GSL_LINALG_MOD_NONE, + QQinv); + + gsl_linalg_cholesky_decomp (QQinv); + gsl_linalg_cholesky_invert (QQinv); + + + gsl_matrix *C = diag_rcp_inv_sqrt (QQinv); + gsl_matrix *Cinv = clone_matrix (C); + + gsl_linalg_cholesky_decomp (Cinv); + gsl_linalg_cholesky_invert (Cinv); + + + gsl_linalg_matmult_mod (result, GSL_LINALG_MOD_NONE, + Q, GSL_LINALG_MOD_NONE, + pm1); + + gsl_linalg_matmult_mod (pm1, GSL_LINALG_MOD_NONE, + Cinv, GSL_LINALG_MOD_NONE, + pattern_matrix); + + + gsl_linalg_matmult_mod (C, GSL_LINALG_MOD_NONE, + QQinv, GSL_LINALG_MOD_NONE, + mm1); + + gsl_linalg_matmult_mod (mm1, GSL_LINALG_MOD_NONE, + C, GSL_LINALG_MOD_TRANSPOSE, + factor_correlation_matrix); + + gsl_linalg_matmult_mod (pattern_matrix, GSL_LINALG_MOD_NONE, + factor_correlation_matrix, GSL_LINALG_MOD_NONE, + pm1); + + gsl_matrix_memcpy (result, pm1); + } + /* reflect negative sums and populate the rotated loadings vector*/ for (i = 0 ; i < result->size2; ++i) @@ -741,7 +916,7 @@ rotate (const struct cmd_factor *cf, const gsl_matrix *unrot, { double s = gsl_matrix_get (result, j, i); ssq += s * s; - sum += gsl_matrix_get (result, j, i); + sum += s; } gsl_vector_set (rotated_loadings, i, ssq); @@ -918,6 +1093,18 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) { factor.rotation = ROT_QUARTIMAX; } + else if (lex_match_id (lexer, "PROMAX")) + { + factor.promax_power = 5; + if (lex_match (lexer, T_LPAREN)) + { + lex_force_int (lexer); + factor.promax_power = lex_integer (lexer); + lex_get (lexer); + lex_force_match (lexer, T_RPAREN); + } + factor.rotation = ROT_PROMAX; + } else if (lex_match_id (lexer, "NOROTATE")) { factor.rotation = ROT_NONE; @@ -1337,6 +1524,7 @@ static void show_factor_matrix (const struct cmd_factor *factor, struct idata *idata, const char *title, const gsl_matrix *fm) { int i; + const int n_factors = idata->n_extractions; const int heading_columns = 1; @@ -1456,7 +1644,9 @@ show_explained_variance (const struct cmd_factor * factor, struct idata *idata, nc += 3; if (factor->print & PRINT_ROTATION) - nc += 3; + { + nc += factor->rotation == ROT_PROMAX ? 1 : 3; + } /* No point having a table with only headings */ if ( nc <= heading_columns) @@ -1508,18 +1698,23 @@ show_explained_variance (const struct cmd_factor * factor, struct idata *idata, if (factor->print & PRINT_ROTATION) { - tab_joint_text (t, c, 0, c + 2, 0, TAB_CENTER | TAT_TITLE, _("Rotation Sums of Squared Loadings")); - c += 3; + const int width = factor->rotation == ROT_PROMAX ? 0 : 2; + tab_joint_text (t, c, 0, c + width, 0, TAB_CENTER | TAT_TITLE, _("Rotation Sums of Squared Loadings")); + c += width + 1; } - for (i = 0; i < (nc - heading_columns) / 3 ; ++i) + for (i = 0; i < (nc - heading_columns + 2) / 3 ; ++i) { tab_text (t, i * 3 + 1, 1, TAB_CENTER | TAT_TITLE, _("Total")); + + tab_vline (t, TAL_2, heading_columns + i * 3, 0, nr - 1); + + if (i == 2 && factor->rotation == ROT_PROMAX) + continue; + /* xgettext:no-c-format */ tab_text (t, i * 3 + 2, 1, TAB_CENTER | TAT_TITLE, _("% of Variance")); tab_text (t, i * 3 + 3, 1, TAB_CENTER | TAT_TITLE, _("Cumulative %")); - - tab_vline (t, TAL_2, heading_columns + i * 3, 0, nr - 1); } for (i = 0 ; i < initial_eigenvalues->size; ++i) @@ -1580,8 +1775,11 @@ show_explained_variance (const struct cmd_factor * factor, struct idata *idata, { r_cum += r_percent; tab_double (t, c++, i + heading_rows, 0, r_lambda, NULL, RC_OTHER); - tab_double (t, c++, i + heading_rows, 0, r_percent, NULL, RC_OTHER); - tab_double (t, c++, i + heading_rows, 0, r_cum, NULL, RC_OTHER); + if (factor->rotation != ROT_PROMAX) + { + tab_double (t, c++, i + heading_rows, 0, r_percent, NULL, RC_OTHER); + tab_double (t, c++, i + heading_rows, 0, r_cum, NULL, RC_OTHER); + } } } } @@ -1591,6 +1789,67 @@ show_explained_variance (const struct cmd_factor * factor, struct idata *idata, } +static void +show_factor_correlation (const struct cmd_factor * factor, const gsl_matrix *fcm) +{ + size_t i, j; + const int heading_columns = 1; + const int heading_rows = 1; + const int nr = heading_rows + fcm->size2; + const int nc = heading_columns + fcm->size1; + struct tab_table *t = tab_create (nc, nr); + + tab_title (t, _("Factor Correlation Matrix")); + + tab_headers (t, heading_columns, 0, heading_rows, 0); + + /* Outline the box */ + tab_box (t, + TAL_2, TAL_2, + -1, -1, + 0, 0, + nc - 1, nr - 1); + + /* Vertical lines */ + tab_box (t, + -1, -1, + -1, TAL_1, + heading_columns, 0, + nc - 1, nr - 1); + + tab_hline (t, TAL_1, 0, nc - 1, heading_rows); + tab_hline (t, TAL_1, 1, nc - 1, 1); + + tab_vline (t, TAL_2, heading_columns, 0, nr - 1); + + + if ( factor->extraction == EXTRACTION_PC) + tab_text (t, 0, 0, TAB_LEFT | TAT_TITLE, _("Component")); + else + tab_text (t, 0, 0, TAB_LEFT | TAT_TITLE, _("Factor")); + + for (i = 0 ; i < fcm->size1; ++i) + { + tab_text_format (t, heading_columns + i, 0, TAB_CENTER | TAT_TITLE, _("%d"), i + 1); + } + + for (i = 0 ; i < fcm->size2; ++i) + { + tab_text_format (t, 0, heading_rows + i, TAB_CENTER | TAT_TITLE, _("%d"), i + 1); + } + + + for (i = 0 ; i < fcm->size1; ++i) + { + for (j = 0 ; j < fcm->size2; ++j) + tab_double (t, heading_columns + i, heading_rows +j, 0, + gsl_matrix_get (fcm, i, j), NULL, RC_OTHER); + } + + tab_submit (t); +} + + static void show_correlation_matrix (const struct cmd_factor *factor, const struct idata *idata) { @@ -1938,6 +2197,8 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) { gsl_matrix *rotated_factors = NULL; + gsl_matrix *pattern_matrix = NULL; + gsl_matrix *fcm = NULL; gsl_vector *rotated_loadings = NULL; const gsl_vector *extracted_eigenvalues = NULL; @@ -2004,10 +2265,16 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) { rotated_factors = gsl_matrix_calloc (factor_matrix->size1, factor_matrix->size2); rotated_loadings = gsl_vector_calloc (factor_matrix->size2); + if (factor->rotation == ROT_PROMAX) + { + pattern_matrix = gsl_matrix_calloc (factor_matrix->size1, factor_matrix->size2); + fcm = gsl_matrix_calloc (factor_matrix->size2, factor_matrix->size2); + } + - rotate (factor, factor_matrix, extracted_communalities, rotated_factors, rotated_loadings); + rotate (factor, factor_matrix, extracted_communalities, rotated_factors, rotated_loadings, pattern_matrix, fcm); } - + show_explained_variance (factor, idata, idata->eval, extracted_eigenvalues, rotated_loadings); factor_matrix_workspace_free (fmw); @@ -2018,16 +2285,27 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) factor->extraction == EXTRACTION_PC ? _("Component Matrix") : _("Factor Matrix"), factor_matrix); + if ( factor->rotation == ROT_PROMAX) + { + show_factor_matrix (factor, idata, _("Pattern Matrix"), pattern_matrix); + gsl_matrix_free (pattern_matrix); + } + if ( factor->rotation != ROT_NONE) { show_factor_matrix (factor, idata, - factor->extraction == EXTRACTION_PC ? _("Rotated Component Matrix") : _("Rotated Factor Matrix"), + (factor->rotation == ROT_PROMAX) ? _("Structure Matrix") : + (factor->extraction == EXTRACTION_PC ? _("Rotated Component Matrix") : _("Rotated Factor Matrix")), rotated_factors); gsl_matrix_free (rotated_factors); } - + if ( factor->rotation == ROT_PROMAX) + { + show_factor_correlation (factor, fcm); + gsl_matrix_free (fcm); + } gsl_matrix_free (factor_matrix); gsl_vector_free (rotated_loadings); @@ -2043,4 +2321,3 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) } - diff --git a/tests/automake.mk b/tests/automake.mk index 661bfbb9a5..31a7877d07 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -239,7 +239,8 @@ EXTRA_DIST += \ tests/data/v14.sav \ tests/language/data-io/Book1.gnm.unzipped \ tests/language/data-io/test.ods \ - tests/language/data-io/newone.ods + tests/language/data-io/newone.ods \ + tests/language/stats/llz.zsav CLEANFILES += *.save pspp.* foo* diff --git a/tests/language/stats/factor.at b/tests/language/stats/factor.at index e90e862f9a..59acba9d48 100644 --- a/tests/language/stats/factor.at +++ b/tests/language/stats/factor.at @@ -1921,4 +1921,145 @@ x,.990 y,.808 z,.723 ]) -AT_CLEANUP \ No newline at end of file +AT_CLEANUP + + +AT_SETUP([FACTOR promax]) +AT_DATA([factor-promax.sps], [dnl +set decimal=dot. +set format=F22.3. + +get file='llz.zsav'. + +factor + /variables pz pn ps nz nn ns tz tn ts oz on os sz sn ss zz zn zs + /missing listwise + /print initial extraction rotation + /criteria mineigen(1) iterate(25) + /extraction paf + /method correlation + /rotation promax (5). +]) + +AT_CHECK([ln -s $top_srcdir/tests/language/stats/llz.zsav .], [0], [ignore]) + +AT_CHECK([pspp -O format=csv factor-promax.sps], [0], [dnl +Table: Communalities +,Initial,Extraction +PZ,.191,.375 +PN,.042,.102 +PS,.458,.623 +NZ,.100,.163 +NN,.065,.079 +NS,.129,.148 +TZ,.181,.344 +TN,.102,.142 +TS,.310,.372 +OZ,.097,.158 +ON,.323,.410 +OS,.469,.617 +SZ,.104,.170 +SN,.154,.267 +SS,.081,.180 +ZZ,.123,.192 +ZN,.208,.412 +ZS,.130,.158 + +Table: Total Variance Explained +,Initial Eigenvalues,,,Extraction Sums of Squared Loadings,,,Rotation Sums of Squared Loadings +Factor,Total,% of Variance,Cumulative %,Total,% of Variance,Cumulative %,Total +1,2.968,16.491,16.491,2.411,13.393,13.393,2.355 +2,2.026,11.253,27.744,1.271,7.059,20.452,1.209 +3,1.622,9.011,36.756,.948,5.264,25.716,1.231 +4,1.086,6.032,42.788,.283,1.574,27.290,.770 +5,.996,5.533,48.321,,,, +6,.923,5.130,53.451,,,, +7,.873,4.852,58.303,,,, +8,.856,4.756,63.060,,,, +9,.836,4.644,67.703,,,, +10,.816,4.534,72.237,,,, +11,.785,4.359,76.596,,,, +12,.740,4.110,80.706,,,, +13,.713,3.964,84.670,,,, +14,.653,3.626,88.296,,,, +15,.633,3.519,91.815,,,, +16,.604,3.356,95.171,,,, +17,.484,2.687,97.858,,,, +18,.386,2.142,100.000,,,, + +Table: Factor Matrix +,Factor,,, +,1,2,3,4 +PZ,-.276,.154,.510,.124 +PN,.096,.129,-.091,.261 +PS,.746,-.085,.234,.063 +NZ,-.111,.323,.206,-.058 +NN,.007,.260,-.083,-.069 +NS,.366,.096,.046,.051 +TZ,-.228,.172,.509,.059 +TN,.131,.345,-.074,.029 +TS,.601,-.005,.098,.030 +OZ,-.145,.166,.322,-.081 +ON,.607,.082,.073,-.173 +OS,.757,-.059,.171,-.104 +SZ,-.142,.307,.226,-.066 +SN,.175,.436,-.183,.115 +SS,.199,.206,-.083,.302 +ZZ,-.074,.411,-.080,-.104 +ZN,.015,.580,-.252,-.114 +ZS,.365,.156,-.004,.015 + +Table: Pattern Matrix +,Factor,,, +,1,2,3,4 +PZ,-.063,-.126,.599,.085 +PN,-.035,.000,-.033,.325 +PS,.762,-.175,.058,.081 +NZ,.027,.230,.327,-.044 +NN,.008,.289,.008,-.026 +NS,.344,.044,.015,.091 +TZ,.004,-.074,.589,.020 +TN,.097,.307,.033,.103 +TS,.585,-.043,-.017,.062 +OZ,.046,.067,.382,-.109 +ON,.654,.151,-.029,-.145 +OS,.803,-.037,-.009,-.092 +SZ,.009,.213,.345,-.060 +SN,.065,.376,-.036,.227 +SS,.054,.042,-.013,.388 +ZZ,-.044,.434,.078,-.046 +ZN,-.025,.646,-.041,-.006 +ZS,.337,.133,-.013,.067 + +Table: Structure Matrix +,Factor,,, +,1,2,3,4 +PZ,-.177,-.058,.598,-.022 +PN,.068,.110,-.049,.317 +PS,.771,-.138,-.136,.240 +NZ,-.060,.236,.339,.019 +NN,.000,.281,.027,.076 +NS,.368,.080,-.068,.207 +TZ,-.127,-.028,.582,-.049 +TN,.122,.345,.023,.235 +TS,.607,-.018,-.160,.221 +OZ,-.074,.055,.384,-.101 +ON,.619,.104,-.160,.102 +OS,.778,-.064,-.190,.132 +SZ,-.086,.215,.361,-.009 +SN,.143,.453,-.044,.380 +SS,.171,.176,-.052,.420 +ZZ,-.073,.422,.120,.085 +ZN,-.013,.641,.008,.214 +ZS,.361,.158,-.088,.213 + +Table: Factor Correlation Matrix +Factor,1,2,3,4 +1,1.000,.008,-.232,.294 +2,.008,1.000,.065,.347 +3,-.232,.065,1.000,-.076 +4,.294,.347,-.076,1.000 +]) + + +AT_CLEANUP diff --git a/tests/language/stats/llz.zsav b/tests/language/stats/llz.zsav new file mode 100644 index 0000000000000000000000000000000000000000..4477cb88c1af4dd1c679057531021ed614ac7484 GIT binary patch literal 24245 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 b{sjO40000076t$S00000U`PP~Z&&~TE?M`( literal 0 HcmV?d00001 -- 2.30.2