double veg_raup(double *x, int nr, int nc, int i1, int i2) { double dist, J, A, B; int sim, t1, t2, j, count; sim = 0; t1 = 0; t2 = 0; count = 0; for (j = 0; j < nc; j++) { if (R_FINITE(x[i1]) && R_FINITE(x[i2])) { if (x[i1] > 0.0 && x[i2] > 0.0) sim++; if (x[i1] > 0) t1++; if (x[i2] > 0) t2++; count++; } i1 += nr; i2 += nr; } if (count == 0) return NA_REAL; J = (double) (sim - 1); A = (t1 < t2) ? (double) t1 : (double) t2; B = (t1 < t2) ? (double) t2 : (double) t1; dist = 1 - phyper(J, A, (double) count - A, B, 1, 0); return dist; }
double phypergeo(double r, double n, double N, double k, int i, int j) { if((r > N) || (k > n) || (k > r)) return std::numeric_limits<double>::quiet_NaN(); double nr = r; double nb = N - r; return phyper(nr, nb, n, k, i, j); }
int main (int argc, char *argv[]) { // argc int a,b,c,d; int q,m,n,k; // phyper in R double pval; if (argc <= 2) { fprintf(stderr, "Usage: %s <D> <B> <C> <A>\nsame as fisher.test(matrix(c(D,B,C,A),2,2),\"greater\") in R\n",argv[0]); exit(0); } // argc --> par a = atoi(argv[1]); b = atoi(argv[2]); c = atoi(argv[3]); d = atoi(argv[4]); // R: phyper q = a-1; m = a+c; n = b+d; k = a+b; pval=1-phyper(q,k,m,m+n); printf("%e\n",pval); return(0); }