projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
FACTOR: Do not try to run an analysis if no matrix is present
[pspp]
/
src
/
language
/
stats
/
factor.c
diff --git
a/src/language/stats/factor.c
b/src/language/stats/factor.c
index 6db35f34e36681944e7a583d837ee98a826d414f..49bc8a4d67f5334fa4af3737edd99b1d4c368acd 100644
(file)
--- a/
src/language/stats/factor.c
+++ b/
src/language/stats/factor.c
@@
-266,10
+266,6
@@
idata_free (struct idata *id)
gsl_vector_free (id->msr);
gsl_vector_free (id->eval);
gsl_matrix_free (id->evec);
gsl_vector_free (id->msr);
gsl_vector_free (id->eval);
gsl_matrix_free (id->evec);
- if (id->mm.cov != NULL)
- gsl_matrix_free (id->mm.cov);
- if (id->mm.corr != NULL)
- gsl_matrix_free (CONST_CAST (gsl_matrix *, id->mm.corr));
free (id);
}
free (id);
}
@@
-1009,7
+1005,7
@@
iterate_factor_matrix (const gsl_matrix *r, gsl_vector *communalities, gsl_matri
static bool run_factor (struct dataset *ds, const struct cmd_factor *factor);
static bool run_factor (struct dataset *ds, const struct cmd_factor *factor);
-static
void
do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata);
+static
bool
do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata);
@@
-1057,6
+1053,7
@@
cmd_factor (struct lexer *lexer, struct dataset *ds)
}
else if (lex_match_id (lexer, "MATRIX"))
{
}
else if (lex_match_id (lexer, "MATRIX"))
{
+ lex_match (lexer, T_EQUALS);
if (! lex_force_match_id (lexer, "IN"))
goto error;
if (!lex_force_match (lexer, T_LPAREN))
if (! lex_force_match_id (lexer, "IN"))
goto error;
if (!lex_force_match (lexer, T_LPAREN))
@@
-1479,7
+1476,9
@@
cmd_factor (struct lexer *lexer, struct dataset *ds)
{
do_factor_by_matrix (&factor, id);
{
do_factor_by_matrix (&factor, id);
+ gsl_matrix_free (id->mm.corr);
id->mm.corr = NULL;
id->mm.corr = NULL;
+ gsl_matrix_free (id->mm.cov);
id->mm.cov = NULL;
}
id->mm.cov = NULL;
}
@@
-1555,14
+1554,14
@@
the_communality (const gsl_matrix *evec, const gsl_vector *eval, int n, int n_fa
/* Return the communality of variable N, calculated to N_FACTORS */
static double
/* Return the communality of variable N, calculated to N_FACTORS */
static double
-communality (struct idata *idata, int n, int n_factors)
+communality (
const
struct idata *idata, int n, int n_factors)
{
return the_communality (idata->evec, idata->eval, n, n_factors);
}
static void
{
return the_communality (idata->evec, idata->eval, n, n_factors);
}
static void
-show_scree (const struct cmd_factor *f, struct idata *idata)
+show_scree (const struct cmd_factor *f,
const
struct idata *idata)
{
struct scree *s;
const char *label ;
{
struct scree *s;
const char *label ;
@@
-1647,7
+1646,7
@@
show_communalities (const struct cmd_factor * factor,
static void
static void
-show_factor_matrix (const struct cmd_factor *factor, struct idata *idata, const char *title, const gsl_matrix *fm)
+show_factor_matrix (const struct cmd_factor *factor,
const
struct idata *idata, const char *title, const gsl_matrix *fm)
{
int i;
{
int i;
@@
-1740,7
+1739,8
@@
show_factor_matrix (const struct cmd_factor *factor, struct idata *idata, const
static void
static void
-show_explained_variance (const struct cmd_factor * factor, struct idata *idata,
+show_explained_variance (const struct cmd_factor * factor,
+ const struct idata *idata,
const gsl_vector *initial_eigenvalues,
const gsl_vector *extracted_eigenvalues,
const gsl_vector *rotated_loadings)
const gsl_vector *initial_eigenvalues,
const gsl_vector *extracted_eigenvalues,
const gsl_vector *rotated_loadings)
@@
-1968,7
+1968,7
@@
show_factor_correlation (const struct cmd_factor * factor, const gsl_matrix *fcm
for (i = 0 ; i < fcm->size1; ++i)
{
for (j = 0 ; j < fcm->size2; ++j)
for (i = 0 ; i < fcm->size1; ++i)
{
for (j = 0 ; j < fcm->size2; ++j)
- tab_double (t, heading_columns +
i, heading_rows +j
, 0,
+ tab_double (t, heading_columns +
j, heading_rows + i
, 0,
gsl_matrix_get (fcm, i, j), NULL, RC_OTHER);
}
gsl_matrix_get (fcm, i, j), NULL, RC_OTHER);
}
@@
-2064,7
+2064,7
@@
show_correlation_matrix (const struct cmd_factor *factor, const struct idata *id
for (i = 0; i < factor->n_vars; ++i)
{
for (j = 0; j < factor->n_vars; ++j)
for (i = 0; i < factor->n_vars; ++i)
{
for (j = 0; j < factor->n_vars; ++j)
- tab_double (t, heading_columns +
i, y + j
, 0, gsl_matrix_get (idata->mm.corr, i, j), NULL, RC_OTHER);
+ tab_double (t, heading_columns +
j, y + i
, 0, gsl_matrix_get (idata->mm.corr, i, j), NULL, RC_OTHER);
}
}
}
}
@@
-2083,7
+2083,7
@@
show_correlation_matrix (const struct cmd_factor *factor, const struct idata *id
if (i == j)
continue;
if (i == j)
continue;
- tab_double (t, heading_columns +
i, y + j
, 0, significance_of_correlation (rho, w), NULL, RC_PVALUE);
+ tab_double (t, heading_columns +
j, y + i
, 0, significance_of_correlation (rho, w), NULL, RC_PVALUE);
}
}
}
}
}
}
@@
-2105,7
+2105,6
@@
show_covariance_matrix (const struct cmd_factor *factor, const struct idata *ida
struct tab_table *t ;
size_t i, j;
int y_pos_corr = -1;
struct tab_table *t ;
size_t i, j;
int y_pos_corr = -1;
- int y_pos_sig = -1;
int suffix_rows = 0;
const int heading_rows = 1;
int suffix_rows = 0;
const int heading_rows = 1;
@@
-2176,7
+2175,7
@@
show_covariance_matrix (const struct cmd_factor *factor, const struct idata *ida
for (i = 0; i < factor->n_vars; ++i)
{
for (j = 0; j < factor->n_vars; ++j)
for (i = 0; i < factor->n_vars; ++i)
{
for (j = 0; j < factor->n_vars; ++j)
- tab_double (t, heading_columns +
i, y + j
, 0, gsl_matrix_get (idata->mm.cov, i, j), NULL, RC_OTHER);
+ tab_double (t, heading_columns +
j, y + i
, 0, gsl_matrix_get (idata->mm.cov, i, j), NULL, RC_OTHER);
}
}
}
}
}
}
@@
-2215,13
+2214,22
@@
do_factor (const struct cmd_factor *factor, struct casereader *r)
do_factor_by_matrix (factor, idata);
finish:
do_factor_by_matrix (factor, idata);
finish:
+ gsl_matrix_free (idata->mm.corr);
+ gsl_matrix_free (idata->mm.cov);
+
idata_free (idata);
casereader_destroy (r);
}
idata_free (idata);
casereader_destroy (r);
}
-static
void
+static
bool
do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
{
do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
{
+ if (!idata->mm.cov && !idata->mm.corr)
+ {
+ msg (ME, _("The dataset has no complete covariance or correlation matrix."));
+ return false;
+ }
+
if (idata->mm.cov && !idata->mm.corr)
idata->mm.corr = correlation_from_covariance (idata->mm.cov, idata->mm.var_matrix);
if (idata->mm.corr && !idata->mm.cov)
if (idata->mm.cov && !idata->mm.corr)
idata->mm.corr = correlation_from_covariance (idata->mm.cov, idata->mm.var_matrix);
if (idata->mm.corr && !idata->mm.cov)