|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T s ┃
Length: 7057 (0x1b91) Types: TextFile Names: »stats.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/stats.c«
/* Copyright 1985 Gary Perlman */ #include "stat.h" PGM(stats,Simple Summary Statistics,5.2,01/20/87) #ifdef min # undef min # undef max #endif #define MAXSTORE 1000 /* maximum store for computing median */ #define MAXCHARS 50 /* maximum length of input word */ /* Options names for requesting statistics */ Boole Verbose = FALSE; Boole InfoVersion; /* print version information */ Boole InfoLimits; /* print program limits */ Boole InfoOptions; /* print usage information */ char *Stat[] = { "n", "min", "max", "sum", "ss", "mean", "var", "sd", "skew", "kurt", "se", "NA", NULL }; /* these defines must have values that correspond to the array above */ #define PRINT_N 0 #define PRINT_MIN 1 #define PRINT_MAX 2 #define PRINT_SUM 3 #define PRINT_SS 4 #define PRINT_MEAN 5 #define PRINT_VAR 6 #define PRINT_SD 7 #define PRINT_SKEW 8 #define PRINT_KURT 9 #define PRINT_SE 10 #define PRINT_NA 11 /* returns the index number of string in (array ending in null pointer) if string is not in array, then array[ sindex (string, array) ] == NULL assumes string and array are not NULL */ int sindex (string, array) register char *string; register char **array; { register int i; for (i = 0; array[i] != NULL; i++) if (!strcmp (string, array[i])) break; return (i); } int process (argc, argv, optind) char **argv; int optind; { int status = 0; /* success status */ int n = 0; /* the number of points read in */ int NA = 0; /* number of missing NA values */ double x; /* the value read in */ double x2; /* the value squared, used for speed up */ char word[MAXCHARS];/* data as strings read in here */ double sum = 0.0; /* sum of scores */ double ss = 0.0; /* sum of squared scores */ double s3 = 0.0; /* sum of cubed scores */ double s4 = 0.0; /* sum of forth powered scores */ double mean = 0.0; /* mean of the data */ double m2; /* square of the mean, used for speed up */ double var = 0.0; /* variance of the data */ double sd = 0.0; /* standard deviation of the data */ double se = 0.0; /* standard error of the mean */ double skew = 0.0; /* third moment around the mean */ double kurt = 0.0; /* kurtosis: fourth moment around the mean */ double min = 0.0; /* minimum value of the input */ double max = 0.0; /* maximum value of the input */ int i; /* utility loop variable */ checkstdin (); while (getword (word, stdin)) { if (isna (word)) NA++; else if (number (word)) { x = atof (word); if (n == 0) min = max = x; else if (x < min) min = x; else if (x > max) max = x; x2 = x * x; sum += x; ss += x2; s3 += x * x2; s4 += x2 * x2; n++; } /* else non-numerical is simply ignored */ } /* post loop computations */ if (n > 0) /* if n == 0, then all statistics are 0 */ { mean = sum / n; m2 = mean * mean; if (n > 1) /* if n == 1, then all variability measures are 0 */ { var = (ss - mean*sum) / (n-1); sd = sqrt (var); se = sd / sqrt ((double) n); if (sd > .000000001) /* this is done to avoid division by zero */ { skew = (s3 - 3.0*mean*ss + 3.0*m2*sum - m2*sum) / (n*var*sd); kurt = (s4-4.*mean*s3+6.*m2*ss-4.*m2*mean*sum+n*m2*m2) / (n*var*var); } } } #define longprint(var,fmt) printf ("var = %fmt\n", var) #define shortprint(var,fmt) if (Verbose) \ longprint(var,fmt); \ else \ printf ("%fmt", var); /* now output results */ if (optind == argc) /* no options, print everything */ { longprint (n,d); longprint (NA,d); longprint (min,g); longprint (max,g); longprint (sum,g); longprint (ss,g); longprint (mean,g); longprint (var,g); longprint (sd,g); longprint (se,g); longprint (skew,g); longprint (kurt,g); } else { for (i = optind; i < argc; i++) /* print statistics in order of requests */ { switch ( sindex (argv[i], Stat) ) { case PRINT_N: shortprint (n,d); break; case PRINT_NA: shortprint (NA,d); break; case PRINT_MIN: shortprint (min,g); break; case PRINT_MAX: shortprint (max,g); break; case PRINT_SUM: shortprint (sum,g); break; case PRINT_SS: shortprint (ss,g); break; case PRINT_MEAN: shortprint (mean,g); break; case PRINT_VAR: shortprint (var,g); break; case PRINT_SD: shortprint (sd,g); break; case PRINT_SE: shortprint (se,g); break; case PRINT_SKEW: shortprint (skew,g); break; case PRINT_KURT: shortprint (kurt,g); break; default: /* this cannot happen because of earlier check */ status++; break; } if (Verbose == FALSE) { if (i == argc - 1) putc ('\n', stdout); else putc ('\t', stdout); } } } return (status); } main (argc, argv) int argc; /* argument count */ char **argv; /* argument vector */ { int optind; ARGV0; optind = initial (argc, argv); exit (process (argc, argv, optind)); } \f /*FUNCTION initial: returns local version of optind, index to first operand */ int initial (argc, argv) char **argv; { extern char *optarg; /* option value accessed through this by getopt */ extern int optind; /* will be index to first operand */ int opterr = 0; /* count of number of errors */ int flag; /* option flag characters read in here */ int i; /* loop variable of command line operands */ char *optstring = /* getopt string to be filled in */ "vLOV"; char *usage = /* part of usage summary to match optstring */ "[-v] [requests]"; while ((flag = getopt (argc, argv, optstring)) != EOF) switch (flag) { default: opterr++; break; /* put option cases here */ case 'v': Verbose = TRUE; break; case 'O': InfoOptions = TRUE; break; case 'V': InfoVersion = TRUE; break; case 'L': InfoLimits = TRUE; break; } if (opterr) /* print usage message and bail out */ { fprintf (stderr, "Usage: %s %s\n", argv[0], usage); exit (1); } usinfo (); for (i = optind; i < argc; i++) if (Stat[ sindex (argv[i], Stat) ] == NULL) { fprintf (stderr, "%s: unknown statistic '%s'\n", argv[0], argv[i]); opterr++; } if (opterr) { printopts (stderr); exit (1); } return (optind); } printopts (ioptr) FILE *ioptr; { int i; fprintf (ioptr, "%s: allowed statistics are:", Argv0); for (i = 0; Stat[i]; i++) fprintf (ioptr, " %s", Stat[i]); putc ('\n', ioptr); } usinfo () { if (InfoVersion) pver (Version); if (InfoLimits) { plim (Argv0); const (MAXCHARS, "maximum number of characters in input words"); } if (InfoOptions) { ppgm (Argv0, Purpose); lopt ('v', "verbose output (label requested stats)", Verbose); printopts (stdout); } if (InfoVersion || InfoLimits || InfoOptions) exit (0); }