Fixed bug reporting the significance of paired value t-test.
[pspp-builds.git] / src / language / stats / t-test.q
index bc0240b5f8ad88cb7deb0feebb255bb47d35c572..c69a6cdb5bc5adb552afedbc209030d6ada3b12b 100644 (file)
@@ -43,6 +43,7 @@
 #include <math/levene.h>
 #include <output/manager.h>
 #include <output/table.h>
+#include <data/format.h>
 
 #include "xalloc.h"
 
@@ -152,7 +153,8 @@ static int parse_value (struct lexer *lexer, union value * v, enum val_type);
 /* Structures and Functions for the Statistics Summary Box */
 struct ssbox;
 typedef void populate_ssbox_func (struct ssbox *ssb,
-                                           struct cmd_t_test *cmd);
+                                 const struct dictionary *,
+                                 struct cmd_t_test *cmd);
 typedef void finalize_ssbox_func (struct ssbox *ssb);
 
 struct ssbox
@@ -168,21 +170,23 @@ struct ssbox
 void ssbox_create (struct ssbox *ssb,   struct cmd_t_test *cmd, int mode);
 
 /* Populate a ssbox according to cmd */
-void ssbox_populate (struct ssbox *ssb, struct cmd_t_test *cmd);
+void ssbox_populate (struct ssbox *ssb, const struct dictionary *dict,
+                    struct cmd_t_test *cmd);
 
 /* Submit and destroy a ssbox */
 void ssbox_finalize (struct ssbox *ssb);
 
 /* A function to create, populate and submit the Paired Samples Correlation
    box */
-void pscbox (void);
+static void pscbox (const struct dictionary *);
 
 
 /* Structures and Functions for the Test Results Box */
 struct trbox;
 
 typedef void populate_trbox_func (struct trbox *trb,
-                                struct cmd_t_test *cmd);
+                                 const struct dictionary *dict,
+                                 struct cmd_t_test *cmd);
 typedef void finalize_trbox_func (struct trbox *trb);
 
 struct trbox {
@@ -195,7 +199,8 @@ struct trbox {
 void trbox_create (struct trbox *trb,   struct cmd_t_test *cmd, int mode);
 
 /* Populate a ssbox according to cmd */
-void trbox_populate (struct trbox *trb, struct cmd_t_test *cmd);
+static void trbox_populate (struct trbox *trb, const struct dictionary *dict,
+                    struct cmd_t_test *cmd);
 
 /* Submit and destroy a ssbox */
 void trbox_finalize (struct trbox *trb);
@@ -362,7 +367,8 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
 }
 
 static int
-tts_custom_groups (struct lexer *lexer, struct dataset *ds, struct cmd_t_test *cmd UNUSED, void *aux UNUSED)
+tts_custom_groups (struct lexer *lexer, struct dataset *ds, struct cmd_t_test *cmd UNUSED, 
+       void *aux UNUSED)
 {
   int n_group_values=0;
 
@@ -435,6 +441,15 @@ tts_custom_groups (struct lexer *lexer, struct dataset *ds, struct cmd_t_test *c
     gp.criterion = CMP_LE ;
 
 
+  if ( var_is_alpha (indep_var))
+    {
+      buf_copy_rpad (gp.v.g_value [0].s, var_get_width (indep_var),
+                    gp.v.g_value [0].s, strlen (gp.v.g_value[0].s));
+
+      buf_copy_rpad (gp.v.g_value [1].s, var_get_width (indep_var),
+                    gp.v.g_value [1].s, strlen (gp.v.g_value[1].s));
+    }
+
   return 1;
 }
 
@@ -577,6 +592,7 @@ parse_value (struct lexer *lexer, union value * v, enum val_type type)
     {
       if (!lex_force_string (lexer))
        return 0;
+      memset  (v->s, ' ', MAX_SHORT_STRING);
       strncpy (v->s, ds_cstr (lex_tokstr (lexer)), ds_length (lex_tokstr (lexer)));
     }
 
@@ -626,9 +642,10 @@ ssbox_create (struct ssbox *ssb, struct cmd_t_test *cmd, int mode)
 
 /* Despatcher for the populate method */
 void
-ssbox_populate (struct ssbox *ssb,struct cmd_t_test *cmd)
+ssbox_populate (struct ssbox *ssb, const struct dictionary *dict,
+               struct cmd_t_test *cmd)
 {
-  ssb->populate (ssb,cmd);
+  ssb->populate (ssb, dict, cmd);
 }
 
 
@@ -664,7 +681,8 @@ ssbox_base_init (struct ssbox *this, int cols,int rows)
 }
 
 void  ssbox_one_sample_populate (struct ssbox *ssb,
-                             struct cmd_t_test *cmd);
+                                const struct dictionary *,
+                                struct cmd_t_test *cmd);
 
 /* Initialize the one_sample ssbox */
 void
@@ -685,8 +703,9 @@ ssbox_one_sample_init (struct ssbox *this,
   tab_text (this->t, 4, 0, TAB_CENTER | TAT_TITLE, _ ("SE. Mean"));
 }
 
-void ssbox_independent_samples_populate (struct ssbox *ssb,
-                                       struct cmd_t_test *cmd);
+static void ssbox_independent_samples_populate (struct ssbox *ssb,
+                                               const struct dictionary *,
+                                               struct cmd_t_test *cmd);
 
 /* Initialize the independent samples ssbox */
 void
@@ -710,27 +729,37 @@ ssbox_independent_samples_init (struct ssbox *this,
 
 
 /* Populate the ssbox for independent samples */
-void
+static void
 ssbox_independent_samples_populate (struct ssbox *ssb,
-                             struct cmd_t_test *cmd)
+                                   const struct dictionary *dict,
+                                   struct cmd_t_test *cmd)
 {
   int i;
 
-  const char *val_lab0;
-  const char *val_lab1;
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
+  char *val_lab[2] = {NULL, NULL};
   double indep_value[2];
 
   char prefix[2][3]={"",""};
 
   if ( var_is_numeric (indep_var) )
     {
-      val_lab0 = var_lookup_value_label (indep_var, &gp.v.g_value[0]);
-      val_lab1 = var_lookup_value_label (indep_var, &gp.v.g_value[1]);
+      const char *s;
+
+      s = var_lookup_value_label (indep_var, &gp.v.g_value[0]);
+      val_lab[0] = s ? strdup (s) : NULL;
+
+      s = var_lookup_value_label (indep_var, &gp.v.g_value[1]);
+      val_lab[1] = s ? strdup (s) : NULL;
     }
   else
     {
-      val_lab0 = gp.v.g_value[0].s;
-      val_lab1 = gp.v.g_value[1].s;
+      val_lab[0] = calloc (sizeof (char), MAX_SHORT_STRING + 1);
+      val_lab[1] = calloc (sizeof (char), MAX_SHORT_STRING + 1);
+      memcpy (val_lab[0], gp.v.g_value[0].s, MAX_SHORT_STRING);
+      memcpy (val_lab[1], gp.v.g_value[1].s, MAX_SHORT_STRING);
     }
 
   if (gp.criterion == CMP_LE )
@@ -757,17 +786,17 @@ ssbox_independent_samples_populate (struct ssbox *ssb,
       tab_text (ssb->t, 0, i*2+1, TAB_LEFT,
                 var_get_name (cmd->v_variables[i]));
 
-      if (val_lab0)
+      if (val_lab[0])
        tab_text (ssb->t, 1, i*2+1, TAB_LEFT | TAT_PRINTF,
-                 "%s%s", prefix[0], val_lab0);
+                 "%s%s", prefix[0], val_lab[0]);
       else
          tab_text (ssb->t, 1, i*2+1, TAB_LEFT | TAT_PRINTF,
                    "%s%g", prefix[0], indep_value[0]);
 
 
-      if (val_lab1)
+      if (val_lab[1])
        tab_text (ssb->t, 1, i*2+1+1, TAB_LEFT | TAT_PRINTF,
-                 "%s%s", prefix[1], val_lab1);
+                 "%s%s", prefix[1], val_lab[1]);
       else
          tab_text (ssb->t, 1, i*2+1+1, TAB_LEFT | TAT_PRINTF,
                    "%s%g", prefix[1], indep_value[1]);
@@ -801,17 +830,20 @@ ssbox_independent_samples_populate (struct ssbox *ssb,
          gs = hsh_find (grp_hash, (void *) &search_val);
          assert (gs);
 
-         tab_float (ssb->t, 2 ,i*2+count+1, TAB_RIGHT, gs->n, 10, 0);
-         tab_float (ssb->t, 3 ,i*2+count+1, TAB_RIGHT, gs->mean, 8, 2);
-         tab_float (ssb->t, 4 ,i*2+count+1, TAB_RIGHT, gs->std_dev, 8, 3);
-         tab_float (ssb->t, 5 ,i*2+count+1, TAB_RIGHT, gs->se_mean, 8, 3);
+         tab_double (ssb->t, 2, i*2+count+1, TAB_RIGHT, gs->n, wfmt);
+         tab_double (ssb->t, 3, i*2+count+1, TAB_RIGHT, gs->mean, NULL);
+         tab_double (ssb->t, 4, i*2+count+1, TAB_RIGHT, gs->std_dev, NULL);
+         tab_double (ssb->t, 5, i*2+count+1, TAB_RIGHT, gs->se_mean, NULL);
        }
     }
+  free (val_lab[0]);
+  free (val_lab[1]);
 }
 
 
-void ssbox_paired_populate (struct ssbox *ssb,
-                          struct cmd_t_test *cmd);
+static void ssbox_paired_populate (struct ssbox *ssb,
+                                  const struct dictionary *dict,
+                                  struct cmd_t_test *cmd);
 
 /* Initialize the paired values ssbox */
 void
@@ -836,10 +868,14 @@ ssbox_paired_init (struct ssbox *this, struct cmd_t_test *cmd UNUSED)
 
 /* Populate the ssbox for paired values */
 void
-ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED)
+ssbox_paired_populate (struct ssbox *ssb, const struct dictionary *dict,
+                      struct cmd_t_test *cmd UNUSED)
 {
   int i;
 
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
   assert (ssb->t);
 
   for (i=0; i < n_pairs; ++i)
@@ -860,10 +896,11 @@ ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED)
                     var_get_name (pairs[i].v[j]));
 
          /* Values */
-         tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, pairs[i].mean[j], 8, 2);
-         tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, pairs[i].n, 10, 0);
-         tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j], 8, 3);
-         tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j]/sqrt (pairs[i].n), 8, 3);
+         tab_double (ssb->t,2, i*2+j+1, TAB_RIGHT, pairs[i].mean[j], NULL);
+         tab_double (ssb->t,3, i*2+j+1, TAB_RIGHT, pairs[i].n, wfmt);
+         tab_double (ssb->t,4, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j], NULL);
+         tab_double (ssb->t,5, i*2+j+1, TAB_RIGHT,
+                     pairs[i].std_dev[j]/sqrt (pairs[i].n), NULL);
 
        }
     }
@@ -871,10 +908,14 @@ ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED)
 
 /* Populate the one sample ssbox */
 void
-ssbox_one_sample_populate (struct ssbox *ssb, struct cmd_t_test *cmd)
+ssbox_one_sample_populate (struct ssbox *ssb, const struct dictionary *dict,
+                          struct cmd_t_test *cmd)
 {
   int i;
 
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
   assert (ssb->t);
 
   for (i=0; i < cmd->n_variables; ++i)
@@ -882,12 +923,11 @@ ssbox_one_sample_populate (struct ssbox *ssb, struct cmd_t_test *cmd)
       struct group_statistics *gs = &group_proc_get (cmd->v_variables[i])->ugs;
 
       tab_text (ssb->t, 0, i+1, TAB_LEFT, var_get_name (cmd->v_variables[i]));
-      tab_float (ssb->t,1, i+1, TAB_RIGHT, gs->n, 10, 0);
-      tab_float (ssb->t,2, i+1, TAB_RIGHT, gs->mean, 8, 2);
-      tab_float (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, 8, 2);
-      tab_float (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, 8, 3);
+      tab_double (ssb->t,1, i+1, TAB_RIGHT, gs->n, wfmt);
+      tab_double (ssb->t,2, i+1, TAB_RIGHT, gs->mean, NULL);
+      tab_double (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, NULL);
+      tab_double (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, NULL);
     }
-
 }
 
 
@@ -900,20 +940,23 @@ void trbox_base_finalize (struct trbox *trb);
 void trbox_independent_samples_init (struct trbox *trb,
                                    struct cmd_t_test *cmd );
 
-void trbox_independent_samples_populate (struct trbox *trb,
-                                       struct cmd_t_test *cmd);
+static void trbox_independent_samples_populate (struct trbox *trb,
+                                        const struct dictionary *dict,
+                                        struct cmd_t_test *cmd);
 
 void trbox_one_sample_init (struct trbox *self,
                      struct cmd_t_test *cmd );
 
-void trbox_one_sample_populate (struct trbox *trb,
-                              struct cmd_t_test *cmd);
+static void trbox_one_sample_populate (struct trbox *trb,
+                               const struct dictionary *,
+                               struct cmd_t_test *cmd);
 
 void trbox_paired_init (struct trbox *self,
                       struct cmd_t_test *cmd );
 
-void trbox_paired_populate (struct trbox *trb,
-                     struct cmd_t_test *cmd);
+static void trbox_paired_populate (struct trbox *trb,
+                                  const struct dictionary *,
+                                  struct cmd_t_test *cmd);
 
 
 
@@ -939,10 +982,11 @@ trbox_create (struct trbox *trb,
 }
 
 /* Populate a trbox according to cmd */
-void
-trbox_populate (struct trbox *trb, struct cmd_t_test *cmd)
+static void
+trbox_populate (struct trbox *trb, const struct dictionary *dict,
+               struct cmd_t_test *cmd)
 {
-  trb->populate (trb,cmd);
+  trb->populate (trb, dict, cmd);
 }
 
 /* Submit and destroy a trbox */
@@ -993,9 +1037,10 @@ trbox_independent_samples_init (struct trbox *self,
 }
 
 /* Populate the independent samples trbox */
-void
+static void
 trbox_independent_samples_populate (struct trbox *self,
-                                  struct cmd_t_test *cmd )
+                                   const struct dictionary *dict UNUSED,
+                                   struct cmd_t_test *cmd)
 {
   int i;
 
@@ -1045,16 +1090,16 @@ trbox_independent_samples_populate (struct trbox *self,
       tab_text (self->t, 1, i*2+3, TAB_LEFT, _ ("Equal variances assumed"));
 
 
-      tab_float (self->t, 2, i*2+3, TAB_CENTER, grp_data->levene, 8,3);
+      tab_double (self->t, 2, i*2+3, TAB_CENTER, grp_data->levene, NULL);
 
       /* Now work out the significance of the Levene test */
       df1 = 1; df2 = grp_data->ugs.n - 2;
       q = gsl_cdf_fdist_Q (grp_data->levene, df1, df2);
 
-      tab_float (self->t, 3, i*2+3, TAB_CENTER, q, 8,3 );
+      tab_double (self->t, 3, i*2+3, TAB_CENTER, q, NULL);
 
       df = gs0->n + gs1->n - 2.0 ;
-      tab_float (self->t, 5, i*2+3, TAB_RIGHT, df, 10, 0);
+      tab_double (self->t, 5, i*2+3, TAB_RIGHT, df, NULL);
 
       pooled_variance = ( (gs0->n )*pow2 (gs0->s_std_dev)
                          +
@@ -1064,30 +1109,30 @@ trbox_independent_samples_populate (struct trbox *self,
       t = (gs0->mean - gs1->mean) / sqrt (pooled_variance) ;
       t /= sqrt ((gs0->n + gs1->n)/ (gs0->n*gs1->n));
 
-      tab_float (self->t, 4, i*2+3, TAB_RIGHT, t, 8, 3);
+      tab_double (self->t, 4, i*2+3, TAB_RIGHT, t, NULL);
 
       p = gsl_cdf_tdist_P (t, df);
       q = gsl_cdf_tdist_Q (t, df);
 
-      tab_float (self->t, 6, i*2+3, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3);
+      tab_double (self->t, 6, i*2+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL);
 
       mean_diff = gs0->mean - gs1->mean;
-      tab_float (self->t, 7, i*2+3, TAB_RIGHT, mean_diff, 8, 3);
+      tab_double (self->t, 7, i*2+3, TAB_RIGHT, mean_diff, NULL);
 
 
       std_err_diff = sqrt ( pow2 (gs0->se_mean) + pow2 (gs1->se_mean));
-      tab_float (self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, 8, 3);
+      tab_double (self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, NULL);
 
 
       /* Now work out the confidence interval */
       q = (1 - cmd->criteria)/2.0;  /* 2-tailed test */
 
       t = gsl_cdf_tdist_Qinv (q,df);
-      tab_float (self->t, 9, i*2+3, TAB_RIGHT,
-               mean_diff - t * std_err_diff, 8, 3);
+      tab_double (self->t, 9, i*2+3, TAB_RIGHT,
+               mean_diff - t * std_err_diff, NULL);
 
-      tab_float (self->t, 10, i*2+3, TAB_RIGHT,
-               mean_diff + t * std_err_diff, 8, 3);
+      tab_double (self->t, 10, i*2+3, TAB_RIGHT,
+               mean_diff + t * std_err_diff, NULL);
 
 
       {
@@ -1101,7 +1146,7 @@ trbox_independent_samples_populate (struct trbox *self,
         (pow2 (gs1->s_std_dev)/ (gs1->n -1) );
 
       t = mean_diff / sqrt (se2) ;
-      tab_float (self->t, 4, i*2+3+1, TAB_RIGHT, t, 8, 3);
+      tab_double (self->t, 4, i*2+3+1, TAB_RIGHT, t, NULL);
 
       df = pow2 (se2) / (
                       (pow2 (pow2 (gs0->s_std_dev)/ (gs0->n - 1 ))
@@ -1112,30 +1157,30 @@ trbox_independent_samples_populate (struct trbox *self,
                        / (gs1->n -1 )
                        )
                       ) ;
-      tab_float (self->t, 5, i*2+3+1, TAB_RIGHT, df, 8, 3);
+
+      tab_double (self->t, 5, i*2+3+1, TAB_RIGHT, df, NULL);
 
       p = gsl_cdf_tdist_P (t, df);
       q = gsl_cdf_tdist_Q (t, df);
 
-      tab_float (self->t, 6, i*2+3+1, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3);
+      tab_double (self->t, 6, i*2+3+1, TAB_RIGHT, 2.0* (t>0?q:p), NULL);
 
       /* Now work out the confidence interval */
       q = (1 - cmd->criteria)/2.0;  /* 2-tailed test */
 
       t = gsl_cdf_tdist_Qinv (q, df);
 
-      tab_float (self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, 8, 3);
-
+      tab_double (self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, NULL);
 
-      tab_float (self->t, 8, i*2+3+1, TAB_RIGHT, std_err_diff, 8, 3);
 
+      tab_double (self->t, 8, i*2+3+1, TAB_RIGHT, std_err_diff, NULL);
 
-      tab_float (self->t, 9, i*2+3+1, TAB_RIGHT,
-               mean_diff - t * std_err_diff, 8, 3);
 
-      tab_float (self->t, 10, i*2+3+1, TAB_RIGHT,
-               mean_diff + t * std_err_diff, 8, 3);
+      tab_double (self->t, 9, i*2+3+1, TAB_RIGHT,
+               mean_diff - t * std_err_diff, NULL);
 
+      tab_double (self->t, 10, i*2+3+1, TAB_RIGHT,
+               mean_diff + t * std_err_diff, NULL);
       }
     }
 }
@@ -1176,12 +1221,16 @@ trbox_paired_init (struct trbox *self,
 }
 
 /* Populate the paired samples trbox */
-void
+static void
 trbox_paired_populate (struct trbox *trb,
-                             struct cmd_t_test *cmd UNUSED)
+                      const struct dictionary *dict,
+                      struct cmd_t_test *cmd UNUSED)
 {
   int i;
 
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
   for (i=0; i < n_pairs; ++i)
     {
       double p,q;
@@ -1197,42 +1246,42 @@ trbox_paired_populate (struct trbox *trb,
                var_get_name (pairs[i].v[0]),
                 var_get_name (pairs[i].v[1]));
 
-      tab_float (trb->t, 2, i+3, TAB_RIGHT, pairs[i].mean_diff, 8, 4);
+      tab_double (trb->t, 2, i+3, TAB_RIGHT, pairs[i].mean_diff, NULL);
 
-      tab_float (trb->t, 3, i+3, TAB_RIGHT, pairs[i].std_dev_diff, 8, 5);
+      tab_double (trb->t, 3, i+3, TAB_RIGHT, pairs[i].std_dev_diff, NULL);
 
       /* SE Mean */
       se_mean = pairs[i].std_dev_diff / sqrt (n) ;
-      tab_float (trb->t, 4, i+3, TAB_RIGHT, se_mean, 8,5 );
+      tab_double (trb->t, 4, i+3, TAB_RIGHT, se_mean, NULL);
 
       /* Now work out the confidence interval */
       q = (1 - cmd->criteria)/2.0;  /* 2-tailed test */
 
       t = gsl_cdf_tdist_Qinv (q, df);
 
-      tab_float (trb->t, 5, i+3, TAB_RIGHT,
-               pairs[i].mean_diff - t * se_mean , 8, 4);
+      tab_double (trb->t, 5, i+3, TAB_RIGHT,
+               pairs[i].mean_diff - t * se_mean , NULL);
 
-      tab_float (trb->t, 6, i+3, TAB_RIGHT,
-               pairs[i].mean_diff + t * se_mean , 8, 4);
+      tab_double (trb->t, 6, i+3, TAB_RIGHT,
+               pairs[i].mean_diff + t * se_mean , NULL);
 
       t = (pairs[i].mean[0] - pairs[i].mean[1])
        / sqrt (
-                ( pow2 (pairs[i].s_std_dev[0]) + pow2 (pairs[i].s_std_dev[1]) -
+               ( pow2 (pairs[i].s_std_dev[0]) + pow2 (pairs[i].s_std_dev[1]) -
                  2 * pairs[i].correlation *
                  pairs[i].s_std_dev[0] * pairs[i].s_std_dev[1] )
                / (n - 1)
                );
 
-      tab_float (trb->t, 7, i+3, TAB_RIGHT, t , 8,3 );
+      tab_double (trb->t, 7, i+3, TAB_RIGHT, t, NULL);
 
       /* Degrees of freedom */
-      tab_float (trb->t, 8, i+3, TAB_RIGHT, df , 10, 0 );
+      tab_double (trb->t, 8, i+3, TAB_RIGHT, df, wfmt);
 
       p = gsl_cdf_tdist_P (t,df);
-      q = gsl_cdf_tdist_P (t,df);
+      q = gsl_cdf_tdist_Q (t,df);
 
-      tab_float (trb->t, 9, i+3, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3);
+      tab_double (trb->t, 9, i+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL);
 
     }
 }
@@ -1274,11 +1323,16 @@ trbox_one_sample_init (struct trbox *self, struct cmd_t_test *cmd )
 
 
 /* Populate the one sample trbox */
-void
-trbox_one_sample_populate (struct trbox *trb, struct cmd_t_test *cmd)
+static void
+trbox_one_sample_populate (struct trbox *trb,
+                          const struct dictionary *dict,
+                          struct cmd_t_test *cmd)
 {
   int i;
 
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
   assert (trb->t);
 
   for (i=0; i < cmd->n_variables; ++i)
@@ -1293,31 +1347,31 @@ trbox_one_sample_populate (struct trbox *trb, struct cmd_t_test *cmd)
 
       t = (gs->mean - cmd->n_testval[0] ) * sqrt (gs->n) / gs->std_dev ;
 
-      tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3);
+      tab_double (trb->t, 1, i+3, TAB_RIGHT, t, NULL);
 
       /* degrees of freedom */
       df = gs->n - 1;
 
-      tab_float (trb->t, 2, i+3, TAB_RIGHT, df, 8,0);
+      tab_double (trb->t, 2, i+3, TAB_RIGHT, df, wfmt);
 
       p = gsl_cdf_tdist_P (t, df);
       q = gsl_cdf_tdist_Q (t, df);
 
       /* Multiply by 2 to get 2-tailed significance, makeing sure we've got
         the correct tail*/
-      tab_float (trb->t, 3, i+3, TAB_RIGHT, 2.0* (t>0?q:p), 8,3);
+      tab_double (trb->t, 3, i+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL);
 
-      tab_float (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, 8,3);
+      tab_double (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, NULL);
 
 
       q = (1 - cmd->criteria)/2.0;  /* 2-tailed test */
       t = gsl_cdf_tdist_Qinv (q, df);
 
-      tab_float (trb->t, 5, i+3, TAB_RIGHT,
-                gs->mean_diff - t * gs->se_mean, 8,4);
+      tab_double (trb->t, 5, i+3, TAB_RIGHT,
+                gs->mean_diff - t * gs->se_mean, NULL);
 
-      tab_float (trb->t, 6, i+3, TAB_RIGHT,
-                gs->mean_diff + t * gs->se_mean, 8,4);
+      tab_double (trb->t, 6, i+3, TAB_RIGHT,
+                gs->mean_diff + t * gs->se_mean, NULL);
     }
 }
 
@@ -1345,11 +1399,14 @@ trbox_base_finalize (struct trbox *trb)
 
 
 /* Create , populate and submit the Paired Samples Correlation box */
-void
-pscbox (void)
+static void
+pscbox (const struct dictionary *dict)
 {
-  const int rows=1+n_pairs;
-  const int cols=5;
+  const struct variable *wv = dict_get_weight (dict);
+  const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0;
+
+  const int rows = 1 + n_pairs;
+  const int cols = 5;
   int i;
 
   struct tab_table *table;
@@ -1391,13 +1448,13 @@ pscbox (void)
 
 
       /* row data */
-      tab_float (table, 2, i+1, TAB_RIGHT, pairs[i].n, 4, 0);
-      tab_float (table, 3, i+1, TAB_RIGHT, pairs[i].correlation, 8, 3);
+      tab_double (table, 2, i+1, TAB_RIGHT, pairs[i].n, wfmt);
+      tab_double (table, 3, i+1, TAB_RIGHT, pairs[i].correlation, NULL);
 
       p = gsl_cdf_tdist_P (correlation_t, df);
       q = gsl_cdf_tdist_Q (correlation_t, df);
 
-      tab_float (table, 4, i+1, TAB_RIGHT, 2.0* (correlation_t>0?q:p), 8, 3);
+      tab_double (table, 4, i+1, TAB_RIGHT, 2.0* (correlation_t>0?q:p), NULL);
     }
 
   tab_submit (table);
@@ -1840,14 +1897,14 @@ calculate (struct cmd_t_test *cmd,
   if (!taint_has_tainted_successor (taint))
     {
       ssbox_create (&stat_summary_box,cmd,mode);
-      ssbox_populate (&stat_summary_box,cmd);
+      ssbox_populate (&stat_summary_box, dict, cmd);
       ssbox_finalize (&stat_summary_box);
 
       if ( mode == T_PAIRED )
-        pscbox ();
+        pscbox (dict);
 
-      trbox_create (&test_results_box,cmd,mode);
-      trbox_populate (&test_results_box,cmd);
+      trbox_create (&test_results_box, cmd, mode);
+      trbox_populate (&test_results_box, dict, cmd);
       trbox_finalize (&test_results_box);
     }