Covariance matrix interface change.
[pspp] / src / language / stats / correlations.c
index 69d91d03c2b56bb9bc71f8c5e1294db4587416fa..6af8ba32ffd54cc32f8e84baa8f77ee0192eee1d 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <libpspp/assertion.h>
 #include <math/covariance.h>
-#include <math/design-matrix.h>
+#include <math/correlation.h>
 #include <gsl/gsl_matrix.h>
 #include <data/casegrouper.h>
 #include <data/casereader.h>
@@ -29,8 +29,7 @@
 #include <language/dictionary/split-file.h>
 #include <language/lexer/lexer.h>
 #include <language/lexer/variable-parser.h>
-#include <output/manager.h>
-#include <output/table.h>
+#include <output/tab.h>
 #include <libpspp/message.h>
 #include <data/format.h>
 #include <math/moments.h>
 #define N_(msgid) msgid
 
 
-static double
-significance_of_correlation (double rho, double w)
-{
-  double t = w - 2;
-  t /= 1 - MIN (1, pow2 (rho));
-  t = sqrt (t);
-  t *= rho;
-  
-  if (t > 0)
-    return  gsl_cdf_tdist_Q (t, w - 2);
-  else
-    return  gsl_cdf_tdist_P (t, w - 2);
-}
-
-
 struct corr
 {
   size_t n_vars_total;
@@ -108,9 +92,8 @@ output_descriptives (const struct corr *corr, const gsl_matrix *means,
   const int heading_columns = 1;
   const int heading_rows = 1;
 
-  struct tab_table *t = tab_create (nc, nr, 0);
+  struct tab_table *t = tab_create (nc, nr);
   tab_title (t, _("Descriptive Statistics"));
-  tab_dim (t, tab_natural_dimensions, NULL);
 
   tab_headers (t, heading_columns, 0, heading_rows, 0);
 
@@ -203,9 +186,8 @@ output_correlation (const struct corr *corr, const struct corr_opts *opts,
   /* One header row */
   nr += heading_rows;
 
-  t = tab_create (nc, nr, 0);
+  t = tab_create (nc, nr);
   tab_title (t, _("Correlations"));
-  tab_dim (t, tab_natural_dimensions, NULL);
 
   tab_headers (t, heading_columns, 0, heading_rows, 0);
 
@@ -291,32 +273,6 @@ output_correlation (const struct corr *corr, const struct corr_opts *opts,
 }
 
 
-static gsl_matrix *
-correlation_from_covariance (const gsl_matrix *cv, const gsl_matrix *v)
-{
-  size_t i, j;
-  gsl_matrix *corr = gsl_matrix_calloc (cv->size1, cv->size2);
-  
-  for (i = 0 ; i < cv->size1; ++i)
-    {
-      for (j = 0 ; j < cv->size2; ++j)
-       {
-         double rho = gsl_matrix_get (cv, i, j);
-         
-         rho /= sqrt (gsl_matrix_get (v, i, j))
-           * 
-           sqrt (gsl_matrix_get (v, j, i));
-         
-         gsl_matrix_set (corr, i, j, rho);
-       }
-    }
-  
-  return corr;
-}
-
-
-
-
 static void
 run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr *corr)
 {
@@ -324,16 +280,25 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
   const gsl_matrix *var_matrix,  *samples_matrix, *mean_matrix;
   const gsl_matrix *cov_matrix;
   gsl_matrix *corr_matrix;
-  struct covariance *cov = covariance_create (corr->n_vars_total, corr->vars,
-                                             opts->wv, opts->exclude);
+  struct covariance *cov = covariance_2pass_create (corr->n_vars_total, corr->vars,
+                                                   NULL,
+                                                   opts->wv, opts->exclude);
 
+  struct casereader *rc = casereader_clone (r);
   for ( ; (c = casereader_read (r) ); case_unref (c))
     {
-      covariance_accumulate (cov, c);
+      covariance_accumulate_pass1 (cov, c);
+    }
+
+  for ( ; (c = casereader_read (rc) ); case_unref (c))
+    {
+      covariance_accumulate_pass2 (cov, c);
     }
 
   cov_matrix = covariance_calculate (cov);
 
+  casereader_destroy (rc);
+
   samples_matrix = covariance_moments (cov, MOMENT_NONE);
   var_matrix = covariance_moments (cov, MOMENT_VARIANCE);
   mean_matrix = covariance_moments (cov, MOMENT_MEAN);
@@ -432,8 +397,11 @@ cmd_correlation (struct lexer *lexer, struct dataset *ds)
                opts.statistics = STATS_DESCRIPTIVES;
              else if (lex_match_id (lexer, "XPROD"))
                opts.statistics = STATS_XPROD;
-             else if (lex_match_id (lexer, "ALL"))
-               opts.statistics = STATS_ALL;
+             else if (lex_token (lexer) == T_ALL)
+               {
+                 opts.statistics = STATS_ALL;
+                 lex_get (lexer);
+               }
              else 
                {
                  lex_error (lexer, NULL);
@@ -530,10 +498,13 @@ cmd_correlation (struct lexer *lexer, struct dataset *ds)
 
 
   /* Done. */
+  free (corr->vars);
   free (corr);
+
   return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE;
 
  error:
+  free (corr->vars);
   free (corr);
   return CMD_FAILURE;
 }