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);
}
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);
}
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 (factor.n_vars < 2)
msg (MW, _("Factor analysis on a single variable is not useful."));
+ if (factor.n_vars < 1)
+ {
+ msg (ME, _("Factor analysis without variables is not possible."));
+ goto error;
+ }
+
if (matrix_reader)
{
struct idata *id = idata_alloc (factor.n_vars);
{
do_factor_by_matrix (&factor, id);
+ gsl_matrix_free (id->mm.corr);
id->mm.corr = NULL;
+ gsl_matrix_free (id->mm.cov);
id->mm.cov = NULL;
}
/* 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
-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 ;
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;
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)
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);
}
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);
}
}
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);
}
}
}
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;
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);
}
}
}
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);
}
-static void
+static bool
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)