double anova(double *vec, int len, int *xtypes, int numeg) // anova 1 but f statistic { int i, k ; double y1, top, bot, ftail ; double *w0, *w1, *popsize, *wmean ; static int ncall2 = 0 ; if (numeg >= len) fatalx("bad anova\n") ; ZALLOC(w0, len, double) ; ZALLOC(w1, len, double) ; ZALLOC(wmean, numeg, double) ; ZALLOC(popsize, numeg, double) ; y1 = asum(vec, len)/ (double) len ; // mean vsp(w0, vec, -y1, len) ; for (i=0; i<len; i++) { k = xtypes[i] ; ++popsize[k] ; wmean[k] += w0[i] ; } /* debug */ if (numeg == 2) { ++ncall2 ; for (i=0; i<len; ++i) { if (ncall2<0) break ; k = xtypes[i] ; // printf("yy %4d %4d %12.6f %12.6f\n", i, k, vec[i], w0[i]) ; } } vsp(popsize, popsize, 1.0e-12, numeg) ; vvd(wmean, wmean, popsize, numeg) ; vvt(w1, wmean, wmean, numeg) ; top = vdot(w1, popsize, numeg) ; for (i=0; i<len ; i++) { k = xtypes[i] ; w1[i] = w0[i] - wmean[k] ; } bot = asum2(w1, len) / (double) (len-numeg) ; bot *= (double) (numeg-1) ; ftail = rtlf(numeg-1, len-numeg, top/bot) ; free(w0) ; free(w1) ; free(popsize) ; free(wmean) ; return ftail ; }
double anova1 (double *vec, int len, int *xtypes, int numeg) { int i, k; double y1, y2, ylike; double *w0, *w1, *popsize, *wmean; ZALLOC(w0, len, double); ZALLOC(w1, len, double); ZALLOC(wmean, numeg, double); ZALLOC(popsize, numeg, double); y1 = asum (vec, len) / (double) len; // mean vsp (w0, vec, -y1, len); for (i = 0; i < len; i++) { k = xtypes[i]; ++popsize[k]; wmean[k] += w0[i]; } vsp (popsize, popsize, 1.0e-12, numeg); vvd (wmean, wmean, popsize, numeg); for (i = 0; i < len; i++) { k = xtypes[i]; w1[i] = w0[i] - wmean[k]; } y1 = asum2 (w0, len) / (double) len; y2 = asum2 (w1, len) / (double) len; ylike = 0.5 * ((double) len) * log (y1 / y2); free (w0); free (w1); free (popsize); free (wmean); return ylike; }
double chitest(double *a, double *p, int n) /* a is n boxes. Goodness of fit test to p */ { double *x, *b, *pp ; double y1=0.0, y2=0.0 ; int i ; ZALLOC(pp, n, double) ; if (p != NULL) copyarr(p,pp,n) ; else vclear(pp, 1.0, n) ; y1 = asum(pp,n) ; y2 = asum(a,n) ; if ( (y1==0.0) || (y2==0.0) ) { free(pp) ; return 0.0 ; } ZALLOC(x,n,double) ; ZALLOC(b,n,double) ; vst (x, pp, y2/y1, n) ; /* expected */ vsp (x, x, .0001, n) ; vvm (b, a, x, n) ; vvt (b, b, b, n) ; vvd (b, b, x, n) ; y1 = asum(b,n) ; free(x) ; free(b) ; return y1 ; }
void dotpops(double *X, char **eglist, int numeg, int *xtypes, int nrows) { double *pp, *npp, val, yy ; int *popsize ; int i, j, k1, k2 ; if (fstonly) return ; ZALLOC(pp, numeg * numeg, double) ; ZALLOC(npp, numeg * numeg, double) ; popsize = xpopsize; ivzero(popsize, numeg) ; for (i=0; i<nrows; i++) { k1 = xtypes[i] ; ++popsize[k1] ; for (j=i+1; j<nrows; j++) { k2 = xtypes[j] ; if (k1 < 0) fatalx("bug\n") ; if (k2 < 0) fatalx("bug\n") ; if (k1>=numeg) fatalx("bug\n") ; if (k2>=numeg) fatalx("bug\n") ; val = X[i*nrows+i] + X[j*nrows+j] - 2.0*X[i*nrows+j] ; pp[k1*numeg+k2] += val ; pp[k2*numeg+k1] += val ; ++npp[k1*numeg+k2] ; ++npp[k2*numeg+k1] ; } } vsp(npp, npp, 1.0e-8, numeg*numeg) ; vvd(pp, pp, npp, numeg*numeg) ; // and normalize so that mean on diagonal is 1 yy = trace(pp, numeg) / (double) numeg ; vst(pp, pp, 1.0/yy, numeg*numeg) ; printf("\n## Average divergence between populations:"); if (numeg<=10) { printf("\n") ; printf("%10s", "") ; for (k1=0; k1<numeg; ++k1) { printf(" %10s", eglist[k1]) ; } printf(" %10s", "popsize") ; printf("\n") ; for (k2=0; k2<numeg; ++k2) { printf("%10s", eglist[k2]) ; for (k1=0; k1<numeg; ++k1) { val = pp[k1*numeg+k2] ; printf(" %10.3f", val) ; } printf(" %10d", popsize[k2]) ; printf("\n") ; } } else { // numeg >= 10 printf("\n") ; for (k2=0; k2<numeg; ++k2) { for (k1=k2; k1<numeg; ++k1) { printf("dotp: %10s", eglist[k2]) ; printf(" %10s", eglist[k1]) ; val = pp[k1*numeg+k2] ; printf(" %10.3f", val) ; printf(" %10d", popsize[k2]) ; printf(" %10d", popsize[k1]) ; printf("\n") ; } } } printf("\n") ; printf("\n") ; fflush(stdout) ; free(pp) ; free(npp) ; }