def test_likelihood_simple_mostly_missing(self): small_cm = pd.DataFrame.from_dict( { "node0": [0, -1, -1], "node1": [1, 1, -1], "node2": [1, -1, -1], "node3": [1, -1, -1], "node4": [1, -1, -1], }, orient="index", ) priors = {0: {1: 1}, 1: {1: 1}, 2: {1: 1}} small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm, priors=priors) small_tree.parameters["stochastic_missing_probability"] = 0.3 L = tree_metrics.calculate_likelihood_discrete(small_tree) self.assertTrue(np.isclose(L, -11.458928604116634)) small_tree.parameters["mutation_rate"] = 0.5 small_tree.parameters["stochastic_missing_probability"] = 0.2 L = tree_metrics.calculate_likelihood_discrete(small_tree, ) self.assertTrue(np.isclose(L, -11.09716890609409)) small_tree.parameters.pop("stochastic_missing_probability") small_tree.parameters["heritable_missing_rate"] = 0.25 L = tree_metrics.calculate_likelihood_discrete(small_tree, ) self.assertTrue(np.isclose(L, -10.685658651089808)) small_tree.parameters["stochastic_missing_probability"] = 0 L = tree_metrics.calculate_likelihood_discrete(small_tree, ) self.assertTrue(np.isclose(L, -10.549534744691526))
def test_bad_lineage_tracing_parameters(self): small_cm = pd.DataFrame.from_dict( { "node0": [1, -1, -1], "node1": [2, 1, -1], "node2": [2, -1, -1], "node3": [1, 2, 2], "node4": [1, 1, 2], }, orient="index", ) small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm) with self.assertRaises(TreeMetricError): small_tree.parameters["mutation_rate"] = -1 tree_metrics.calculate_likelihood_continuous(small_tree) with self.assertRaises(TreeMetricError): small_tree.parameters["mutation_rate"] = -1 tree_metrics.calculate_likelihood_discrete(small_tree) with self.assertRaises(TreeMetricError): small_tree.parameters["heritable_missing_rate"] = -1 tree_metrics.calculate_likelihood_continuous(small_tree) with self.assertRaises(TreeMetricError): small_tree.parameters["heritable_missing_rate"] = 1.5 tree_metrics.calculate_likelihood_discrete(small_tree) with self.assertRaises(TreeMetricError): small_tree.parameters["stochastic_missing_probability"] = -1 tree_metrics.calculate_likelihood_continuous(small_tree) with self.assertRaises(TreeMetricError): small_tree.parameters["stochastic_missing_probability"] = 1.5 tree_metrics.calculate_likelihood_continuous(small_tree)
def test_likelihood_set_internal_states(self): small_cm = pd.DataFrame.from_dict( { "node0": [1, -1, -1], "node1": [2, 1, -1], "node2": [2, -1, -1], "node3": [1, 2, 2], "node4": [1, 1, 2], }, orient="index", ) priors = { 0: { 1: 0.3, 2: 0.7 }, 1: { 1: 0.3, 2: 0.7 }, 2: { 1: 0.3, 2: 0.7 }, 3: { 1: 0.3, 2: 0.7 }, } small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm, priors=priors) small_tree.parameters["mutation_rate"] = 0.5 small_tree.parameters["heritable_missing_rate"] = 0.25 small_tree.parameters["stochastic_missing_probability"] = 0 small_tree.reconstruct_ancestral_characters() L = tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=True, ) self.assertTrue(np.isclose(L, -24.57491637086155)) small_tree.set_character_states("node7", [0, 0, 0]) small_tree.set_character_states("node5", [0, 0, 0]) small_tree.set_character_states("node6", [0, 0, 2]) L = tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=True, ) self.assertTrue(np.isclose(L, -28.68500929005179))
def test_likelihood_sum_to_one(self): priors = { 0: { 1: 0.2, 2: 0.8 }, 1: { 1: 0.2, 2: 0.8 }, 2: { 1: 0.2, 2: 0.8 } } ls_branch = [] ls_no_branch = [] for ( a, b, ) in itertools.product([0, 1, -1, 2], repeat=2): for a_, b_ in itertools.product([0, 1, -1, 2], repeat=2): small_net = nx.DiGraph() small_net.add_edges_from([("node2", "node0"), ("node2", "node1"), ("node3", "node2")]) small_cm = pd.DataFrame.from_dict( { "node0": [a, a_], "node1": [b, b_], }, orient="index", ) small_tree = cas.data.CassiopeiaTree(tree=small_net, character_matrix=small_cm, priors=priors) small_tree.parameters["mutation_rate"] = 0.5 small_tree.parameters["heritable_missing_rate"] = 0.25 small_tree.parameters["stochastic_missing_probability"] = 0.25 L_no_branch = tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=False, ) L_branch = tree_metrics.calculate_likelihood_continuous( small_tree, use_internal_character_states=False, ) ls_no_branch.append(np.exp(L_no_branch)) ls_branch.append(np.exp(L_branch)) self.assertTrue(np.isclose(sum(ls_branch), 1.0)) self.assertTrue(np.isclose(sum(ls_no_branch), 1.0))
def test_likelihood_more_complex_case(self): small_cm = pd.DataFrame.from_dict( { "node0": [1, -1, -1, 1], "node1": [2, 1, -1, 1], "node2": [2, -1, -1, -1], "node3": [1, 2, 2, -1], "node4": [1, 1, 2, 1], }, orient="index", ) priors = { 0: { 1: 0.3, 2: 0.7 }, 1: { 1: 0.3, 2: 0.7 }, 2: { 1: 0.3, 2: 0.7 }, 3: { 1: 0.3, 2: 0.7 }, } small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm, priors=priors) small_tree.parameters["mutation_rate"] = 0.5 small_tree.parameters["heritable_missing_rate"] = 0.25 small_tree.parameters["stochastic_missing_probability"] = 0 L = tree_metrics.calculate_likelihood_discrete(small_tree) self.assertTrue(np.isclose(L, -33.11623901010781))
def test_likelihood_bad_cases(self): small_tree = cas.data.CassiopeiaTree(tree=self.small_net) small_tree.parameters["stochastic_missing_probability"] = 0.2 with self.assertRaises(TreeMetricError): tree_metrics.calculate_likelihood_discrete(small_tree) small_cm = pd.DataFrame.from_dict( { "node0": [1, -1, -1], "node1": [2, 1, -1], "node2": [2, -1, -1], "node3": [1, 2, 2], "node4": [1, 1, 2], }, orient="index", ) small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm) small_tree.parameters["stochastic_missing_probability"] = 0.2 with self.assertRaises(TreeMetricError): tree_metrics.calculate_likelihood_discrete(small_tree) priors = { 0: { 1: 0.3, 2: 0.7 }, 1: { 1: 0.3, 2: 0.7 }, 2: { 1: 0.3, 2: 0.7 }, 3: { 1: 0.3, 2: 0.7 }, } small_tree = cas.data.CassiopeiaTree(tree=self.small_net, character_matrix=small_cm, priors=priors) small_tree.parameters["stochastic_missing_probability"] = 0.2 with self.assertRaises(TreeMetricError): tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=True) small_tree.set_character_states("node7", [0, 0, 0]) small_tree.set_character_states("node5", [0, 0, 0]) with self.assertRaises(TreeMetricError): tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=True, ) small_tree.set_character_states("node6", [0, 0, 1]) L = tree_metrics.calculate_likelihood_discrete( small_tree, use_internal_character_states=True, ) self.assertEqual(-np.inf, L)