X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fglm.c;h=2536c5f52de069c9e326f3891e18600d61394c1e;hb=7235f7f42b61c2b111174c3ee5ca72aac8815cd5;hp=dddf39144fc13656e48ccc609275ae500baf2651;hpb=f978f300ef185051b6d9b1583d7172d93898feb8;p=pspp diff --git a/src/language/stats/glm.c b/src/language/stats/glm.c index dddf39144f..2536c5f52d 100644 --- a/src/language/stats/glm.c +++ b/src/language/stats/glm.c @@ -334,75 +334,14 @@ error: static void get_ssq (struct covariance *, gsl_vector *, const struct glm_spec *); -static bool -not_dropped (size_t j, const size_t *dropped, size_t n_dropped) +static inline bool +not_dropped (size_t j, const bool *ff) { - size_t i; - - for (i = 0; i < n_dropped; i++) - { - if (j == dropped[i]) - return false; - } - return true; -} - -/* - Do the variables in X->VARS constitute a proper - subset of the variables in Y->VARS? - */ -static bool -is_subset (const struct interaction *x, const struct interaction *y) -{ - size_t i; - size_t j; - size_t n = 0; - - if (x->n_vars < y->n_vars) - { - for (i = 0; i < x->n_vars; i++) - { - for (j = 0; j < y->n_vars; j++) - { - if (x->vars [i] == y->vars [j]) - { - n++; - } - } - } - } - if (n >= x->n_vars) - return true; - return false; -} - -static bool -drop_from_submodel (const struct interaction *x, const struct interaction *y) -{ - size_t i; - size_t j; - size_t n = 0; - - if (is_subset (x, y)) - return true; - - for (i = 0; i < x->n_vars; i++) - for (j = 0; j < y->n_vars; j++) - { - if (x->vars [i] == y->vars [j]) - n++; - } - if (n == x->n_vars) - { - return true; - } - - return false; + return ! ff[j]; } static void -fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped, - size_t n_dropped) +fill_submatrix (const gsl_matrix * cov, gsl_matrix * submatrix, bool *dropped_f) { size_t i; size_t j; @@ -411,12 +350,12 @@ fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped, for (i = 0; i < cov->size1; i++) { - if (not_dropped (i, dropped, n_dropped)) + if (not_dropped (i, dropped_f)) { m = 0; for (j = 0; j < cov->size2; j++) { - if (not_dropped (j, dropped, n_dropped)) + if (not_dropped (j, dropped_f)) { gsl_matrix_set (submatrix, n, m, gsl_matrix_get (cov, i, j)); @@ -434,8 +373,8 @@ get_ssq (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) gsl_matrix *cm = covariance_calculate_unnormalized (cov); size_t i; size_t k; - size_t *model_dropped = xcalloc (covariance_dim (cov), sizeof (*model_dropped)); - size_t *submodel_dropped = xcalloc (covariance_dim (cov), sizeof (*submodel_dropped)); + bool *model_dropped = xcalloc (covariance_dim (cov), sizeof (*model_dropped)); + bool *submodel_dropped = xcalloc (covariance_dim (cov), sizeof (*submodel_dropped)); const struct categoricals *cats = covariance_get_categoricals (cov); for (k = 0; k < cmd->n_interactions; k++) @@ -448,30 +387,38 @@ get_ssq (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) { const struct interaction * x = categoricals_get_interaction_by_subscript (cats, i - cmd->n_dep_vars); - if (is_subset (cmd->interactions [k], x)) - { - assert (n_dropped_model < covariance_dim (cov)); - model_dropped[n_dropped_model++] = i; - } - if (drop_from_submodel (cmd->interactions [k], x)) + + model_dropped[i] = false; + submodel_dropped[i] = false; + if (interaction_is_subset (cmd->interactions [k], x)) { assert (n_dropped_submodel < covariance_dim (cov)); - submodel_dropped[n_dropped_submodel++] = i; + n_dropped_submodel++; + submodel_dropped[i] = true; + + if ( cmd->interactions [k]->n_vars < x->n_vars) + { + assert (n_dropped_model < covariance_dim (cov)); + n_dropped_model++; + model_dropped[i] = true; + } } } - model_cov = - gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); + + model_cov = gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); gsl_matrix_set (model_cov, 0, 0, gsl_matrix_get (cm, 0, 0)); - submodel_cov = - gsl_matrix_calloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); - fill_submatrix (cm, model_cov, model_dropped, n_dropped_model); - fill_submatrix (cm, submodel_cov, submodel_dropped, n_dropped_submodel); + submodel_cov = gsl_matrix_calloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); + + fill_submatrix (cm, model_cov, model_dropped); + fill_submatrix (cm, submodel_cov, submodel_dropped); reg_sweep (model_cov, 0); reg_sweep (submodel_cov, 0); + gsl_vector_set (ssq, k + 1, - gsl_matrix_get (submodel_cov, 0, 0) - - gsl_matrix_get (model_cov, 0, 0)); + gsl_matrix_get (submodel_cov, 0, 0) - gsl_matrix_get (model_cov, 0, 0) + ); + gsl_matrix_free (model_cov); gsl_matrix_free (submodel_cov); } @@ -596,6 +543,7 @@ output_glm (const struct glm_spec *cmd, const struct glm_workspace *ws) if (cmd->intercept) nr++; + msg (MW, "GLM is experimental. Do not rely on these results."); t = tab_create (nc, nr); tab_title (t, _("Tests of Between-Subjects Effects"));