Do not use const in pspp_linreg_get_vars. Use correct covariance
authorJason H Stover <jhs@math.gcsu.edu>
Fri, 12 Sep 2008 21:47:43 +0000 (17:47 -0400)
committerJason H Stover <jhs@math.gcsu.edu>
Fri, 12 Sep 2008 21:47:43 +0000 (17:47 -0400)
matrix in pspp_linreg_with_cov. Initialize model cache in glm.q

src/language/stats/glm.q
src/math/linreg.c
src/math/linreg.h

index 1b91ba8166c389bb0e40bb002ac9bc984b0364e9..ad8bf55e9dfd5dfee172289eb099e42c8922ab22 100644 (file)
@@ -47,7 +47,7 @@
 #include "xalloc.h"
 #include "gettext.h"
 
-#define GLM_LARGE_DATA 1000
+#define GLM_LARGE_DATA 10000
 
 /* (headers) */
 
@@ -339,6 +339,17 @@ run_glm (struct casereader *input,
                }
            }
        }
+      model = pspp_linreg_cache_alloc (n_data, n_indep);
+      model->depvar = v_dependent;
+      /*
+       For large data sets, use QR decomposition.
+      */
+      if (n_data > sqrt (n_indep) && n_data > GLM_LARGE_DATA)
+       {
+         model->method = PSPP_LINREG_QR;
+       }
+      coeff_init (model, X);
+      pspp_linreg_with_cov (X, model);
       casereader_destroy (reader);
       for (i = 0; i < n_all_vars; i++)
        {
@@ -357,6 +368,7 @@ run_glm (struct casereader *input,
     }
   free (indep_vars);
   free (lopts.get_indep_mean_std);
+  pspp_linreg_cache_free (model);
   casereader_destroy (input);
 
   return true;
index 2fb98cf76822d020c4369d31acdf8ce0a91b1457..355261b6ea15d2eb2f86d44503f9bb1f258f5b40 100644 (file)
@@ -96,7 +96,7 @@ linreg_mean_std (gsl_vector_const_view v, double *mp, double *sp, double *ssp)
   The return value is the number of distinct variables found.
  */
 int
-pspp_linreg_get_vars (const void *c_, const struct variable **v)
+pspp_linreg_get_vars (const void *c_, struct variable **v)
 {
   const pspp_linreg_cache *c = c_;
   const struct variable *tmp;
@@ -666,7 +666,7 @@ rearrange_covariance_matrix (const struct design_matrix *cov, pspp_linreg_cache
   v = xnmalloc (c->n_coeffs, sizeof (*v));
   model_vars = xnmalloc (c->n_coeffs, sizeof (*model_vars));
   columns = xnmalloc (cov->m->size2, sizeof (*columns));
-  n_vars = pspp_linreg_get_vars (c, (const struct variable **) v);
+  n_vars = pspp_linreg_get_vars (c, v);
   dep_col = 0;
   k = 0;
   for (i = 0; i < cov->m->size2; i++)
@@ -731,7 +731,7 @@ pspp_linreg_with_cov (const struct design_matrix *full_cov,
 {
   struct design_matrix *cov;
 
-  assert (cov != NULL);
+  assert (full_cov != NULL);
   assert (cache != NULL);
 
   cov = rearrange_covariance_matrix (full_cov, cache);
index 05c8159630d8aa8da3467148a72e6d7a2da95218..18f962c06046b1af232af22b656d231722bcbd65 100644 (file)
@@ -197,7 +197,7 @@ pspp_linreg_residual (const struct variable **, const union value **,
 /*
   All variables used in the model.
  */
-int pspp_linreg_get_vars (const void *, const struct variable **);
+int pspp_linreg_get_vars (const void *, struct variable **);
 
 struct pspp_coeff *pspp_linreg_get_coeff (const pspp_linreg_cache
                                                       *,