void plus2Dint(int **a, int **b, int **c, int nrows, int ncols) { int x ; for (x=0; x < nrows; ++x) { ivvp(a[x], b[x], c[x], ncols) ; } }
double fstcol(double *estn, double *estd, SNP *cupt, int *xindex, int *xtypes, int nrows, int type1, int type2) { int c1[2], c2[2], *cc ; int *rawcol ; int k, g, i ; double ya, yb, yaa, ybb, p1, p2, en, ed ; double z, zz, h1, h2, yt ; int **ccc ; static int ncall = 0 ; ++ncall ; ccc = initarray_2Dint(nrows, 2, 0) ; ZALLOC(rawcol, nrows, int) ; getrawcolx(ccc, cupt, xindex, nrows, indivmarkers) ; getrawcol(rawcol, cupt, xindex, nrows) ; ivzero(c1, 2) ; ivzero(c2, 2) ; for (i=0; i< nrows; i++) { k = xtypes[i] ; cc = NULL ; if (k==type1) cc = c1 ; if (k==type2) cc = c2 ; if (cc == NULL) continue ; g = ccc[i][0] ; if (ncall < 1000) { // printf("zz %d %d %d\n", rawcol[i], ccc[i][0], ccc[i][1]) ; } if (g<0) continue ; ivvp(cc, cc, ccc[i], 2) ; } if (ncall < 0) { printf("qqq\n") ; printimat(c1, 1, 2) ; printimat(c2, 1, 2) ; } ya = c1[0] ; yb = c1[1] ; yaa = c2[0] ; ybb = c2[1] ; z = ya + yb ; zz = yaa+ybb ; if ((z<1.1) || (zz<1.1)) { *estn = 0.0 ; *estd = -1.0 ; free(rawcol) ; free2Dint(&ccc, nrows) ; return 0.0; } yt = ya+yb ; p1 = ya/yt ; h1 = ya*yb/(yt*(yt-1.0)) ; yt = yaa+ybb ; p2 = yaa/yt ; h2 = yaa*ybb/(yt*(yt-1.0)) ; en = (p1-p2)*(p1-p2) ; en -= h1/z ; en -= h2/zz ; ed = en ; ed += h1 ; ed += h2 ; *estn = en ; *estd = ed ; free(rawcol) ; free2Dint(&ccc, nrows) ; return z + zz ; }