// Calculate P-value based on Fisher's exact test. double fpval(double nm, double nn, double bm, double bn) { double contingency_table[4] = {nm, nn, bm, bn}; // stuff for Fisher's test. int nrow = 2; int *nrowp = &nrow; int ncol = 2; int *ncolp = &ncol; double expected = -1.0; double percnt = 100.0; double emin = 0.0; double prt = 0.0; double *expectedp = &expected; double *percntp = % double *eminp = &emin; double *prtp = &prt; double pvalue = 0.0; double *pvaluep = &pvalue; int workspace = 300000; int *workspacep = &workspace; fexact(nrowp, ncolp, contingency_table, nrowp, expectedp, percntp, eminp, prtp, pvaluep, workspacep); return pvalue; }
double fexact_two_sided_pvalue(const std::vector<int> &twotwoTable) { // This is specific for 2x2 tables. contingency_table = matrix(twotwoTable, 2, 2, byrow = T) double contingency_table[4] = {0, 0, 0, 0}; for (int i = 0; i != 4; ++i) contingency_table[i] = twotwoTable[i]; //stuff for Fisher's test int nrow = 2; int ncol = 2; double expected = -1.0; double percnt = 100.0; double emin = 0.0; double prt = 0.0; double pvalue = 0.0; int workspace = 300000; fexact(&nrow, &ncol, contingency_table, &nrow, &expected, &percnt, &emin, &prt, &pvalue, &workspace); return pvalue; }