phykit 2.1.80__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.80 → phykit-2.1.81}/PKG-INFO +1 -1
  2. {phykit-2.1.80 → phykit-2.1.81}/phykit/cli_registry.py +4 -0
  3. {phykit-2.1.80 → phykit-2.1.81}/phykit/phykit.py +87 -0
  4. {phykit-2.1.80 → phykit-2.1.81}/phykit/service_factories.py +1 -0
  5. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/__init__.py +1 -0
  6. phykit-2.1.81/phykit/services/tree/phylo_anova.py +808 -0
  7. phykit-2.1.81/phykit/version.py +1 -0
  8. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/PKG-INFO +1 -1
  9. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/SOURCES.txt +1 -0
  10. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/entry_points.txt +4 -0
  11. {phykit-2.1.80 → phykit-2.1.81}/setup.py +4 -0
  12. phykit-2.1.80/phykit/version.py +0 -1
  13. {phykit-2.1.80 → phykit-2.1.81}/LICENSE.md +0 -0
  14. {phykit-2.1.80 → phykit-2.1.81}/README.md +0 -0
  15. {phykit-2.1.80 → phykit-2.1.81}/phykit/__init__.py +0 -0
  16. {phykit-2.1.80 → phykit-2.1.81}/phykit/__main__.py +0 -0
  17. {phykit-2.1.80 → phykit-2.1.81}/phykit/errors.py +0 -0
  18. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/__init__.py +0 -0
  19. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/boolean_argument_parsing.py +0 -0
  20. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/caching.py +0 -0
  21. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/circular_layout.py +0 -0
  22. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/color_annotations.py +0 -0
  23. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/discrete_models.py +0 -0
  24. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/files.py +0 -0
  25. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/json_output.py +0 -0
  26. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/parallel.py +0 -0
  27. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/parsimony_utils.py +0 -0
  28. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/plot_config.py +0 -0
  29. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/quartet_utils.py +0 -0
  30. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/stats_summary.py +0 -0
  31. {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/streaming.py +0 -0
  32. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/__init__.py +0 -0
  33. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/__init__.py +0 -0
  34. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_entropy.py +0 -0
  35. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_length.py +0 -0
  36. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_length_no_gaps.py +0 -0
  37. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_outlier_taxa.py +0 -0
  38. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_recoding.py +0 -0
  39. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_subsample.py +0 -0
  40. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/base.py +0 -0
  41. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/column_score.py +0 -0
  42. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/composition_per_taxon.py +0 -0
  43. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/compositional_bias_per_site.py +0 -0
  44. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/create_concatenation_matrix.py +0 -0
  45. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dfoil.py +0 -0
  46. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dna_threader.py +0 -0
  47. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dstatistic.py +0 -0
  48. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/evolutionary_rate_per_site.py +0 -0
  49. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/faidx.py +0 -0
  50. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/gc_content.py +0 -0
  51. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/identity_matrix.py +0 -0
  52. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/mask_alignment.py +0 -0
  53. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/occupancy_per_taxon.py +0 -0
  54. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/pairwise_identity.py +0 -0
  55. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/parsimony_informative_sites.py +0 -0
  56. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/phylo_gwas.py +0 -0
  57. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/plot_alignment_qc.py +0 -0
  58. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rcv.py +0 -0
  59. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rcvt.py +0 -0
  60. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rename_fasta_entries.py +0 -0
  61. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/sum_of_pairs_score.py +0 -0
  62. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/taxon_groups.py +0 -0
  63. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/variable_sites.py +0 -0
  64. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/base.py +0 -0
  65. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ancestral_reconstruction.py +0 -0
  66. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/base.py +0 -0
  67. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/bipartition_support_stats.py +0 -0
  68. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/branch_length_multiplier.py +0 -0
  69. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/character_map.py +0 -0
  70. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/collapse_branches.py +0 -0
  71. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/concordance_asr.py +0 -0
  72. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/consensus_network.py +0 -0
  73. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/consensus_tree.py +0 -0
  74. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/cont_map.py +0 -0
  75. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/cophylo.py +0 -0
  76. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/covarying_evolutionary_rates.py +0 -0
  77. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/density_map.py +0 -0
  78. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/discordance_asymmetry.py +0 -0
  79. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/dvmc.py +0 -0
  80. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/evo_tempo_map.py +0 -0
  81. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/evolutionary_rate.py +0 -0
  82. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/fit_continuous.py +0 -0
  83. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/fit_discrete.py +0 -0
  84. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/hidden_paralogy_check.py +0 -0
  85. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/hybridization.py +0 -0
  86. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/independent_contrasts.py +0 -0
  87. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/internal_branch_stats.py +0 -0
  88. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/internode_labeler.py +0 -0
  89. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/kf_distance.py +0 -0
  90. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/last_common_ancestor_subtree.py +0 -0
  91. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/lb_score.py +0 -0
  92. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ltt.py +0 -0
  93. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/monophyly_check.py +0 -0
  94. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/nearest_neighbor_interchange.py +0 -0
  95. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/neighbor_net.py +0 -0
  96. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/network_signal.py +0 -0
  97. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ou_shift_detection.py +0 -0
  98. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ouwie.py +0 -0
  99. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/parsimony_score.py +0 -0
  100. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/patristic_distances.py +0 -0
  101. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phenogram.py +0 -0
  102. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_heatmap.py +0 -0
  103. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_impute.py +0 -0
  104. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_logistic.py +0 -0
  105. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_glm.py +0 -0
  106. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_ordination.py +0 -0
  107. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_regression.py +0 -0
  108. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_signal.py +0 -0
  109. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylomorphospace.py +0 -0
  110. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/polytomy_test.py +0 -0
  111. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/print_tree.py +0 -0
  112. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/prune_tree.py +0 -0
  113. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/quartet_network.py +0 -0
  114. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/quartet_pie.py +0 -0
  115. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rate_heterogeneity.py +0 -0
  116. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/relative_rate_test.py +0 -0
  117. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rename_tree_tips.py +0 -0
  118. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rf_distance.py +0 -0
  119. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/root_tree.py +0 -0
  120. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/saturation.py +0 -0
  121. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spectral_discordance.py +0 -0
  122. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spr.py +0 -0
  123. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spurious_sequence.py +0 -0
  124. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/stochastic_character_map.py +0 -0
  125. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/terminal_branch_stats.py +0 -0
  126. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/threshold_model.py +0 -0
  127. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_labels.py +0 -0
  128. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_distance.py +0 -0
  129. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_node_distance.py +0 -0
  130. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/total_tree_length.py +0 -0
  131. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/trait_correlation.py +0 -0
  132. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/trait_rate_map.py +0 -0
  133. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tree_space.py +0 -0
  134. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/treeness.py +0 -0
  135. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/treeness_over_rcv.py +0 -0
  136. {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/vcv_utils.py +0 -0
  137. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/dependency_links.txt +0 -0
  138. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/requires.txt +0 -0
  139. {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/top_level.txt +0 -0
  140. {phykit-2.1.80 → 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.80
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",
@@ -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(
@@ -8685,6 +8768,10 @@ def phylo_gwas(argv=None):
8685
8768
  Phykit.phylo_gwas(sys.argv[1:])
8686
8769
 
8687
8770
 
8771
+ def phylo_anova(argv=None):
8772
+ Phykit.phylo_anova(sys.argv[1:])
8773
+
8774
+
8688
8775
  def dfoil(argv=None):
8689
8776
  Phykit.dfoil(sys.argv[1:])
8690
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",