phykit 2.1.79__tar.gz → 2.1.81__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. {phykit-2.1.79 → phykit-2.1.81}/PKG-INFO +1 -1
  2. {phykit-2.1.79 → phykit-2.1.81}/phykit/cli_registry.py +4 -0
  3. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/quartet_utils.py +36 -0
  4. {phykit-2.1.79 → phykit-2.1.81}/phykit/phykit.py +95 -0
  5. {phykit-2.1.79 → phykit-2.1.81}/phykit/service_factories.py +1 -0
  6. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/__init__.py +1 -0
  7. phykit-2.1.81/phykit/services/tree/phylo_anova.py +808 -0
  8. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/quartet_pie.py +83 -6
  9. phykit-2.1.81/phykit/version.py +1 -0
  10. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/PKG-INFO +1 -1
  11. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/SOURCES.txt +1 -0
  12. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/entry_points.txt +4 -0
  13. {phykit-2.1.79 → phykit-2.1.81}/setup.py +4 -0
  14. phykit-2.1.79/phykit/version.py +0 -1
  15. {phykit-2.1.79 → phykit-2.1.81}/LICENSE.md +0 -0
  16. {phykit-2.1.79 → phykit-2.1.81}/README.md +0 -0
  17. {phykit-2.1.79 → phykit-2.1.81}/phykit/__init__.py +0 -0
  18. {phykit-2.1.79 → phykit-2.1.81}/phykit/__main__.py +0 -0
  19. {phykit-2.1.79 → phykit-2.1.81}/phykit/errors.py +0 -0
  20. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/__init__.py +0 -0
  21. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/boolean_argument_parsing.py +0 -0
  22. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/caching.py +0 -0
  23. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/circular_layout.py +0 -0
  24. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/color_annotations.py +0 -0
  25. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/discrete_models.py +0 -0
  26. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/files.py +0 -0
  27. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/json_output.py +0 -0
  28. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/parallel.py +0 -0
  29. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/parsimony_utils.py +0 -0
  30. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/plot_config.py +0 -0
  31. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/stats_summary.py +0 -0
  32. {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/streaming.py +0 -0
  33. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/__init__.py +0 -0
  34. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/__init__.py +0 -0
  35. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_entropy.py +0 -0
  36. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_length.py +0 -0
  37. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_length_no_gaps.py +0 -0
  38. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_outlier_taxa.py +0 -0
  39. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_recoding.py +0 -0
  40. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_subsample.py +0 -0
  41. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/base.py +0 -0
  42. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/column_score.py +0 -0
  43. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/composition_per_taxon.py +0 -0
  44. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/compositional_bias_per_site.py +0 -0
  45. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/create_concatenation_matrix.py +0 -0
  46. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dfoil.py +0 -0
  47. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dna_threader.py +0 -0
  48. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dstatistic.py +0 -0
  49. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/evolutionary_rate_per_site.py +0 -0
  50. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/faidx.py +0 -0
  51. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/gc_content.py +0 -0
  52. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/identity_matrix.py +0 -0
  53. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/mask_alignment.py +0 -0
  54. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/occupancy_per_taxon.py +0 -0
  55. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/pairwise_identity.py +0 -0
  56. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/parsimony_informative_sites.py +0 -0
  57. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/phylo_gwas.py +0 -0
  58. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/plot_alignment_qc.py +0 -0
  59. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rcv.py +0 -0
  60. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rcvt.py +0 -0
  61. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rename_fasta_entries.py +0 -0
  62. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/sum_of_pairs_score.py +0 -0
  63. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/taxon_groups.py +0 -0
  64. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/variable_sites.py +0 -0
  65. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/base.py +0 -0
  66. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ancestral_reconstruction.py +0 -0
  67. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/base.py +0 -0
  68. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/bipartition_support_stats.py +0 -0
  69. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/branch_length_multiplier.py +0 -0
  70. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/character_map.py +0 -0
  71. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/collapse_branches.py +0 -0
  72. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/concordance_asr.py +0 -0
  73. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/consensus_network.py +0 -0
  74. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/consensus_tree.py +0 -0
  75. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/cont_map.py +0 -0
  76. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/cophylo.py +0 -0
  77. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/covarying_evolutionary_rates.py +0 -0
  78. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/density_map.py +0 -0
  79. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/discordance_asymmetry.py +0 -0
  80. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/dvmc.py +0 -0
  81. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/evo_tempo_map.py +0 -0
  82. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/evolutionary_rate.py +0 -0
  83. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/fit_continuous.py +0 -0
  84. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/fit_discrete.py +0 -0
  85. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/hidden_paralogy_check.py +0 -0
  86. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/hybridization.py +0 -0
  87. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/independent_contrasts.py +0 -0
  88. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/internal_branch_stats.py +0 -0
  89. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/internode_labeler.py +0 -0
  90. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/kf_distance.py +0 -0
  91. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/last_common_ancestor_subtree.py +0 -0
  92. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/lb_score.py +0 -0
  93. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ltt.py +0 -0
  94. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/monophyly_check.py +0 -0
  95. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/nearest_neighbor_interchange.py +0 -0
  96. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/neighbor_net.py +0 -0
  97. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/network_signal.py +0 -0
  98. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ou_shift_detection.py +0 -0
  99. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ouwie.py +0 -0
  100. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/parsimony_score.py +0 -0
  101. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/patristic_distances.py +0 -0
  102. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phenogram.py +0 -0
  103. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_heatmap.py +0 -0
  104. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_impute.py +0 -0
  105. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_logistic.py +0 -0
  106. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_glm.py +0 -0
  107. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_ordination.py +0 -0
  108. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_regression.py +0 -0
  109. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_signal.py +0 -0
  110. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylomorphospace.py +0 -0
  111. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/polytomy_test.py +0 -0
  112. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/print_tree.py +0 -0
  113. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/prune_tree.py +0 -0
  114. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/quartet_network.py +0 -0
  115. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rate_heterogeneity.py +0 -0
  116. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/relative_rate_test.py +0 -0
  117. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rename_tree_tips.py +0 -0
  118. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rf_distance.py +0 -0
  119. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/root_tree.py +0 -0
  120. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/saturation.py +0 -0
  121. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spectral_discordance.py +0 -0
  122. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spr.py +0 -0
  123. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spurious_sequence.py +0 -0
  124. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/stochastic_character_map.py +0 -0
  125. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/terminal_branch_stats.py +0 -0
  126. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/threshold_model.py +0 -0
  127. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_labels.py +0 -0
  128. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_distance.py +0 -0
  129. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_node_distance.py +0 -0
  130. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/total_tree_length.py +0 -0
  131. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/trait_correlation.py +0 -0
  132. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/trait_rate_map.py +0 -0
  133. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tree_space.py +0 -0
  134. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/treeness.py +0 -0
  135. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/treeness_over_rcv.py +0 -0
  136. {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/vcv_utils.py +0 -0
  137. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/dependency_links.txt +0 -0
  138. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/requires.txt +0 -0
  139. {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/top_level.txt +0 -0
  140. {phykit-2.1.79 → phykit-2.1.81}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phykit
3
- Version: 2.1.79
3
+ Version: 2.1.81
4
4
  Home-page: https://github.com/jlsteenwyk/phykit
5
5
  Author: Jacob L. Steenwyk
6
6
  Author-email: jlsteenwyk@gmail.com
@@ -55,6 +55,10 @@ ALIAS_TO_HANDLER: Dict[str, str] = {
55
55
  "sum_of_pairs_score": "sum_of_pairs_score",
56
56
  "sops": "sum_of_pairs_score",
57
57
  "sop": "sum_of_pairs_score",
58
+ "phylo_anova": "phylo_anova",
59
+ "panova": "phylo_anova",
60
+ "phylo_manova": "phylo_anova",
61
+ "pmanova": "phylo_anova",
58
62
  "phylo_gwas": "phylo_gwas",
59
63
  "pgwas": "phylo_gwas",
60
64
  "vs": "variable_sites",
@@ -114,6 +114,42 @@ def parse_astral_annotations(
114
114
  return result
115
115
 
116
116
 
117
+ def parse_astral_branch_info(
118
+ tree,
119
+ ) -> Dict[int, Dict[str, float]]:
120
+ """Parse f1 (concordant count) and pp1 (LPP) from ASTRAL/wASTRAL labels.
121
+
122
+ Returns dict mapping clade id -> {"f1": ..., "pp1": ...}.
123
+ Keys are only present if the value was found in the annotation.
124
+ """
125
+ result = {}
126
+ for clade in tree.find_clades(order="preorder"):
127
+ if clade.is_terminal():
128
+ continue
129
+ label = clade.name or clade.comment or ""
130
+ info = _parse_branch_info_from_label(str(label))
131
+ if info:
132
+ result[id(clade)] = info
133
+ return result
134
+
135
+
136
+ def _parse_branch_info_from_label(label: str) -> Dict[str, float]:
137
+ """Extract f1, pp1 (and optionally f2, f3, pp2, pp3) from an ASTRAL label."""
138
+ s = label.strip("'\"").strip("[]")
139
+ info = {}
140
+ for part in s.split(";"):
141
+ if "=" not in part:
142
+ continue
143
+ key, val = part.split("=", 1)
144
+ key = key.strip()
145
+ try:
146
+ if key in ("f1", "f2", "f3", "pp1", "pp2", "pp3"):
147
+ info[key] = float(val)
148
+ except ValueError:
149
+ continue
150
+ return info
151
+
152
+
117
153
  def _parse_qs_from_label(label: str) -> Optional[Tuple[float, float, float]]:
118
154
  """Extract q1, q2, q3 from an ASTRAL node label string."""
119
155
  s = label.strip("'\"").strip("[]")
@@ -248,6 +248,8 @@ class Phykit:
248
248
  - fit phylogenetic generalized least squares (PGLS) regression
249
249
  phylogenetic_glm (alias: phylo_glm; pglm)
250
250
  - fit phylogenetic GLM for binary (logistic) or count (Poisson) data
251
+ phylo_anova (alias: panova; phylo_manova; pmanova)
252
+ - phylogenetic ANOVA / MANOVA using RRPP (Adams & Collyer 2018)
251
253
  phylo_logistic (alias: phylo_logreg; plogreg)
252
254
  - fit phylogenetic logistic regression (Ives & Garland 2010)
253
255
  stochastic_character_map (alias: simmap; scm)
@@ -2004,6 +2006,87 @@ class Phykit:
2004
2006
  _add_json_argument(parser)
2005
2007
  _run_service(parser, argv, PhyloGwas)
2006
2008
 
2009
+ @staticmethod
2010
+ def phylo_anova(argv):
2011
+ parser = _new_parser(
2012
+ description=textwrap.dedent(
2013
+ f"""\
2014
+ {help_header}
2015
+
2016
+ Phylogenetic ANOVA / MANOVA using the Residual
2017
+ Randomization Permutation Procedure (RRPP) of
2018
+ Adams & Collyer (2018).
2019
+
2020
+ Tests whether a continuous trait (ANOVA) or multiple
2021
+ traits (MANOVA) differ across discrete groups while
2022
+ accounting for phylogenetic non-independence.
2023
+
2024
+ Auto-detects univariate vs multivariate based on the
2025
+ number of response trait columns. Override with
2026
+ --method anova or --method manova.
2027
+
2028
+ Aliases:
2029
+ phylo_anova, panova, phylo_manova, pmanova
2030
+ Command line interfaces:
2031
+ pk_phylo_anova, pk_panova, pk_phylo_manova, pk_pmanova
2032
+
2033
+ Usage:
2034
+ phykit phylo_anova -t <tree> --traits <traits_file>
2035
+ [--group-column <name>] [--method auto|anova|manova]
2036
+ [--permutations <int>] [--pairwise]
2037
+ [--plot-output <file>] [--plot-type boxplot|phylomorphospace]
2038
+ [--seed <int>] [--json]
2039
+
2040
+ Options
2041
+ =====================================================
2042
+ -t/--tree species tree file (required)
2043
+
2044
+ --traits TSV file with taxon, group
2045
+ column, and one or more
2046
+ response trait columns
2047
+ (required)
2048
+
2049
+ --group-column name of the categorical
2050
+ grouping column (default:
2051
+ first non-taxon column)
2052
+
2053
+ --method analysis method: auto, anova,
2054
+ or manova (default: auto)
2055
+
2056
+ --permutations number of RRPP permutations
2057
+ (default: 1000)
2058
+
2059
+ --pairwise include post-hoc pairwise
2060
+ group comparisons
2061
+
2062
+ --plot-output output figure path
2063
+ (.png, .pdf, .svg)
2064
+
2065
+ --plot-type boxplot or phylomorphospace
2066
+ (default: auto — boxplot for
2067
+ ANOVA, phylomorphospace for
2068
+ MANOVA)
2069
+
2070
+ --seed random seed for reproducible
2071
+ permutations
2072
+
2073
+ --json output results as JSON
2074
+ """
2075
+ ),
2076
+ )
2077
+ parser.add_argument("-t", "--tree", type=str, required=True, help=SUPPRESS, metavar="")
2078
+ parser.add_argument("--traits", type=str, required=True, help=SUPPRESS, metavar="")
2079
+ parser.add_argument("--group-column", type=str, default=None, help=SUPPRESS, metavar="")
2080
+ parser.add_argument("--method", type=str, default="auto", choices=["auto", "anova", "manova"], help=SUPPRESS, metavar="")
2081
+ parser.add_argument("--permutations", type=int, default=1000, help=SUPPRESS, metavar="")
2082
+ parser.add_argument("--pairwise", action="store_true", help=SUPPRESS)
2083
+ parser.add_argument("--plot-output", type=str, default=None, help=SUPPRESS, metavar="")
2084
+ parser.add_argument("--plot-type", type=str, default="auto", choices=["auto", "boxplot", "phylomorphospace"], help=SUPPRESS, metavar="")
2085
+ parser.add_argument("--seed", type=int, default=None, help=SUPPRESS, metavar="")
2086
+ add_plot_arguments(parser)
2087
+ _add_json_argument(parser)
2088
+ _run_service(parser, argv, PhyloAnova)
2089
+
2007
2090
  @staticmethod
2008
2091
  def alignment_subsample(argv):
2009
2092
  parser = _new_parser(
@@ -6076,6 +6159,11 @@ class Phykit:
6076
6159
  and branch colors (iTOL-
6077
6160
  inspired TSV format)
6078
6161
 
6162
+ --branch-labels show concordant gene count
6163
+ above and LPP support below
6164
+ each internal branch
6165
+ (PhyTop-style)
6166
+
6079
6167
  --csv output per-branch concordance
6080
6168
  values as a CSV file
6081
6169
 
@@ -6102,6 +6190,9 @@ class Phykit:
6102
6190
  parser.add_argument(
6103
6191
  "--annotate", action="store_true", required=False, help=SUPPRESS
6104
6192
  )
6193
+ parser.add_argument(
6194
+ "--branch-labels", action="store_true", required=False, help=SUPPRESS
6195
+ )
6105
6196
  parser.add_argument(
6106
6197
  "--csv", type=str, required=False, default=None,
6107
6198
  help=SUPPRESS, metavar=""
@@ -8677,6 +8768,10 @@ def phylo_gwas(argv=None):
8677
8768
  Phykit.phylo_gwas(sys.argv[1:])
8678
8769
 
8679
8770
 
8771
+ def phylo_anova(argv=None):
8772
+ Phykit.phylo_anova(sys.argv[1:])
8773
+
8774
+
8680
8775
  def dfoil(argv=None):
8681
8776
  Phykit.dfoil(sys.argv[1:])
8682
8777
 
@@ -44,6 +44,7 @@ RelativeCompositionVariability = _LazyServiceFactory("phykit.services.alignment.
44
44
  RelativeCompositionVariabilityTaxon = _LazyServiceFactory("phykit.services.alignment.rcvt", "RelativeCompositionVariabilityTaxon")
45
45
  RenameFastaEntries = _LazyServiceFactory("phykit.services.alignment.rename_fasta_entries", "RenameFastaEntries")
46
46
  SumOfPairsScore = _LazyServiceFactory("phykit.services.alignment.sum_of_pairs_score", "SumOfPairsScore")
47
+ PhyloAnova = _LazyServiceFactory("phykit.services.tree.phylo_anova", "PhyloAnova")
47
48
  PhyloGwas = _LazyServiceFactory("phykit.services.alignment.phylo_gwas", "PhyloGwas")
48
49
  TaxonGroups = _LazyServiceFactory("phykit.services.alignment.taxon_groups", "TaxonGroups")
49
50
  VariableSites = _LazyServiceFactory("phykit.services.alignment.variable_sites", "VariableSites")
@@ -52,6 +52,7 @@ _EXPORTS = {
52
52
  "TreenessOverRCV": "treeness_over_rcv",
53
53
  "ConcordanceAsr": "concordance_asr",
54
54
  "PhyloLogistic": "phylo_logistic",
55
+ "PhyloAnova": "phylo_anova",
55
56
  "PhyloImpute": "phylo_impute",
56
57
  "TraitCorrelation": "trait_correlation",
57
58
  "TraitRateMap": "trait_rate_map",