void Discriminant_getPartialDiscriminationProbability (Discriminant me, long numberOfDimensions, double *p_prob, double *p_chisq, double *p_df) { long g = my numberOfGroups; long p = my eigen -> dimension, k = numberOfDimensions; long numberOfFunctions = Discriminant_getNumberOfFunctions (me); double degreesOfFreedom = Discriminant_getDegreesOfFreedom (me); double prob = NUMundefined, chisq = NUMundefined, df = NUMundefined; if (k < numberOfFunctions) { double lambda = NUMwilksLambda (my eigen -> eigenvalues, k + 1, numberOfFunctions); if (lambda != 1.0) { chisq = - (degreesOfFreedom + (g - p) / 2.0 - 1.0) * log (lambda); df = (p - k) * (g - k - 1); if (p_prob) { prob = NUMchiSquareQ (chisq, df); } } } if (p_prob) { *p_prob = prob; } if (p_chisq) { *p_chisq = chisq; } if (p_df) { *p_df = df; } }
void structDiscriminant :: v_info () { structDaata :: v_info (); MelderInfo_writeLine (U"Number of groups: ", numberOfGroups); MelderInfo_writeLine (U"Number of variables: ", dimension); MelderInfo_writeLine (U"Number of discriminant functions: ", Discriminant_getNumberOfFunctions (this)); MelderInfo_writeLine (U"Number of observations (total): ", Discriminant_getNumberOfObservations (this, 0)); }
void structDiscriminant :: v_info () { structDaata :: v_info (); MelderInfo_writeLine (U"Number of groups: ", numberOfGroups); MelderInfo_writeLine (U"Number of eigenvalues: ", eigen -> numberOfEigenvalues); MelderInfo_writeLine (U"Dimension of eigenvector: ", eigen -> dimension); MelderInfo_writeLine (U"Number of discriminant functions: ", Discriminant_getNumberOfFunctions (this)); MelderInfo_writeLine (U"Number of observations (total): ", Discriminant_getNumberOfObservations (this, 0)); }
double Discriminant_getWilksLambda (Discriminant me, long from) { long numberOfFunctions = Discriminant_getNumberOfFunctions (me); if (from >= numberOfFunctions) { return 1; } if (from < 1) { from = 1; } return NUMwilksLambda (my eigen -> eigenvalues, 1 + from, numberOfFunctions); }
autoConfiguration Discriminant_and_TableOfReal_to_Configuration (Discriminant me, TableOfReal thee, long numberOfDimensions) { try { if (numberOfDimensions == 0) { numberOfDimensions = Discriminant_getNumberOfFunctions (me); } autoConfiguration him = Configuration_create (thy numberOfRows, numberOfDimensions); Eigen_and_TableOfReal_into_TableOfReal_projectRows (my eigen.get(), thee, 1, him.get(), 1, numberOfDimensions); TableOfReal_copyLabels (thee, him.get(), 1, 0); TableOfReal_setSequentialColumnLabels (him.get(), 0, 0, U"Eigenvector ", 1, 1); return him; } catch (MelderError) { Melder_throw (U"Configuration not created."); } }
void Discriminant_drawConcentrationEllipses (Discriminant me, Graphics g, double scale, bool confidence, char32 *label, int discriminantDirections, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) { long numberOfFunctions = Discriminant_getNumberOfFunctions (me); if (! discriminantDirections) { SSCPList_drawConcentrationEllipses (my groups.get(), g, scale, confidence, label, d1, d2, xmin, xmax, ymin, ymax, fontSize, garnish); return; } if (numberOfFunctions <= 1) { Melder_warning (U"Discriminant_drawConcentrationEllipses: Nothing drawn " U"because there is only one dimension in the discriminant space."); return; } // Project SSCPs on eigenvectors. if (d1 == 0 && d2 == 0) { d1 = 1; d2 = MIN (numberOfFunctions, d1 + 1); } else if (d1 < 0 || d2 > numberOfFunctions) { return; } double *v1 = my eigen -> eigenvectors [d1]; double *v2 = my eigen -> eigenvectors [d2]; autoSSCPList thee = SSCPList_toTwoDimensions (my groups.get(), v1, v2); SSCPList_drawConcentrationEllipses (thee.get(), g, scale, confidence, label, 1, 2, xmin, xmax, ymin, ymax, fontSize, 0); if (garnish) { char32 llabel[40]; Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, true, true, false); Melder_sprint (llabel,40, U"function ", d2); Graphics_textLeft (g, true, llabel); Graphics_marksBottom (g, 2, true, true, false); Melder_sprint (llabel,40, U"function ", d1); Graphics_textBottom (g, true, llabel); } }
void Discriminant_getPartialDiscriminationProbability (Discriminant me, long numberOfDimensions, double *probability, double *chisq, long *ndf) { long g = my numberOfGroups; long p = my dimension, k = numberOfDimensions; long numberOfFunctions = Discriminant_getNumberOfFunctions (me); double degreesOfFreedom = Discriminant_getDegreesOfFreedom (me); double lambda; *probability = 1; *chisq = 0; *ndf = 0; if (k >= numberOfFunctions) { return; } lambda = NUMwilksLambda (my eigenvalues, k + 1, numberOfFunctions); if (lambda == 1) { return; } *chisq = - (degreesOfFreedom + (g - p) / 2 - 1) * log (lambda); *ndf = (p - k) * (g - k - 1); *probability = NUMchiSquareQ (*chisq, *ndf); }