|
@@ -1,7 +1,32 @@
|
|
|
/* functions to classify sorted arrays of doubles and fill a vector of classbreaks */
|
|
|
|
|
|
+#include <grass/glocale.h>
|
|
|
#include <grass/arraystats.h>
|
|
|
|
|
|
+double class_apply_algorithm(char *algo, double *data, int nrec, int *nbreaks,
|
|
|
+ double *classbreaks)
|
|
|
+{
|
|
|
+ double finfo = 0.0;
|
|
|
+
|
|
|
+ if (G_strcasecmp(algo, "int") == 0)
|
|
|
+ finfo = class_interval(data, nrec, *nbreaks, classbreaks);
|
|
|
+ else if (G_strcasecmp(algo, "std") == 0)
|
|
|
+ finfo = class_stdev(data, nrec, *nbreaks, classbreaks);
|
|
|
+ else if (G_strcasecmp(algo, "qua") == 0)
|
|
|
+ finfo = class_quant(data, nrec, *nbreaks, classbreaks);
|
|
|
+ else if (G_strcasecmp(algo, "equ") == 0)
|
|
|
+ finfo = class_equiprob(data, nrec, nbreaks, classbreaks);
|
|
|
+ else if (G_strcasecmp(algo, "dis") == 0)
|
|
|
+ finfo = class_discont(data, nrec, *nbreaks, classbreaks);
|
|
|
+ else
|
|
|
+ G_fatal_error(_("%s: Unknown algorithm"), algo);
|
|
|
+
|
|
|
+ if (finfo == 0)
|
|
|
+ G_fatal_error(_("%s: Error in classification algorithm"), algo);
|
|
|
+
|
|
|
+ return finfo;
|
|
|
+}
|
|
|
+
|
|
|
int class_interval(double *data, int count, int nbreaks, double *classbreaks)
|
|
|
{
|
|
|
double min, max;
|
|
@@ -218,7 +243,7 @@ int class_equiprob(double *data, int count, int *nbreaks, double *classbreaks)
|
|
|
|
|
|
double class_discont(double *data, int count, int nbreaks, double *classbreaks)
|
|
|
{
|
|
|
- int *num, nbclass, maxclass = 0;
|
|
|
+ int *num, nbclass;
|
|
|
double *no, *zz, *nz, *xn, *co;
|
|
|
double *x; //Vecteur des observations standardisées
|
|
|
int i, j, k;
|
|
@@ -233,7 +258,7 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
|
|
|
int im = 0, ji = 0;
|
|
|
int tmp = 0;
|
|
|
int nff = 0, jj = 0, no1 = 0, no2 = 0;
|
|
|
- double f = 0, xt1 = 0, xt2 = 0, chi2 = 0, xnj_1 = 0, xj_1 = 0;
|
|
|
+ double f = 0, xt1 = 0, xt2 = 0, chi2 = 1000.0, xnj_1 = 0, xj_1 = 0;
|
|
|
|
|
|
|
|
|
/*get the number of values */
|
|
@@ -311,7 +336,7 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
|
|
|
dmax = d;
|
|
|
nmax = k;
|
|
|
}
|
|
|
- nd--; //A VERIFIER!
|
|
|
+ nd--; //A VERIFIER!
|
|
|
if (x[nf] != x[nd]) {
|
|
|
if (nd != 0)
|
|
|
co[j] = (xn[nf] - xn[nd]) / (x[nf] - x[nd]);
|
|
@@ -382,17 +407,10 @@ double class_discont(double *data, int count, int nbreaks, double *classbreaks)
|
|
|
xt2 -= xt1;
|
|
|
}
|
|
|
|
|
|
- /*if new class break not statistically significant (alpha > 0.05), give warning */
|
|
|
- if (maxclass == 0) {
|
|
|
+ /* calculate chi-square to indicate statistical significance of new class, i.e. how probable would it be that the new class could be the result of purely random choice */
|
|
|
+ if (chi2 > pow((double)((no1 - no2) - (xt1 - xt2)), 2) / (xt1 + xt2))
|
|
|
chi2 = pow((double)((no1 - no2) - (xt1 - xt2)), 2) / (xt1 + xt2);
|
|
|
- if (chi2 < 3.84148) {
|
|
|
|
|
|
- G_warning(_
|
|
|
- ("discontinuities algorithm: %i class breaks or more are not statistically significant at alpha=0.05"),
|
|
|
- i);
|
|
|
- maxclass = 1;
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/* Fill up classbreaks of i <=nbclass classes */
|