def get_time_point_summary(Q_mut, Q_sels, t): """ @param Q_mut: the mutation rate matrix @param Q_sels: sequence of mutation-selection rate matrices @param t: the time point under consideration @return: a sequence of statistics """ # Compute the following statistics at this time point: # t # mutation MI # selection MI max # selection MI high # selection MI mean # selection MI low # selection MI min # correlation fn 1 # correlation fn 2 # correlation fn 3 # correlation fn 4 # correlation fn 5 # proportion sign agreement fn 1 # proportion sign agreement fn 2 # proportion sign agreement fn 3 # proportion sign agreement fn 4 # proportion sign agreement fn 5 # informativeness fn 1 # informativeness fn 2 # informativeness fn 3 # informativeness fn 4 # informativeness fn 5 # # First compute the mutual information for mut and mut-sel. nsels = len(Q_sels) mi_mut = ctmcmi.get_mutual_information(Q_mut, t) mi_sels = [ctmcmi.get_mutual_information(Q, t) for Q in Q_sels] mi_signs = [1 if mi_sel > mi_mut else -1 for mi_sel in mi_sels] # Now compute some other functions v0 = [ctmcmi.get_mutual_information_small_approx_c(Q, t) for Q in Q_sels] v1 = [ctmcmi.get_mutual_information_small_approx(Q, t) for Q in Q_sels] v2 = [ctmcmi.get_mutual_information_approx_c(Q, t) for Q in Q_sels] v3 = [math.exp(-2*t/mrate.R_to_relaxation_time(Q)) for Q in Q_sels] v4 = [math.exp(-t*mrate.Q_to_expected_rate(Q)) for Q in Q_sels] # Now that we have computed all of the vectors at this time point, # we can compute the statistics that we want to report. statistics = [] statistics.append(t) statistics.append(mi_mut) # add the mutual information statistics sorted_mi = sorted(mi_sels) n_extreme = nsels / 20 statistics.append(sorted_mi[-1]) statistics.append(sorted_mi[-n_extreme]) statistics.append(sum(sorted_mi) / nsels) statistics.append(sorted_mi[n_extreme-1]) statistics.append(sorted_mi[0]) # add the correlations for v in (v0, v1, v2, v3, v4): r, p = scipy.stats.stats.pearsonr(v, mi_sels) statistics.append(r) # add the sign proportions for v in (v0, v1, v2, v3, v4): v_signs = [1 if value > mi_mut else -1 for value in v] total = sum(1 for a, b in zip(mi_signs, v_signs) if a == b) p = float(total) / nsels statistics.append(p) # add the informativenesses for v in (v0, v1, v2, v3, v4): v_signs = [1 if value > mi_mut else -1 for value in v] informativeness = 0 for pair in ((1, 1), (1, -1), (-1, 1), (-1, -1)): v_value, m_value = pair v_marginal_count = sum(1 for x in v_signs if x == v_value) m_marginal_count = sum(1 for x in mi_signs if x == m_value) joint_count = sum(1 for x in zip(v_signs, mi_signs) if x == pair) if joint_count: joint_prob = joint_count / float(nsels) a = math.log(joint_prob) b = math.log(v_marginal_count / float(nsels)) c = math.log(m_marginal_count / float(nsels)) informativeness += joint_prob * (a - b - c) statistics.append(informativeness) # return the statistics return statistics
def get_time_point_summary(Q_mut, Q_sels, t): """ @param Q_mut: the mutation rate matrix @param Q_sels: sequence of mutation-selection rate matrices @param t: the time point under consideration @return: a sequence of statistics """ # Compute the following statistics at this time point: # t # mutation MI # selection MI max # selection MI high # selection MI mean # selection MI low # selection MI min # correlation fn 1 # correlation fn 2 # correlation fn 3 # correlation fn 4 # correlation fn 5 # proportion sign agreement fn 1 # proportion sign agreement fn 2 # proportion sign agreement fn 3 # proportion sign agreement fn 4 # proportion sign agreement fn 5 # informativeness fn 1 # informativeness fn 2 # informativeness fn 3 # informativeness fn 4 # informativeness fn 5 # mutual information proportion # # First compute the mutual information for mut and mut-sel. nsels = len(Q_sels) mi_mut = ctmcmi.get_mutual_information(Q_mut, t) mi_sels = [ctmcmi.get_mutual_information(Q, t) for Q in Q_sels] mi_signs = [1 if mi_sel > mi_mut else -1 for mi_sel in mi_sels] # Now compute some other functions v0 = [ctmcmi.get_mutual_information_small_approx_c(Q, t) for Q in Q_sels] v1 = [ctmcmi.get_mutual_information_small_approx(Q, t) for Q in Q_sels] v2 = [ctmcmi.get_mutual_information_approx_c(Q, t) for Q in Q_sels] v3 = [math.exp(-2*t/mrate.R_to_relaxation_time(Q)) for Q in Q_sels] v4 = [math.exp(-t*mrate.Q_to_expected_rate(Q)) for Q in Q_sels] # Now that we have computed all of the vectors at this time point, # we can compute the statistics that we want to report. statistics = [] statistics.append(t) statistics.append(mi_mut) # add the mutual information statistics sorted_mi = sorted(mi_sels) n_extreme = nsels / 20 statistics.append(sorted_mi[-1]) statistics.append(sorted_mi[-n_extreme]) statistics.append(sum(sorted_mi) / nsels) statistics.append(sorted_mi[n_extreme-1]) statistics.append(sorted_mi[0]) # add the correlations for v in (v0, v1, v2, v3, v4): r, p = scipy.stats.stats.pearsonr(v, mi_sels) statistics.append(r) # add the sign proportions for v in (v0, v1, v2, v3, v4): v_signs = [1 if value > mi_mut else -1 for value in v] total = sum(1 for a, b in zip(mi_signs, v_signs) if a == b) p = float(total) / nsels statistics.append(p) # add the informativenesses for v in (v0, v1, v2, v3, v4): v_signs = [1 if value > mi_mut else -1 for value in v] informativeness = 0 for pair in ((1, 1), (1, -1), (-1, 1), (-1, -1)): v_value, m_value = pair v_marginal_count = sum(1 for x in v_signs if x == v_value) m_marginal_count = sum(1 for x in mi_signs if x == m_value) joint_count = sum(1 for x in zip(v_signs, mi_signs) if x == pair) if joint_count: joint_prob = joint_count / float(nsels) a = math.log(joint_prob) b = math.log(v_marginal_count / float(nsels)) c = math.log(m_marginal_count / float(nsels)) informativeness += joint_prob * (a - b - c) statistics.append(informativeness) # add the mutual information sign proportion statistics.append(sum(1 for x in mi_signs if x == 1) / float(nsels)) return statistics
def get_response_content(fs): out = StringIO() np.set_printoptions(linewidth=200) # get the user defined variables n = fs.nstates t = fs.divtime #h = fs.delta # sample a random rate matrix v = divtime.sample_distribution(n) S = divtime.sample_symmetric_rate_matrix(n) R = mrate.to_gtr_halpern_bruno(S, v) # get some properties of the rate matrix distn = mrate.R_to_distn(R) spectrum = np.linalg.eigvalsh(mrate.symmetrized(R)) #spectrum, U = np.linalg.eigh(mrate.symmetrized(R)) #spectrum = np.linalg.eigvals(R) # report some information about the mutual information curve mi = ctmcmi.get_mutual_information(R, t) mi_diff = ctmcmi.get_mutual_information_diff(R, t) mi_diff_b = ctmcmi.get_mutual_information_diff_b(R, t) mi_diff_c = ctmcmi.get_mutual_information_diff_c(R, t) print >> out, 'arbitrary large-ish divergence time:' print >> out, t print >> out print >> out, 'randomly sampled reversible rate matrix:' print >> out, R print >> out print >> out, 'stationary distribution:' print >> out, distn print >> out print >> out, 'spectrum of the rate matrix:' print >> out, spectrum print >> out print >> out, 'mutual information at t = %f:' % t print >> out, mi print >> out print >> out, 'mutual information at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_b(R, t) print >> out print >> out, 'large t approximation of MI at t = %f:' % t print >> out, ctmcmi.get_mutual_information_approx(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_approx_b(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 3):' % t print >> out, ctmcmi.cute_MI_alternate(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 4):' % t print >> out, ctmcmi.get_mutual_information_approx_c(R, t) print >> out print >> out, 'small t approximation of MI at t = %f:' % t print >> out, ctmcmi.get_mutual_information_small_approx(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_small_approx_b(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 3):' % t print >> out, ctmcmi.get_mutual_information_small_approx_c(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 4):' % t print >> out, ctmcmi.get_mutual_information_small_approx_d(R, t) print >> out print >> out, 'mutual information diff at t = %f:' % t print >> out, mi_diff print >> out print >> out, 'mutual information diff at t = %f (ver. 2):' % t print >> out, mi_diff_b print >> out print >> out, 'mutual information diff at t = %f (ver. 3):' % t print >> out, mi_diff_c print >> out print >> out, 'large t approximation of MI diff at t = %f:' % t print >> out, ctmcmi.get_mutual_information_diff_approx(R, t) print >> out print >> out, 'large t approximation of MI diff at t = %f: (ver. 2)' % t print >> out, ctmcmi.get_mutual_information_diff_approx_b(R, t) print >> out print >> out, 'large t approximation of MI diff at t = %f: (ver. 4)' % t print >> out, ctmcmi.get_mutual_information_diff_approx_c(R, t) print >> out print >> out, 'log of mutual information at t = %f:' % t print >> out, math.log(mi) print >> out #print >> out, 'estimated derivative', #print >> out, 'of log of mutual information at t = %f:' % t #print >> out, (math.log(mi_c) - math.log(mi_a)) / (2*h) #print >> out print >> out, 'estimated derivative of log of MI', print >> out, 'at t = %f:' % t print >> out, mi_diff / mi print >> out print >> out, 'large t approximation of derivative of log of MI', print >> out, 'at t = %f:' % t print >> out, ctmcmi.get_mutual_information_diff_approx( R, t) / ctmcmi.get_mutual_information_approx(R, t) print >> out print >> out, 'large t approximation of derivative of log of MI', print >> out, 'at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_diff_approx_b( R, t) / ctmcmi.get_mutual_information_approx_b(R, t) print >> out print >> out, 'twice the relevant eigenvalue:' print >> out, 2 * spectrum[-2] print >> out print >> out #print >> out, 'estimated derivative', #print >> out, 'of mutual information at t = %f:' % t #print >> out, (mi_c - mi_a) / (2*h) #print >> out #print >> out, '(estimated derivative of mutual information) /', #print >> out, '(mutual information) at t = %f:' % t #print >> out, (mi_c - mi_a) / (2*h*mi_b) #print >> out return out.getvalue()
def get_response_content(fs): out = StringIO() np.set_printoptions(linewidth=200) # get the user defined variables n = fs.nstates t = fs.divtime #h = fs.delta # sample a random rate matrix v = divtime.sample_distribution(n) S = divtime.sample_symmetric_rate_matrix(n) R = mrate.to_gtr_halpern_bruno(S, v) # get some properties of the rate matrix distn = mrate.R_to_distn(R) spectrum = np.linalg.eigvalsh(mrate.symmetrized(R)) #spectrum, U = np.linalg.eigh(mrate.symmetrized(R)) #spectrum = np.linalg.eigvals(R) # report some information about the mutual information curve mi = ctmcmi.get_mutual_information(R, t) mi_diff = ctmcmi.get_mutual_information_diff(R, t) mi_diff_b = ctmcmi.get_mutual_information_diff_b(R, t) mi_diff_c = ctmcmi.get_mutual_information_diff_c(R, t) print >> out, 'arbitrary large-ish divergence time:' print >> out, t print >> out print >> out, 'randomly sampled reversible rate matrix:' print >> out, R print >> out print >> out, 'stationary distribution:' print >> out, distn print >> out print >> out, 'spectrum of the rate matrix:' print >> out, spectrum print >> out print >> out, 'mutual information at t = %f:' % t print >> out, mi print >> out print >> out, 'mutual information at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_b(R, t) print >> out print >> out, 'large t approximation of MI at t = %f:' % t print >> out, ctmcmi.get_mutual_information_approx(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_approx_b(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 3):' % t print >> out, ctmcmi.cute_MI_alternate(R, t) print >> out print >> out, 'large t approximation of MI at t = %f (ver. 4):' % t print >> out, ctmcmi.get_mutual_information_approx_c(R, t) print >> out print >> out, 'small t approximation of MI at t = %f:' % t print >> out, ctmcmi.get_mutual_information_small_approx(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_small_approx_b(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 3):' % t print >> out, ctmcmi.get_mutual_information_small_approx_c(R, t) print >> out print >> out, 'small t approximation of MI at t = %f (ver. 4):' % t print >> out, ctmcmi.get_mutual_information_small_approx_d(R, t) print >> out print >> out, 'mutual information diff at t = %f:' % t print >> out, mi_diff print >> out print >> out, 'mutual information diff at t = %f (ver. 2):' % t print >> out, mi_diff_b print >> out print >> out, 'mutual information diff at t = %f (ver. 3):' % t print >> out, mi_diff_c print >> out print >> out, 'large t approximation of MI diff at t = %f:' % t print >> out, ctmcmi.get_mutual_information_diff_approx(R, t) print >> out print >> out, 'large t approximation of MI diff at t = %f: (ver. 2)' % t print >> out, ctmcmi.get_mutual_information_diff_approx_b(R, t) print >> out print >> out, 'large t approximation of MI diff at t = %f: (ver. 4)' % t print >> out, ctmcmi.get_mutual_information_diff_approx_c(R, t) print >> out print >> out, 'log of mutual information at t = %f:' % t print >> out, math.log(mi) print >> out #print >> out, 'estimated derivative', #print >> out, 'of log of mutual information at t = %f:' % t #print >> out, (math.log(mi_c) - math.log(mi_a)) / (2*h) #print >> out print >> out, 'estimated derivative of log of MI', print >> out, 'at t = %f:' % t print >> out, mi_diff / mi print >> out print >> out, 'large t approximation of derivative of log of MI', print >> out, 'at t = %f:' % t print >> out, ctmcmi.get_mutual_information_diff_approx(R, t) / ctmcmi.get_mutual_information_approx(R, t) print >> out print >> out, 'large t approximation of derivative of log of MI', print >> out, 'at t = %f (ver. 2):' % t print >> out, ctmcmi.get_mutual_information_diff_approx_b(R, t) / ctmcmi.get_mutual_information_approx_b(R, t) print >> out print >> out, 'twice the relevant eigenvalue:' print >> out, 2 * spectrum[-2] print >> out print >> out #print >> out, 'estimated derivative', #print >> out, 'of mutual information at t = %f:' % t #print >> out, (mi_c - mi_a) / (2*h) #print >> out #print >> out, '(estimated derivative of mutual information) /', #print >> out, '(mutual information) at t = %f:' % t #print >> out, (mi_c - mi_a) / (2*h*mi_b) #print >> out return out.getvalue()