CORRELATIONS: Fixed bug displaying non-sqaure correlation matrices 20120608060502/pspp 20120610000508/pspp 20120611000503/pspp 20120612000502/pspp 20120613000503/pspp 20120614000503/pspp 20120615000509/pspp
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 7 Jun 2012 19:20:22 +0000 (21:20 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 7 Jun 2012 19:20:22 +0000 (21:20 +0200)
When CORRELATIONS was run using the WITH keyword, the wrong index
was calculated for the columns/rows - hence the program crashed.
This change fixes that.

Reported-by: Ebel Magnin
src/language/stats/correlations.c
tests/language/stats/correlations.at

index bc6508bd2f1863be967eec13fb3aed6a1c81a308..b5495c7bb0782f40fcefd68adc0f0cd9a199b136 100644 (file)
@@ -207,6 +207,7 @@ output_correlation (const struct corr *corr, const struct corr_opts *opts,
           nc - 1, nr - 1);
 
   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
+
   tab_vline (t, TAL_1, 1, heading_rows, nr - 1);
 
   for (r = 0 ; r < corr->n_vars1 ; ++r)
@@ -232,7 +233,8 @@ output_correlation (const struct corr *corr, const struct corr_opts *opts,
 
   for (c = 0 ; c < matrix_cols ; ++c)
     {
-      const struct variable *v = corr->n_vars_total > corr->n_vars1 ? corr->vars[corr->n_vars_total - corr->n_vars1 + c] : corr->vars[c];
+      const struct variable *v = corr->n_vars_total > corr->n_vars1 ?
+       corr->vars[corr->n_vars_total - corr->n_vars1 - 1 + c] : corr->vars[c];
       tab_text (t, heading_columns + c, 0, TAB_LEFT | TAT_TITLE, var_to_string (v));      
     }
 
@@ -242,7 +244,9 @@ output_correlation (const struct corr *corr, const struct corr_opts *opts,
       for (c = 0 ; c < matrix_cols ; ++c)
        {
          unsigned char flags = 0; 
-         const int col_index = corr->n_vars_total - corr->n_vars1 + c;
+         const int col_index = corr->n_vars_total > corr->n_vars1 ? 
+           corr->n_vars_total - corr->n_vars1 - 1  + c : 
+           c;
          double pearson = gsl_matrix_get (cm, r, col_index);
          double w = gsl_matrix_get (samples, r, col_index);
          double sig = opts->tails * significance_of_correlation (pearson, w);
@@ -309,10 +313,8 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
   if ( opts->statistics & STATS_DESCRIPTIVES) 
     output_descriptives (corr, mean_matrix, var_matrix, samples_matrix);
 
-  output_correlation (corr, opts,
-                     corr_matrix,
-                     samples_matrix,
-                     cov_matrix);
+  output_correlation (corr, opts, corr_matrix,
+                     samples_matrix, cov_matrix);
 
   covariance_destroy (cov);
   gsl_matrix_free (corr_matrix);
index f31d0593fd40db5e0a4645ab8719a32003cc6914..599db3df28f45a8ebd3de7c538154ad0fa70bdf4 100644 (file)
@@ -116,3 +116,32 @@ AT_CHECK([pspp -O format=csv correlations1.sps], [0], [stdout])
 mv stdout expout
 AT_CHECK([pspp -O format=csv correlations2.sps], [0], [expout])
 AT_CLEANUP
+
+
+AT_SETUP([CORRELATIONS -- non-square])
+AT_DATA([corr-ns.sps], [dnl
+set format = F11.3.
+data list notable list /foo * bar * wiz *.
+begin data.
+1 1 6
+2 2 5 
+3 3 4
+4 4 3
+5 5 2
+6 6 1
+end data.
+
+correlations 
+       variables = foo with bar wiz
+       .
+])
+
+AT_CHECK([pspp -O format=csv corr-ns.sps], [0], [dnl
+Table: Correlations
+,,bar,wiz
+foo,Pearson Correlation,1.000,-1.000
+,Sig. (2-tailed),,.000
+,N,6,6
+])
+
+AT_CLEANUP
\ No newline at end of file