def sample_motif_ar_tilted(matrix, mu, Ne, N): nu = Ne - 1 L = len(matrix) ep_min, ep_max, L = sum(map(min, matrix)), sum(map(max, matrix)), len(matrix) site_sigma = site_sigma_from_matrix(matrix) density = lambda ep: (1 / (1 + exp(ep - mu)))**(Ne - 1) * dnorm( ep, 0, site_sigma) * (ep_min <= ep <= ep_max) d_density = lambda ep: ep / site_sigma**2 + nu / (1 + exp(mu - ep)) phat = lambda ep: (1 / (1 + exp(ep - mu)))**(Ne - 1) mode = bisect_interval(d_density, -100, 100) if mode < ep_min: mode = ep_min + 1 # don't want mode right on the nose of ep_min for sampling purposes, so offset it a bit dmode = density(mode) # calculate mean epsilon via rejection sampling motif = [] def mean_ep(lamb): psfm = psfm_from_matrix(matrix, lamb=lamb) return sum([ ep * p for (mat_row, psfm_row) in zip(matrix, psfm) for (ep, p) in zip(mat_row, psfm_row) ]) lamb = bisect_interval(lambda l: mean_ep(l) - mode, -20, 20) tilted_psfm = psfm_from_matrix(matrix, lamb=lamb) log_tilted_psfm = [map(log, row) for row in tilted_psfm] while len(motif) < N: site = random_site(L) ep = score_seq(matrix, site) if random.random() < phat(ep) / pmode: motif.append(site) return motif
def sample_motif_ar_tilted(matrix, mu, Ne, N): nu = Ne - 1 L = len(matrix) ep_min, ep_max, L = sum(map(min,matrix)), sum(map(max,matrix)), len(matrix) site_sigma = site_sigma_from_matrix(matrix) density = lambda ep:(1/(1+exp(ep-mu)))**(Ne-1) * dnorm(ep,0,site_sigma)*(ep_min <= ep <= ep_max) d_density = lambda ep:ep/site_sigma**2 + nu/(1+exp(mu-ep)) phat = lambda ep:(1/(1+exp(ep-mu)))**(Ne-1) mode = bisect_interval(d_density, -100, 100) if mode < ep_min: mode = ep_min + 1 # don't want mode right on the nose of ep_min for sampling purposes, so offset it a bit dmode = density(mode) # calculate mean epsilon via rejection sampling motif = [] def mean_ep(lamb): psfm = psfm_from_matrix(matrix, lamb=lamb) return sum([ep * p for (mat_row, psfm_row) in zip(matrix, psfm) for (ep, p) in zip(mat_row, psfm_row)]) lamb = bisect_interval(lambda l:mean_ep(l) - mode, -20, 20) tilted_psfm = psfm_from_matrix(matrix, lamb=lamb) log_tilted_psfm = [map(log,row) for row in tilted_psfm] while len(motif) < N: site = random_site(L) ep = score_seq(matrix, site) if random.random() < phat(ep)/pmode: motif.append(site) return motif
def marginal(i, j): red_matrix = [row for jp, row in enumerate(matrix) if not j == jp] red_site_mu = site_mu_from_matrix(red_matrix) red_site_sigma = site_sigma_from_matrix(red_matrix) ep = matrix[i][j] nom = integrate.quad(lambda ep_rest:f(ep + ep_rest)*dnorm(ep_rest, red_site_mu, red_site_sigma), ep_min, ep_max) denom = integrate.quad(lambda ep_rest:f(ep_rest)*dnorm(ep_rest, site_mu, site_sigma), ep_min, ep_max)
def remarginalize(matrix, mu, Ne): def phat(site): ep = score_seq(matix, site) return 1/(1+exp(ep-mu))**(Ne-1) def f(ep): return 1/(1+exp(ep-mu))**(Ne-1) site_mu = site_mu_from_matrix(matrix) site_sigma = site_sigma_from_matrix(matrix) ep_min = sum(map(argmin, matrix)) ep_max = sum(map(argmax, matrix)) def marginal(i, j): red_matrix = [row for jp, row in enumerate(matrix) if not j == jp] red_site_mu = site_mu_from_matrix(red_matrix) red_site_sigma = site_sigma_from_matrix(red_matrix) ep = matrix[i][j] nom = integrate.quad(lambda ep_rest:f(ep + ep_rest)*dnorm(ep_rest, red_site_mu, red_site_sigma), ep_min, ep_max) denom = integrate.quad(lambda ep_rest:f(ep_rest)*dnorm(ep_rest, site_mu, site_sigma), ep_min, ep_max)
def predict_ic(matrix, mu, Ne, N=100): nu = Ne - 1 ep_min, ep_max, L = sum(map(min, matrix)), sum(map(max, matrix)), len(matrix) site_sigma = site_sigma_from_matrix(matrix) density = lambda ep: (1 / (1 + exp(ep - mu)))**(Ne - 1) * dnorm( ep, 0, site_sigma) * (ep_min <= ep <= ep_max) d_density = lambda ep: ep / site_sigma**2 + nu / (1 + exp(mu - ep)) mode = bisect_interval(d_density, -100, 100) if mode < ep_min: mode = ep_min dmode = density(mode) # calculate mean epsilon via rejection sampling eps = [] while len(eps) < N: ep = random.random() * (ep_max - ep_min) + ep_min if random.random() < density(ep) / dmode: eps.append(ep) #return eps des_mean_ep = mean(eps) des_mean_ep_analytic = integrate.quad(lambda ep: ep * density(ep), ep_min, ep_max) # print "des_means:", des_mean_ep, des_mean_ep_analytic # print "min ep: %s max_ep: %s des_mean_ep: %s" % (ep_min, ep_max, des_mean_ep) def mean_ep(lamb): try: psfm = psfm_from_matrix(matrix, lamb=lamb) return sum([ ep * p for (mat_row, psfm_row) in zip(matrix, psfm) for (ep, p) in zip(mat_row, psfm_row) ]) except: print matrix, lamb raise Exception try: lamb = bisect_interval(lambda l: mean_ep(l) - des_mean_ep, -20, 20) except: print matrix, mu, Ne raise Exception tilted_psfm = psfm_from_matrix(matrix, lamb) return sum([2 - h(col) for col in tilted_psfm])
def predict_ic(matrix, mu, Ne, N=100): nu = Ne - 1 ep_min, ep_max, L = sum(map(min,matrix)), sum(map(max,matrix)), len(matrix) site_sigma = site_sigma_from_matrix(matrix) density = lambda ep:(1/(1+exp(ep-mu)))**(Ne-1) * dnorm(ep,0,site_sigma)*(ep_min <= ep <= ep_max) d_density = lambda ep:ep/site_sigma**2 + nu/(1+exp(mu-ep)) mode = bisect_interval(d_density, -100, 100) if mode < ep_min: mode = ep_min dmode = density(mode) # calculate mean epsilon via rejection sampling eps = [] while len(eps) < N: ep = random.random() * (ep_max - ep_min) + ep_min if random.random() < density(ep)/dmode: eps.append(ep) #return eps des_mean_ep = mean(eps) des_mean_ep_analytic = integrate.quad(lambda ep:ep*density(ep), ep_min, ep_max) # print "des_means:", des_mean_ep, des_mean_ep_analytic # print "min ep: %s max_ep: %s des_mean_ep: %s" % (ep_min, ep_max, des_mean_ep) def mean_ep(lamb): try: psfm = psfm_from_matrix(matrix, lamb=lamb) return sum([ep * p for (mat_row, psfm_row) in zip(matrix, psfm) for (ep, p) in zip(mat_row, psfm_row)]) except: print matrix, lamb raise Exception try: lamb = bisect_interval(lambda l:mean_ep(l) - des_mean_ep, -20, 20) except: print matrix, mu, Ne raise Exception tilted_psfm = psfm_from_matrix(matrix, lamb) return sum([2 - h(col) for col in tilted_psfm])