def build_FI_trace_term(): cov_matrix = eqns2l.matrix_sigmadata(c1, koff, c2, koff2) cov_matrix_inv = np.linalg.inv(cov_matrix) dcov_dtheta_idx_dict = {0: build_dcov_dtheta_idx(0), 1: build_dcov_dtheta_idx(1), 2: build_dcov_dtheta_idx(2), 3: build_dcov_dtheta_idx(3)} def compute_trace(n, m): arr = np.linalg.multi_dot([cov_matrix_inv, dcov_dtheta_idx_dict[n], cov_matrix_inv, dcov_dtheta_idx_dict[m]]) return np.trace(arr) FI_trace_term = np.zeros((4, 4)) for n in range(4): for m in range(4): FI_trace_term[n, m] = 0.5 * compute_trace(n, m) return FI_trace_term
def __sigmaEst__(c1, koff, c2, koff2, add_trace_term=True): # eqns2l are the equations imported from Mathematica and turned into matrices (function of c1,c2,koff,koff2) A = eqns2l.matrix_dmudthetaInv(c1, koff, c2, koff2) B = eqns2l.matrix_sigmadata(c1, koff, c2, koff2) Atrans = np.transpose(A) def build_dcov_dtheta_idx(theta_idx): label_data = {0: 'N1', 1: 'M1', 2: 'N2', 3: 'M2'} label_theta = {0: 'c1', 1: 'koff', 2: 'c2', 3: 'koff2'} def fetch_eqn(i, j): if j > i: method_to_call = getattr(eqns2l, 'Cov%s%sd%s' % (label_data[i], label_data[j], label_theta[theta_idx])) else: method_to_call = getattr(eqns2l, 'Cov%s%sd%s' % (label_data[j], label_data[i], label_theta[theta_idx])) return method_to_call dcov_dtheta_idx = np.zeros((4, 4)) for i in range(4): for j in range(4): dcov_dtheta_idx[i, j] = fetch_eqn(i, j)(c1, koff, c2, koff2) return dcov_dtheta_idx def build_FI_trace_term(): cov_matrix = eqns2l.matrix_sigmadata(c1, koff, c2, koff2) cov_matrix_inv = np.linalg.inv(cov_matrix) dcov_dtheta_idx_dict = {0: build_dcov_dtheta_idx(0), 1: build_dcov_dtheta_idx(1), 2: build_dcov_dtheta_idx(2), 3: build_dcov_dtheta_idx(3)} def compute_trace(n, m): arr = np.linalg.multi_dot([cov_matrix_inv, dcov_dtheta_idx_dict[n], cov_matrix_inv, dcov_dtheta_idx_dict[m]]) return np.trace(arr) FI_trace_term = np.zeros((4, 4)) for n in range(4): for m in range(4): FI_trace_term[n, m] = 0.5 * compute_trace(n, m) return FI_trace_term error_matrix = np.linalg.multi_dot([A, B, Atrans]) if add_trace_term: # idea is to invert the matrix above, add the trace term, then invert the whole thing FI_term_base = np.linalg.inv(error_matrix) FI_term_trace = build_FI_trace_term() FI_full = FI_term_base + FI_term_trace error_matrix = np.linalg.inv(FI_full) # use to make the entries relative estimates rel = np.array([[c1 * c1, c1 * koff, c1 * c2, c1 * koff2], [koff * c1, koff * koff, koff * c2, koff * koff2], [c2 * c1, c2 * koff, c2 * c2, c2 * koff2], [koff2 * c1, koff2 * koff, koff2 * c2, koff2 * koff2]]) relErrorMatrix = np.divide(error_matrix, rel) return error_matrix, np.linalg.det(error_matrix), relErrorMatrix, np.linalg.det(error_matrix)/(c1**2 * c2**2 * koff**2 * koff2**2)
def __sigmaData__(c1, koff, c2, koff2): """ Create the matrix from exported mathematica expressions """ return eqns2l.matrix_sigmadata(c1, koff, c2, koff2), np.linalg.det(eqns2l.matrix_sigmadata(c1, koff, c2, koff2))