|
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 - metrics - downloadIndex: T t
Length: 6830 (0x1aae) Types: TextFile Names: »ts.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/ts.c«
/* Copyright 1981 Gary Perlman */ #include "stat.h" PGM(ts,Time Series Analysis and Plots,5.2,01/20/87) #define WIDTH 70 /* default plot width */ /* OPTIONS */ Boole InfoVersion; /* print version information */ Boole InfoLimits; /* print program limits */ Boole InfoOptions; /* print usage information */ double Base = 1.0; /* base value of the plot interval */ double Interval = 1.0; /* plot interval size for label */ int Axes = 1; /* type of axes */ int Echo; /* print out (possibly transformed) ts */ int Width = WIDTH; /* width of plot */ int Length; /* rescaled length of ts */ int Plot; /* request a plot */ int Plotstyle; /* specify plot style */ int Stats; /* request summary statistics */ int Onumber; /* number output */ int Autocor; /* maximum lag for autocorrelations */ int NAcount = 0; /* count of NA missing values */ #define MAXTSIZE 1000 /* max size for raw time series */ #define MAXCHARS 50 /* maximum number of chars in words */ typedef struct { unsigned int size; float *data; } TS; #define check_ts(ts) if (! (ts || ts->size) ) return; TS * new_ts (size) { TS *tss; if ((tss = myalloc (TS, 1)) == NULL) return (NULL); tss->data = myalloc (float, size); if (tss->data == NULL) return (NULL); tss->size = 0; return (tss); } TS * make_ts (tss, n) TS *tss; { TS *newts; int i; int tsn = tss->size; if (tsn == 0) return (tss); if (newts = new_ts (n)) { newts->size = n; for (i = 0; i < n; i++) newts->data[i] = 0.0; for (i = 0; i < n*tsn; i++) newts->data[i/tsn] += tss->data[i/n]; for (i = 0; i < n; i++) newts->data[i] /= tsn; } free_ts (tss); return (newts); } read_ts (tss) TS *tss; { char s[MAXCHARS]; check_ts (tss); while (getword (s, stdin)) { if (isna (s)) { NAcount++; continue; } if (!number (s)) ERRNUM (s,input value) if (tss->size >= MAXTSIZE) ERRSPACE (time series) tss->data[tss->size++] = atof (s); } } print_ts (tss) TS *tss; { int i; check_ts (tss); for (i = 0; i < tss->size; i++) { if (Onumber) { if ((i >= 0) && ((i%Onumber) == 0)) printf ("%8g ", i*Interval + Base); else printf ("%8s ", ""); } printf ("%.5g\n", tss->data[i]); } } #define tabprint(label,format,value) printf ("%s = %format\n", "label", (value)) printstats (vector, n) float *vector; unsigned n; { double sum = 0.0; double ss = 0.0; double minx = vector[0]; double maxx = vector[0]; int count = n; while (count-- > 0) { sum += vector[0]; ss += vector[0] * vector[0]; if (vector[0] > maxx) maxx = vector[0]; else if (vector[0] < minx) minx = vector[0]; vector++; } tabprint (n,d,n); tabprint (NA,d,NAcount); tabprint (sum,g,sum); tabprint (ss,g,ss); tabprint (min,g,minx); tabprint (max,g,maxx); tabprint (range,g,maxx-minx); tabprint (midpt,g,(maxx+minx)/2.0); if (n) { tabprint (mean,g,sum/n); if (n > 1) tabprint (sd,g,n <= 1 ? 0.0 : sqrt ((ss-sum*sum/n)/(n-1))); } } cor_ts (tss) TS *tss; { int lag; double cor (); double r, r2; double Fr; double p, pof (); int df; float seq[MAXTSIZE]; int i; if (tss->size <= 1) { WARNING (No autocorrelation analysis for so few data) return; } printf ("%8s %6s %6s %5s %12s %5s %6s\n", "Lag", "r", "r^2", "n'", "F", "df", "p"); for (lag = 0; lag <= Autocor; lag++) { df = tss->size - lag - 2; if (lag == 0) { for (i = 0; i < tss->size; i++) seq[i] = (float) i; r = cor (seq, tss->data, tss->size); } else r = cor (tss->data, tss->data+lag, tss->size-lag); r2 = r*r; if (r2 == 1.0) { Fr = 0.0; p = 0.0; } else { Fr = (r2 * df) / (1.0 - r2); p = pof (Fr, 1, df); } printf ("%8d %6.3f %6.3f %5d %12.3f %5d %6.3f\n", lag, r, r2, tss->size-lag, Fr, df, p); } } initial (argc, argv) char **argv; { extern char *optarg; extern int optind; int errflg = 0; int C; #define OPTSTRING "ei:l:b:pP:sn:ac:w:LOV" while ((C = getopt (argc, argv, OPTSTRING)) != EOF) switch (C) { case 'O': InfoOptions = TRUE; break; case 'V': InfoVersion = TRUE; break; case 'L': InfoLimits = TRUE; break; case 'a': Plot = 1; Axes = !Axes; break; case 'b': if (setreal (Argv0, C, optarg, &Base)) errflg++; break; case 'c': if (setint (Argv0, C, optarg, &Autocor, 1, 1000)) errflg++; break; case 'e': Echo = 1; break; case 'i': if (setreal (Argv0, C, optarg, &Interval)) errflg++; if (Interval <= FZERO) ERRVAL (g,Interval,interval size) Plot = 1; break; case 'l': if (setint (Argv0, C, optarg, &Length, 1, 1000)) errflg++; break; case 'n': if (setint (Argv0, C, optarg, &Onumber, 1, 1000)) errflg++; break; case 'P': if (setint (Argv0, C, optarg, &Plotstyle, 0, 2)) errflg++; /* FALLTHROUGH */ case 'p': Plot = 1; break; case 's': Stats = 1; break; case 'w': if (setint (Argv0, C, optarg, &Width, 1, 1000)) errflg++; Plot = 1; break; default: errflg++; break; } if (errflg) USAGE ([-aesp] [-b base] [-c autocor] [-i interval] [-l length]\n\t[-n number] [-P style] [-w width]) if (!Plot && !Autocor && !Echo) Stats = 1; ERROPT (optind) usinfo (); } main (argc, argv) char**argv; { TS *tss = new_ts (MAXTSIZE); ARGV0; initial (argc, argv); checkstdin (); read_ts (tss); if (Length) tss = make_ts (tss, Length); if (Echo) print_ts (tss); if (Stats) printstats (tss->data, tss->size); if (Autocor) cor_ts (tss); if (Plot) barplot (tss->data, tss->size, Plotstyle, Axes, Onumber, Width, Base, Interval); free_ts (tss); exit (0); } free_ts (tss) TS *tss; { if (tss) { if (tss->size) free ((char *) tss->data); free ((char *) tss); } } usinfo () { if (InfoVersion) pver (Version); if (InfoLimits) { plim (Argv0); const (MAXTSIZE, "maximum size of input time series"); const (MAXCHARS, "maximum number of characters in input fields"); } if (InfoOptions) { ppgm (Argv0, Purpose); lopt ('a', "draw axes around plots", Axes); ropt ('b', "base", "base number of time series", Base); iopt ('c', "lag", "autocorrelations of lags 1:lag", Autocor); lopt ('e', "echo time series", Echo); ropt ('i', "width", "set plot interval width", Interval); iopt ('l', "length", "set series length", Length); iopt ('n', "number", "number output", Onumber); lopt ('p', "request plot", Plot); iopt ('P', "type", "specify plot style", Plotstyle); lopt ('s', "print summary statistics", Stats); iopt ('w', "width", "plot width", Width); } if (InfoVersion || InfoLimits || InfoOptions) exit (0); }