def calc_IDR(theta, r1, r2): """ idr <- 1 - e.z o <- order(idr) idr.o <- idr[o] idr.rank <- rank(idr.o, ties.method = "max") top.mean <- function(index, x) { mean(x[1:index]) } IDR.o <- sapply(idr.rank, top.mean, idr.o) IDR <- idr IDR[o] <- IDR.o """ mu, sigma, rho, p = theta z1 = compute_pseudo_values(r1, mu, sigma, p, EPS=1e-12) z2 = compute_pseudo_values(r2, mu, sigma, p, EPS=1e-12) localIDR = 1-calc_post_membership_prbs(numpy.array(theta), z1, z2) if idr.FILTER_PEAKS_BELOW_NOISE_MEAN: localIDR[z1 + z2 < 0] = 1 # it doesn't make sense for the IDR values to be smaller than the # optimization tolerance localIDR = numpy.clip(localIDR, idr.CONVERGENCE_EPS_DEFAULT, 1) local_idr_order = localIDR.argsort() ordered_local_idr = localIDR[local_idr_order] ordered_local_idr_ranks = rankdata( ordered_local_idr, method='max' ) IDR = [] for i, rank in enumerate(ordered_local_idr_ranks): IDR.append(ordered_local_idr[:rank].mean()) IDR = numpy.array(IDR)[local_idr_order.argsort()] return localIDR, IDR
def calc_IDR(theta, r1, r2): """ idr <- 1 - e.z o <- order(idr) idr.o <- idr[o] idr.rank <- rank(idr.o, ties.method = "max") top.mean <- function(index, x) { mean(x[1:index]) } IDR.o <- sapply(idr.rank, top.mean, idr.o) IDR <- idr IDR[o] <- IDR.o """ mu, sigma, rho, p = theta z1 = compute_pseudo_values(r1, mu, sigma, p, EPS=1e-12) z2 = compute_pseudo_values(r2, mu, sigma, p, EPS=1e-12) localIDR = 1 - calc_post_membership_prbs(numpy.array(theta), z1, z2) if idr.FILTER_PEAKS_BELOW_NOISE_MEAN: localIDR[z1 + z2 < 0] = 1 # it doesn't make sense for the IDR values to be smaller than the # optimization tolerance localIDR = numpy.clip(localIDR, idr.CONVERGENCE_EPS_DEFAULT, 1) local_idr_order = localIDR.argsort() ordered_local_idr = localIDR[local_idr_order] ordered_local_idr_ranks = rankdata(ordered_local_idr, method='max') IDR = [] for i, rank in enumerate(ordered_local_idr_ranks): IDR.append(ordered_local_idr[:rank].mean()) IDR = numpy.array(IDR)[local_idr_order.argsort()] return localIDR, IDR
def EM_step(z1, z2, starting_point): i_mu, i_sigma, i_rho, i_p = starting_point ez = calc_post_membership_prbs(starting_point, z1, z2) # just a small optimization ez_sum = ez.sum() mu_1 = (ez*z1).sum()/(ez_sum) mu_2 = (ez*z2).sum()/(ez_sum) mu = (mu_1 + mu_2)/2 weighted_sum_sqs_1 = (ez*((z1-mu)**2)).sum() weighted_sum_sqs_2 = (ez*((z2-mu)**2)).sum() weighted_sum_prod = (ez*(z2-mu)*(z1-mu)).sum() sigma = math.sqrt((weighted_sum_sqs_1+weighted_sum_sqs_2)/(2*ez_sum)) rho = 2*(ez*(z1-mu)*(z2-mu)).sum()/( weighted_sum_sqs_1 + weighted_sum_sqs_2) p = ez_sum/len(ez) return numpy.array([mu, sigma, rho, p])