HGMV = function(n1, m1, N, odds.ratio) { m2 = N - m1 n2 = N - n1; if(odds.ratio >= 1.) u = corn(n1, m1, N, odds.ratio) else u = n1 - corn(n1, m2, N, 1/odds.ratio); minimum.u = min(u, n1-u, m1-u, m2-n1+u); if(u <= minimum.u) value = HGMV1(n1, m1, N, odds.ratio) else if(n1-u <= minimum.u) { value = HGMV1(n1, m2, N, 1/odds.ratio); value[1] = n1 - value[1]; } else if(m1-u <= minimum.u) { value = HGMV1(n2, m1, N, 1/odds.ratio); value[1] = m1 - value[1]; } else { value = HGMV1(n2,m2,N,odds.ratio); value[1] = m1 - n2 + value[1]; } value; } HGMV1 = function(n1, m1, N, odds.ratio) { m2 = N - m1; minimum.mn = min(n1, m1); n1 = n1 - minimum.mn; m1 = m1 - minimum.mn; u1 = 0.; u2 = 0.; for( i in 1:minimum.mn) { m1 = m1+1; n1 = n1+1; u1 = u2; u2 = n1*m1*odds.ratio/(m1+m2+(1.- odds.ratio)*(1.- n1-m1+u1)); } mean.value = u2; variance.value = u2*(u1-u2+1.); c(mean.value, variance.value); } corn = function(n1, m1, N, odds.ratio) { a = 1.- odds.ratio; b = N -(n1+m1)*a; c = -odds.ratio*n1*m1; q = -.5*(b + sqrt(b*b-4.*a*c)); c/q; }