X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fstats%2Foneway.c;h=8e2805b3b1d54ca618b91d2b23889d10a84cdd75;hb=71eea20b080f51f1aa00ef35acf4f49ce742d10a;hp=e2d39910558291d3cb505aab9b3dd4bf78b01e08;hpb=81579d9e9f994fb2908f50af41c3eb033d216e58;p=pspp diff --git a/src/language/stats/oneway.c b/src/language/stats/oneway.c index e2d3991055..8e2805b3b1 100644 --- a/src/language/stats/oneway.c +++ b/src/language/stats/oneway.c @@ -23,9 +23,9 @@ #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" +#include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" -#include "data/procedure.h" #include "data/value.h" #include "language/command.h" #include "language/dictionary/split-file.h" @@ -91,7 +91,6 @@ struct oneway_spec /* The weight variable */ const struct variable *wv; - }; /* Per category data */ @@ -109,6 +108,7 @@ struct per_var_ws { struct categoricals *cat; struct covariance *cov; + struct levene *nl; double sst; double sse; @@ -117,7 +117,6 @@ struct per_var_ws int n_groups; double mse; - double levene_w; }; struct oneway_workspace @@ -393,6 +392,7 @@ run_oneway (const struct oneway_spec *cmd, ws.vws[v].cov = covariance_2pass_create (1, &cmd->vars[v], ws.vws[v].cat, cmd->wv, cmd->exclude); + ws.vws[v].nl = levene_create (var_get_width (cmd->indep_var), NULL); } c = casereader_peek (input, 0); @@ -413,20 +413,11 @@ run_oneway (const struct oneway_spec *cmd, cmd->exclude, NULL, NULL); input = casereader_create_filter_weight (input, dict, NULL, NULL); - - if (cmd->stats & STATS_HOMOGENEITY) - for (v = 0; v < cmd->n_vars; ++v) - { - struct per_var_ws *pvw = &ws.vws[v]; - - pvw->levene_w = levene (input, cmd->indep_var, cmd->vars[v], cmd->wv, cmd->exclude); - } - reader = casereader_clone (input); - for (; (c = casereader_read (reader)) != NULL; case_unref (c)) { int i; + double w = dict_get_case_weight (dict, c, NULL); for (i = 0; i < cmd->n_vars; ++i) { @@ -441,13 +432,16 @@ run_oneway (const struct oneway_spec *cmd, } covariance_accumulate_pass1 (pvw->cov, c); + levene_pass_one (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); } } casereader_destroy (reader); + reader = casereader_clone (input); for ( ; (c = casereader_read (reader) ); case_unref (c)) { int i; + double w = dict_get_case_weight (dict, c, NULL); for (i = 0; i < cmd->n_vars; ++i) { struct per_var_ws *pvw = &ws.vws[i]; @@ -461,10 +455,35 @@ run_oneway (const struct oneway_spec *cmd, } covariance_accumulate_pass2 (pvw->cov, c); + levene_pass_two (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); } } casereader_destroy (reader); + reader = casereader_clone (input); + for ( ; (c = casereader_read (reader) ); case_unref (c)) + { + int i; + double w = dict_get_case_weight (dict, c, NULL); + + for (i = 0; i < cmd->n_vars; ++i) + { + struct per_var_ws *pvw = &ws.vws[i]; + const struct variable *v = cmd->vars[i]; + const union value *val = case_data (c, v); + + if ( MISS_ANALYSIS == cmd->missing_type) + { + if ( var_is_value_missing (v, val, cmd->exclude)) + continue; + } + + levene_pass_three (pvw->nl, val->f, w, case_data (c, cmd->indep_var)); + } + } + casereader_destroy (reader); + + for (v = 0; v < cmd->n_vars; ++v) { struct per_var_ws *pvw = &ws.vws[v]; @@ -476,8 +495,6 @@ run_oneway (const struct oneway_spec *cmd, pvw->sst = gsl_matrix_get (cm, 0, 0); - // gsl_matrix_fprintf (stdout, cm, "%g "); - reg_sweep (cm, 0); pvw->sse = gsl_matrix_get (cm, 0, 0); @@ -512,11 +529,11 @@ run_oneway (const struct oneway_spec *cmd, for (v = 0; v < cmd->n_vars; ++v) { covariance_destroy (ws.vws[v].cov); + levene_destroy (ws.vws[v].nl); dd_destroy (ws.dd_total[v]); } free (ws.vws); free (ws.dd_total); - } static void show_contrast_coeffs (const struct oneway_spec *cmd, const struct oneway_workspace *ws); @@ -726,8 +743,8 @@ show_descriptives (const struct oneway_spec *cmd, const struct oneway_workspace struct string vstr; - const union value *gval = categoricals_get_value_by_subscript (cats, count); - const struct descriptive_data *dd = categoricals_get_user_data_by_subscript (cats, count); + const union value *gval = categoricals_get_value_by_category (cats, count); + const struct descriptive_data *dd = categoricals_get_user_data_by_category (cats, count); moments1_calculate (dd->mom, &n, &mean, &variance, NULL, NULL); @@ -846,7 +863,7 @@ show_homogeneity (const struct oneway_spec *cmd, const struct oneway_workspace * { double n; const struct per_var_ws *pvw = &ws->vws[v]; - double F = pvw->levene_w; + double F = levene_calculate (pvw->nl); const struct variable *var = cmd->vars[v]; const char *s = var_to_string (var); @@ -936,7 +953,7 @@ show_contrast_coeffs (const struct oneway_spec *cmd, const struct oneway_workspa ++count, coeffi = ll_next (coeffi)) { const struct categoricals *cats = covariance_get_categoricals (cov); - const union value *val = categoricals_get_value_by_subscript (cats, count); + const union value *val = categoricals_get_value_by_category (cats, count); struct string vstr; ds_init_empty (&vstr); @@ -1073,7 +1090,7 @@ show_contrast_tests (const struct oneway_spec *cmd, const struct oneway_workspac ++ci, coeffi = ll_next (coeffi)) { double n, mean, variance; - const struct descriptive_data *dd = categoricals_get_user_data_by_subscript (cats, ci); + const struct descriptive_data *dd = categoricals_get_user_data_by_category (cats, ci); struct coeff_node *cn = ll_data (coeffi, struct coeff_node, ll); const double coef = cn->coeff; double winv ;