|
@@ -1,25 +1,19 @@
|
|
|
|
|
|
-/*-
|
|
|
- * from s.normal - GRASS program for distributional testing.
|
|
|
- * Copyright (C) 1994-1995. James Darrell McCauley.
|
|
|
- *
|
|
|
- * Author: James Darrell McCauley darrell@mccauley-usa.com
|
|
|
- * http://mccauley-usa.com/
|
|
|
- *
|
|
|
- * This program is free software; you can redistribute it and/or
|
|
|
- * modify it under the terms of the GNU General Public License
|
|
|
- * as published by the Free Software Foundation; either version 2
|
|
|
- * of the License, or (at your option) any later version.
|
|
|
- *
|
|
|
- * This program is distributed in the hope that it will be useful,
|
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
- * GNU General Public License for more details.
|
|
|
+
|
|
|
+/***************************************************************
|
|
|
*
|
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
+ * MODULE: v.normal
|
|
|
+ *
|
|
|
+ * AUTHOR(S): James Darrell McCauley darrell@mccauley-usa.com
|
|
|
+ * OGR support by Martin Landa <landa.martin gmail.com> (2009)
|
|
|
+ *
|
|
|
+ * PURPOSE: GRASS program for distributional testing (based on s.normal)
|
|
|
+ *
|
|
|
+ * COPYRIGHT: (C) 2001-2009 by the GRASS Development Team
|
|
|
*
|
|
|
+ * This program is free software under the GNU General
|
|
|
+ * Public License (>=v2). Read the file COPYING that
|
|
|
+ * comes with GRASS for details.
|
|
|
* Modification History:
|
|
|
* <23 Jan 2001> - added field parameter, fixed reading of sites (MN)
|
|
|
* <27 Aug 1994> - began coding. Adapted cdh.f from statlib (jdm)
|
|
@@ -30,10 +24,11 @@
|
|
|
* <21 Jun 1995> - adapted to use new sites API (jdm)
|
|
|
* <13 Sep 2000> - released under GPL
|
|
|
*
|
|
|
- */
|
|
|
+ **************************************************************/
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
#include <math.h>
|
|
|
+
|
|
|
#include <grass/gis.h>
|
|
|
#include <grass/dbmi.h>
|
|
|
#include <grass/vector.h>
|
|
@@ -44,7 +39,7 @@ int scan_cats(char *, long *, long *);
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
- int i, nsites, verbose, warn_once = 0;
|
|
|
+ int i, nsites, warn_once = 0;
|
|
|
int all;
|
|
|
long x, y;
|
|
|
struct Cell_head window;
|
|
@@ -61,6 +56,7 @@ int main(int argc, char **argv)
|
|
|
|
|
|
struct Map_info Map;
|
|
|
int line, nlines, npoints;
|
|
|
+ int field;
|
|
|
struct line_pnts *Points;
|
|
|
struct line_cats *Cats;
|
|
|
struct bound_box box;
|
|
@@ -77,13 +73,10 @@ int main(int argc, char **argv)
|
|
|
module = G_define_module();
|
|
|
G_add_keyword(_("vector"));
|
|
|
G_add_keyword(_("statistics"));
|
|
|
- module->description = _("Tests for normality for points.");
|
|
|
- parm.input = G_define_option();
|
|
|
- parm.input->key = "map";
|
|
|
- parm.input->type = TYPE_STRING;
|
|
|
- parm.input->required = YES;
|
|
|
- parm.input->description = "point vector defining sample points";
|
|
|
- parm.input->gisprompt = "old,vector,vector";
|
|
|
+ G_add_keyword(_("points"));
|
|
|
+ module->description = _("Tests for normality for vector points.");
|
|
|
+
|
|
|
+ parm.input = G_define_standard_option(G_OPT_V_MAP);
|
|
|
|
|
|
parm.tests = G_define_option();
|
|
|
parm.tests->key = "tests";
|
|
@@ -91,65 +84,52 @@ int main(int argc, char **argv)
|
|
|
parm.tests->type = TYPE_STRING;
|
|
|
parm.tests->multiple = YES;
|
|
|
parm.tests->required = YES;
|
|
|
- parm.tests->description = "Lists of tests (1-15): e.g. 1,3-8,13";
|
|
|
+ parm.tests->label = _("Lists of tests (1-15)");
|
|
|
+ parm.tests->description = _("E.g. 1,3-8,13");
|
|
|
|
|
|
- parm.dfield = G_define_option();
|
|
|
- parm.dfield->key = "column";
|
|
|
- parm.dfield->type = TYPE_STRING;
|
|
|
- parm.dfield->multiple = NO;
|
|
|
+ parm.dfield = G_define_standard_option(G_OPT_DB_COLUMN);
|
|
|
parm.dfield->required = YES;
|
|
|
- parm.dfield->description = "Attribute column";
|
|
|
|
|
|
flag.region = G_define_flag();
|
|
|
flag.region->key = 'r';
|
|
|
- flag.region->description = "Use only points in current region";
|
|
|
-
|
|
|
- flag.q = G_define_flag();
|
|
|
- flag.q->key = 'q';
|
|
|
- flag.q->description = "Quiet";
|
|
|
+ flag.region->description = _("Use only points in current region");
|
|
|
|
|
|
flag.l = G_define_flag();
|
|
|
flag.l->key = 'l';
|
|
|
- flag.l->description = "lognormal";
|
|
|
-
|
|
|
+ flag.l->description = _("Lognormality instead of normality");
|
|
|
+
|
|
|
if (G_parser(argc, argv))
|
|
|
exit(EXIT_FAILURE);
|
|
|
-
|
|
|
- if (parm.tests->answer == NULL) {
|
|
|
- G_usage();
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
all = flag.region->answer ? 0 : 1;
|
|
|
- verbose = flag.q->answer ? 0 : 1;
|
|
|
|
|
|
/* Open input */
|
|
|
Vect_set_open_level(2);
|
|
|
Vect_open_old(&Map, parm.input->answer, "");
|
|
|
-
|
|
|
+ field = 1;
|
|
|
+
|
|
|
/* Read attributes */
|
|
|
- Fi = Vect_get_field(&Map, 1);
|
|
|
+ Fi = Vect_get_field(&Map, field);
|
|
|
if (Fi == NULL) {
|
|
|
- G_fatal_error("Cannot read layer info");
|
|
|
+ G_fatal_error("Database connection not defined for layer %d", field);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Driver = db_start_driver_open_database(Fi->driver, Fi->database);
|
|
|
if (Driver == NULL)
|
|
|
G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
|
|
|
Fi->database, Fi->driver);
|
|
|
|
|
|
- nrecords =
|
|
|
- db_select_CatValArray(Driver, Fi->table, Fi->key, parm.dfield->answer,
|
|
|
- NULL, &cvarr);
|
|
|
+ nrecords = db_select_CatValArray(Driver, Fi->table, Fi->key, parm.dfield->answer,
|
|
|
+ NULL, &cvarr);
|
|
|
G_debug(1, "nrecords = %d", nrecords);
|
|
|
|
|
|
ctype = cvarr.ctype;
|
|
|
if (ctype != DB_C_TYPE_INT && ctype != DB_C_TYPE_DOUBLE)
|
|
|
- G_fatal_error("Column type not supported");
|
|
|
+ G_fatal_error(_("Only numeric column type supported"));
|
|
|
|
|
|
if (nrecords < 0)
|
|
|
G_fatal_error(_("Unable to select data from table"));
|
|
|
- G_message(_("%d records selected from table"), nrecords);
|
|
|
+ G_verbose_message(_("%d records selected from table"), nrecords);
|
|
|
|
|
|
db_close_database_shutdown_driver(Driver);
|
|
|
|
|
@@ -188,7 +168,7 @@ int main(int argc, char **argv)
|
|
|
if (ctype == DB_C_TYPE_INT) {
|
|
|
ret = db_CatValArray_get_value_int(&cvarr, cat, &cval);
|
|
|
if (ret != DB_OK) {
|
|
|
- G_warning("No record for cat = %d", cat);
|
|
|
+ G_warning(_("No record for cat %d"), cat);
|
|
|
continue;
|
|
|
}
|
|
|
dval = cval;
|
|
@@ -196,7 +176,7 @@ int main(int argc, char **argv)
|
|
|
else if (ctype == DB_C_TYPE_DOUBLE) {
|
|
|
ret = db_CatValArray_get_value_double(&cvarr, cat, &dval);
|
|
|
if (ret != DB_OK) {
|
|
|
- G_warning("No record for cat = %d", cat);
|
|
|
+ G_warning(_("No record for cat %d"), cat);
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
@@ -206,24 +186,21 @@ int main(int argc, char **argv)
|
|
|
nsites++;
|
|
|
}
|
|
|
|
|
|
- if (verbose)
|
|
|
- fprintf(stdout, "Number of points: %d\n", nsites);
|
|
|
-
|
|
|
+ G_verbose_message(_("Number of points: %d"), nsites);
|
|
|
+
|
|
|
if (nsites <= 0)
|
|
|
- G_fatal_error("No points found");
|
|
|
+ G_fatal_error(_("No points found"));
|
|
|
|
|
|
if (nsites < 4)
|
|
|
- fprintf(stdout,
|
|
|
- "WARNING: I'm not so sure of myself for small samples\n");
|
|
|
-
|
|
|
+ G_warning(_("Too small sample"));
|
|
|
+
|
|
|
if (flag.l->answer) {
|
|
|
- G_message(_("Doing log transformation"));
|
|
|
warn_once = 0;
|
|
|
for (i = 0; i < nsites; ++i) {
|
|
|
if (z[i] > 1.0e-10)
|
|
|
z[i] = log10(z[i]);
|
|
|
else if (!warn_once) {
|
|
|
- G_warning("Negative or very small point values set to -10.0");
|
|
|
+ G_warning(_("Negative or very small point values set to -10.0"));
|
|
|
z[i] = -10.0;
|
|
|
warn_once = 1;
|
|
|
}
|
|
@@ -240,104 +217,99 @@ int main(int argc, char **argv)
|
|
|
while (x <= y)
|
|
|
switch (x++) {
|
|
|
case 1: /* moments */
|
|
|
- fprintf(stdout, "Moments \\sqrt{b_1} and b_2:");
|
|
|
+ fprintf(stdout, _("Moments \\sqrt{b_1} and b_2: "));
|
|
|
w = omnibus_moments(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[0], w[1]);
|
|
|
break;
|
|
|
case 2: /* geary */
|
|
|
- fprintf(stdout, "Geary's a-statistic & an approx. normal: ");
|
|
|
+ fprintf(stdout, _("Geary's a-statistic & an approx. normal: "));
|
|
|
w = geary_test(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[0], w[1]);
|
|
|
break;
|
|
|
case 3: /* extreme deviates */
|
|
|
- fprintf(stdout, "Extreme normal deviates: ");
|
|
|
+ fprintf(stdout, _("Extreme normal deviates: "));
|
|
|
w = extreme(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[0], w[1]);
|
|
|
break;
|
|
|
case 4: /* D'Agostino */
|
|
|
- fprintf(stdout, "D'Agostino's D & an approx. normal: ");
|
|
|
+ fprintf(stdout, _("D'Agostino's D & an approx. normal: "));
|
|
|
w = dagostino_d(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[0], w[1]);
|
|
|
break;
|
|
|
case 5: /* Kuiper */
|
|
|
fprintf(stdout,
|
|
|
- "Kuiper's V (regular & modified for normality): ");
|
|
|
+ _("Kuiper's V (regular & modified for normality): "));
|
|
|
w = kuipers_v(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[1], w[0]);
|
|
|
break;
|
|
|
case 6: /* Watson */
|
|
|
fprintf(stdout,
|
|
|
- "Watson's U^2 (regular & modified for normality): ");
|
|
|
+ _("Watson's U^2 (regular & modified for normality): "));
|
|
|
w = watson_u2(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[1], w[0]);
|
|
|
break;
|
|
|
case 7: /* Durbin */
|
|
|
fprintf(stdout,
|
|
|
- "Durbin's Exact Test (modified Kolmogorov): ");
|
|
|
+ _("Durbin's Exact Test (modified Kolmogorov): "));
|
|
|
w = durbins_exact(z, nsites);
|
|
|
fprintf(stdout, "%g\n", w[0]);
|
|
|
break;
|
|
|
case 8: /* Anderson-Darling */
|
|
|
fprintf(stdout,
|
|
|
- "Anderson-Darling's A^2 (regular & modified for normality): ");
|
|
|
+ _("Anderson-Darling's A^2 (regular & modified for normality): "));
|
|
|
w = anderson_darling(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[1], w[0]);
|
|
|
break;
|
|
|
case 9: /* Cramer-Von Mises */
|
|
|
fprintf(stdout,
|
|
|
- "Cramer-Von Mises W^2(regular & modified for normality): ");
|
|
|
+ _("Cramer-Von Mises W^2(regular & modified for normality): "));
|
|
|
w = cramer_von_mises(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[1], w[0]);
|
|
|
break;
|
|
|
case 10: /* Kolmogorov-Smirnov */
|
|
|
fprintf(stdout,
|
|
|
- "Kolmogorov-Smirnov's D (regular & modified for normality): ");
|
|
|
+ _("Kolmogorov-Smirnov's D (regular & modified for normality): "));
|
|
|
w = kolmogorov_smirnov(z, nsites);
|
|
|
fprintf(stdout, "%g %g\n", w[1], w[0]);
|
|
|
break;
|
|
|
case 11: /* chi-square */
|
|
|
fprintf(stdout,
|
|
|
- "Chi-Square stat (equal probability classes) and d.f.: ");
|
|
|
+ _("Chi-Square stat (equal probability classes) and d.f.: "));
|
|
|
w = chi_square(z, nsites);
|
|
|
fprintf(stdout, "%g %d\n", w[0], (int)w[1]);
|
|
|
break;
|
|
|
case 12: /* Shapiro-Wilk */
|
|
|
if (nsites > 50) {
|
|
|
- fprintf(stdout,
|
|
|
- "\nShapiro-Wilk's W cannot be used for n > 50\n");
|
|
|
+ G_warning(_("Shapiro-Wilk's W cannot be used for n > 50"));
|
|
|
if (nsites < 99)
|
|
|
- fprintf(stdout, "Use Weisberg-Binghams's W''\n\n");
|
|
|
- else
|
|
|
- fprintf(stdout, "\n");
|
|
|
+ G_message(_("Use Weisberg-Binghams's W''"));
|
|
|
}
|
|
|
else {
|
|
|
- fprintf(stdout, "Shapiro-Wilk W: ");
|
|
|
+ fprintf(stdout, _("Shapiro-Wilk W: "));
|
|
|
w = shapiro_wilk(z, nsites);
|
|
|
fprintf(stdout, "%g\n", w[0]);
|
|
|
}
|
|
|
break;
|
|
|
case 13: /* Weisberg-Bingham */
|
|
|
if (nsites > 99 || nsites < 50)
|
|
|
- fprintf(stdout,
|
|
|
- "\nWeisberg-Bingham's W'' cannot be used for n < 50 or n > 99\n\n");
|
|
|
+ G_warning(_("Weisberg-Bingham's W'' cannot be used for n < 50 or n > 99"));
|
|
|
else {
|
|
|
- fprintf(stdout, "Weisberg-Bingham's W'': ");
|
|
|
+ fprintf(stdout, _("Weisberg-Bingham's W'': "));
|
|
|
w = weisberg_bingham(z, nsites);
|
|
|
fprintf(stdout, "%g\n", w[0]);
|
|
|
}
|
|
|
break;
|
|
|
case 14: /* Royston */
|
|
|
if (nsites > 2000)
|
|
|
- fprintf(stdout,
|
|
|
- "\nRoyston only extended Shapiro-Wilk's W up to n = 2000\n\n");
|
|
|
+ G_warning(_("Royston only extended Shapiro-Wilk's W up to n = 2000"));
|
|
|
else {
|
|
|
- fprintf(stdout, "Shapiro-Wilk W'': ");
|
|
|
+ fprintf(stdout, _("Shapiro-Wilk W'': "));
|
|
|
w = royston(z, nsites);
|
|
|
fprintf(stdout, "%g\n", w[0]);
|
|
|
}
|
|
|
break;
|
|
|
case 15: /* Kotz */
|
|
|
- fprintf(stdout, "Kotz' T'_f (Lognormality vs. Normality): ");
|
|
|
+ fprintf(stdout, _("Kotz' T'_f (Lognormality vs. Normality): "));
|
|
|
w = kotz_families(z, nsites);
|
|
|
fprintf(stdout, "%g\n", w[0]);
|
|
|
break;
|