From c5041cb8c5d0d8bf6c05cc8d057c1500403c124e Mon Sep 17 00:00:00 2001 From: "Brian M. Schilder" <34280215+bschilder@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:14:59 +0000 Subject: [PATCH] separate KGExplorer funcs --- .DS_Store | Bin 0 -> 6148 bytes DESCRIPTION | 32 +- NAMESPACE | 45 +- NEWS.md | 43 +- R/.DS_Store | Bin 0 -> 6148 bytes R/_docs.R | 118 ++++ R/add_ancestor.R | 61 +- R/add_death.R | 14 +- R/add_disease.R | 24 +- R/add_disease_definition.R | 88 --- R/add_disease_genes.R | 9 +- R/add_evidence.R | 16 +- R/add_gene_frequency.R | 9 +- R/add_genes.R | 12 +- R/add_hpo_definition.R | 1 + R/add_hpo_id.R | 22 +- R/add_hpo_synonym.R | 88 +-- R/add_info_content.R | 18 +- R/add_medgen.R | 44 -- R/add_mondo.R | 73 +-- R/add_ndisease.R | 1 + R/add_omop.R | 36 +- R/add_onset.R | 11 +- R/add_ont_lvl.R | 28 +- R/add_pheno_frequency.R | 12 +- R/add_prevalence.R | 49 +- R/add_prevalence_oard.R | 10 - R/add_prevalence_orphanet.R | 42 -- R/add_prevalence_report.R | 4 +- R/add_severity.R | 13 +- R/add_tier.R | 1 + R/adjacency_matrix.R | 55 -- R/annotate_phenos.R | 53 +- R/as_ascii.R | 12 +- R/clear_cache.R | 26 - R/convert_ontology.R | 99 --- R/data.R | 32 +- R/example_phenos.R | 6 +- R/filter_descendants.R | 39 ++ R/fix_hpo_ids.R | 23 +- R/get_data.R | 5 +- R/get_gencc.R | 74 --- R/get_gene_lengths.R | 42 -- R/get_gene_lists.R | 7 +- R/get_hpo.R | 41 +- R/get_hpo_id_direct.R | 13 +- R/get_kg_monarch.R | 42 -- R/get_max_ont_lvl.R | 15 - R/get_metadata_omim.R | 20 - R/get_metadata_orphanet.R | 21 - R/get_monarch.R | 58 -- R/get_mondo.R | 28 - R/get_ont_lvl.R | 73 --- R/get_ont_lvls.R | 77 --- R/get_ont_lvls2.R | 49 -- R/get_orphanet_epidemiology.R | 79 --- R/get_term_definition_api.R | 1 - R/get_term_definition_data.R | 4 +- R/get_upheno.R | 68 -- R/get_version.R | 34 - R/gpt_annot_check.R | 4 +- R/harmonise_phenotypes.R | 83 --- R/hpo_modifiers_agg.R | 6 +- R/hpo_to_matrix.R | 8 +- R/ids_to_mondo.R | 12 - R/igraph_to_ggnetwork.R | 5 - R/igraph_to_plotly.R | 69 -- R/invert_dict.R | 3 - R/kde_surface.R | 57 -- R/list_deaths.R | 22 +- R/list_onsets.R | 20 +- R/load_decipher_genes.R | 27 - R/load_disease_genes.R | 31 - R/load_harmonizome_genes.R | 11 - R/load_omim_genes.R | 12 - R/load_orphanet_genes.R | 35 -- R/load_phenotype_to_genes.R | 9 +- R/make_hoverboxes.R | 69 -- R/make_igraph_object.R | 38 +- R/make_network_object.R | 80 +-- R/make_node_data.R | 13 +- R/make_ontology.R | 58 -- R/make_phenos_dataframe.R | 61 +- R/{assign_tiers.R => make_tiers.R} | 62 +- R/map_models.R | 26 - R/map_phenotypes.R | 26 + R/map_upheno.R | 69 -- R/map_upheno_data.R | 61 -- R/map_upheno_data_i.R | 198 ------ R/map_upheno_heatmap.R | 97 --- R/map_upheno_nn.R | 62 -- R/map_upheno_plots.R | 52 -- R/map_upheno_rainplot.R | 51 -- R/map_upheno_scatterplot.R | 11 - R/mondo_to_matrix.R | 48 -- R/network_3d.R | 231 ------- R/oard_query_api.R | 49 -- R/parse_pheno_frequency.R | 10 +- R/per_branch_plot.R | 48 +- R/phenos_to_granges.R | 12 +- R/read_enrichr.R | 7 - R/report_missing.R | 14 +- R/search_hpo.R | 15 +- R/subset_descendants.R | 46 -- R/unlist_col.R | 8 +- inst/.DS_Store | Bin 6148 -> 6148 bytes inst/extdata/.DS_Store | Bin 0 -> 6148 bytes inst/extdata/orphanet_epidemiology.csv.gz | Bin 544729 -> 0 bytes inst/hex/hexSticker.Rmd | 2 +- man/add_.Rd | 594 ++++++++++++++++++ man/add_ancestor.Rd | 47 -- man/add_death.Rd | 72 --- man/add_disease.Rd | 51 -- man/add_disease_definition.Rd | 47 -- man/add_disease_genes.Rd | 31 - man/add_evidence.Rd | 66 -- man/add_gene_frequency.Rd | 45 -- man/add_genes.Rd | 50 -- man/add_hpo_definition.Rd | 36 -- man/add_hpo_id.Rd | 35 -- man/add_hpo_synonym.Rd | 37 -- man/add_info_content.Rd | 25 - man/add_mondo.Rd | 46 -- man/add_ndisease.Rd | 41 -- man/add_omop.Rd | 46 -- man/add_onset.Rd | 72 --- man/add_ont_lvl.Rd | 55 -- man/add_pheno_frequency.Rd | 45 -- man/add_prevalence.Rd | 36 -- man/add_severity.Rd | 54 -- man/add_tier.Rd | 69 -- man/adjacency_matrix.Rd | 35 -- man/assign_tiers.Rd | 77 --- man/clear_cache.Rd | 42 -- man/convert_ontology.Rd | 39 -- man/disease_id_to_omop.Rd | 6 +- man/example_phenos.Rd | 20 - man/filter_.Rd | 44 ++ man/fix_hpo_ids.Rd | 8 +- man/get_.Rd | 95 +++ man/get_data.Rd | 2 +- man/get_gencc.Rd | 47 -- man/get_gene_lists.Rd | 5 +- man/get_hpo.Rd | 43 -- man/get_hpo_id_direct.Rd | 24 - man/get_kg_monarch.Rd | 18 - man/get_monarch.Rd | 85 --- man/get_mondo.Rd | 36 -- man/get_ont_lvl.Rd | 40 -- man/get_ont_lvls.Rd | 61 -- man/get_ont_lvls2.Rd | 50 -- man/get_term_definition_api.Rd | 3 - man/get_upheno.Rd | 37 -- man/get_version.Rd | 30 - man/gpt_annot_plot.Rd | 4 +- man/harmonise_phenotypes.Rd | 54 -- man/hpo_deaths.Rd | 7 +- man/hpo_frequencies.Rd | 2 +- man/hpo_id_to_omop.Rd | 8 +- man/hpo_modifiers.Rd | 2 +- man/hpo_onsets.Rd | 3 +- man/hpo_tiers_auto.Rd | 4 +- man/hpo_to_matrix.Rd | 2 +- man/igraph_to_plotly.Rd | 33 - man/kde_surface.Rd | 46 -- man/list_columns.Rd | 2 +- man/list_deaths.Rd | 34 - man/list_onsets.Rd | 34 - man/load_disease_genes.Rd | 25 - man/load_phenotype_to_genes.Rd | 2 +- man/{annotate_phenos.Rd => main.Rd} | 61 +- man/make_.Rd | 240 +++++++ man/make_hoverboxes.Rd | 54 -- man/make_igraph_object.Rd | 68 -- man/make_network_object.Rd | 69 -- man/make_ontology.Rd | 54 -- man/make_phenos_dataframe.Rd | 98 --- man/map_.Rd | 99 +++ man/map_upheno.Rd | 69 -- man/map_upheno_data.Rd | 68 -- man/map_upheno_plot.Rd | 33 - man/network_3d.Rd | 114 ---- man/per_branch_plot.Rd | 10 +- man/phenos_to_granges.Rd | 11 +- man/search_hpo.Rd | 3 +- man/subset_descendants.Rd | 41 -- man/unlist_col.Rd | 4 +- tests/testthat/test-add_hpo_id.R | 4 +- tests/testthat/test-add_omop.R | 4 +- tests/testthat/test-add_ont_lvl.R | 3 +- tests/testthat/test-as_ascii.R | 4 +- tests/testthat/test-assign_tiers.R | 6 - tests/testthat/test-clear_cache.R | 11 - ...escendants.R => test-filter_descendants.R} | 4 +- tests/testthat/test-get_hpo.R | 2 +- tests/testthat/test-get_ont_lvls.R | 44 -- tests/testthat/test-ggnetwork_plot.R | 2 +- tests/testthat/test-list_onsets.R | 1 - tests/testthat/test-make_tiers.R | 6 + tests/testthat/test-map_upheno.R | 21 - ...test-network_3d.R => test-plot_graph_3d.R} | 10 +- vignettes/HPOExplorer.Rmd | 6 +- 202 files changed, 1902 insertions(+), 5989 deletions(-) create mode 100644 .DS_Store create mode 100644 R/.DS_Store create mode 100644 R/_docs.R delete mode 100644 R/add_disease_definition.R delete mode 100644 R/add_medgen.R delete mode 100644 R/add_prevalence_oard.R delete mode 100644 R/add_prevalence_orphanet.R delete mode 100644 R/adjacency_matrix.R delete mode 100644 R/clear_cache.R delete mode 100644 R/convert_ontology.R create mode 100644 R/filter_descendants.R delete mode 100644 R/get_gencc.R delete mode 100644 R/get_gene_lengths.R delete mode 100644 R/get_kg_monarch.R delete mode 100644 R/get_max_ont_lvl.R delete mode 100644 R/get_metadata_omim.R delete mode 100644 R/get_metadata_orphanet.R delete mode 100644 R/get_monarch.R delete mode 100644 R/get_mondo.R delete mode 100644 R/get_ont_lvl.R delete mode 100644 R/get_ont_lvls.R delete mode 100644 R/get_ont_lvls2.R delete mode 100644 R/get_orphanet_epidemiology.R delete mode 100644 R/get_upheno.R delete mode 100644 R/get_version.R delete mode 100644 R/harmonise_phenotypes.R delete mode 100644 R/ids_to_mondo.R delete mode 100644 R/igraph_to_ggnetwork.R delete mode 100644 R/igraph_to_plotly.R delete mode 100644 R/invert_dict.R delete mode 100644 R/kde_surface.R delete mode 100644 R/load_decipher_genes.R delete mode 100644 R/load_disease_genes.R delete mode 100644 R/load_harmonizome_genes.R delete mode 100644 R/load_omim_genes.R delete mode 100644 R/load_orphanet_genes.R delete mode 100644 R/make_hoverboxes.R delete mode 100644 R/make_ontology.R rename R/{assign_tiers.R => make_tiers.R} (77%) delete mode 100644 R/map_models.R create mode 100644 R/map_phenotypes.R delete mode 100644 R/map_upheno.R delete mode 100644 R/map_upheno_data.R delete mode 100644 R/map_upheno_data_i.R delete mode 100644 R/map_upheno_heatmap.R delete mode 100644 R/map_upheno_nn.R delete mode 100644 R/map_upheno_plots.R delete mode 100644 R/map_upheno_rainplot.R delete mode 100644 R/map_upheno_scatterplot.R delete mode 100644 R/mondo_to_matrix.R delete mode 100644 R/network_3d.R delete mode 100644 R/oard_query_api.R delete mode 100644 R/read_enrichr.R delete mode 100644 R/subset_descendants.R create mode 100644 inst/extdata/.DS_Store delete mode 100644 inst/extdata/orphanet_epidemiology.csv.gz create mode 100644 man/add_.Rd delete mode 100644 man/add_ancestor.Rd delete mode 100644 man/add_death.Rd delete mode 100644 man/add_disease.Rd delete mode 100644 man/add_disease_definition.Rd delete mode 100644 man/add_disease_genes.Rd delete mode 100644 man/add_evidence.Rd delete mode 100644 man/add_gene_frequency.Rd delete mode 100644 man/add_genes.Rd delete mode 100644 man/add_hpo_definition.Rd delete mode 100644 man/add_hpo_id.Rd delete mode 100644 man/add_hpo_synonym.Rd delete mode 100644 man/add_info_content.Rd delete mode 100644 man/add_mondo.Rd delete mode 100644 man/add_ndisease.Rd delete mode 100644 man/add_omop.Rd delete mode 100644 man/add_onset.Rd delete mode 100644 man/add_ont_lvl.Rd delete mode 100644 man/add_pheno_frequency.Rd delete mode 100644 man/add_prevalence.Rd delete mode 100644 man/add_severity.Rd delete mode 100644 man/add_tier.Rd delete mode 100644 man/adjacency_matrix.Rd delete mode 100644 man/assign_tiers.Rd delete mode 100644 man/clear_cache.Rd delete mode 100644 man/convert_ontology.Rd delete mode 100644 man/example_phenos.Rd create mode 100644 man/filter_.Rd create mode 100644 man/get_.Rd delete mode 100644 man/get_gencc.Rd delete mode 100644 man/get_hpo.Rd delete mode 100644 man/get_hpo_id_direct.Rd delete mode 100644 man/get_kg_monarch.Rd delete mode 100644 man/get_monarch.Rd delete mode 100644 man/get_mondo.Rd delete mode 100644 man/get_ont_lvl.Rd delete mode 100644 man/get_ont_lvls.Rd delete mode 100644 man/get_ont_lvls2.Rd delete mode 100644 man/get_upheno.Rd delete mode 100644 man/get_version.Rd delete mode 100644 man/harmonise_phenotypes.Rd delete mode 100644 man/igraph_to_plotly.Rd delete mode 100644 man/kde_surface.Rd delete mode 100644 man/list_deaths.Rd delete mode 100644 man/list_onsets.Rd delete mode 100644 man/load_disease_genes.Rd rename man/{annotate_phenos.Rd => main.Rd} (63%) create mode 100644 man/make_.Rd delete mode 100644 man/make_hoverboxes.Rd delete mode 100644 man/make_igraph_object.Rd delete mode 100644 man/make_network_object.Rd delete mode 100644 man/make_ontology.Rd delete mode 100644 man/make_phenos_dataframe.Rd create mode 100644 man/map_.Rd delete mode 100644 man/map_upheno.Rd delete mode 100644 man/map_upheno_data.Rd delete mode 100644 man/map_upheno_plot.Rd delete mode 100644 man/network_3d.Rd delete mode 100644 man/subset_descendants.Rd delete mode 100644 tests/testthat/test-assign_tiers.R delete mode 100644 tests/testthat/test-clear_cache.R rename tests/testthat/{test-subset_descendants.R => test-filter_descendants.R} (71%) delete mode 100644 tests/testthat/test-get_ont_lvls.R create mode 100644 tests/testthat/test-make_tiers.R delete mode 100644 tests/testthat/test-map_upheno.R rename tests/testthat/{test-network_3d.R => test-plot_graph_3d.R} (54%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..19582aa423afc60ecf4884f412f52689a4e5081f GIT binary patch literal 6148 zcmeH~JqiLr422WjLa?#4oW=uqgF*BHdI1Z;Mph8Co}>Hnqu^>SA}=ucCfQ_{eZ|g3 zM09mMEJbD_GQl#+!rZ_VvC8(gyY#1XfAr{4GRjTV;2wkPk2;bHPys4H1*iZO_#Fl8 z+=fl2L3%1c1*pJN0sB4_EMrZ!pnp2xd;|bHq}{OhSpqDU0Bf=Zk%4Kng3+ozhFIR) z!IE_~*@Dq7n!|_Ylhvjem`1y3K>*Y0prZm*V4%P_;+dWQ8>~7tnC{X=;d%PKLH5rD4t`v;d-$RSd%S?42(YlE(0AE_^JYTP5utv literal 0 HcmV?d00001 diff --git a/DESCRIPTION b/DESCRIPTION index 263761f..604e0f8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: HPOExplorer Title: Analysis and Visualisation of the Human Phenotype Ontology -Version: 0.99.12 +Version: 1.0.0 Authors@R: c( person(given = "Brian", @@ -18,25 +18,21 @@ Authors@R: role = c("aut"), email = "nathan.skene@gmail.com", comment = c(ORCID = "0000-0002-6807-3180"))) -Description: HPOExplorer contains useful functions for working with - the Human Phenotype Ontology (HPO). - It allows you to create interactive phenotype network plots, - which can be useful for making web applications. - It also has functions for finding ontology level - (n generations of terms below the selected term), - and getting term definitions from HPO API. +Description: Import, annotate and visualise the 18k+ hierarchically structured + clinical phenotypes across the Human Phenotype Ontology. License: GPL-3 URL: https://github.com/neurogenomics/HPOExplorer BugReports: https://github.com/neurogenomics/HPOExplorer/issues Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.0 Depends: R (>= 4.1.0) Imports: + KGExplorer, + simona, ggplot2, - plotly, - ontologyIndex, + plotly, utils, stats, methods, @@ -45,31 +41,27 @@ Imports: tools, data.table, stringr, - EnsDb.Hsapiens.v75, - ensembldb, - AnnotationFilter, - GenomicRanges, - AnnotationHub + GenomicRanges Suggests: rmarkdown, knitr, devtools, - BiocStyle, rworkflows, here, httr, jsonlite, testthat (>= 3.0.0), - igraph, pals, Matrix, MASS, scales, htmlwidgets, - R.utils, piggyback, patchwork, - BiocParallel + igraph, + tidygraph +Remotes: + github::neurogenomics/KGExplorer VignetteBuilder: knitr biocViews: Genetics, Preprocessing, GeneTarget, SystemsBiology, diff --git a/NAMESPACE b/NAMESPACE index 1fd52e6..81ea4ea 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,14 +3,12 @@ export(add_ancestor) export(add_death) export(add_disease) -export(add_disease_definition) export(add_disease_genes) export(add_evidence) export(add_gene_frequency) export(add_genes) export(add_hpo_definition) export(add_hpo_id) -export(add_hpo_synonym) export(add_info_content) export(add_mondo) export(add_ndisease) @@ -21,89 +19,58 @@ export(add_pheno_frequency) export(add_prevalence) export(add_severity) export(add_tier) -export(adjacency_matrix) export(annotate_phenos) -export(assign_tiers) -export(clear_cache) -export(convert_ontology) export(example_phenos) -export(get_gencc) +export(filter_descendants) export(get_gene_lists) export(get_hpo) export(get_hpo_id_direct) -export(get_monarch) -export(get_mondo) -export(get_ont_lvls) -export(get_ont_lvls2) -export(get_upheno) -export(get_version) export(ggnetwork_plot) export(gpt_annot_check) export(gpt_annot_codify) export(gpt_annot_plot) export(gpt_annot_read) -export(harmonise_phenotypes) export(hpo_api) export(hpo_to_matrix) -export(kde_surface) export(list_columns) export(list_deaths) export(list_onsets) -export(load_disease_genes) export(load_phenotype_to_genes) -export(make_hoverboxes) export(make_igraph_object) export(make_network_object) export(make_phenos_dataframe) -export(map_upheno) -export(map_upheno_data) -export(map_upheno_plot) -export(network_3d) +export(make_tiers) +export(map_phenotypes) export(newlines_to_definition) export(per_branch_plot) export(phenos_to_granges) export(search_hpo) -export(subset_descendants) +import(KGExplorer) import(data.table) import(ggplot2) import(network) +import(simona) +importFrom(KGExplorer,map_mondo) importFrom(data.table,":=") importFrom(data.table,.EACHI) -importFrom(data.table,.N) -importFrom(data.table,.SD) importFrom(data.table,as.data.table) importFrom(data.table,copy) importFrom(data.table,data.table) importFrom(data.table,dcast.data.table) -importFrom(data.table,fcoalesce) importFrom(data.table,fread) importFrom(data.table,merge.data.table) -importFrom(data.table,rbindlist) -importFrom(data.table,setcolorder) -importFrom(data.table,setkey) -importFrom(data.table,setkeyv) importFrom(data.table,setnafill) importFrom(data.table,setnames) importFrom(ggnetwork,geom_edges) importFrom(ggnetwork,ggnetwork) -importFrom(methods,show) -importFrom(ontologyIndex,get_OBO) -importFrom(ontologyIndex,get_ancestors) -importFrom(ontologyIndex,get_descendants) -importFrom(ontologyIndex,get_term_descendancy_matrix) -importFrom(ontologyIndex,get_term_info_content) importFrom(plotly,ggplotly) importFrom(plotly,layout) -importFrom(stats,as.dist) importFrom(stats,as.formula) importFrom(stats,cor) -importFrom(stats,cutree) -importFrom(stats,hclust) importFrom(stats,na.omit) importFrom(stats,setNames) importFrom(stats,terms) importFrom(stringr,str_split) -importFrom(stringr,str_wrap) importFrom(tools,R_user_dir) importFrom(utils,data) importFrom(utils,download.file) diff --git a/NEWS.md b/NEWS.md index 1d6750b..27c3b97 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,40 @@ +# HPOExplorer 1.0.0 + +## New features + +* *MAJOR CHANGES*: Switched from `ontologyIndex` to `simona`, + which seems to be better written and has extensive analysis functions. +* *MAJOR CHANGES*: Moved most non-HPO data annotation to [`KnowledgeNets`](https://github.com/neurogenomics/KnowledgeNets) + - Functions to assess disease or phenotype prevalence (https://github.com/neurogenomics/RareDiseasePrioritisation/issues/34) + - `get_prevalence_orphanet` + - `get_prevalence_oard` + - Functions to assess the existence of models for phenotypes or diseases (https://github.com/neurogenomics/RareDiseasePrioritisation/issues/33) + - `map_upheno` + - `map_upheno_data` + - `map_upheno_plots` + - `map_upheno_heatmap` + - `map_upheno_rainplot` + - `map_upheno_scatterplot` + - `get_monarch` + - `get_monarch_models` + +* New exported functions: + - Helper functions: + - `convert_hpo` + - Functions to map IDs across ontologies: + - `add_medgen` + - `add_omop` + - `add_prevalence` + - `add_prevalence_report` +* New internal functions: + - `dt_to_matrix` + +## Bug fixes + +* `add_mondo` + - Drastically improved cross-ontology mappings to MONDO (https://github.com/monarch-initiative/mondo/issues/6873) + - Add subfunction `map_mondo` + # HPOExplorer 0.99.12 ## New features @@ -11,7 +48,7 @@ - `load_phenotypes_to_genes`: new attribute. - New exported helper function: `get_version` - New exported helper function: `clear_cache` -* Add `make_hpo` internal function. +* Add `make_ontology` internal function. * Ensure consistent function naming: - `create_node_data` --> `make_node_data` * `get_gencc` @@ -179,7 +216,7 @@ * `hpo_tiers`: - Found lots of typos, outdated phenotype names, and mismatched HPO IDs. We through and manually re-curated all of these and checked that they match up with the - `harmonise_phenotypes` output. + `map_phenotypes` output. - Add original `hpo_tiers` csv to *inst/extdata*. * Delete `get_hpo_id` function in favor of `get_hpo_id_direct` which is more reliable and comprehensive. @@ -219,7 +256,7 @@ - `phenos_to_granges` - `add_onset` - `add_tier` - - `harmonise_phenotypes` + - `map_phenotypes` - `get_gene_lists` - `get_gene_lengths` - `list_onsets` diff --git a/R/.DS_Store b/R/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T00){ - x[lvl] - } else {NA} - }) |> unlist() - # phenos[,.(ancestor=unlist(ancestor))] - phenos[,ancestor_name:=hpo$name[ancestor]] + messager(paste0("Adding level-",lvl),"ancestor to each HPO ID.") + hpo <- KGExplorer::add_ancestors(ont = hpo, + lvl = lvl) + ancestors <- hpo@elementMetadata[,c("id","ancestor","ancestor_name")] |> + unique() + phenos <- data.table::merge.data.table(phenos, + ancestors, + by.x = "hpo_id", + by.y = "id", + all.x = TRUE) } else { - messager("hpo_id column not found. Cannot add ancestors.",v=verbose) + messager("hpo_id column not found. Cannot add ancestors.") } #### Filter #### if(!is.null(remove_descendants)){ messager("Removing remove descendants of:", - paste(shQuote(remove_descendants),collapse = "\n -"),v=verbose) - rmd <- HPOExplorer::harmonise_phenotypes(phenotypes = remove_descendants, - hpo = hpo, - as_hpo_ids = TRUE, - keep_order = FALSE, - verbose = verbose) + paste(shQuote(remove_descendants),collapse = "\n -")) + rmd <- map_phenotypes(terms = remove_descendants, + hpo = hpo, + to="id", + keep_order = FALSE) phenos <- phenos[!ancestor %in% rmd,] } return(phenos) diff --git a/R/add_death.R b/R/add_death.R index 091d888..04b7c96 100644 --- a/R/add_death.R +++ b/R/add_death.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add age of death #' #' Add age of death for each HPO ID. @@ -18,10 +19,7 @@ #' @param keep_deaths The age of death associated with each HPO ID to keep. #' If >1 age of death is associated with the term, #' only the earliest age is considered. -#' See \link[HPOExplorer]{add_death} for details. -#' @param agg_by Column to aggregate age of death metadata by. -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table +#' See \link{add_death} for details. #' @returns phenos data.table with extra columns: #' \itemize{ #' \item{"AgeOfDeath": }{AgeOfDeath HPO IDs of disease phenotypes associated @@ -46,19 +44,17 @@ add_death <- function(phenos, keep_deaths = NULL, all.x = TRUE, allow.cartesian = FALSE, - agg_by = NULL, - verbose = TRUE){ + agg_by = NULL){ # devoptera::args2vars(add_death) AgeOfDeath_earliest <- AgeOfDeath_name <- NULL; if(!all(c("AgeOfDeath", "AgeOfDeath_name") %in% names(phenos))){ - messager("Annotating phenos with AgeOfDeath.",v=verbose) + messager("Annotating phenos with AgeOfDeath.") phenos <- add_disease(phenos = phenos, all.x = all.x, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) annot <- pkg_data("hpo_deaths") annot <- annot[,c("disease_id", "AgeOfDeath_name", diff --git a/R/add_disease.R b/R/add_disease.R index 369efbd..bc50741 100644 --- a/R/add_disease.R +++ b/R/add_disease.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add diseases #' #' Annotate each HPO term with diseases that they are associated with. @@ -6,12 +7,6 @@ #' See #' \href{https://hpo-annotation-qc.readthedocs.io/en/latest/annotationFormat.html}{ #' here for column descriptions}. -#' @param add_definitions Add disease definitions using -#' \link[HPOExplorer]{add_disease_definition}. -#' @inheritParams add_disease_definition -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table -#' @returns phenos data.table with extra columns #' #' @export #' @importFrom data.table merge.data.table @@ -22,23 +17,17 @@ add_disease <- function(phenos, # extra_cols = c("Evidence","Reference","Biocuration"), extra_cols = NULL, - include_mondo = TRUE, all.x = TRUE, allow.cartesian = FALSE, - add_definitions = FALSE, - verbose = TRUE){ - - # devoptera::args2vars(add_disease) - + add_definitions = FALSE){ if(!"hpo_id" %in% names(phenos)){ stp <- paste("hpo_id column must be present in phenos.") stop(stp) } if(!all(c("disease_name","disease_id") %in% names(phenos))){ - messager("Annotating phenos with Disease",v=verbose) + messager("Annotating phenos with Disease") annot <- load_phenotype_to_genes(3) #### From disease_id #### - data.table::setnames(phenos,"disease_id","disease_id", skip_absent = TRUE) if("disease_name" %in% names(phenos)){ return(phenos) } @@ -57,12 +46,9 @@ add_disease <- function(phenos, all.x = all.x, allow.cartesian = allow.cartesian) } - #### Add Definitions column and fill out missing disease_name columns #### + #### Add disease definitions and Mondo ID mappings #### if(isTRUE(add_definitions)){ - phenos <- add_disease_definition(phenos = phenos, - all.x = all.x, - include_mondo = include_mondo, - verbose = verbose) + phenos <- add_mondo(phenos = phenos) } return(phenos) } diff --git a/R/add_disease_definition.R b/R/add_disease_definition.R deleted file mode 100644 index 266e68d..0000000 --- a/R/add_disease_definition.R +++ /dev/null @@ -1,88 +0,0 @@ -#' Add disease definition -#' -#' Add metadata for diseases using files from their respective databases: -#' OMIM, DECIPHER, Orphanet. -#' @param id_col Name of the disease ID column. -#' @param cols Metadata columns to include. -#' @param save_dir Directory to save metadata files to. -#' @param include_mondo Add IDs/names/definitions from MONDO via -#' \link[HPOExplorer]{add_mondo}. -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table -#' @returns phenos data.table with extra columns. -#' -#' @export -#' @importFrom data.table merge.data.table fcoalesce := -#' @importFrom utils data -#' @examples -#' phenos <- load_phenotype_to_genes(3)[seq(1000)] -#' phenos2 <- add_disease_definition(phenos = phenos) -add_disease_definition <- function(phenos, - cols = c("Definitions","Preferred.Label"), - id_col = "disease_id", - save_dir = file.path( - tools::R_user_dir("HPOExplorer", - which="cache")), - include_mondo = TRUE, - all.x = TRUE, - verbose = TRUE) { - - # devoptera::args2vars(add_disease_definition) - disease_name <- disease_id <- Preferred.Label <- Definitions <- - MONDO_definition <- NULL; - - #### Check if already filled out #### - if(!is.null(phenos) && - all(cols %in% names(phenos))){ - return(phenos) - } - #### Gather metadata #### - messager("Adding disease metadata:",paste(cols,collapse = ", "),v=verbose) - meta <- list( - ORPH = get_metadata_orphanet(save_dir = save_dir, - verbose = verbose), - OMIM = get_metadata_omim(save_dir = save_dir, - verbose = verbose) - ) |> data.table::rbindlist(fill=TRUE, - use.names = TRUE, - idcol = "Database") - #### Return only metadata #### - if(is.null(phenos)) { - return(meta) - #### Merge metdata #### - } else { - phenos <- - data.table::merge.data.table(phenos, - meta[,unique(c("id",cols)), with=FALSE], - all.x = all.x, - by.x = id_col[1], - by.y = "id") - if("disease_name" %in% names(phenos)){ - #### Report missing #### - report_missing(phenos = phenos, - id_col = id_col, - report_col = c("disease_name","Definitions"), - verbose = verbose) - ## Needs to be lowercase to harmonise across metadata sources, eg.: - ## "CEREBROOCULOFACIOSKELETAL SYNDROME 1" vs. - ## "Cerebrooculofacioskeletal syndrome 1" - phenos[,disease_name:=tolower(data.table::fcoalesce(Preferred.Label, - disease_name, - disease_id))] - } - #### Add mondo #### - if(isTRUE(include_mondo)){ - phenos <- add_mondo(phenos = phenos, - all.x = all.x, - verbose = verbose) - ## Coalesce definitions ## - phenos[,Definitions:=tolower(data.table::fcoalesce(Definitions, - MONDO_definition))] - report_missing(phenos = phenos, - id_col = id_col, - report_col = "Definitions", - verbose = verbose) - } - return(phenos) - } -} diff --git a/R/add_disease_genes.R b/R/add_disease_genes.R index 0204d4d..d96d398 100644 --- a/R/add_disease_genes.R +++ b/R/add_disease_genes.R @@ -1,13 +1,8 @@ +#' @describeIn add_ add_ #' Add disease genes #' #' Add genes that overlap between an HPO ID and an associated phenotype. -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table -#' @returns phenos data.table with extra columns -#' #' @export -#' @importFrom data.table merge.data.table -#' @importFrom utils data #' @examples #' \dontrun{ #' phenos <- load_phenotype_to_genes() @@ -30,7 +25,7 @@ add_disease_genes <- function(phenos, dannot <- load_phenotype_to_genes(file = "phenotype.hpoa") # annot <- annot[hpo_id %in% unique(phenos$hpo_id),] # #### Add hpo_id associations #### - # dgenes <- load_disease_genes() + # dgenes <- get_disease_genes() # dgenes <- data.table::merge.data.table( # dgenes, # annot[,c("disease_id","disease_name","hpo_id")], diff --git a/R/add_evidence.R b/R/add_evidence.R index 97cb4e6..e28efd2 100644 --- a/R/add_evidence.R +++ b/R/add_evidence.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add evidence #' #' Add the strength of evidence supporting each gene-disease association. @@ -16,7 +17,6 @@ #' } #' @param keep_evidence The evidence scores of each gene-disease #' association to keep. -#' @param agg_by Column to aggregate metadata by. #' @param default_score Default evidence score to #' apply to gene-disease associations that are present in the HPO annotations #' but don't have evidence scores in the GenCC annotations. @@ -40,21 +40,15 @@ add_evidence <- function(phenos, allow.cartesian = FALSE, agg_by = c("disease_id", "gene_symbol"), - default_score = 1, - verbose = TRUE){ - - # devoptera::args2vars(add_evidence) + default_score = 1){ evidence_score <- evidence_score_mean <- NULL; if(!all(c("evidence_score_mean") %in% names(phenos))){ - messager("Annotating gene-disease associations with Evidence score", - v=verbose) + messager("Annotating gene-disease associations with Evidence score") phenos <- add_disease(phenos = phenos, all.x = all.x, - allow.cartesian = allow.cartesian, - verbose = verbose) - annot <- get_gencc(agg_by = agg_by, - verbose = verbose) + allow.cartesian = allow.cartesian) + annot <- get_gencc(agg_by = agg_by) #### Merge with input data #### phenos <- data.table::merge.data.table( x = phenos, diff --git a/R/add_gene_frequency.R b/R/add_gene_frequency.R index 23ea94c..16c1dd0 100644 --- a/R/add_gene_frequency.R +++ b/R/add_gene_frequency.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add gene frequency #' #' Add gene-level frequency, i.e. how often mutations in a given gene @@ -8,15 +9,12 @@ #' a gene that occurs 100% of the time in a given phenotype. #' Include \code{NA} if you wish to retain genes that #' do not have any frequency data. -#' See \link[HPOExplorer]{add_gene_frequency} for details. +#' See \link{add_gene_frequency} for details. #' @inheritParams make_phenos_dataframe #' @inheritParams data.table::merge.data.table #' @returns phenos data.table with extra column #' #' @export -#' @importFrom data.table setnames merge.data.table := -#' @importFrom utils data -#' @importFrom stringr str_split #' @examples #' phenotype_to_genes <- load_phenotype_to_genes()[seq(1000),] #' phenos2 <- add_gene_frequency(phenotype_to_genes = phenotype_to_genes) @@ -31,8 +29,7 @@ add_gene_frequency <- function(phenotype_to_genes = load_phenotype_to_genes(), gene_freq_min <- gene_freq_max <- . <- NULL; phenotype_to_genes <- add_hpo_id(phenos = phenotype_to_genes, - phenotype_to_genes= phenotype_to_genes, - verbose = verbose) + phenotype_to_genes= phenotype_to_genes) new_cols <- c("gene_freq_name","gene_freq_min", "gene_freq_max","gene_freq_mean") if(!all(new_cols %in% names(phenotype_to_genes))){ diff --git a/R/add_genes.R b/R/add_genes.R index adc26d1..f84636b 100644 --- a/R/add_genes.R +++ b/R/add_genes.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add genes #' #' Add genes associated with each phenotype @@ -19,8 +20,7 @@ add_genes <- function(phenos = NULL, by = c("hpo_id","disease_id"), gene_col = "gene_symbol", all.x = FALSE, - allow.cartesian = FALSE, - verbose = TRUE){ + allow.cartesian = FALSE){ # devoptera::args2vars(add_genes, reassign = TRUE) #### Prepare gene data #### @@ -38,7 +38,7 @@ add_genes <- function(phenos = NULL, ## Genes driving celltype-symptom enrichment. if(!is.null(gene_col) && gene_col %in% names(phenos)){ - phenos <- unlist_col(dt=phenos, + phenos <- unlist_col(dat=phenos, col=gene_col) data.table::setnames(phenos,gene_col,"gene_symbol") by <- unique(c(by,"gene_symbol")) @@ -46,11 +46,9 @@ add_genes <- function(phenos = NULL, #### Ensure necessary columns are in phenos #### phenos <- add_hpo_id(phenos = phenos, phenotype_to_genes = phenotype_to_genes, - hpo = hpo, - verbose = verbose) + hpo = hpo) phenos <- add_disease(phenos = phenos, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) #### Add Gene col to data #### if(!"gene_symbol" %in% names(phenos)){ by <- by[by %in% names(phenos)] diff --git a/R/add_hpo_definition.R b/R/add_hpo_definition.R index a2a51ae..2137d25 100644 --- a/R/add_hpo_definition.R +++ b/R/add_hpo_definition.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Get term definition #' #' This function accesses the HPO API to get a description/definition of an diff --git a/R/add_hpo_id.R b/R/add_hpo_id.R index dcf2ffa..c8877b5 100644 --- a/R/add_hpo_id.R +++ b/R/add_hpo_id.R @@ -1,29 +1,19 @@ +#' @describeIn add_ add_ #' Add HPO ID column to dataframe #' -#' This adds the HPO term id column to the subset of ewce results data -#' to be plotted -#' in the cell select app. It also checks if it is a valid HPO term id to -#' prevent error and adds -#' a boolean column where TRUE if term is valid. If the HPO Id is not correct, -#' it caused an error in the ontologyPlot package. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @returns The subset of EWCE results dataframe with a HPO Id column added. -#' +#' Adds the HPO term ID column "hpo_id". #' @export -#' @importFrom data.table := setkeyv #' @examples #' phenotype_to_genes <- load_phenotype_to_genes() #' phenos <- unique(phenotype_to_genes[,c("hpo_id","hpo_name")]) #' phenos2 <- add_hpo_id(phenos=phenos) add_hpo_id <- function(phenos, hpo = get_hpo(), - phenotype_to_genes = NULL, - verbose = FALSE) { + phenotype_to_genes = NULL) { HPO_term_valid <- hpo_id <- NULL; if(!"hpo_id" %in% names(phenos)){ - messager("Adding HPO IDs.",v=verbose) + messager("Adding HPO IDs.") alt_names <- grep("hpo_id","^id$",names(phenos), value=TRUE, ignore.case = TRUE) if(length(alt_names)>0){ @@ -33,10 +23,10 @@ add_hpo_id <- function(phenos, if(is.null(phenotype_to_genes)) { phenotype_to_genes <- load_phenotype_to_genes() } - phenos <- fix_hpo_ids(dt=phenos, + phenos <- fix_hpo_ids(dat=phenos, phenotype_to_genes=phenotype_to_genes) } - phenos[,HPO_term_valid:=(hpo_id %in% hpo$id)] + phenos[,HPO_term_valid:=(hpo_id %in% hpo@terms)] } return(phenos) } diff --git a/R/add_hpo_synonym.R b/R/add_hpo_synonym.R index 9d5f0cc..5aaa1ef 100644 --- a/R/add_hpo_synonym.R +++ b/R/add_hpo_synonym.R @@ -1,44 +1,44 @@ -#' Add HPO ID synonyms -#' -#' Map HPO IDs to synonynmous IDs from other ontologies -#' (e.g. UMLS, SNOMEDCT_US, MSH, ICD-10) -#' @inheritParams make_network_object -#' @returns A data.table with the HPO ID synonyms in a new column with -#' the same name as \code{to}. -#' -#' @param to The ontology to map to. Default is \code{UMLS}. -#' @param to_col The name of the new column to add the synonyms to. -#' @export -#' @examples -#' phenos <- HPOExplorer::example_phenos() -#' phenos2 <- add_hpo_synonym(phenos) -add_hpo_synonym <- function(phenos, - to="UMLS", - to_col=paste0(to,"_ID"), - hpo=get_hpo(), - verbose=TRUE){ - hpo_id <- NULL; - messager("Adding HPO ID synonyms:",to,v=verbose) - dict <- unlist(hpo$xref) - ## Fix typos in mapping - dict <- gsub("ICD10","ICD-10",dict) - dict <- gsub("ICD9","ICD-10",dict) - ## Get all prefixes - # prefixes <- sort( - # table(stringr::str_split(unname(dict),":",simplify = TRUE)[,1]), - # decreasing = TRUE) - if(!is.null(to)){ - dict <- grep(paste0("^",to,":"),dict, value = TRUE) - phenos[,(to_col):=dict[hpo_id]] - n_mapped <- length(unique(na.omit(phenos[[to_col]]))) - n_total <- length(unique(phenos$hpo_id)) - messager(formatC(n_mapped,big.mark = ","),"/", - formatC(n_total,big.mark = ","), - paste0("(",round(n_mapped/n_total*100,1),"%)"), - "hpo_id mapped to",paste0(to_col,"."), v=verbose - ) - return(phenos) - } else{ - return(dict) - } -} +##' @describeIn add_ add_ +##' Add HPO ID synonyms +##' +##' Map HPO IDs to synonynmous IDs from other ontologies +##' (e.g. UMLS, SNOMEDCT_US, MSH, ICD-10), +##' @returns A data.table with the HPO ID synonyms in a new column with +##' the same name as \code{to}. +##' +##' @param to The ontology to map to. Default is \code{UMLS}. +##' @param to_col The name of the new column to add the synonyms to. +##' @export +##' @examples +##' phenos <- xample_phenos() +##' phenos2 <- add_hpo_synonym(phenos) +#add_hpo_synonym <- function(phenos, +# to="UMLS", +# to_col=paste0(to,"_ID"), +# hpo=get_hpo()){ +# hpo_id <- NULL; +# messager("Adding HPO ID synonyms:",to) +# dict <- unlist(hpo$xref) +# ## Fix typos in mapping +# dict <- gsub("ICD10","ICD-10",dict) +# dict <- gsub("ICD9","ICD-10",dict) +# ## Get all prefixes +# # prefixes <- sort( +# # table(stringr::str_split(unname(dict),":",simplify = TRUE)[,1]), +# # decreasing = TRUE) +# if(!is.null(to)){ +# dict <- grep(paste0("^",to,":"),dict, value = TRUE) +# phenos[,(to_col):=dict[hpo_id]] +# n_mapped <- length(unique(na.omit(phenos[[to_col]]))) +# n_total <- length(unique(phenos$hpo_id)) +# messager(formatC(n_mapped,big.mark = ","),"/", +# formatC(n_total,big.mark = ","), +# paste0("(",round(n_mapped/n_total*100,1),"%)"), +# "hpo_id mapped to",paste0(to_col,"."), v=verbose +# ) +# return(phenos) +# } else{ +# return(dict) +# } +#} +# diff --git a/R/add_info_content.R b/R/add_info_content.R index a253bfb..655eb13 100644 --- a/R/add_info_content.R +++ b/R/add_info_content.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add information content #' #' Add a column containing the information content score for each HPO ID. @@ -6,22 +7,21 @@ #' @returns phenos data.table with extra column #' #' @export -#' @importFrom data.table := -#' @importFrom ontologyIndex get_term_info_content +#' @import simona #' @examples #' phenos <- example_phenos() #' phenos2 <- add_info_content(phenos = phenos) add_info_content <- function(phenos, - hpo = get_hpo(), - verbose = TRUE){ + hpo = get_hpo()){ info_content <- hpo_id <- NULL; if(!"info_content" %in% names(phenos)){ - messager("Adding information_content scores.",v=verbose) - ic_dict <- ontologyIndex::get_term_info_content( - ontology = hpo, - term_sets = phenos$hpo_id, - patch_missing = FALSE) + messager("Adding information_content scores.") + if(!"IC" %in% names(hpo@elementMetadata)){ + simona::mcols(hpo)$IC <- simona::term_IC(hpo) + } + ic_dict <- KGExplorer::get_ontology_dict(ont=hpo, + to = "IC") phenos[,info_content:=ic_dict[hpo_id]] } return(phenos) diff --git a/R/add_medgen.R b/R/add_medgen.R deleted file mode 100644 index 0545a93..0000000 --- a/R/add_medgen.R +++ /dev/null @@ -1,44 +0,0 @@ -add_medgen <- function(phenos, - id_col = "hpo_id", - to=""){ - source_id <- MONDO_ID<-definition<-DEF<-NULL; - - URL <- "https://ftp.ncbi.nlm.nih.gov/pub/medgen/" - def <- data.table::fread(paste0(URL,"csv/MGDEF.csv.gz"), fill = TRUE) - map <- data.table::fread(paste0(URL,"MedGenIDMappings.txt.gz"), - header = TRUE, - key = "source_id") - data.table::setnames(map,"#CUI","CUI") - # sort(table(map$source), decreasing = TRUE) - #### Conform disease_id to MedGen format #### - phenos <- HPOExplorer::make_phenos_dataframe(add_disease_data = FALSE) - phenos <- HPOExplorer::add_mondo(phenos, - id_col = id_col) - phenos[,source_id:=get(id_col)] - phenos <- phenos[!is.na(get(id_col))] - if(id_col=="disease_id"){ - phenos[,source_id:=gsub("OMIM:","",source_id)] - phenos[,source_id:=gsub("ORPHANET:","Orphanet_",source_id)] - phenos[,source_id:=ifelse(source_id %in% unique(map$source_id), source_id, MONDO_ID)] - } - mapped <- data.table::merge.data.table( - phenos,map, - by="source_id", - all.x = TRUE - ) |> - data.table::merge.data.table(def, - by=c("CUI","source"), - all.x = TRUE) - data.table::uniqueN(phenos[!is.na(definition)]$hpo_id) - data.table::uniqueN(grep("^HP:",map$source_id, value = TRUE)) - data.table::uniqueN(def[source=="HPO"]$CUI) - data.table::uniqueN(mapped[!is.na(DEF)]$hpo_id) - HPOExplorer:::report_missing(mapped, - id_col = "disease_id", - report_col = "CUI") - - ### CONCLUSIONS #### - # Medgen has HPO-CUI mappings for 16569 HPO IDs - # However, their definitions data only has definitions for 22 HPO IDs max - # ....not very useful. -} diff --git a/R/add_mondo.R b/R/add_mondo.R index c2f863a..d04d516 100644 --- a/R/add_mondo.R +++ b/R/add_mondo.R @@ -1,60 +1,29 @@ -#' Add MONDO +#' @describeIn add_ add_ +#' Add Mondo metadata +#' +#' Add Mondo metadata (MONDO ID mappings, names, and definitions) for diseases +#' using files from their respective databases: +#' e.g. OMIM, DECIPHER, Orphanet. +#' @inheritParams KGExplorer::map_mondo +#' @inheritDotParams KGExplorer::map_mondo +#' @returns phenos data.table with extra columns. #' -#' Add metadata from \href{https://mondo.monarchinitiative.org/}{MONDO}, -#' including: -#' \itemize{ -#' \item{MONDO_ID: }{MONDO term ID.} -#' \item{MONDO_name: }{MONDO term name.} -#' \item{MONDO_definition: }{MONDO term definition.} -#' } -#' @param id_col ID column to map to MONDO IDs. -#' @inheritParams add_disease -#' @inheritParams data.table::merge.data.table #' @export -#' @importFrom data.table := +#' @importFrom KGExplorer map_mondo #' @examples -#' phenos <- example_phenos() +#' phenos <- load_phenotype_to_genes(3)[seq(1000)] #' phenos2 <- add_mondo(phenos = phenos) add_mondo <- function(phenos, - id_col = "disease_id", - add_definitions = TRUE, - all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE){ - - # devoptera::args2vars(add_mondo) - MONDO_definition <- MONDO_name <- MONDO_ID <- NULL; - - if(!all(c("MONDO_ID","MONDO_name","MONDO_definition") %in% names(phenos))){ - phenos <- add_disease(phenos = phenos, - all.x = all.x, - allow.cartesian = allow.cartesian, - add_definitions = add_definitions, - include_mondo = FALSE, - verbose = verbose) - messager("Annotating phenos with MONDO metadata.",v=verbose) - mondo <- get_mondo() - dict <- mondo_dict(mondo = mondo) - - #### Assess missing values #### - # sum(is.na(mondo$name)) - # sum(is.na(mondo$def)) - # xref_ids <- unique(names(unlist(mondo$xref))) - # sum(!xref_ids %in% names(mondo$id)) - # sum(!xref_ids %in% names(mondo$name)) - # sum(!xref_ids %in% names(mondo$def)) - # names(mondo$name)[is.na(unname(mondo$name))] - # sum(is.na(unname(mondo$name))) - # names(unlist(mondo$xref)) + input_col = "disease_id", + map_to = "hpo", + ...) { - ### Add new columns #### - phenos[,MONDO_ID:=dict[get(id_col)]] - phenos[,MONDO_name:=mondo$name[MONDO_ID]] - phenos[,MONDO_definition:=mondo$def[MONDO_ID]] - report_missing(phenos = phenos, - id_col = id_col, - report_col = c("MONDO_ID","MONDO_name","MONDO_definition"), - verbose = verbose) - } + phenos[,(input_col):=gsub("^ORPHA","Orphanet",get(input_col))] + #### Map (skips is output_col already present) #### + phenos <- KGExplorer::map_mondo(dat = phenos, + input_col = input_col, + map_to = map_to, + ...) + phenos[,(input_col):=gsub("^Orphanet","ORPHA",get(input_col))] return(phenos) } diff --git a/R/add_ndisease.R b/R/add_ndisease.R index 96f8bd2..a2d7730 100644 --- a/R/add_ndisease.R +++ b/R/add_ndisease.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add N diseases #' #' Annotate each HPO term with the total number of disease diff --git a/R/add_omop.R b/R/add_omop.R index 5a8ba9b..b580b0a 100644 --- a/R/add_omop.R +++ b/R/add_omop.R @@ -1,52 +1,50 @@ -#' Add MONDO +#' @describeIn add_ add_ +#' Add OMOP #' #' Add metadata from \href{https://mondo.monarchinitiative.org/}{MONDO}, #' including: #' \itemize{ -#' \item{MONDO_ID: }{MONDO term ID.} -#' \item{MONDO_name: }{MONDO term name.} -#' \item{MONDO_definition: }{MONDO term definition.} +#' \item{mondo_id: }{MONDO term ID.} +#' \item{mondo_name: }{MONDO term name.} +#' \item{mondo_def: }{MONDO term definition.} #' } -#' @param id_col ID column to map to MONDO IDs. +#' @param input_col ID column to map to MONDO IDs. #' @param force_new Force a new query to the OARD API instead of #' using pre-downloaded data. -#' @inheritParams add_disease -#' @inheritParams data.table::merge.data.table +#' #' @export -#' @importFrom data.table := +#' @import data.table #' @examples #' phenos <- example_phenos() #' phenos2 <- add_omop(phenos = phenos) add_omop <- function(phenos, - id_col = "hpo_id", + input_col = "hpo_id", all.x = TRUE, allow.cartesian = FALSE, force_new = FALSE, verbose = TRUE){ - - # devoptera::args2vars(add_omop) - if(!id_col %in% names(phenos)){ - stop("id_col not found in phenos.") + if(!input_col %in% names(phenos)){ + stop("input_col not found in phenos.") } if(!all(c("OMOP_ID","OMOP_NAME") %in% names(phenos))){ messager("Annotating phenos with OMOP metadata.",v=verbose) #### Select the correct map #### - if(id_col=="hpo_id" || isTRUE(force_new)){ + if(input_col=="hpo_id" || isTRUE(force_new)){ omop <- pkg_data("hpo_id_to_omop") - } else if(id_col=="disease_id"){ + } else if(input_col=="disease_id"){ omop <- pkg_data("disease_id_to_omop") } else { - omop <- oard_query_api(ids = phenos[[id_col]]) + omop <- KGExplorer::query_oard(ids = phenos[[input_col]]) } phenos2 <- data.table::merge.data.table( phenos, omop, - by=id_col, + by=input_col, all.x = all.x, allow.cartesian = allow.cartesian, ) - report_missing(phenos = phenos2, - id_col = id_col, + report_missing(phenos2, + input_col = input_col, report_col = c("OMOP_ID","OMOP_NAME"), verbose = verbose) return(phenos2) diff --git a/R/add_onset.R b/R/add_onset.R index e684c26..4dad09e 100644 --- a/R/add_onset.R +++ b/R/add_onset.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add age of onset #' #' Add age of onset for each HPO ID. @@ -45,19 +46,15 @@ add_onset <- function(phenos, keep_onsets = NULL, agg_by = NULL, all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE){ - - # devoptera::args2vars(add_onset) + allow.cartesian = FALSE){ onset_latest <- onset_score <- onset_name <- NULL; if(!any(c("onset","onset_name","onset_names","onset_score") %in% names(phenos))){ - messager("Annotating phenos with onset.",v=verbose) + messager("Annotating phenos with onset.") phenos <- add_disease(phenos = phenos, all.x = all.x, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) hpo_onsets <- pkg_data("hpo_onsets") dict <- hpo_dict(type = "onset") hpo_onsets[,onset_score:=dict[onset_name]] diff --git a/R/add_ont_lvl.R b/R/add_ont_lvl.R index 1df0890..b080e9d 100644 --- a/R/add_ont_lvl.R +++ b/R/add_ont_lvl.R @@ -1,12 +1,12 @@ +#' @describeIn add_ add_ #' Add ontology level #' #' Add the relative ontology level for each HPO ID. #' @param keep_ont_levels Only keep phenotypes at certain \emph{absolute} #' ontology levels to keep. -#' See \link[HPOExplorer]{add_ont_lvl} for details. -#' @inheritParams get_ont_lvls -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table +#' See \link{add_ont_lvl} for details. +#' @inheritDotParams KGExplorer::get_ontology_levels +#' @inheritParams KGExplorer::get_ontology_levels #' @returns phenos data.table with extra column #' #' @export @@ -16,35 +16,27 @@ #' phenos2 <- add_ont_lvl(phenos = phenos) add_ont_lvl <- function(phenos, hpo = get_hpo(), - adjacency = NULL, absolute = TRUE, - exclude_top_lvl = TRUE, keep_ont_levels = NULL, - reverse = TRUE, - verbose = TRUE){ - + ...){ ontLvl_geneCount_ratio <- geneCount <- hpo_id <- ontLvl <- tmp <- NULL; col <- if(isTRUE(absolute)) "ontLvl" else "ontLvl_relative" if(col %in% names(phenos)) return(phenos) if("hpo_id" %in% names(phenos)){ - lvls_dict <- get_ont_lvls(terms = unique(phenos$hpo_id), - hpo = hpo, - adjacency = adjacency, - absolute = absolute, - reverse = reverse, - exclude_top_lvl = exclude_top_lvl, - verbose = verbose) + lvls_dict <- KGExplorer::get_ontology_levels(ont = hpo, + absolute = absolute, + ...) #### Add the new column #### phenos[,tmp:=lvls_dict[hpo_id]] data.table::setnames(phenos,old = "tmp", new = col) #### Compute gene ratio #### if(all(c("ontLvl","geneCount") %in% names(phenos))){ - messager("Computing ontology level / gene count ratio.",v=verbose) + messager("Computing ontology level / gene count ratio.") phenos[,ontLvl_geneCount_ratio:=(ontLvl/geneCount)] } } else { - messager("hpo_id column not found. Cannot add ontology level.",v=verbose) + messager("hpo_id column not found. Cannot add ontology level.") } #### Filter #### if(!is.null(keep_ont_levels)){ diff --git a/R/add_pheno_frequency.R b/R/add_pheno_frequency.R index e73c832..14588e2 100644 --- a/R/add_pheno_frequency.R +++ b/R/add_pheno_frequency.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add phenotype frequency #' #' Add phenotype-level frequency, i.e. @@ -8,8 +9,6 @@ #' Include \code{NA} if you wish to retain phenotypes that #' do not have any frequency data. #' See \link[HPOExplorer]{add_pheno_frequency} for details. -#' @inheritParams make_network_object -#' @inheritParams data.table::merge.data.table #' @returns phenos data.table with extra column #' #' @export @@ -22,18 +21,15 @@ add_pheno_frequency <- function(phenos, pheno_frequency_threshold = NULL, all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE){ - # devoptera::args2vars(add_pheno_frequency) + allow.cartesian = FALSE){ pheno_freq_mean <- NULL; new_cols <- c("pheno_freq_min","pheno_freq_max","pheno_freq_mean") if(!all(new_cols %in% names(phenos))){ - messager("Annotating phenotype frequencies.",v=verbose) + messager("Annotating phenotype frequencies.") phenos <- add_disease(phenos = phenos, all.x = all.x, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) #### Get precomputed phenotype-disease frequencies #### hpo_frequencies <- pkg_data("hpo_frequencies") # hpo_frequencies <- hpo_frequencies_agg(hpo_frequencies) diff --git a/R/add_prevalence.R b/R/add_prevalence.R index 8854db2..585ba05 100644 --- a/R/add_prevalence.R +++ b/R/add_prevalence.R @@ -1,31 +1,58 @@ +#' @describeIn add_ add_ #' Add prevalence #' #' Add a column containing the prevalence score for each disease ("disease_id") #' or phenotype ("hpo_id"). #' @param method One of "orphanet" or "oard". -#' @param id_col Name of the column containing the disease or phenotype IDs. +#' @param input_col Name of the column containing the disease or phenotype IDs. #' @param drop_na Whether to drop rows with missing prevalence data. -#' @inheritParams make_network_object -#' @returns phenos data.table with extra column #' #' @export #' @examples #' phenos <- example_phenos() #' phenos2 <- add_prevalence(phenos = phenos) add_prevalence <- function(phenos, - id_col="disease_id", + input_col="disease_id", drop_na=TRUE, - verbose=TRUE, method="orphanet"){ - + method <- match.arg(method) + #### Example phenos data + if(is.null(phenos)){ + phenos <- make_phenos_dataframe(add_disease_data = TRUE, + include_mondo = FALSE) + } else { + phenos <- data.table::copy(phenos) + } + phenos <- add_disease(phenos) #### From OARD #### # res <- add_prevalence_oard(phenos$hpo_id[1:100]) #### From ORPHANET #### if(method=="orphanet"){ - phenos2 <- add_prevalence_orphanet(phenos=phenos, - id_col=id_col, - drop_na=drop_na, - verbose=verbose) + mean_prevalence <- NULL; + #### Add MONDO IDs #### + phenos <- add_mondo(phenos = phenos, + input_col = input_col) + #### Get Orphanet data #### + dprev <- KGExplorer:::get_prevalence_orphanet(agg_by=c("mondo_id", + "id","Name")) + phenos2 <- data.table::merge.data.table( + phenos, + dprev, + by="mondo_id", + all.x=TRUE + )[order(-mean_prevalence)] + #### Drop NAs #### + if(isTRUE(drop_na)) phenos2 <- phenos2[!is.na(mean_prevalence),] + #### Report missing #### + add_prevalence_report(phenos = phenos, + phenos2 = phenos2, + input_col = sort( + unique(c(input_col, + "hpo_id", + "disease_id", + "mondo_id") + ) + )) + return(phenos2) } - return(phenos2) } diff --git a/R/add_prevalence_oard.R b/R/add_prevalence_oard.R deleted file mode 100644 index 9d0484d..0000000 --- a/R/add_prevalence_oard.R +++ /dev/null @@ -1,10 +0,0 @@ -add_prevalence_oard <- function(ids){ - - # ids <- unique(phenos$hpo_id)[1:100] - res <- oard_query_api(ids=ids) - res2 <- oard_query_api(ids=res$results$concept_id, - dataset_id=1, - endpoint="frequencies/singleConceptFreq", - concept_prefix="concept_id=") - return(res2) -} diff --git a/R/add_prevalence_orphanet.R b/R/add_prevalence_orphanet.R deleted file mode 100644 index 6176906..0000000 --- a/R/add_prevalence_orphanet.R +++ /dev/null @@ -1,42 +0,0 @@ -add_prevalence_orphanet <- function(phenos=NULL, - id_col="disease_id", - drop_na=TRUE, - verbose=TRUE){ - # devoptera::args2vars(add_prevalence_orphanet) - - mean_prevalence <- NULL; - #### Example phenos data - if(is.null(phenos)){ - phenos <- make_phenos_dataframe(add_disease_data = TRUE, - include_mondo = FALSE, - verbose = verbose) - } else { - phenos <- data.table::copy(phenos) - } - #### Add MONDO IDs #### - phenos <- add_mondo(phenos = phenos, - id_col = id_col, - verbose = verbose) - #### Get Orphanet data #### - dprev <- get_orphanet_epidemiology(agg_by=c("MONDO_ID","id","Name")) - phenos2 <- data.table::merge.data.table( - phenos, - dprev, - by="MONDO_ID", - all.x=TRUE - )[order(-mean_prevalence)] - #### Drop NAs #### - if(isTRUE(drop_na)) phenos2[!is.na(mean_prevalence),] - #### Report missing #### - add_prevalence_report(phenos = phenos, - phenos2 = phenos2, - id_col = sort( - unique(c(id_col, - "hpo_id", - "disease_id", - "MONDO_ID") - ) - ), - verbose = verbose) - return(phenos2) -} diff --git a/R/add_prevalence_report.R b/R/add_prevalence_report.R index dd3e028..d8e7801 100644 --- a/R/add_prevalence_report.R +++ b/R/add_prevalence_report.R @@ -1,11 +1,11 @@ add_prevalence_report <- function(phenos, phenos2, - id_col, + input_col, verbose=TRUE){ mean_prevalence <- NULL; phenos2 <- data.table::copy(phenos2) phenos2 <- phenos2[!is.na(mean_prevalence),] - for(idc in id_col){ + for(idc in input_col){ n_end <- length(unique(phenos2[[idc]])) n_start <- length(unique(phenos[[idc]])) messager( diff --git a/R/add_severity.R b/R/add_severity.R index 40db4d6..7f322db 100644 --- a/R/add_severity.R +++ b/R/add_severity.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add HPO modifiers #' #' Annotate each HPO with modifier terms, including @@ -28,21 +29,17 @@ add_severity <- function(phenos, hpo = get_hpo(), all.x = TRUE, allow.cartesian = FALSE, - severity_threshold = NULL, - verbose = TRUE){ - - # devoptera::args2vars(add_severity) + severity_threshold = NULL){ Severity_score <- NULL; if(!all(c("modifier","modifier_name") %in% names(phenos))){ - messager("Annotating phenos with modifiers",v=verbose) + messager("Annotating phenos with modifiers") phenos <- add_disease(phenos = phenos, all.x = all.x, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) hpo_mod <- pkg_data("hpo_modifiers") #### Aggregate to HPO level #### - # hpo_agg <- hpo_modifiers_agg(dt = hpo_mod, + # hpo_agg <- hpo_modifiers_agg(dat = hpo_mod, # by = by) #### Add diseases #### phenos <- data.table::merge.data.table( diff --git a/R/add_tier.R b/R/add_tier.R index 528d21f..cbbb7f1 100644 --- a/R/add_tier.R +++ b/R/add_tier.R @@ -1,3 +1,4 @@ +#' @describeIn add_ add_ #' Add severity Tiers #' #' Add severity Tier for each HPO ID, in accordance with the diff --git a/R/adjacency_matrix.R b/R/adjacency_matrix.R deleted file mode 100644 index c8b7369..0000000 --- a/R/adjacency_matrix.R +++ /dev/null @@ -1,55 +0,0 @@ -#' Adjacency matrix -#' -#' Create adjacency matrix of HPO child-parent relationships. -#' @param terms Character vector of term IDs to include. -#' @param remove_terms Character vector of term IDs to exclude. -#' @param method Method to use to create the adjacency matrix. -#' @inheritParams make_phenos_dataframe -#' @inheritParams ontologyIndex::get_term_descendancy_matrix -#' @returns adjacency matrix -#' -#' @export -#' @importFrom ontologyIndex get_term_descendancy_matrix -#' @examples -#' terms <- get_hpo()$id[seq(1000)] -#' adjacency <- adjacency_matrix(terms = terms) -adjacency_matrix <- function(hpo = get_hpo(), - terms = unique(hpo$id), - remove_terms=grep(":",terms, - invert = TRUE, value = TRUE), - method = "HPOExplorer", - verbose = TRUE) { - #### Filter terms - if(is.null(terms)){ - terms <- hpo$id - } - terms <- terms[!terms %in% remove_terms] - #### Report - messager("Creating adjacency matrix for", - formatC(length(terms),big.mark = ","),"term(s).", - v=verbose) - if(tolower(method)=="ontologyindex"){ - #### ontologyIndex method #### - ## Returns same object but not sure if it's the same in all conditions - adjacency <- ontologyIndex::get_term_descendancy_matrix(ontology = hpo, - terms = terms) *1 - } else { - #### Custom script ##### - terms <- unique(terms) - terms <- terms[terms %in% hpo$id] - if(length(terms)==0) stop("0 valid HPO IDs (terms) provided.") - size <- length(terms) - adjacency <- matrix(nrow = size, - ncol = size, - dimnames = list(terms, terms)) - adjacency[is.na(adjacency)] <- 0 - for (id in terms) { - children <- hpo$children[[id]] - children <- children[children %in% terms] - if(length(children)>0){ - adjacency[id, children] <- 1 - } - } - } - return(adjacency) -} diff --git a/R/annotate_phenos.R b/R/annotate_phenos.R index ac2eb46..33304d5 100644 --- a/R/annotate_phenos.R +++ b/R/annotate_phenos.R @@ -1,21 +1,18 @@ +#' @describeIn main main #' Annotate phenotypes #' #' Annotate phenotypes \link[data.table]{data.table} without various types #' of metadata. -#' @inheritParams make_network_object -#' @inheritParams make_phenos_dataframe -#' #' @export #' @examples #' phenos <- example_phenos() #' phenos2 <- annotate_phenos(phenos) annotate_phenos <- function(phenos, hpo = get_hpo(), - adjacency = NULL, ##### Phenotype metadata #### add_ont_lvl_absolute = TRUE, add_ont_lvl_relative = FALSE, - add_info_contents = FALSE, + add_info_content = TRUE, add_description = TRUE, #### Disease/symptom metadata #### add_disease_data = FALSE, @@ -30,76 +27,58 @@ annotate_phenos <- function(phenos, #### Extra ##### add_hoverboxes = FALSE, columns = list_columns(), - interactive = TRUE, - verbose = TRUE){ + interactive = TRUE){ #### Add ontology levels: absolute #### if(isTRUE(add_ont_lvl_absolute)){ phenos <- add_ont_lvl(phenos = phenos, hpo = hpo, - absolute = TRUE, - verbose = verbose) + absolute = TRUE) } #### Add ontology levels: relative #### if(isTRUE(add_ont_lvl_relative)){ phenos <- add_ont_lvl(phenos = phenos, hpo = hpo, - adjacency = adjacency, - absolute = FALSE, - verbose = verbose) + absolute = FALSE) } #### Add info content #### if(isTRUE(add_info_content)){ phenos <- add_info_content(phenos = phenos, - hpo = hpo, - verbose = verbose) + hpo = hpo) } - phenos <- add_hpo_definition(phenos = phenos, - verbose = verbose) - phenos <- add_ancestor(phenos = phenos, - verbose = verbose) + phenos <- add_hpo_definition(phenos = phenos) + phenos <- add_ancestor(phenos = phenos) if(isTRUE(add_ndiseases)){ - phenos <- add_ndisease(phenos = phenos, - verbose = verbose) + phenos <- add_ndisease(phenos = phenos) } #### Add age of onset #### if(isTRUE(add_onsets)){ - phenos <- add_onset(phenos = phenos, - verbose = verbose) + phenos <- add_onset(phenos = phenos) } #### Add age of death #### if(isTRUE(add_deaths)){ phenos <- add_death(phenos = phenos, - allow.cartesian = TRUE, - verbose = verbose) + allow.cartesian = TRUE) } #### Add Tiers #### if(isTRUE(add_tiers)){ - phenos <- add_tier(phenos = phenos, - verbose = verbose) + phenos <- add_tier(phenos = phenos) } #### Add Severities #### if(isTRUE(add_severities)){ - phenos <- add_severity(phenos = phenos, - verbose = verbose) + phenos <- add_severity(phenos = phenos) } #### Add phenotype-disease freqs #### if(isTRUE(add_pheno_frequencies)){ - phenos <- add_pheno_frequency(phenos = phenos, - verbose = verbose) + phenos <- add_pheno_frequency(phenos = phenos) } #### Add phenotype-disease freqs #### if(isTRUE(add_disease_definitions)){ - phenos <- add_disease_definition(phenos = phenos, - include_mondo = include_mondo, - verbose = verbose) + phenos <- add_mondo(phenos = phenos) } #### Add hoverboxes #### if(isTRUE(add_hoverboxes)){ - phenos <- make_hoverboxes(phenos = phenos, - interactive = interactive, - columns = columns, - verbose = verbose) + phenos <- KGExplorer::add_hoverboxes(g=phenos) } return(phenos) } diff --git a/R/as_ascii.R b/R/as_ascii.R index 4a44e4e..7e0a1b6 100644 --- a/R/as_ascii.R +++ b/R/as_ascii.R @@ -1,14 +1,14 @@ -as_ascii <- function(dt, - cols=names(dt)){ - cols <- cols[cols %in% names(dt)] +as_ascii <- function(dat, + cols=names(dat)){ + cols <- cols[cols %in% names(dat)] func <- function(v){ Encoding(v) <- "latin1" iconv(v, "latin1", "UTF-8") } for(col in cols){ - if(is.character(dt[[col]])){ - dt[[col]] <- func(dt[[col]]) + if(is.character(dat[[col]])){ + dat[[col]] <- func(dat[[col]]) } } - return(dt) + return(dat) } diff --git a/R/clear_cache.R b/R/clear_cache.R deleted file mode 100644 index 976c04c..0000000 --- a/R/clear_cache.R +++ /dev/null @@ -1,26 +0,0 @@ -#' Clear cache -#' -#' Remove all data cached by \pkg{HPOExplorer}. -#' @param save_dir Path to cache directory. -#' @param verbose Print messages. -#' @inheritParams base::unlink -#' @inheritDotParams base::unlink -#' @returns Null. -#' -#' @export -#' @importFrom tools R_user_dir -#' @examples -#' \dontrun{ -#' clear_cache() -#' } -clear_cache <- function(save_dir=tools::R_user_dir(package = "HPOExplorer", - which = "cache"), - recursive=TRUE, - verbose=TRUE, - ... - ){ - - f <- list.files(save_dir,recursive = recursive) - messager("Clearing",length(f),"cached files from:",save_dir,v=verbose) - unlink(x = save_dir,recursive = recursive,...) -} diff --git a/R/convert_ontology.R b/R/convert_ontology.R deleted file mode 100644 index fbc93f4..0000000 --- a/R/convert_ontology.R +++ /dev/null @@ -1,99 +0,0 @@ -#' Convert ontology -#' -#' Convert an \link[ontologyIndex]{ontology_index} to -#' a number of other useful formats. -#' @param ont An \link[ontologyIndex]{ontology_index} object. -#' @param to A character string specifying the format to convert to. -#' @param as_sparse If TRUE, return a sparse matrix where possible. -#' @inheritParams adjacency_matrix -#' @returns An object of the specified format. -#' -#' @export -#' @importFrom ontologyIndex get_term_descendancy_matrix -#' @importFrom stats as.dist hclust cutree -#' @examples -#' ont <- get_hpo() -#' terms <- head(ont$id,100) -#' obj <- convert_ontology(ont=ont, terms=terms, to="igraph_dist_hclust") -convert_ontology <- function(ont=get_hpo(), - terms=unique(ont$id), - remove_terms=grep(":",terms, - invert = TRUE, value = TRUE), - to=c("adjacency", - "descendancy", - "dist", - "dist_hclust", - "dist_hclust_dendrogram", - "clusters", - "igraph", - "igraph_dist", - "igraph_dist_hclust", - "igraph_dist_hclust_dendrogram", - "tidygraph", - "data.frame", - "data.table"), - as_sparse=FALSE){ - # devoptera::args2vars(convert_ontology, reassign = TRUE) - to <- match.arg(to) - if(to=="tidygraph") requireNamespace("tidygraph") - if(to=="igraph") requireNamespace("igraph") - terms <- terms[!terms %in% remove_terms] - - if(to=="adjacency"){ - obj <- adjacency_matrix(hpo = ont, - terms = terms, - remove_terms = remove_terms) - } else if(to=="descendancy"){ - obj <- ontologyIndex::get_term_descendancy_matrix(ontology = ont, - terms = terms) - } else if(to=="dist"){ - adj <- convert_ontology(ont, terms, remove_terms, to="adjacency") - # obj <- stats::dist(adj) ### seems to take forever - obj <- stats::as.dist(abs(adj-max(adj))) - } else if(to=="dist_hclust"){ - d <- convert_ontology(ont, terms, remove_terms, to="dist") - obj <- stats::hclust(d) - } else if(to=="dist_hclust_dendrogram"){ - dh <- convert_ontology(ont, terms, remove_terms, to="dist_hclust") - obj <- stats::as.dendrogram(dh) - }else if(to=="clusters"){ - hc <- convert_ontology(ont, terms, remove_terms, to="hclust") - obj <- stats::cutree(hc,k=10) - } else if(to=="igraph"){ - adj <- convert_ontology(ont, terms, remove_terms, to="adjacency") - obj <- igraph::graph_from_adjacency_matrix(adj) - } else if (to=="igraph_dist"){ - g <- convert_ontology(ont, terms, remove_terms, to="igraph") - obj <- igraph::distances(g) - } else if(to=="igraph_dist_hclust"){ - gd <- convert_ontology(ont, terms, remove_terms, to="igraph_dist") - if(any(is.infinite(gd))) gd[is.infinite(gd)] <- max(gd[!is.infinite(gd)]) - obj <- stats::hclust(stats::as.dist(gd)) - } else if(to=="igraph_dist_hclust_dendrogram"){ - gdh <- convert_ontology(ont, terms, remove_terms, to="igraph_dist_hclust") - obj <- stats::as.dendrogram(gdh) - } else if(to=="tidygraph"){ - g <- convert_ontology(ont, terms, remove_terms, to="igraph") - obj <- tidygraph::as_tbl_graph(g) - } else if(to=="data.frame"){ - obj <- as.data.frame(ont) - if(!is.null(terms)) obj <- obj[terms,] - if(!is.null(remove_terms)) obj <- obj[!obj$id %in% remove_terms,] - } else if(to=="data.table"){ - df <- convert_ontology(ont, terms, remove_terms, to="data.frame") - obj <- data.table::as.data.table(df) - }else { - stop("Unknown conversion type.") - } - #### Convert to sparse #### - if(isTRUE(as_sparse)){ - if(methods::is(obj,"matrix")){ - obj <- Matrix::Matrix(adj, sparse=TRUE) - } - } - ## Report - messager("Converted ontology to:",to, - if(as_sparse) paste0("(sparse)") else NULL - ) - return(obj) -} diff --git a/R/data.R b/R/data.R index 1831299..ea3c714 100644 --- a/R/data.R +++ b/R/data.R @@ -26,8 +26,7 @@ #' \code{ #' annot <- load_phenotype_to_genes(file = "phenotype.hpoa") #' annot <- annot[onset!="",] -#' annot$onset_name <- harmonise_phenotypes(phenotypes = annot$onset, -#' as_hpo_ids = FALSE) +#' annot$onset_name <- map_phenotypes(terms = annot$onset) #' counts <- dplyr::group_by(annot, disease_id) |> #' dplyr::summarise(hpo_ids=length(unique(hpo_id)), #' onsets=length(unique(onset))) @@ -46,10 +45,10 @@ #' #' @description #' HPO severity tiers automatically assigned using -#' \link[HPOExplorer]{assign_tiers}. +#' \link[HPOExplorer]{make_tiers}. #' @source #' \code{ -#' hpo_tiers_auto <- HPOExplorer:::assign_tiers(as_datatable=TRUE) +#' hpo_tiers_auto <- HPOExplorer:::make_tiers(as_datatable=TRUE) #' hpo_tiers_auto <- add_onset(phenos = hpo_tiers_auto) #' #### Filter by onset criterion #### #' ### Tier 1: Shortened life span: infancy @@ -85,7 +84,7 @@ #' annot <- HPOExplorer::load_phenotype_to_genes(3) #' annot <- annot[modifier!=""] #' parse_mod <- function(x){ -#' unique(harmonise_phenotypes(strsplit(x,";")[[1]])) +#' unique(map_phenotypes(strsplit(x,";")[[1]])) #' } #' annot <- annot[,modifier_name:=lapply(modifier,parse_mod)][modifier!="",] #' annot <- annot[,.(modifier_name=unlist(modifier_name)), @@ -119,7 +118,7 @@ #' \code{ #' annot <- load_phenotype_to_genes("phenotype.hpoa") #' hpo_frequencies <- HPOExplorer:::parse_pheno_frequency(annot=annot) -#' hpo_frequencies <- HPOExplorer:::as_ascii(dt=hpo_frequencies) +#' hpo_frequencies <- HPOExplorer:::as_ascii(dat=hpo_frequencies) #' data.table::setcolorder(hpo_frequencies,c("disease_id","hpo_id")) #' usethis::use_data(hpo_frequencies, overwrite = TRUE) #' } @@ -134,9 +133,7 @@ #' Age of Death associated with each disease, and by extension, each phenotype. #' @source #' \code{ -#' terms <- ontologyIndex::get_descendants(ontology = get_hpo(), -#' roots = "HP:0011420", -#' exclude_roots = TRUE) +#' terms <- simona::dag_offspring(get_hpo(), term = "HP:0011420") #' aod <- lapply(stats::setNames(terms, terms), #' function(hpo_id){ #' message("Extracting API data for",hpo_id) @@ -144,8 +141,7 @@ #' }) |> data.table::rbindlist(fill = TRUE, #' use.names = TRUE, #' idcol = "AgeOfDeath") -#' aod$AgeOfDeath_name <- harmonise_phenotypes(phenotypes = aod$AgeOfDeath, -#' as_hpo_ids = FALSE) +#' aod$AgeOfDeath_name <- map_phenotypes(terms = aod$AgeOfDeath) #' #### Convert AoD to numeric scores #### #' dict <- HPOExplorer:::hpo_dict(type="AgeOfDeath") #' aod$AgeOfDeath_score <- dict[aod$AgeOfDeath_name] @@ -167,14 +163,14 @@ #' @source #' \code{ #' hpo <- get_hpo() -#' ids <- unique(hpo$id) +#' ids <- unique(hpo@terms) #' hpo_id_to_omop <- oard_query_api(ids = ids, workers=10) -#' id_col="hpo_id" +#' input_col="hpo_id" #' data.table::setnames(hpo_id_to_omop, #' toupper(gsub("concept_","OMOP_",names(hpo_id_to_omop))) #' ) -#' data.table::setnames(hpo_id_to_omop, "OMOP_CODE",id_col) -#' hpo_id_to_omop <- hpo_id_to_omop[,c(id_col,"OMOP_ID","OMOP_NAME"), +#' data.table::setnames(hpo_id_to_omop, "OMOP_CODE",input_col) +#' hpo_id_to_omop <- hpo_id_to_omop[,c(input_col,"OMOP_ID","OMOP_NAME"), #' with=FALSE] #' usethis::use_data(hpo_id_to_omop, overwrite = TRUE) #' } @@ -190,7 +186,7 @@ #' @source #' \code{ #' annot <- load_phenotype_to_genes(3) -#' id_col <- "disease_id" +#' input_col <- "disease_id" #' ## NOTE: must keep batch_size=1 as the OARD API returns results only for #' ## the IDs it can map. This leads to a mismatch between the input and output #' ## which is exacerbated that the concept_id is automatically converted to @@ -201,8 +197,8 @@ #' data.table::setnames(disease_id_to_omop, #' toupper(gsub("concept_","OMOP_",names(disease_id_to_omop))) #' ) -#' data.table::setnames(disease_id_to_omop,"QUERY",id_col) -#' disease_id_to_omop <- disease_id_to_omop[,c(id_col,"OMOP_ID","OMOP_NAME"), +#' data.table::setnames(disease_id_to_omop,"QUERY",input_col) +#' disease_id_to_omop <- disease_id_to_omop[,c(input_col,"OMOP_ID","OMOP_NAME"), #' with=FALSE] #' usethis::use_data(disease_id_to_omop, overwrite = TRUE) #' } diff --git a/R/example_phenos.R b/R/example_phenos.R index d3bf20b..3844718 100644 --- a/R/example_phenos.R +++ b/R/example_phenos.R @@ -1,3 +1,4 @@ +#' @describeIn main main #' Example phenotypes dataframe #' #' Create a minimal example of a phenos dataframe. @@ -8,6 +9,7 @@ #' @importFrom data.table data.table #' @examples #' phenos <- example_phenos() -example_phenos <- function(i=seq(10)){ - data.table::data.table(hpo_id=grep("^HP:",get_hpo()$id, value = TRUE)[i]) +example_phenos <- function(i=seq(10), + hpo=get_hpo()){ + data.table::data.table(hpo_id=grep("^HP:",hpo@terms, value = TRUE)[i]) } diff --git a/R/filter_descendants.R b/R/filter_descendants.R new file mode 100644 index 0000000..9929cdb --- /dev/null +++ b/R/filter_descendants.R @@ -0,0 +1,39 @@ +#' @describeIn filter_ filter_ +#' Filter descendants +#' +#' Subset a \code{phenos} data.table to only +#' descendants of an ancestor HPO ID term. +#' @param ancestor Phenotype names (or HPO ID) of an ancestor in the +#' \href{https://hpo.jax.org/}{Human Phenotype Ontology}. +#' Only phenotypes that are descendants of this ancestor will be kept. +#' Set to \code{NULL} (default) to skip this filtering step. +#' @returns data.table of phenotypes, with additional columns: +#' "ancestor", "ancestor_id" +#' +#' @export +#' @examples +#' phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +#' phenos2 <- filter_descendants(phenos = phenos, +#' ancestor = "Motor delay") +filter_descendants <- function(phenos, + ancestor = NULL, + hpo = get_hpo()){ + + hpo_id <- NULL; + + if(!is.null(ancestor)){ + messager("Subsetting phenotypes to only ancestors of:", + paste(ancestor,collapse = ",")) + ancestor_id <- map_phenotypes(terms = ancestor, + hpo = hpo, + to="id") + all_ids <- simona::dag_offspring(dag = hpo, + term=ancestor_id, + include_self = TRUE ) + phenos <- phenos[hpo_id %in% all_ids, + ][,ancestor:=ancestor][,ancestor_id:=ancestor_id] + messager(formatC(nrow(phenos),big.mark = ","), + "associations remain after filtering.") + } + return(phenos) +} diff --git a/R/fix_hpo_ids.R b/R/fix_hpo_ids.R index b62c489..7fe2498 100644 --- a/R/fix_hpo_ids.R +++ b/R/fix_hpo_ids.R @@ -2,39 +2,36 @@ #' #' Fix missing HPO IDs by inferring their identity from the \code{hpo_name} #' column using several methods. -#' @param dt \link[data.table]{data.table} +#' @param dat \link[data.table]{data.table} #' containing a column named "hpo_name". -#' @inheritParams make_phenos_dataframe #' @returns data.table with the column "hpo_id" #' #' @keywords internal -#' @importFrom data.table setcolorder setkey -#' @importFrom stats setNames -fix_hpo_ids <- function(dt, +fix_hpo_ids <- function(dat, phenotype_to_genes = load_phenotype_to_genes()) { hpo_id <- NULL; - dt$hpo_id <- harmonise_phenotypes(dt$hpo_name, as_hpo_ids = TRUE) + dat$hpo_id <- map_phenotypes(dat$hpo_name, to = "id") dict <- stats::setNames(phenotype_to_genes$hpo_id, phenotype_to_genes$hpo_name) - dt[is.na(hpo_id)]$hpo_id <- dict[dt[is.na(hpo_id)]$hpo_name] + dat[is.na(hpo_id)]$hpo_id <- dict[dat[is.na(hpo_id)]$hpo_name] #### Check if any IDs are still missing #### - missing1 <- sum(is.na(dt$hpo_id)) + missing1 <- sum(is.na(dat$hpo_id)) if(missing1>0){ stp <- paste(missing1,"HPO IDs are still missing.") warning(stp) } - missing2 <- sum(!grepl("HP",dt$hpo_id)) + missing2 <- sum(!grepl("HP",dat$hpo_id)) if(missing2>0){ stp <- paste(missing2,"HPO IDs are still missing.") warning(stp) } - missing3 <- sum(is.na(dt$hpo_name)) + missing3 <- sum(is.na(dat$hpo_name)) if(missing3>0){ stp <- paste(missing3,"hpo_names are still missing.") warning(stp) } - data.table::setcolorder(dt,"hpo_id") - data.table::setkey(dt,"hpo_id") - return(dt) + data.table::setcolorder(dat,"hpo_id") + data.table::setkey(dat,"hpo_id") + return(dat) } diff --git a/R/get_data.R b/R/get_data.R index cde6645..0549823 100644 --- a/R/get_data.R +++ b/R/get_data.R @@ -12,10 +12,7 @@ get_data <- function(file, tag = "latest", repo = "neurogenomics/HPOExplorer", - save_dir = tools::R_user_dir( - package = "HPOExplorer", - which = "cache" - ), + save_dir = KGExplorer::cache_dir(package = "HPOExplorer"), add_version = FALSE, overwrite = TRUE ){ diff --git a/R/get_gencc.R b/R/get_gencc.R deleted file mode 100644 index 752bc34..0000000 --- a/R/get_gencc.R +++ /dev/null @@ -1,74 +0,0 @@ -#' Get GenCC -#' -#' Get phenotype-gene evidence score from the -#' \href{https://thegencc.org/}{Gene Curation Coalition}. -#' Data downloaded from \href{https://search.thegencc.org/download}{here}.\cr -#' \emph{NOTE:} Due to licensing restrictions, a GenCC download does not -#' include OMIM data. OMIM data can be accessed and downloaded through -#' \href{https://omim.org/downloads/}{OMIM}.\cr -#' \emph{NOTE:} GenCC does not currently have any systematic versioning. -#' There for the \code{attr(obj,"version")} attribute is set to the date it was -#' downloaded and cached by \link[HPOExplorer]{get_gencc}. -#' -#' @param dict A named vector of evidence score mappings. -#' See \href{https://thegencc.org/faq.html#validity-termsdelphi-survey}{here} -#' for more information. -#' @inheritParams add_evidence -#' @inheritParams get_data -#' @returns \link[data.table]{data.table} with columns: -#' \itemize{ -#' \item{"disease_id": }{Disease ID.} -#' \item{"gene_symbol": }{Gene symbol.} -#' \item{"evidence_score": }{Evidence score.} -#' } -#' -#' @export -#' @import data.table -#' @importFrom utils download.file -#' @examples -#' d <- get_gencc() -get_gencc <- function(agg_by=c("disease_id", - "gene_symbol"), - dict = c("Definitive"=6,# GENCC:100001 - "Strong"=5, # GENCC:100002 - "Moderate"=4, # GENCC:100003 - "Supportive"=3, # GENCC:100009 - "Limited"=2, # GENCC:100004 - "Disputed Evidence"=1, # GENCC:100005 - "Refuted Evidence"=0, # GENCC:100006 - "No Known Disease Relationship"=0 # GENCC:100008 - ), - save_dir=tools::R_user_dir("HPOExplorer", - which="cache"), - verbose=TRUE){ - # devoptera::args2vars(get_gencc) - - disease_id <- disease_original_curie <- classification_title <- - evidence_score <- NULL; - - messager("Gathering data from GenCC.",v=verbose) - URL <- "https://search.thegencc.org/download/action/submissions-export-csv" - f <- file.path(save_dir,"genCC_submission.csv") - if(!file.exists(f)){ - dir.create(save_dir, showWarnings = FALSE, recursive = TRUE) - utils::download.file(URL, f) - } else { - messager("Importing cached file.",v=verbose) - } - d <- data.table::fread(f) - d[,disease_id:=gsub("^Orphanet","ORPHA",disease_original_curie)] - #### Encode evidence numerically #### - d[,evidence_score:=dict[classification_title]] - #### Aggregate so that there's 1 entry/gene/disease #### - if(!is.null(agg_by)){ - d <- d[,list(evidence_score_min=min(evidence_score, na.rm = TRUE), - evidence_score_max=max(evidence_score, na.rm = TRUE), - evidence_score_mean=mean(evidence_score, na.rm=TRUE)), - by=agg_by] - } - #### Add version #### - attr(d,"version") <- format(file.info(f)$mtime, "%Y-%m-%d") - get_version(obj=d, verbose=verbose) - #### Return #### - return(d) -} diff --git a/R/get_gene_lengths.R b/R/get_gene_lengths.R deleted file mode 100644 index 5492d2b..0000000 --- a/R/get_gene_lengths.R +++ /dev/null @@ -1,42 +0,0 @@ -get_gene_lengths <- function(gene_list, - keep_seqnames = c(seq(22),"X","Y"), - ensembl_version = 75, - verbose = TRUE){ - - requireNamespace("ensembldb") - requireNamespace("AnnotationFilter") - - gene_list <- unique(gene_list) - messager("Gathering metadata for",length(gene_list),"unique genes.", - v=verbose) - if(is.null(keep_seqnames)){ - keep_seqnames <- eval(formals(get_gene_lengths)$keep_seqnames) - } - #### Standardise seqnames #### - keep_seqnames <- unique( - c(tolower(keep_seqnames), - paste0("chr",keep_seqnames), - keep_seqnames) - ) - #### Get gene reference database #### - if(ensembl_version==75){ - #### Outdated ref #### - requireNamespace("EnsDb.Hsapiens.v75") - txdb <- EnsDb.Hsapiens.v75::EnsDb.Hsapiens.v75 - } else { - #### Updated ref #### - requireNamespace("AnnotationHub") - hub <- AnnotationHub::AnnotationHub() - q <- AnnotationHub::query(hub, c("EnsDb",ensembl_version,"sapiens")) - txdb <- q[[length(q)]] - } - #### Set - tx_gr <- ensembldb::genes( - txdb, - columns = c(ensembldb::listColumns(txdb, "gene"), "entrezid"), - filter=AnnotationFilter::AnnotationFilterList( - AnnotationFilter::SymbolFilter(value = gene_list), - AnnotationFilter::SeqNameFilter(value = keep_seqnames) - )) - return(tx_gr) -} diff --git a/R/get_gene_lists.R b/R/get_gene_lists.R index 043a9db..044d694 100644 --- a/R/get_gene_lists.R +++ b/R/get_gene_lists.R @@ -25,10 +25,9 @@ get_gene_lists <- function(phenotypes, # devoptera::args2vars(get_gene_lists) hpo_id <- NULL; - hpo_ids <- harmonise_phenotypes(phenotypes = phenotypes, - hpo = hpo, - as_hpo_ids = TRUE, - verbose = TRUE) + hpo_ids <- map_phenotypes(terms = phenotypes, + hpo = hpo, + to="id") p2g <- phenotype_to_genes[hpo_id %in% hpo_ids] #### Return at data.table ##### if(isFALSE(as_list)) return(p2g) diff --git a/R/get_hpo.R b/R/get_hpo.R index 59d0560..d0b41ee 100644 --- a/R/get_hpo.R +++ b/R/get_hpo.R @@ -1,6 +1,7 @@ +#' @describeIn get_ get_ #' Get Human Phenotype Ontology (HPO) #' -#' Updated version of Human Phenotype Ontology (HPO) from 2023-10-09. +#' Updated version of Human Phenotype Ontology (HPO). #' Created from the OBO files distributed by the HPO project's #' \href{https://github.com/obophenotype/human-phenotype-ontology}{GitHub}. #' @@ -8,26 +9,28 @@ #' Note that the maximum ontology level depth in the 2016 version was 14, #' whereas in the 2023 version the maximum ontology level depth is 16 #' (due to an expansion of the HPO). -#' @source \href{https://bioportal.bioontology.org/ontologies/HP}{BioPortal} -#' \code{ -#' hpo <- HPOExplorer:::make_ontology(upload_tag="latest") -#' } -#' @inheritParams get_data -#' @inheritParams piggyback::pb_download -#' @importFrom tools R_user_dir -#' @returns \link[ontologyIndex]{ontology_index} object. +#' @inheritParams KGExplorer::add_ancestors +#' @inheritDotParams KGExplorer::get_ontology +#' @returns \link[simona]{ontology_DAG} object. #' #' @export +#' @import KGExplorer #' @examples #' hpo <- get_hpo() -get_hpo <- function(save_dir=tools::R_user_dir("HPOExplorer", - which="cache"), - tag = "latest", - overwrite = TRUE){ - #### ontologyIndex data outdated, from 2016. Don't use. #### - # utils::data("hpo",package = "ontologyIndex") - get_data(file = "hp-base.rds", - tag = tag, - overwrite = overwrite, - save_dir = save_dir) +get_hpo <- function(lvl, + add_ancestors = TRUE, + force_new = FALSE, + ...){ + save_dir <- KGExplorer::cache_dir(package = "HPOExplorer") + file <- file.path(save_dir,"hpo.rds") + if(!file.exists(file) || isTRUE(force_new)){ + ont <- KGExplorer::get_ontology(name = "hp", + add_ancestors = add_ancestors, + force_new = force_new, + ...) + saveRDS(ont,file) + } else { + ont <- readRDS(file) + } + return(ont) } diff --git a/R/get_hpo_id_direct.R b/R/get_hpo_id_direct.R index 46a8702..f267289 100644 --- a/R/get_hpo_id_direct.R +++ b/R/get_hpo_id_direct.R @@ -1,16 +1,15 @@ +#' @describeIn get_ get_ #' Get HPO term ID direct #' #' Directly retrieves it from the HPO -#' ontology object (found in the \pkg{ontologyIndex} package \code{data(hpo)}). -#' @param phenotype One or more phenotype names in to get HPO IDs for. -#' @inheritParams make_phenos_dataframe +#' ontology object. #' @returns The HPO ID(s) of phenotype(s) #' #' @export #' @examples -#' phenotype = "Phenotypic abnormality" -#' pheno_abnormality_id <- get_hpo_id_direct(phenotype = phenotype) -get_hpo_id_direct <- function(phenotype, +#' term = "Phenotypic abnormality" +#' pheno_abnormality_id <- get_hpo_id_direct(term = term) +get_hpo_id_direct <- function(term, hpo = get_hpo()) { - return(hpo$id[which(phenotype == hpo$name)]) + return(hpo@terms[which(term == hpo@elementMetadata$name)]) } diff --git a/R/get_kg_monarch.R b/R/get_kg_monarch.R deleted file mode 100644 index 7890f70..0000000 --- a/R/get_kg_monarch.R +++ /dev/null @@ -1,42 +0,0 @@ -#' Get knowledge graph: Monarch -#' -#' -#' Option 1: Use the \href{https://api.monarchinitiative.org/api/}{biolink API} -#' to efficiently extract specific subset of data -#' from the Monarch server. -#' Option 2: Import the entire knowledge graph from the -#' \href{https://data.monarchinitiative.org/monarch-kg/latest/}{Monarch server}. -#' @source \href{https://pubmed.ncbi.nlm.nih.gov/37707514/}{BioThings Explorer} -get_kg_monarch <- function(){ - ### Option 1 #### - # - # con <- neo4r::neo4j_api$new( - # url = "https://api.monarchinitiative.org/api/", - # user = "neo4j", - # password = "plop" - # ) - # jsonlite::read_json("https://api.monarchinitiative.org/api/bioentity/MONDO:0012990") - # neo2R::graphRequest(graph = , - # endpoint = "/bioentity/", - # postText = "MONDO:0012990") - # neo <- neo2R::graphRequest("https://data.monarchinitiative.org/monarch-kg-dev/latest/monarch-kg.neo4j.dump", ) - # top_targets <- add_mondo(top_targets) - - ### Option 2 #### - d <- data.table::fread("https://data.monarchinitiative.org/monarch-kg/latest/monarch-kg-denormalized-edges.tsv.gz") - - sort(unique(d$subject_category)) - - d[subject_category== "biolink:Cell",]$subject_label |> - gsub(pattern="[0-9]+",replacement="") |> - # stringr::str_trunc(20) |> - unique() |> sort() - - d2 <- d[#(subject_category=="biolink:Disease" & object_category=="biolink:PhenotypicFeature") | - (subject_category=="biolink:PhenotypicFeature" & object_category=="biolink:Gene") | - (subject_category=="biolink:Disease" & object_category=="biolink:Gene")] - - #### Use evidence_count as connection weights #### - round(table(d$evidence_count,useNA = "always")/nrow(d)*100,6) - -} diff --git a/R/get_max_ont_lvl.R b/R/get_max_ont_lvl.R deleted file mode 100644 index e30286b..0000000 --- a/R/get_max_ont_lvl.R +++ /dev/null @@ -1,15 +0,0 @@ -get_max_ont_lvl <- function(hpo = get_hpo(), - absolute = TRUE, - exclude_top_lvl=FALSE){ - #### Get the maximum ontology level #### - max_lvl <- 0 - for(i in seq(length(hpo$id))){ - tmp <- get_ont_lvl(term = hpo$id[[i]], - hpo = hpo, - absolute = absolute) - if(tmp > max_lvl) max_lvl <- tmp - } - #### Exclude the top level term "All" (HP:0000001) #### - if(isTRUE(exclude_top_lvl)) max_lvl <- max_lvl-1 - return(max_lvl) -} diff --git a/R/get_metadata_omim.R b/R/get_metadata_omim.R deleted file mode 100644 index d246227..0000000 --- a/R/get_metadata_omim.R +++ /dev/null @@ -1,20 +0,0 @@ -get_metadata_omim <- function(save_dir = file.path( - tools::R_user_dir("HPOExplorer", - which="cache")), - verbose = TRUE){ - Class.ID <- id <- NULL; - - messager("Importing OMIM metadata.",v=verbose) - f <- file.path(save_dir,"OMIM.csv.gz") - if(!file.exists(f)){ - dir.create(save_dir, showWarnings = FALSE, recursive = TRUE) - utils::download.file(paste0( - "https://data.bioontology.org/ontologies/OMIM/download?", - "apikey=8b5b7825-538d-40e0-9e9e-5ab9274a9aeb&download_format=csv" - ), f) - } - meta <- data.table::fread(f) - colnames(meta) <- gsub(" ",".",colnames(meta)) - meta[,id:=paste0("OMIM:",basename(Class.ID))] - return(meta) -} diff --git a/R/get_metadata_orphanet.R b/R/get_metadata_orphanet.R deleted file mode 100644 index 6cb59ae..0000000 --- a/R/get_metadata_orphanet.R +++ /dev/null @@ -1,21 +0,0 @@ -get_metadata_orphanet <- function(save_dir = file.path( - tools::R_user_dir("HPOExplorer", - which="cache")), - verbose = TRUE){ - Class.ID <- id <- NULL; - - options(download.file.method = "curl") - messager("Importing Orphanet metadata.",v=verbose) - f <- file.path(save_dir,"ORDO.csv.gz") - if(!file.exists(f)){ - dir.create(save_dir, showWarnings = FALSE, recursive = TRUE) - utils::download.file(paste0( - "https://data.bioontology.org/ontologies/ORDO/download?", - "apikey=8b5b7825-538d-40e0-9e9e-5ab9274a9aeb&download_format=csv" - ), f) - } - meta <- data.table::fread(f) - colnames(meta) <- gsub(" ",".",colnames(meta)) - meta[,id:=gsub("Orphanet_","ORPHA:",basename(Class.ID))] - return(meta) -} diff --git a/R/get_monarch.R b/R/get_monarch.R deleted file mode 100644 index 6d84282..0000000 --- a/R/get_monarch.R +++ /dev/null @@ -1,58 +0,0 @@ -#' Get Monarch -#' -#' Get key datasets from the Monarch Initiative server. -#' @param file Short name of the file to retrieve. -#' \itemize{ -#' \item{"gene_to_gene"}{Gene-to-gene mappings across species orthologous.} -#' \item{"phenotype_to_gene"}{Phenotype-to-gene mappings for multiple species.} -#' \item{"disease_to_model"}{Disease-to-model mappings for multiple -#' model species.} -#' \item{"phenotype_to_phenotype"}{Phenotype-to-phenotype mappings across -#' species homologs.} -#' } -#' @param file_map Mapping between short name and full name of each file. -#' @param domain Monarch Initiative server domain. -#' @inheritDotParams data.table::fread -#' @returns \link[data.table]{data.table} -#' -#' @export -#' @examples -#' dat <- get_monarch() -get_monarch <- function(file=c("gene_to_gene", - "phenotype_to_gene", - "disease_to_model", - "phenotype_to_phenotype" - ), - file_map=list( - ## Gene-gene homology across 12 species - gene_to_gene= - paste0( - "monarch-kg-dev/latest/tsv/all_associations/", - "gene_to_gene_homology_association.all.tsv.gz" - ), - ## Gene-phenotype associations across 8 species - phenotype_to_gene= - paste0( - "monarch-kg-dev/latest/tsv/all_associations/", - "gene_to_phenotypic_feature_association.all.tsv.gz" - ), - disease_to_model= - paste0( - "latest/tsv/model_associations/", - "model_disease.all.tsv.gz" - ), - phenotype_to_phenotype= - paste0( - "upheno2/current/upheno-release/all/", - "upheno_mapping_all.csv" - ) - ), - domain="https://data.monarchinitiative.org", - ... - ){ - - file <- match.arg(file) - URL <- paste(domain,file_map[[file]], sep="/") - dat <- data.table::fread(URL,...) - return(dat) -} diff --git a/R/get_mondo.R b/R/get_mondo.R deleted file mode 100644 index 33703a7..0000000 --- a/R/get_mondo.R +++ /dev/null @@ -1,28 +0,0 @@ -#' Get Mondo Disease Ontology -#' -#' Import \href{https://mondo.monarchinitiative.org/}{Mondo} as an R object. -#' @source -#' \code{ -#' mondo <- HPOExplorer:::make_ontology(file="mondo-base.obo", -#' repo="monarch-initiative/mondo", -#' upload_tag="latest") -#' } -#' @inheritParams get_data -#' @inheritParams piggyback::pb_download -#' @importFrom tools R_user_dir -#' @returns \link[ontologyIndex]{ontology_index} -#' -#' @export -#' @examples -#' mondo <- get_mondo() -get_mondo <- function(save_dir=tools::R_user_dir("HPOExplorer", - which="cache"), - tag = "latest", - overwrite = TRUE){ - #### ontoProc data outdated, from 2021 Don't use. #### - # mondo <- ontoProc::getMondoOnto() - get_data(file = "mondo-base.rds", - tag = tag, - overwrite = overwrite, - save_dir = save_dir) -} diff --git a/R/get_ont_lvl.R b/R/get_ont_lvl.R deleted file mode 100644 index e7adaf0..0000000 --- a/R/get_ont_lvl.R +++ /dev/null @@ -1,73 +0,0 @@ -#' Get HPO term level -#' -#' In this function, ontology level refers to the number of generations of -#' sub-phenotypes a term has below it in the HPO DAG. For example, the root of -#' the HPO is term "HP:0000001", the longest path to a term with no child terms -#' is 14. In other words there are 14 generations of "is-a" relationships below -#' HP:0000001 and it is therefore at ontology level 14. A term with no -#' sub-phenotypes below it (a leaf node), is at ontology level 0. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @inheritParams adjacency_matrix -#' @returns Ontology level of HPO ID. -#' -#' @keywords internal -#' @source -#' \code{ -#' lvl_absolute <- get_ont_lvl(term = "HP:0000001", absolute=TRUE) -#' lvl_relative <- get_ont_lvl(term = "HP:0000001", absolute=FALSE) -#' } -get_ont_lvl <- function(term, - hpo = get_hpo(), - adjacency = NULL, - absolute = TRUE, - verbose = FALSE) { - - messager("Getting ontology level for:", paste(term,collapse = ", "), - v=verbose) - #### Children method #### - if(isTRUE(absolute)){ - children <- unique( - setdiff(unlist(hpo$children[term]), - term) - ) - if (length(children) == 0) { - return(0) - } else { - return(1 + get_ont_lvl(term = children, - hpo = hpo, - absolute = absolute, - verbose = verbose)) #<- recursion.. - } - } else { - #### Parents method #### - if(is.null(adjacency)){ - stp <- "Must supply adjacency when absolute=FALSE." - stop(stp) - } - phenotypes <- rownames(adjacency) - pos_parents <- hpo$parents[term] - paths <- lapply(phenotypes, function(p){ - if (adjacency[p, term] == 1) { - if (p %in% pos_parents) { - 1 + get_ont_lvl(term = p, - adjacency = adjacency, - absolute = absolute, - hpo = hpo) # <- recursion - } - } - }) |> unlist() - #### Check count #### - if (length(paths) == 0) { - return(0) - } else { - parents <- 0 - for (i in seq(length(paths))) { - if (paths[[i]] > parents) { - parents <- paths[[i]] - } - } - } - return(parents) - } -} diff --git a/R/get_ont_lvls.R b/R/get_ont_lvls.R deleted file mode 100644 index bfd2e9d..0000000 --- a/R/get_ont_lvls.R +++ /dev/null @@ -1,77 +0,0 @@ -#' Get ontology level for HPO terms -#' -#' For a given set of HPO terms, get their level -#' within the hierarchically organised HPO ontology. -#' Ontology level can be computed either absolute mode (\code{absolute=TRUE}) -#' where the entire ontology is considered when assigning levels, or -#' relative mode (\code{absolute=FALSE}) where only a subset of the ontology -#' that is connected to a given term is considered when assigning levels. -#' Relative mode can be helpful when trying to make plot where nodes are -#' scaled to the ontology level. -#' @param absolute Make the levels absolute in the sense that they consider -#' the entire HPO ontology (\code{TRUE}). -#' Otherwise, levels will be relative to only the HPO terms that are in -#' the provided subset of \code{terms} AND are directly adjacent (connected) -#' to a given cluster of terms (\code{FALSE}). -#' @param reverse If \code{TRUE}, ontology -#' level numbers with be revered such that the level of the parent terms -#' are larger than the child terms. -#' @param exclude_top_lvl Exclude the top level term of the HPO -#' (i.e. "All" (HP:0000001)) when computing \emph{absolute} levels. -#' This argument is not used when computing \emph{relative} levels. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @inheritParams adjacency_matrix -#' @returns A named vector of relative ontology level, -#' where names are HPO Ids and -#' value is relative ontology level. -#' -#' @export -#' @importFrom stats setNames -#' @examples -#' terms <- ontologyIndex::get_descendants(ontology = get_hpo(), -#' roots = "HP:0000002") -#' lvls <- get_ont_lvls(terms = terms) -#' lvls_abs <- get_ont_lvls(terms = terms, absolute=TRUE) -get_ont_lvls <- function(terms, - hpo = get_hpo(), - adjacency = NULL, - absolute = TRUE, - exclude_top_lvl=TRUE, - reverse = TRUE, - verbose = TRUE) { - - terms <- unique(terms) - messager("Getting",if(absolute)"absolute"else"relative", - "ontology level for", - formatC(length(terms),big.mark = ","),"HPO IDs.", v=verbose) - #### Create adjacency matrix if needed #### - if(isFALSE(absolute) & - is.null(adjacency)){ - adjacency <- adjacency_matrix(terms = terms, - hpo = hpo, - verbose = verbose) - } - #### Get ontology levle for each HPO term #### - hierarchy <- lapply(stats::setNames(terms, - terms), - function(term){ - get_ont_lvl(term = term, - hpo = hpo, - adjacency = adjacency, - absolute = absolute, - verbose = FALSE) - }) |> unlist() - #### Reverse levels #### - if (isTRUE(reverse) && - isFALSE(absolute)) { - hierarchy <- max(hierarchy) - hierarchy - } - if(isFALSE(reverse) && - isTRUE(absolute)){ - max_lvl <- get_max_ont_lvl(hpo = hpo, - exclude_top_lvl = exclude_top_lvl) - hierarchy <- max_lvl- hierarchy - } - return(hierarchy) -} diff --git a/R/get_ont_lvls2.R b/R/get_ont_lvls2.R deleted file mode 100644 index db38514..0000000 --- a/R/get_ont_lvls2.R +++ /dev/null @@ -1,49 +0,0 @@ -#' Get relative ontology level for multiple HPO terms -#' -#' This calls the \code{get_ont_lvl} function on all phenotypes in a -#' subset of the HPO. The subset chosen when creating the adjacency from the main -#' adjacency matrix of all phenotypes. So, the phenotypes can be found in the -#' row and column names of adjacency. -#' @param reverse A boolean, if TRUE it will reverse the ontology -#' level numbers so that -#' the parent terms are larger than the child terms. -#' @param absolute Make the levels absolute in the sense that they consider -#' the entire HPO ontology (\code{TRUE}). -#' Otherwise, levels will be relative to only the subset \code{terms} provided -#' (\code{FALSE}). -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @inheritParams adjacency_matrix -#' @returns A named vector of relative ontology level, -#' where names are HPO Ids and -#' value is relative ontology level. -#' -#' @export -#' @importFrom stats setNames -#' @examples -#' terms <- ontologyIndex::get_descendants(ontology = get_hpo(), -#' roots = "HP:0000002") -#' lvls <- get_ont_lvls2(terms = terms) -get_ont_lvls2 <- function(terms, - hpo = get_hpo(), - adjacency = - adjacency_matrix(terms = terms, - hpo = hpo), - absolute = FALSE, - reverse = TRUE, - verbose = TRUE) { - - messager("Getting ontology level for", - formatC(length(terms),big.mark = ","),"HPO IDs.", v=verbose) - # if(isTRUE(absolute)){ - # adjacency <- adjacency_matrix(hpo = hpo, - # verbose = verbose) - # } - - - - # if (isTRUE(reverse)) { - # hierarchy <- max(hierarchy) - hierarchy - # } - # return(hierarchy) -} diff --git a/R/get_orphanet_epidemiology.R b/R/get_orphanet_epidemiology.R deleted file mode 100644 index e37fd2c..0000000 --- a/R/get_orphanet_epidemiology.R +++ /dev/null @@ -1,79 +0,0 @@ -get_orphanet_epidemiology <- function(agg_by=c("MONDO_ID","id","Name"), - include_mondo=TRUE){ - # https://www.orphadata.com/epidemiology/ - # tmp <- tempfile(fileext = ".xml") - # download.file("https://www.orphadata.com/data/xml/en_product9_prev.xml", - # destfile = tmp) - # xml <- rvest::read_html(tmp) - - # xml <- xml2::read_xml(tmp) - # xmlconvert::xml_to_df(xml, records.xpath = "/html") - # xmls <- xml |> - # rvest::html_nodes("Disorder") |> - # # xml2::xml_find_all(".//Disorder") |> - # xml2::as_list()# |> - # tibble::as_tibble(xmls[[1]]) |> - # tidyr::unnest_longer(col=c(OrphaCode,ExpertLink, - # Name,DisorderType,DisorderGroup), simplify = TRUE) |> - # tidyr::unnest_wider(col=PrevalenceList) |> - # tidyr::unnest_longer(col = c(Source,PrevalenceType,PrevalenceQualification,ValMoy)) - # - # - # nodes <- xml2::xml_find_all(xml, ".//Disorder") - # ## Preview structure - # nodes[1]|> xml2::html_structure() - # # xml2::xml_path()|> - # # xml2::xml_text() - # - # ### Convert each node to a flattened data.table - # xml2::xml_find_all(nodes[1:10], ".//Prevalence") |> - # xml2::as_list() |> - # purrr::flatten() |> - # data.table::as.data.table()# |> - # data.table::transpose() - - - mean_prevalence <- Prevalence.ValMoy <- prevalence_denominator <- MONDO_ID <- - NULL; - ## Open in Excel and convert to CSV first ## - path <- system.file("extdata", "orphanet_epidemiology.csv.gz", - package = "HPOExplorer") - d <- data.table::fread(path) - #### Fix column names #### - names(d) <- trimws(whitespace = "[.]", - gsub("[.]+",".", - gsub("/|#",".", - gsub(paste("/DisorderList", - "/Disorder", - "/PrevalenceList", - sep = "|"), - "", - names(d) - ) - ) - ) - ) |> `names<-`(names(d)) - #### Prepare numeric prevalence data #### - d[,prevalence_numerator:=`Prevalence.ValMoy`] - d$prevalence_denominator <- gsub( - " +","", - stringr::str_split(d$Prevalence.PrevalenceClass.Name," / ", - simplify = TRUE)[,2] - ) |> as.numeric() - d[,prevalence:=prevalence_numerator/prevalence_denominator*100] - - #### Add MONDO ID #### - if(isTRUE(include_mondo)){ - d[,MONDO_ID:=mondo_dict(ids = id)] - } - - if(!is.null(agg_by)){ - ## Compute mean prevalence - dprev <- d[,list(n=.N, mean_prevalence=mean(prevalence, na.rm=TRUE)), - by=agg_by #"Prevalence.PrevalenceType.Name" - ][order(-mean_prevalence)] - return(dprev) - } else { - return(d) - } -} diff --git a/R/get_term_definition_api.R b/R/get_term_definition_api.R index d90d767..f552d71 100644 --- a/R/get_term_definition_api.R +++ b/R/get_term_definition_api.R @@ -4,7 +4,6 @@ #' HPO term. If a \code{line_length} \> 0 is passed to the function, it will add #' newlines every nth word. This can be useful when displaying the description #' in plots with limited space. -#' @param term One or more HPO IDs. #' @returns Character vector of definitions. #' @keywords internal get_term_definition_api <- function(term, diff --git a/R/get_term_definition_data.R b/R/get_term_definition_data.R index df27352..b243652 100644 --- a/R/get_term_definition_data.R +++ b/R/get_term_definition_data.R @@ -1,7 +1,9 @@ get_term_definition_data <- function(term, line_length, hpo = get_hpo()){ - definitions <- hpo$def[term] + dict <- stats::setNames(hpo@elementMetadata$definition, + hpo@elementMetadata$id) + definitions <- dict[term] if (line_length > 0) { definitions <- substr(x=definitions, start=0, stop=line_length) } diff --git a/R/get_upheno.R b/R/get_upheno.R deleted file mode 100644 index 4d29dad..0000000 --- a/R/get_upheno.R +++ /dev/null @@ -1,68 +0,0 @@ -#' Get UPHENO -#' -#' Get data from the \href{https://github.com/obophenotype/upheno}{ -#' Unified Phenotype Ontology (UPHENO)}. -#' -#' @param file Can be one of the following: -#' \itemize{ -#' \item{"ontology"}{Creates an \link[ontologyIndex]{ontologyIndex} R object by -#' importing the OBO file directly from the official -#' \href{https://github.com/obophenotype/upheno}{UPHENO GitHub repository}.} -#' \item{"bestmatches"}{Returns a merged table with the best matches between -#' human and non-human homologous phenotypes (from multiple species). -#' Distributed by the official -#' \href{https://github.com/obophenotype/upheno/tree/master/mappings}{ -#' UPHENO GitHub repository}.} -#' \item{"upheno_mapping"}{Return a merged table with matches bteween human -#' and non-human homologous phenotypes (from multiple species). -#' Distributed by the -#' \href{https://data.monarchinitiative.org/upheno2/current/upheno-release/all/index.html}{ -#' Monarch Initiative server}.} -#' } -#' @import data.table -#' @importFrom stringr str_split -#' @returns \link[ontologyIndex]{ontologyIndex} or -#' \link[data.table]{data.table}. -#' -#' @export -#' @examples -#' upheno <- get_upheno() -get_upheno <- function(file=c("ontology", - "bestmatches", - "upheno_mapping")){ - file <- match.arg(file) - if(file=="ontology"){ - requireNamespace("ontologyIndex") - upheno <- ontologyIndex::get_OBO( - "https://github.com/obophenotype/upheno-dev/raw/master/upheno.obo", - extract_tags = "everything") - return(upheno) - } - if(file=="bestmatches"){ - #### Fuzzy query #### - ## Only between HPO and 3 ontologies - base_url <- "http://purl.obolibrary.org/obo/upheno/mappings/" - URLs <- paste0(base_url, - c("hp-to-zp-bestmatches.tsv", - "hp-to-mp-bestmatches.tsv", - "hp-to-wbphenotype-bestmatches.tsv")) - pheno_map <- lapply(URLs, function(x){ - data.table::fread(x) - }) |> `names<-`(gsub("-bestmatches.tsv","",basename(URLs))) |> - data.table::rbindlist(idcol = "map", fill = TRUE) |> - `names<-`(c("map","id1","label1","id2", - "label2","equivalence_score","subclass_score")) - pheno_map$db2 <- stringr::str_split(pheno_map$id2,":", simplify = TRUE)[,1] - return(pheno_map) - } - if (file=="upheno_mapping"){ - id1 <- id2 <- p1 <- p2 <- NULL; - pheno_map <- get_monarch("phenotype_to_phenotype") - pheno_map[,id1:=gsub("_",":",basename(p1)) - ][,id2:=gsub("_",":",basename(p2))] - pheno_map$db1 <- stringr::str_split(pheno_map$id1,":", simplify = TRUE)[,1] - pheno_map$db2 <- stringr::str_split(pheno_map$id2,":", simplify = TRUE)[,1] - data.table::setkeyv(pheno_map,"id1") - return(pheno_map) - } -} diff --git a/R/get_version.R b/R/get_version.R deleted file mode 100644 index f23d222..0000000 --- a/R/get_version.R +++ /dev/null @@ -1,34 +0,0 @@ -#' Get version -#' -#' Extract the precise version of the HPO release that the data object -#' was built from. All HPO Releases can be found at the official -#' \href{https://github.com/obophenotype/human-phenotype-ontology/releases}{ -#' HPO GitHub Releases page}. -#' @param obj An object from -#' \link[HPOExplorer]{get_hpo} or -#' \link[HPOExplorer]{load_phenotype_to_genes}. -#' @param verbose Print messages. -#' @param return_version Return the version as a character string. -#' @returns HPO Release version a character string. -#' -#' @export -#' @examples -#' obj <- get_hpo() -#' get_version(obj=obj) -get_version <- function(obj, - return_version = FALSE, - verbose = TRUE){ - ## Extract - if(methods::is(obj,"ontology_index")){ - x <- grep("data-version:",attr(obj,"version"),value=TRUE) - v <- paste0("v", - trimws(gsub("data-version:|hp/releases/|/hp-base.owl","",x)) - ) - } else { - v <- attr(obj,"version") - } - ## Print - messager("+ Version:",v,v=verbose) - ## Return - if(isTRUE(return_version)) return(v) -} diff --git a/R/gpt_annot_check.R b/R/gpt_annot_check.R index d52a6e0..939c917 100644 --- a/R/gpt_annot_check.R +++ b/R/gpt_annot_check.R @@ -27,8 +27,8 @@ gpt_annot_check <- function(annot = gpt_annot_read(), # prior_ids <- unique(HPOExplorer::hpo_modifiers$hpo_id) # new_ids <- unique(annot$hpo_id) # length(new_ids)/length(prior_ids) - # length(prior_ids)/length(hpo$id) - # length(new_ids)/length(hpo$id) + # length(prior_ids)/length(hpo@terms) + # length(new_ids)/length(hpo@terms) #### Check annotation consistency #### nm <- names(annot)[!grepl("hpo_name|justification|hpo_id",names(annot), ignore.case = TRUE)] diff --git a/R/harmonise_phenotypes.R b/R/harmonise_phenotypes.R deleted file mode 100644 index b3f6d30..0000000 --- a/R/harmonise_phenotypes.R +++ /dev/null @@ -1,83 +0,0 @@ -#' Harmonise phenotypes -#' -#' Harmonise a mixed vector of phenotype names (e.g. "Focal motor seizure") -#' and HPO IDs (e.g. c("HP:0000002","HP:0000003")). -#' @param phenotypes A character vector of phenotype names and/or HPO IDs. -#' @param as_hpo_ids Return all \code{phenotypes} as HPO IDs (\code{TRUE}), -#' or phenotype names (\code{FALSE}). -#' @param ignore_case Ignore casing when searching for matches. -#' @param keep_order Return a named list of the same length and order -#' as \code{phenotypes}. -#' If \code{FALSE}, return a named list of only the unique \code{phenotypes}, -#' sometimes in a different order. -#' @param validate Remove any phenotype names or IDs that cannot be found in the -#' \code{hpo}. -#' @param invert Invert the keys/values of the dictionary, -#' such that the key becomes the values (and vice versa). -#' @param verbose Print messages. -#' @inheritParams make_phenos_dataframe -#' @returns Character vector -#' -#' @export -#' @importFrom stats setNames -#' @examples -#' phenotypes <- c("Focal motor seizure","HP:0000002","HP:0000003") -#' #### As phenotype names #### -#' pheno_names <- harmonise_phenotypes(phenotypes=phenotypes) -#' #### As HPO IDs #### -#' pheno_ids <- harmonise_phenotypes(phenotypes=phenotypes, as_hpo_ids=TRUE) -harmonise_phenotypes <- function(phenotypes, - hpo = get_hpo(), - as_hpo_ids = FALSE, - validate = TRUE, - ignore_case = TRUE, - keep_order = TRUE, - invert = FALSE, - verbose = TRUE){ - - # devoptera::args2vars(harmonise_phenotypes) - phenotypes_og <- phenotypes - phenotypes <- unique(phenotypes) - hpo_ids <- grep("^HP:|^HP_",phenotypes, - value = TRUE, - ignore.case = ignore_case) - ptypes <- phenotypes[!phenotypes %in% hpo_ids] - #### Validate phenotypes #### - if(isTRUE(as_hpo_ids)){ - messager("Translating all phenotypes to HPO IDs.",v=verbose) - out <- stats::setNames(hpo_ids,hpo_ids) - if(length(ptypes)>0) { - id_dict <- stats::setNames(names(hpo$name), - unname(hpo$name)) - out <- c(out,id_dict[ptypes]) - } - if(isTRUE(validate)){ - out <- out[out %in% unname(hpo$id)] - } - } else { - messager("Translating all phenotypes to names.",v=verbose) - out <- stats::setNames(ptypes,ptypes) - if(length(hpo_ids)>0){ - out <- c(out, hpo$name[hpo_ids]) - } - if(isTRUE(validate)){ - out <- out[out %in% unname(hpo$name)] - } - } - #### Return #### - if(isFALSE(keep_order)){ - messager("+ Returning a dictionary of phenotypes", - "(different order as input).", - v=verbose) - } else { - messager("+ Returning a vector of phenotypes", - "(same order as input).", - v=verbose) - out <- out[phenotypes_og] - } - #### Invert #### - if(isTRUE(invert)){ - out <- stats::setNames(names(out), unname(out)) - } - return(out) -} diff --git a/R/hpo_modifiers_agg.R b/R/hpo_modifiers_agg.R index 376ec14..598eee1 100644 --- a/R/hpo_modifiers_agg.R +++ b/R/hpo_modifiers_agg.R @@ -1,11 +1,11 @@ -hpo_modifiers_agg <- function(dt, +hpo_modifiers_agg <- function(dat, by = c("disease_id","hpo_id")){ modifier <- modifier_name <- disease_name <- disease_name <- disease_id <- Severity_score <- Severity_score_min <- hpo_id <- NULL; by <- by[1] if(by=="hpo_id"){ - dt2 <- dt[,list( + dt2 <- dat[,list( modifier=paste(unique(modifier),collapse=";"), modifier_name=paste(unique(modifier_name),collapse=";"), modifier_count=paste(table(unlist(modifier_name)),collapse=";"), @@ -16,7 +16,7 @@ hpo_modifiers_agg <- function(dt, Severity_score_min=min(Severity_score, na.rm=TRUE) ), by=by] } else if (by=="disease_id"){ - dt2 <- dt[,list( + dt2 <- dat[,list( disease_name=disease_name, modifier=paste(unique(modifier),collapse=";"), modifier_name=paste(unique(modifier_name),collapse=";"), diff --git a/R/hpo_to_matrix.R b/R/hpo_to_matrix.R index fd8aff9..324c645 100644 --- a/R/hpo_to_matrix.R +++ b/R/hpo_to_matrix.R @@ -55,8 +55,7 @@ hpo_to_matrix <- function(terms = NULL, phenotype_to_genes[,dummy:=1] value.var <- "dummy" } else if(grepl("^evidence_score",value.var)){ - phenotype_to_genes <- add_evidence(phenos = phenotype_to_genes, - verbose = verbose) + phenotype_to_genes <- add_evidence(phenos = phenotype_to_genes) } else if(!value.var %in% names(phenotype_to_genes)){ stp <- paste("value.var not found in phenotype_to_genes.") stop(stp) @@ -82,7 +81,10 @@ hpo_to_matrix <- function(terms = NULL, #### Format and return #### if(isTRUE(as_matrix) || isTRUE(run_cor)){ - X <- as.matrix(X_dt[,-meta_vars,with=FALSE])|> `rownames<-`(rn) + X <- dt_to_matrix(dat=X_dt, + omit_cols = meta_vars, + rownames = rn, + as_sparse = FALSE) if(isTRUE(run_cor)){ messager("Computing all parwise correlations.",v=verbose) X_cor <- stats::cor(X, method = method) diff --git a/R/ids_to_mondo.R b/R/ids_to_mondo.R deleted file mode 100644 index 97d738f..0000000 --- a/R/ids_to_mondo.R +++ /dev/null @@ -1,12 +0,0 @@ -mondo_dict <- function(mondo=get_mondo(), - ids=NULL){ - xref <- unlist(mondo$xref) - # xref <- xref[names(xref) %in% names(mondo$id)] - dict <- xref |> invert_dict() - names(dict) <- gsub("^Orphanet","ORPHA",names(dict)) - if(!is.null(ids)) { - return(dict[ids]) - } else { - return(dict) - } -} diff --git a/R/igraph_to_ggnetwork.R b/R/igraph_to_ggnetwork.R deleted file mode 100644 index b494293..0000000 --- a/R/igraph_to_ggnetwork.R +++ /dev/null @@ -1,5 +0,0 @@ -igraph_to_ggnetwork <- function(g){ - g |> - igraph::simplify() |> - ggnetwork::fortify() -} diff --git a/R/igraph_to_plotly.R b/R/igraph_to_plotly.R deleted file mode 100644 index 0fdf6a9..0000000 --- a/R/igraph_to_plotly.R +++ /dev/null @@ -1,69 +0,0 @@ -#' igraph to plotly data -#' -#' Convert an igraph to data for a 3D plotly plot. -#' @param dim Number of dimensions to create layout in. -#' @inheritParams network_3d -#' @returns Named list of data.frames. -#' -#' @keywords internal -#' @importFrom data.table data.table as.data.table .SD := -igraph_to_plotly <- function(g, - layout_func = igraph::layout.fruchterman.reingold, - dim = 3, - seed = 2023, - verbose = TRUE){ - - requireNamespace("igraph") - .SD <- NULL; - - set.seed(seed) - messager("Converting igraph to plotly data.",v=verbose) - layout_coords <- cbind( - name=names(igraph::V(g)), - layout_func(g,dim=dim) |> - data.table::as.data.table()|> - `colnames<-`(c("x","y","z")[seq(dim)]) - ) - # d <- data.table::as.data.table(igraph::as_edgelist(g)) - d <- igraph::as_data_frame(g, what = "both") - # d <- igraph::as_long_data_frame(g) - # gnet <- data.table::data.table( - # igraph_to_ggnetwork(g) - # )[,-c("x","y","xend","yend")] - # if("node_type" %in% names(gnet)){ - # gnet <- unique(gnet[node_type %in% c("hpo_name","ancestor_name")]) - # } - - #### Vertex data #### - #### Merge layout coordinates with vertex metadata #### - vdf <- merge( - layout_coords, - d$vertices, - by = "name", - all = TRUE - ) - ## Make NAs into characters so that they still get assigned a point color - cols <- names(vdf)[sapply(vdf, class) == 'character'] - vdf[, (cols) := lapply(.SD, replace,NA,"NA"),.SDcols=cols] - #### Edge data #### - edf <- data.table::merge.data.table( - data.table::data.table(d$edges), - layout_coords, - by.x="from", - by.y="name" - ) |> data.table::merge.data.table( - data.table::copy(layout_coords) |> - data.table::setnames(c("x","y","z")[seq(dim)], - c("xend","yend","zend")[seq(dim)] - ), - by.x="to", - by.y="name" - ) - - if(!"hpo_name" %in% names(vdf)){ - vdf$hpo_name <- harmonise_phenotypes(phenotypes = vdf$hpo_id, - as_hpo_ids = FALSE) - } - return(list(vertices=vdf, - edges=edf)) -} diff --git a/R/invert_dict.R b/R/invert_dict.R deleted file mode 100644 index 14100f8..0000000 --- a/R/invert_dict.R +++ /dev/null @@ -1,3 +0,0 @@ -invert_dict <- function(dict){ - stats::setNames(names(dict),unname(dict)) -} diff --git a/R/kde_surface.R b/R/kde_surface.R deleted file mode 100644 index 416f842..0000000 --- a/R/kde_surface.R +++ /dev/null @@ -1,57 +0,0 @@ -#' Kernel Density Estimation (KDE) surface -#' -#' Compute a KDE surface based on the density of points along -#' an x- and y-axis. -#' @param xyz A data.frame containing the columns "x" and "y" (required). -#' Can also include a third column "z" (optional). -#' @param extend_kde Extend the limits of the KDE area by setting -#' \code{extend_kde>1}. -#' This makes the "mountains' of the KDE end more smoothly along the edges of -#' the x/y coordinates. -#' @param rescale_z Rescale the z-axis so that the KDE can be positioned -#' below the original data points (when plotting them together). -#' @inheritParams MASS::kde2d -#' @returns -#' \itemize{ -#' \item{\code{x, y}: }{ -#' The x and y coordinates of the grid points, vectors of length n. -#' } -#' \item{\code{z}: }{ -#' An \code{n[1]} by \code{n[2]} matrix of the estimated density: -#' rows correspond to the value of \code{x}, columns to the value of \code{y}. -#' } -#' } -#' -#' @export -#' @examples -#' xyz <- data.frame(x=stats::rnorm(50), -#' y=stats::rnorm(50), -#' z=stats::rnorm(50)) -#' kd <- kde_surface(xyz = xyz) -kde_surface <- function(xyz, - n = 50, - extend_kde = 1, - rescale_z = TRUE){ - # devoptera::args2vars(kde_surface) - requireNamespace("MASS") - requireNamespace("scales") - - kd <- MASS::kde2d(x = xyz$x, - y = xyz$y, - n = n, - lims = c(range(xyz$x), - range(xyz$y) - )*extend_kde) - #### Rescale the z-axis so that the KDE plot is below the points #### - if(isTRUE(rescale_z)){ - if("z" %in% names(xyz)){ - kd$z <- scales::rescale(x = kd$z, - to = c(min(xyz$z*2), - min(xyz$z)-.25)) - } else{ - wrn <- "Cannot rescale_z when z column not present in xyz data.frame." - warning(wrn) - } - } - return(kd) -} diff --git a/R/list_deaths.R b/R/list_deaths.R index 932273d..9d91160 100644 --- a/R/list_deaths.R +++ b/R/list_deaths.R @@ -1,3 +1,4 @@ +#' @describeIn map_ map_ #' List age of death HPO terms #' #' List age of death phenotypes in the HPO. @@ -10,22 +11,19 @@ #' deaths <- list_deaths() list_deaths <- function(hpo = get_hpo(), exclude = FALSE,# c("Miscarriage","Stillbirth","Prenatal death" ) - as_hpo_ids = FALSE, - include_na = TRUE, - verbose = TRUE){ - # devoptera::args2vars(list_opts) - - opts <- harmonise_phenotypes(phenotypes = names(hpo_dict(type = "AgeOfDeath")), - hpo = hpo, - as_hpo_ids = TRUE, - keep_order = FALSE, - invert = TRUE, - verbose = verbose) + to = c("name","id"), + include_na = TRUE){ + to <- match.arg(to) + opts <- map_phenotypes(terms = names(hpo_dict(type = "AgeOfDeath")), + hpo = hpo, + to="id", + keep_order = FALSE, + invert = TRUE) if(!is.null(exclude)){ opts <- opts[!grepl(paste(exclude,collapse = "|"),opts, ignore.case = TRUE)] } - if(isTRUE(as_hpo_ids)){ + if(to=="id"){ ids <- names(opts) if(isTRUE(include_na)){ ids <- c(ids,NA) diff --git a/R/list_onsets.R b/R/list_onsets.R index 5b36850..153cc47 100644 --- a/R/list_onsets.R +++ b/R/list_onsets.R @@ -1,8 +1,8 @@ +#' @describeIn map_ map_ #' List age of onset HPO terms #' #' List age of onset phenotypes in the HPO. #' @param exclude HPO phenotype names to exclude. -#' @param as_hpo_ids Return as a character vector vector HPO IDs only. #' @param include_na Include NA values for onset. #' @inheritParams make_phenos_dataframe #' @returns Named list of HPO IDs. @@ -12,22 +12,20 @@ #' onsets <- list_onsets() list_onsets <- function(hpo = get_hpo(), exclude = FALSE, #c("Antenatal","Fetal","Congenital") - as_hpo_ids = FALSE, + to = c("name","id"), include_na = TRUE, verbose = TRUE){ - # devoptera::args2vars(list_onsets) - - opts <- harmonise_phenotypes(phenotypes = names(hpo_dict(type = "onset")), - hpo = hpo, - as_hpo_ids = TRUE, - keep_order = FALSE, - invert = TRUE, - verbose = verbose) + to <- match.arg(to) + opts <- map_phenotypes(terms = names(hpo_dict(type = "onset")), + hpo = hpo, + to="id", + keep_order = FALSE, + invert = TRUE) if(!is.null(exclude)){ opts <- opts[!grepl(paste(exclude,collapse = "|"),opts, ignore.case = TRUE)] } - if(isTRUE(as_hpo_ids)){ + if(to=="id"){ ids <- names(opts) if(isTRUE(include_na)){ ids <- c(ids,NA) diff --git a/R/load_decipher_genes.R b/R/load_decipher_genes.R deleted file mode 100644 index f0f201b..0000000 --- a/R/load_decipher_genes.R +++ /dev/null @@ -1,27 +0,0 @@ -load_decipher_genes <- function(verbose=TRUE){ - - requireNamespace("R.utils") - disease_name <- disease_name <- ID <- `disease_id` <- NULL; - - messager("Loading DECIPHER genes.",v=verbose) - #### UCSC bigbed file #### - # "https://hgdownload.soe.ucsc.edu/gbdb/hg38/" - - #### EBI annotations file #### - dat <- data.table::fread( - "https://www.ebi.ac.uk/gene2phenotype/downloads/DDG2P.csv.gz") - names(dat) <- gsub(" ","_",names(dat)) - dat[,disease_name:=tolower(disease_name)] - ## Bizarrely, the do not provide their disease IDs in their own database. - ## Have to instead infer from the HPO data - d <- load_phenotype_to_genes("phenotype.hpoa") - d <- d[grepl("DECIPHER",d$disease_id),] - d[,ID:=disease_id][,disease_name:=tolower(disease_name)] - dat <- data.table::merge.data.table(dat, - d[,c("ID","disease_name")], - by.x = "disease_name", - by.y = "disease_name", - all.x = TRUE) - # sum(!is.na(dat$ID)) - return(dat) -} diff --git a/R/load_disease_genes.R b/R/load_disease_genes.R deleted file mode 100644 index d7b1fdb..0000000 --- a/R/load_disease_genes.R +++ /dev/null @@ -1,31 +0,0 @@ -#' Load disease genes -#' -#' Load gene lists associated with each disease phenotype from: -#' \itemize{ -#' \item{DECIPHER} -#' \item{ORPHANET} -#' \item{OMIM} -#' } -#' @param verbose Print messages. -#' @returns data.table -#' -#' @export -#' @importFrom data.table := rbindlist -#' @examples -#' dat <- load_disease_genes() -load_disease_genes <- function(verbose=TRUE){ - # devoptera::args2vars(load_disease_genes) - - #### Import data #### - decipher <- load_decipher_genes(verbose = verbose) - orphanet <- load_orphanet_genes(verbose = verbose) - omim <- load_omim_genes(verbose = verbose) - #### Merge data #### - nms <- c("disease_id","disease_name_og","gene_symbol") - dgenes <- list( - DECIPHER=decipher[,c("ID","disease_name","gene_symbol")] |> `names<-`(nms), - ORPHANET=orphanet[,c("Orphanet_ID","phenotype","gene")] |> `names<-`(nms), - OMIMG=omim[,c("OMIMID","Disease","GeneSym")] |> `names<-`(nms) - ) |> data.table::rbindlist(fill = TRUE,use.names = TRUE, idcol = "Database") - return(dgenes) -} diff --git a/R/load_harmonizome_genes.R b/R/load_harmonizome_genes.R deleted file mode 100644 index e98b2af..0000000 --- a/R/load_harmonizome_genes.R +++ /dev/null @@ -1,11 +0,0 @@ -load_harmonizome_genes <- function(dataset){ - # dataset <- c("omim","clinvar") - dataset <- tolower(dataset[1]) - baseurl <- paste0( - "https://maayanlab.cloud/static/hdfs/harmonizome/data/",dataset - ) - genes <- data.table::fread(paste0(baseurl,"/gene_list_terms.txt.gz")) - terms <- data.table::fread(paste0(baseurl,"/attribute_list_entries.txt.gz")) - dat <- data.table::merge.data.table(terms, genes) - return(dat) -} diff --git a/R/load_omim_genes.R b/R/load_omim_genes.R deleted file mode 100644 index 8be2f6e..0000000 --- a/R/load_omim_genes.R +++ /dev/null @@ -1,12 +0,0 @@ -load_omim_genes <- function(verbose=TRUE){ - - messager("Loading OMIM genes.",v=verbose) - #### From enrichr ##### - ## Outdated file - # dat <- read_enrichr(file = "https://maayanlab.cloud/Enrichr/geneSetLibrary?mode=text&libraryName=OMIM_Expanded") - - #### From Harmonizome #### - # j <- jsonlite::fromJSON("https://maayanlab.cloud/Harmonizome/api/1.0/dataset/OMIM+Gene-Disease+Associations") - dat <- load_harmonizome_genes(dataset = "omim") - return(dat) -} diff --git a/R/load_orphanet_genes.R b/R/load_orphanet_genes.R deleted file mode 100644 index 644ac3a..0000000 --- a/R/load_orphanet_genes.R +++ /dev/null @@ -1,35 +0,0 @@ -load_orphanet_genes <- function(verbose=TRUE){ - - Orphanet_ID <- NULL; - messager("Loading Orphanet genes.",v=verbose) - # URL <- "https://hgdownload.soe.ucsc.edu/gbdb/hg38/bbi/orphanet/orphadata.bb" - # bb <- rtracklayer::import(URL) - - #### From Orphanet XML file #### - # (they don't provide the data in any easy-to-use format) - # xml <- xml2::read_xml("https://www.orphadata.com/data/xml/en_product6.xml") - # xml_list <- xml2::as_list(xml) - # df <- lapply(xml_list$JDBOR$DisorderList, function(x){ - # data.table::data.table( - # t(unlist(x[names(x)!="DisorderGeneAssociationList"])), - # t(unlist(x$DisorderGeneAssociationList$DisorderGeneAssociation$Gene[ - # c("Symbol") - # ])), - # t(unlist(x$DisorderGeneAssociationList$DisorderGeneAssociation[ - # c("SourceOfValidation","DisorderGeneAssociationType","DisorderGeneAssociationStatus") - # ])) - # ) - # }) |> data.table::rbindlist(fill = TRUE) - - #### From enrichrR #### - dat <- read_enrichr(file = "https://maayanlab.cloud/Enrichr/geneSetLibrary?mode=text&libraryName=Orphanet_Augmented_2021") - splt <- cbind( - ( - data.table::as.data.table( - stringr::str_split(dat$term,"ORPHA:",simplify = TRUE)) |> - `colnames<-`(c("phenotype","Orphanet_ID")) - )[,Orphanet_ID:=paste0("ORPHA:",Orphanet_ID)], - gene=dat$gene - ) - return(splt) -} diff --git a/R/load_phenotype_to_genes.R b/R/load_phenotype_to_genes.R index cffb1ff..1ad0d48 100644 --- a/R/load_phenotype_to_genes.R +++ b/R/load_phenotype_to_genes.R @@ -20,8 +20,9 @@ load_phenotype_to_genes <- function(file = c("phenotype_to_genes.txt", "genes_to_phenotype.txt", "phenotype.hpoa"), save_dir = file.path( - tools::R_user_dir("HPOExplorer", - which="cache"), + KGExplorer::cache_dir( + package = "HPOExplorer" + ), "data"), repo = paste( "obophenotype", @@ -49,7 +50,7 @@ load_phenotype_to_genes <- function(file = c("phenotype_to_genes.txt", !overwrite){ messager("Reading cached RDS file:",file,v=verbose) obj <- readRDS(path_rds) - get_version(obj,verbose=verbose) + KGExplorer::get_version(obj,verbose=verbose) return(obj) } #### Stored in GitHub Releases #### @@ -72,7 +73,7 @@ load_phenotype_to_genes <- function(file = c("phenotype_to_genes.txt", #### Add version #### if(!is.null(attr(f,"version"))){ attr(phenotype_to_genes,"version") <- attr(f,"version") - get_version(phenotype_to_genes,verbose=verbose) + KGExplorer::get_version(phenotype_to_genes, verbose=verbose) } #### Save RDS #### ## This lets up keep track of the version of the data without having to diff --git a/R/make_hoverboxes.R b/R/make_hoverboxes.R deleted file mode 100644 index 30c5355..0000000 --- a/R/make_hoverboxes.R +++ /dev/null @@ -1,69 +0,0 @@ -#' Make hoverboxes -#' -#' A hoverbox is a box of text that shows up when the cursor -#' hovers over something. -#' These can be useful when making interactive network plots -#' of the HPO phenotypes because we can include a hoverbox that gives -#' information and data associated with each phenotype. -#' -#' This function expects a dataframe of with a "hpo_name" column that has the -#' name of each phenotype. It must then include columns -#' for all of the parameters you wish to include in the hoverbox. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @inheritParams base::round -#' @inheritParams stringr::str_wrap -#' @returns A nicely formatted string with newlines etc, -#' to be used as a hoverbox. -#' -#' @export -#' @importFrom stats setNames -#' @importFrom data.table := -#' @importFrom stringr str_wrap -#' @examples -#' phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay", -#' add_hoverboxes = FALSE) -#' phenos <- make_hoverboxes(phenos = phenos) -make_hoverboxes <- function(phenos, - columns = list_columns(), - interactive = TRUE, - width = 60, - digits = 3, - verbose = TRUE) { - # templateR:::source_all() - # devoptera::args2vars(make_hoverboxes) - - hover <- hpo_id <- hpo_name <- NULL; - - #### Select sep #### - sep <- if(isTRUE(interactive)) "
" else "\n" - columns <- columns[unname(columns) %in% names(phenos)] - if(length(columns)==0){ - messager("No columns found. Making hoverboxes from hpo_id only.",v=verbose) - phenos[hover:=paste("hpo_id:",hpo_id)] - } else { - messager("Making hoverboxes from:", - paste(shQuote(columns),collapse = ", "),v=verbose) - #### Iterate over phenotypes #### - hoverBoxes <- lapply(stats::setNames( - unique(phenos$hpo_name), - unique(phenos$hpo_name) - ), function(pheno_i){ - lapply(seq(length(columns)), function(i){ - val <- phenos[hpo_name == pheno_i, ][1,][[columns[[i]]]] - val <- if(is.numeric(val)) round(val,digits = digits) else { - paste( - stringr::str_wrap(val, width = width), - collapse = sep - ) - } - paste0("",names(columns)[[i]],"", - ": ",val - ) - }) |> paste(collapse = sep) - }) - #### Assign to each row ##### - phenos$hover <- unlist(hoverBoxes[phenos$hpo_name]) - } - return(phenos) -} diff --git a/R/make_igraph_object.R b/R/make_igraph_object.R index 7a9832c..a5a04fc 100644 --- a/R/make_igraph_object.R +++ b/R/make_igraph_object.R @@ -1,3 +1,4 @@ +#' @describeIn make_ make_ #' Make an \link[igraph]{igraph} object #' #' This uses the network package to coerce the adjacency matrix into a @@ -8,8 +9,6 @@ #' hpo_id. #' @inheritParams make_phenos_dataframe #' @inheritParams make_network_object -#' @inheritParams ggnetwork::fortify.network -#' @inheritDotParams ggnetwork::ggnetwork #' @returns A \link[igraph]{igraph} object. #' #' @export @@ -18,11 +17,7 @@ #' g <- make_igraph_object(phenos = phenos) make_igraph_object <- function(phenos, hpo = get_hpo(), - adjacency = adjacency_matrix( - terms = phenos$hpo_id, - hpo = hpo), colour_var = "fold_change", - add_ont_lvl_absolute = FALSE, cols = list_columns( extra_cols = c( colour_var, @@ -31,27 +26,20 @@ make_igraph_object <- function(phenos, value = TRUE) ) ), - layout = "fruchtermanreingold", - verbose = TRUE, ... ){ - requireNamespace("igraph") - phenoNet <- make_network_object(phenos = phenos, - hpo = hpo, - adjacency = adjacency, - colour_var = colour_var, - add_ont_lvl_absolute = add_ont_lvl_absolute, - cols = cols, - verbose = verbose, - ...) - messager("Creating igraph object.",v=verbose) - vertices <- unique( - phenoNet[,!names(phenoNet) %in% c("x","y","vertex.names","xend","yend")] - ) - rownames(vertices) <- vertices$hpo_id - g <- igraph::graph_from_adjacency_matrix(adjacency) - for(n in names(vertices)){ - igraph::vertex_attr(g,name = n) <- vertices[names(igraph::V(g)),n] + requireNamespace("tidygraph") + g <- KGExplorer::ontology_to(ont = hpo, + terms = phenos$hpo_id, + to = "tbl_graph") + pcols <- intersect(names(phenos), names(cols)) + gcols <- KGExplorer:::get_graph_colnames(g) + cols <- setdiff(pcols, gcols) + if(length(cols)>0){ + phenos <- phenos[,cols,with=FALSE] + g <- g |> tidygraph::activate("nodes") |> + tidygraph::left_join(by=c("name" = "hpo_id"), + phenos) } return(g) } diff --git a/R/make_network_object.R b/R/make_network_object.R index 569c3e0..903b493 100644 --- a/R/make_network_object.R +++ b/R/make_network_object.R @@ -1,3 +1,4 @@ +#' @describeIn make_ make_ #' Make a \link[ggnetwork]{ggnetwork} object #' #' This uses the network package to coerce the adjacency matrix into a @@ -6,15 +7,11 @@ #' #' It expects there to be a column of HPO IDs in the phenos dataframe called #' hpo_id. -#' @param phenos dataframe of phenotypes and values / parameters. -#' @param adjacency An adjacency matrix generated -#' by \link[HPOExplorer]{adjacency_matrix}. #' @param colour_var The column from phenos that you wish #' to map to node colour. #' @param cols Columns to add to metadata of \link[ggnetwork]{ggnetwork} object. -#' @inheritParams make_phenos_dataframe -#' @inheritParams ggnetwork::fortify.network -#' @inheritDotParams ggnetwork::ggnetwork +#' @inheritParams ggnetwork::fortify +#' @inheritDotParams ggnetwork::fortify #' @returns A \link[ggnetwork]{ggnetwork} object. #' #' @export @@ -27,10 +24,6 @@ #' colour_var = "ontLvl_geneCount_ratio") make_network_object <- function(phenos, hpo = get_hpo(), - adjacency = - adjacency_matrix( - terms = phenos$hpo_id, - hpo = hpo), colour_var = "fold_change", add_ont_lvl_absolute = FALSE, cols = list_columns( @@ -41,42 +34,35 @@ make_network_object <- function(phenos, value = TRUE) ) ), - layout = "fruchtermanreingold", - verbose = TRUE, + as=c("ggnetwork","tbl_graph"), ...) { - # devoptera::args2vars(make_network_object, reassign = TRUE) - - messager("Making phenotype network object.",v=verbose) - if("hpo_id" %in% names(phenos)){ - adjacency <- adjacency[unique(phenos$hpo_id), - unique(phenos$hpo_id)] - } - if(!"ontLvl" %in% names(phenos) && - isTRUE(add_ont_lvl_absolute)){ - phenos <- add_ont_lvl(phenos = phenos, - hpo = hpo, - absolute = TRUE, - verbose = verbose) - } - #### Create phenoNet obj #### - messager("Creating ggnetwork object.",v=verbose) - phenoNet <- ggnetwork::ggnetwork(x = adjacency, - arrow.gap = 0, - layout = layout, - ...) - cols <- cols[cols %in% names(phenos)] - for(col in cols){ - #### Add metadata to phenoNet #### - phenoNet <- make_node_data(phenoNet = phenoNet, - phenos = phenos, - phenos_column = col, - verbose = verbose) - } - #### Add number of total edges for each node #### - if("hpo_id" %in% names(phenos)){ - messager("Adding n_edges per node.",v=verbose) - phenoNet$n_edges <- rowSums(adjacency)[phenoNet$vertex.names] - } - phenoNet <- unique(phenoNet) - return(phenoNet) + as <- match.arg(as) + messager("Making phenotype network object.") + if(!"ontLvl" %in% names(phenos) && + isTRUE(add_ont_lvl_absolute)){ + phenos <- add_ont_lvl(phenos = phenos, + hpo = hpo, + absolute = TRUE) + } + #### Create phenoNet obj #### + g <- make_igraph_object(phenos, + hpo = hpo, + colour_var = colour_var, + cols = cols) + #### Return tbl_graph object if requested #### + if(as == "tbl_graph") return(g) + #### Proceed to convert to ggnetwork object #### + messager("Creating ggnetwork object.") + phenoNet <- ggnetwork::fortify(g, + ...) + cols <- cols[cols %in% names(phenos)] + #### No longer needed as make_igraph_object() adds these columns #### + # for(col in cols){ + # #### Add metadata to phenoNet #### + # phenoNet <- make_node_data(phenoNet = phenoNet, + # phenos = phenos, + # phenos_column = col) + # } + phenoNet <- unique(phenoNet) + return(phenoNet) } diff --git a/R/make_node_data.R b/R/make_node_data.R index 821002d..c6b7f2e 100644 --- a/R/make_node_data.R +++ b/R/make_node_data.R @@ -1,19 +1,18 @@ make_node_data <- function(phenoNet, - phenos, - phenos_column, - new_column=phenos_column, - verbose=TRUE) { + phenos, + phenos_column, + new_column=phenos_column) { if(!phenos_column %in% names(phenos)){ messager(paste0("phenos_column=",shQuote(phenos_column)), - "not found in phenos.",v=verbose) + "not found in phenos.") return(phenoNet) } - messager("Adding",paste0("new_column=",shQuote(new_column)),v=verbose) + messager("Adding",paste0("new_column=",shQuote(new_column))) # data.table::setkeyv(phenos,"hpo_id") # phenoNet[[new_column]] <- phenos[phenoNet$vertex.names, ][[phenos_column]] dat <- unique(phenos[,c("hpo_id",phenos_column), with=FALSE]) data_dict <- stats::setNames(dat[[phenos_column]], dat$hpo_id) - phenoNet[[new_column]] <- data_dict[phenoNet$vertex.names] + phenoNet[[new_column]] <- data_dict[phenoNet$name] return(phenoNet) } diff --git a/R/make_ontology.R b/R/make_ontology.R deleted file mode 100644 index 5b77dc1..0000000 --- a/R/make_ontology.R +++ /dev/null @@ -1,58 +0,0 @@ -#' Make an ontologyIndex object -#' -#' Make a \link[ontologyIndex]{ontology_index} -#' object from the Open Biomedical Ontologies (OBO) file. -#' By default, this function uses the Human Phenotype Ontology (HPO) -#' distributed via the official -#' \href{https://github.com/obophenotype/human-phenotype-ontology/releases}{ -#' HPO GitHub Releases}. -#' @param fix_ascii Fix non-ASCII characters in metadata. -#' @inheritParams get_data -#' @inheritParams piggyback::pb_download -#' @inheritParams ontologyIndex::get_OBO -#' @inheritDotParams ontologyIndex::get_OBO -#' @returns \link[ontologyIndex]{ontology_index} object -#' -#' @keywords internal -#' @importFrom ontologyIndex get_OBO -make_ontology <- function(file = "hp-base.obo", - repo = "obophenotype/human-phenotype-ontology", - tag = "latest", - save_dir = tools::R_user_dir( - package = "HPOExplorer", - which = "cache" - ), - extract_tags = "everything", - fix_ascii = TRUE, - overwrite = TRUE, - upload_tag = NULL, - ...){ - - #### Download data #### - f <- get_data(file = file, - repo = repo, - tag = tag, - save_dir = save_dir, - overwrite = overwrite) - #### Import data #### - hpo <- ontologyIndex::get_OBO(file = f, - extract_tags = "everything", - ...) - #### Fix non-ASCII characters in metadata #### - if(fix_ascii){ - func <- function(v){ - Encoding(v) <- "latin1" - iconv(v, "latin1", "UTF-8") - } - attributes(hpo)$version <- func(attributes(hpo)$version) - } - if(!is.null(upload_tag)){ - save_path <- file.path(save_dir,gsub("\\.obo",".rds",file)) - saveRDS(hpo,save_path) - piggyback::pb_upload(file = save_path, - repo = "neurogenomics/HPOExplorer", - overwrite = TRUE, - tag = upload_tag) - } - return(hpo) -} diff --git a/R/make_phenos_dataframe.R b/R/make_phenos_dataframe.R index 6513d50..d9caf6a 100644 --- a/R/make_phenos_dataframe.R +++ b/R/make_phenos_dataframe.R @@ -1,58 +1,22 @@ +#' @describeIn make_ make_ #' Make phenotypes dataframe #' #' Make a dataframe from a subset of the Human Phenotype Ontology. -#' @param hpo Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}. -#' @param phenotype_to_genes Output of -#' \link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -#' to gene annotations. -#' @param ancestor The ancestor to get all descendants of. If \code{NULL}, -#' returns the entirely ontology. -#' @param add_ont_lvl_absolute Add the absolute ontology level of each HPO term. -#' See \link[HPOExplorer]{get_ont_lvls} for more details. -#' @param add_ont_lvl_relative Add the relative ontology level of each HPO term. -#' See \link[HPOExplorer]{get_ont_lvls} for more details. -#' @param add_description Whether to get the phenotype descriptions as -#' well (slower). -#' @param add_info_contents Add information content column for each phenotype. -#' @param add_disease_data Add all disease metadata columns. -#' This will expand the data using \code{allow.cartesian=TRUE}. -#' @param add_ndiseases Add the number of diseases per phenotype. -#' @param add_pheno_frequencies Add the frequency of each phenotype in -#' each disease. -#' @param add_tiers Add severity Tiers column using -#' \link[HPOExplorer]{add_tier}. -#' @param add_severities Add severity column using -#' \link[HPOExplorer]{add_severity}. -#' @param add_hoverboxes Add hoverdata with -#' \link[HPOExplorer]{make_hoverboxes}. -#' @param add_onsets Add age of onset columns using -#' \link[HPOExplorer]{add_onset}. -#' @param add_deaths Add age of death columns using -#' \link[HPOExplorer]{add_death}. -#' @param columns A named vector of columns in \code{phenos} -#' to add to the hoverdata via \link[HPOExplorer]{make_hoverboxes}. -#' @param add_disease_definitions Add disease definitions. -#' @param include_mondo Add \href{https://mondo.monarchinitiative.org/}{MONDO} -#' IDs, names, and definitions to each disease. -#' @param verbose Print messages. #' @inheritParams ggnetwork_plot #' @inheritParams make_network_object #' @returns The HPO in dataframe format. #' #' @export -#' @importFrom ontologyIndex get_descendants -#' @importFrom data.table setnames := .N #' @examples #' phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") make_phenos_dataframe <- function(ancestor = NULL, hpo = get_hpo(), phenotype_to_genes = load_phenotype_to_genes(), - adjacency = NULL, ##### Phenotype metadata #### add_ont_lvl_absolute = TRUE, add_ont_lvl_relative = FALSE, - add_info_contents = FALSE, + add_info_content = FALSE, add_description = TRUE, #### Disease/symptom metadata #### add_disease_data = FALSE, @@ -70,34 +34,30 @@ make_phenos_dataframe <- function(ancestor = NULL, interactive = TRUE, verbose = TRUE ){ - # devoptera::args2vars(make_phenos_dataframe) - # ancestor = "Neurodevelopmental delay" - hpo_id <- . <- NULL; if(!is.null(ancestor)){ - IDx <- get_hpo_id_direct(phenotype = ancestor, + IDx <- get_hpo_id_direct(term = ancestor, hpo = hpo) - IDx_all <- ontologyIndex::get_descendants(ontology = hpo, - roots = IDx, - exclude_roots = FALSE) + IDx_all <- simona::dag_offspring(hpo, + term=IDx, + include_self = TRUE) descendants <- phenotype_to_genes[hpo_id %in% IDx_all,] } else { descendants <- phenotype_to_genes } messager("Extracting data for", formatC(length(unique(descendants$hpo_name)),big.mark = ","), - "descendents.",v=verbose) - messager("Computing gene counts.",v=verbose) + "descendents.") + messager("Computing gene counts.") phenos <- descendants[,.(geneCount=.N), by=c("hpo_id","hpo_name")] #### Annotate phenotypes #### phenos <- annotate_phenos(phenos = phenos, hpo = hpo, - adjacency = adjacency, ##### Phenotype metadata #### add_ont_lvl_absolute = add_ont_lvl_absolute, add_ont_lvl_relative = add_ont_lvl_relative, - add_info_contents = add_info_contents, + add_info_content = add_info_content, add_description = add_description, #### Disease/symptom metadata #### add_disease_data = add_disease_data, @@ -112,7 +72,6 @@ make_phenos_dataframe <- function(ancestor = NULL, #### Extra ##### add_hoverboxes = add_hoverboxes, columns = columns, - interactive = interactive, - verbose = verbose) + interactive = interactive) return(phenos) } diff --git a/R/assign_tiers.R b/R/make_tiers.R similarity index 77% rename from R/assign_tiers.R rename to R/make_tiers.R index 286d7c5..7df6ed5 100644 --- a/R/assign_tiers.R +++ b/R/make_tiers.R @@ -1,4 +1,5 @@ -#' Add severity Tiers (auto) +#' @describeIn make_ make_ +#' Make severity Tiers (auto) #' #' Automatically add severity Tier for each HPO ID, in accordance with the #' rating system provided by @@ -32,21 +33,15 @@ #' @param search_ancestors Inherit Tiers of ancestors. #' @param search_descendants Inherit Tiers of descendants. #' @param as_datatable Return the results as a \link[data.table]{data.table}. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object #' @returns Tier assignments for each term in \code{terms}. #' Will be returned as either a named vector or a \link[data.table]{data.table}. #' #' @export -#' @importFrom data.table data.table -#' @importFrom utils data -#' @importFrom stats setNames -#' @importFrom ontologyIndex get_ancestors get_descendants #' @examples -#' terms <- get_hpo()$id[seq(10)] -#' tiers <- assign_tiers(terms = terms) -assign_tiers <- function(hpo=get_hpo(), - terms=hpo$id, +#' terms <- get_hpo()@terms[seq(100)] +#' tiers <- make_tiers(terms = terms) +make_tiers <- function(hpo=get_hpo(), + terms=hpo@terms, keyword_sets = list( Tier1=c("intellectual disability","death"), Tier2=c("impaired mobility","malform"), @@ -62,10 +57,7 @@ assign_tiers <- function(hpo=get_hpo(), search_descendants=TRUE, as_datatable=FALSE, verbose=TRUE){ - - # devoptera::args2vars(assign_tiers) - - disease_name <- definition <- NULL; + disease_name <- NULL; #### Gather sets of IDs in the HPO that would qualify #### annot <- load_phenotype_to_genes("phenotype.hpoa") hpo_sets <- lapply(stats::setNames(names(keyword_sets), @@ -76,28 +68,28 @@ assign_tiers <- function(hpo=get_hpo(), #### Matched in the name ##### if(isTRUE(check_names)){ ids1 <- grep(paste(k,collapse = "|"), - hpo$name,value = TRUE, ignore.case = TRUE) + hpo@elementMetadata$name,value = TRUE, ignore.case = TRUE) ids <- c(ids,ids1) } #### Matched in the definition #### if(isTRUE(check_definitions)){ hp_sub <- grep(paste(k,collapse = "|"), - hpo$def, + hpo@elementMetadata$definition, ignore.case = TRUE,value = TRUE) - ids2 <- hpo$name[names(hp_sub)] + ids2 <- hpo@elementMetadata$name[names(hp_sub)] ids <- c(ids,ids2) } #### Matches in the disease association #### if(isTRUE(check_diseases)){ annot_sub <- annot[grepl(paste(k,collapse = "|"), disease_name, ignore.case = TRUE),] - ids3 <- hpo$name[names(hpo$name) %in% annot_sub$hpo_id] + ids3 <- hpo@terms[hpo@terms %in% annot_sub$hpo_id] ids <- c(ids,ids3) } ids <- ids[!duplicated(names(ids))] messager(paste0("keyword_set=",nm,":"), "Found",formatC(length(unique(ids)),big.mark = ","), - "terms matching category.",v=verbose) + "terms matching category.") return(ids) }) #### Remove phenotypes belonging to multiple tiers #### @@ -108,8 +100,7 @@ assign_tiers <- function(hpo=get_hpo(), terms <- unique(terms) messager("Auto-assigning severity Tiers to", formatC(length(terms),big.mark = ","), - "terms.", - v=verbose) + "terms.") tiers <- lapply(stats::setNames(terms, terms), function(term){ @@ -118,17 +109,20 @@ assign_tiers <- function(hpo=get_hpo(), return("direct") } else if(isTRUE(search_descendants) && any(names(h) %in% - ontologyIndex::get_descendants( - ontology = hpo, - roots = term))){ + simona::dag_offspring( + dag = hpo, + term = term) + ) + ){ return("descendant") } else if(isTRUE(search_ancestors) && any(names(h) %in% - ontologyIndex::get_ancestors( - ontology = hpo, - terms = term))){ + simona::dag_ancestors( + dag = hpo, + term = term) + ) + ){ return("ancestor") - } else { NULL } @@ -136,11 +130,11 @@ assign_tiers <- function(hpo=get_hpo(), }) |> unlist() #### Return #### if(isTRUE(as_datatable)){ - dt <- data.table::data.table(hpo_id=names(tiers), - tier_auto=unname(tiers), - key="hpo_id") - dups <- dt$hpo_id[duplicated(dt$hpo_id)] - return(dt) + dat <- data.table::data.table(hpo_id=names(tiers), + tier_auto=unname(tiers), + key="hpo_id") + dups <- dat$hpo_id[duplicated(dat$hpo_id)] + return(dat) } else { return(tiers) } diff --git a/R/map_models.R b/R/map_models.R deleted file mode 100644 index 9690575..0000000 --- a/R/map_models.R +++ /dev/null @@ -1,26 +0,0 @@ -map_models <- function(){ - - #### Get disease models #### - ## Link by disease (MONDO_ID) - models <- get_monarch("disease_to_model") - top_targets <- MultiEWCE::example_targets$top_targets - top_targets_map <- data.table::merge.data.table( - top_targets, - map, - by.x = "hpo_id", - by.y = "id1", - all = FALSE - ) - top_targets_fmap <- data.table::merge.data.table(top_targets, - map2[,-c("hpo_name")], - by="hpo_id") - messager(round(length(unique(top_targets_map$hpo_id)) / - length(unique(top_targets$hpo_id))*100,1), - "% of hpo_ids mapped across non-human ontologies.") - messager(round(length(unique(top_targets_fmap$hpo_id)) / - length(unique(top_targets$hpo_id))*100,1), - "% of hpo_ids mapped across non-human ontologies.") - - - sum(top_targets$hpo_id %in% map2$hpo_id) -} diff --git a/R/map_phenotypes.R b/R/map_phenotypes.R new file mode 100644 index 0000000..ff64ba1 --- /dev/null +++ b/R/map_phenotypes.R @@ -0,0 +1,26 @@ +#' @describeIn map_ map_ +#' Harmonise phenotypes +#' +#' Harmonise a mixed vector of phenotype names (e.g. "Focal motor seizure") +#' and HPO IDs (e.g. c("HP:0000002","HP:0000003")). +#' @returns Character vector +#' +#' @export +#' @import KGExplorer +#' @examples +#' terms <- c("Focal motor seizure","HP:0000002","HP:0000003") +#' #### As phenotype names #### +#' term_names <- map_phenotypes(terms=terms) +#' #### As HPO IDs #### +#' term_ids <- map_phenotypes(terms=terms, to="id") +map_phenotypes <- function(terms, + hpo = get_hpo(), + to=c("name","id"), + keep_order = TRUE, + invert = FALSE){ + KGExplorer::map_ontology_terms(terms = terms, + ont = hpo, + to = to, + keep_order = keep_order, + invert = invert) +} diff --git a/R/map_upheno.R b/R/map_upheno.R deleted file mode 100644 index e5658de..0000000 --- a/R/map_upheno.R +++ /dev/null @@ -1,69 +0,0 @@ -#' Map phenotypes across uPheno -#' -#' Map phenotypes across species within the Unified Phenotype Ontology (uPheno). -#' First, gathers phenotype-phenotype mappings across ontologies. -#' Next, gathers all phenotype-gene associations for each ontology, -#' converts all genes to human HGNC orthologs, and computes the number of -#' overlapping orthologs between all pairs mapped phenotypes. -#' Finally, plots the results as the proportion of intersecting genes between -#' all pairs of phenotypes. -#' @source https://data.monarchinitiative.org/upheno2/current/qc/index -#' @source https://data.monarchinitiative.org/upheno2/current/upheno-release/all/index.html -#' -#' @param save_dir Directory to save cached data. -#' @param pheno_map_method Method to use for mapping phenotypes across ontologies. -#' \itemize{ -#' \item{"upheno"}{Use uPheno's phenotype-to-phenotype mappings. -#' Contains fewer ontologies but with greater coverage of phenotypes.} -#' \item{"monarch"}{Use Monarch's phenotype-to-phenotype mappings. -#' Contains more ontologies but with less coverage of phenotypes. -#' } -#' } -#' @param gene_map_method Method to use for mapping genes across species. -#' \itemize{ -#' \item{"monarch"}{Use Monarch's gene-to-gene mappings.} -#' \item{"orthogene"}{Use \link[orthogene]{convert_orthologs} to generate -#' gene-to-gene mappings.} -#' } -#' @param force_new Force new data to be downloaded and processed. -#' @param subset_db1 Subset of ontologies to include in the plot. -#' @param save_dir Directory to save cached data. -#' @param show_plot Show the plot. -#' @param fill_scores Fill missing scores in the "equivalence_score" and -#' "subclass_score" columns with this value. These columns represent the -#' quality of mapping between two phenotypes on a scale from 0-1. -#' @param terms A subset of HPO IDs to include in the final dataset and plots -#' (e.g. c("HP:0001508","HP:0001507")). -#' @returns A list containing the data and plot. -#' -#' @export -#' @import data.table -#' @importFrom tools R_user_dir -#' @examples -#' res <- map_upheno() -map_upheno <- function(pheno_map_method=c("upheno","monarch"), - gene_map_method=c("monarch","orthogene"), - subset_db1=c("HP"), - terms=NULL, - fill_scores=NULL, - show_plot=TRUE, - force_new=FALSE, - save_dir=tools::R_user_dir(package = "HPOExplorer", - which = "cache")){ - # devoptera::args2vars(map_upheno) - - #### Get data #### - pheno_map_genes_match <- map_upheno_data(pheno_map_method=pheno_map_method, - gene_map_method=gene_map_method, - fill_scores=fill_scores, - force_new = force_new, - terms=terms) - #### Plots #### - plots <- map_upheno_plot(pheno_map_genes_match, - subset_db1=subset_db1) - #### Return #### - return( - list(data=pheno_map_genes_match, - plots=plots) - ) -} diff --git a/R/map_upheno_data.R b/R/map_upheno_data.R deleted file mode 100644 index a666e86..0000000 --- a/R/map_upheno_data.R +++ /dev/null @@ -1,61 +0,0 @@ -#' Map uPheno data -#' -#' Get uPheno cross-species mapping data by: -#' \itemize{ -#' \item{Downloading cross-species phenotype-phenotype mappings.} -#' \item{Downloading within-spceies phenotype-gene mappings, -#' and converting these genes to human orthologs.} -#' \item{Merging the phenotype-phenotype and phenotype-gene mappings.} -#' \item{Filtering out any mappings that do not have a human ortholog within -#' each respective phenotype.} -#' \item{Calculating the proportion of orthologous genes overlapping across -#' the species-specific phenotype-gene mappings.} -#' \item{Iterating the above steps using multiple methods -#' (\code{pheno_map_method}) and concatenating the results together.} -#' } -#' @param keep_nogenes Logical indicating whether to keep mappings that do not -#' have any orthologous genes. -#' @inheritParams map_upheno -#' @returns A data.table containing the mapped data. -#' -#' @export -#' @examples -#' pheno_map_genes_match <- map_upheno_data() -map_upheno_data <- function(pheno_map_method=c("upheno","monarch"), - gene_map_method=c("monarch","orthogene"), - keep_nogenes=FALSE, - fill_scores=NULL, - terms=NULL, - save_dir=tools::R_user_dir(package = "HPOExplorer", - which = "cache"), - force_new=FALSE){ - # devoptera::args2vars(map_upheno_data) - - #### Check for cached data #### - path <- file.path(save_dir,"pheno_map_genes_match.rds") - if(file.exists(path) && - isFALSE(force_new)){ - ## Read from cache - messager("Importing cached data:",path) - pheno_map_genes_match <- readRDS(path) - } else { - ## Create - pheno_map_genes_match <- lapply( - stats::setNames(pheno_map_method, - pheno_map_method), - function(m){ - map_upheno_data_i(pheno_map_method=m, - gene_map_method=gene_map_method, - keep_nogenes=keep_nogenes, - fill_scores=fill_scores, - terms=terms) - }) |> data.table::rbindlist(fill=TRUE, idcol = "pheno_map_method") - ## Save - messager("Caching processed file -->",path) - attr(pheno_map_genes_match,"version") <- format(Sys.Date(), "%Y-%m-%d") - dir.create(save_dir, showWarnings = FALSE, recursive = TRUE) - saveRDS(pheno_map_genes_match,path) - } - ## Return - return(pheno_map_genes_match) -} diff --git a/R/map_upheno_data_i.R b/R/map_upheno_data_i.R deleted file mode 100644 index 575a54b..0000000 --- a/R/map_upheno_data_i.R +++ /dev/null @@ -1,198 +0,0 @@ -map_upheno_data_i <- function(pheno_map_method, - gene_map_method, - keep_nogenes, - fill_scores, - terms){ - hgnc_id <- gene_label1 <- subject <- subject_taxon_label <- - hgnc_label <- n_phenotypes <- n_genes_intersect <- - prop_intersect <- p1 <- p2 <- db1 <- db2 <- id1 <- id2 <- - equivalence_score <- subclass_score <- hgnc_label1 <- - hgnc_label2 <- hgnc_id2 <- gene_id <- gene_label1 <- gene_label2 <- - n_genes_db1 <- object <- - n_genes_db2 <- subject_taxon_label1 <- subject_taxon_label2 <- - phenotype_genotype_score <- equivalence_score <- NULL; - - pheno_map_method <- pheno_map_method[1] - gene_map_method <- gene_map_method[1] - messager(paste0("map_upheno_data: pheno_map_method=", - shQuote(pheno_map_method))) - #### Import data #### - ## Cross-species phenotype map - { - if(pheno_map_method=="upheno"){ - pheno_map <- get_upheno("bestmatches") - pheno_map[,db1:=gsub("*:.*","",basename(id1))] - } else if(pheno_map_method=="monarch"){ - pheno_map <- get_monarch("phenotype_to_phenotype") |> - data.table::setnames(c("label_x","label_y"),c("label1","label2")) - pheno_map[,id1:=gsub("_",":",basename(p1)) - ][,id2:=gsub("_",":",basename(p2))] - pheno_map[,db1:=gsub("*_.*","",basename(p1)) - ][,db2:=gsub("*_.*","",basename(p2))] - pheno_map[,equivalence_score:=NA][,subclass_score:=NA] - } - #### Filter data #### - if(!is.null(terms)){ - pheno_map <- pheno_map[id1 %in% terms,] - if(nrow(pheno_map)==0){ - stop("No terms found in pheno_map") - } - } - } - - ## Gene-phenotype associations across 8 species - { - genes <- get_monarch("phenotype_to_gene") - data.table::setkeyv(genes,"object") - messager("Unique species with genes:", - data.table::uniqueN(genes$subject_taxon_label)) - # genes[,db:=gsub("*:.*","",object)] - ## Create an ID-label map for each phenotype - genes_map <- genes[,c("object","object_label", - "subject_taxon","subject_taxon_label")] |> unique() - genes_map <- genes_map[,.SD[1], by="object" - ][,db:=gsub("*:.*","",object)] - ## Create an db-species map for each Ontology - species_map <- genes_map[,.SD[1], keyby="db"][,.(db,subject_taxon_label)] - } - - ## Gene-gene homology across 12 species - if(gene_map_method=="monarch"){ - { - homol <- get_monarch("gene_to_gene") - messager("Unique species with ortholog:", - data.table::uniqueN(homol$subject_taxon_label)) - ## Subset to only convert human --> non-human - homol <- homol[grep("^HGNC",subject),] |> - data.table::setnames( - c("subject","subject_label","object","object_label"), - c("hgnc_id","hgnc_label","gene_id","gene_label")) - ## Add human-to-human back into map - hhomol <- (homol[,c("hgnc_id","hgnc_label", - "subject_taxon","subject_taxon_label")] |> unique() - )[,gene_id:=hgnc_id][,gene_label:=hgnc_label] - homol <- rbind(hhomol,homol,fill=TRUE) - message("Unique orthologs: ",data.table::uniqueN(homol$gene_id)) - } - ## Orthogene - } else if(gene_map_method=="orthogene"){ - requireNamespace("orthogene") - homol <- lapply(stats::setNames(unique(genes$subject_taxon_label), - unique(genes$subject_taxon_label)), - function(x){ - - input_species <- if(x=="Xenopus laevis"){ - "Xenopus" - } else if(x=="Caenorhabditis elegans"){ - "celegans" - } else { - x - } - orthogene::convert_orthologs( - gene_df = genes[subject_taxon_label==x,]$subject_label|> - unique(), - # gene_input = "subject_label", - gene_output = "columns", - input_species = input_species, - non121_strategy = "kbs", - output_species = "human") - }) |> - data.table::rbindlist(fill=TRUE, idcol = "subject_taxon_label") |> - data.table::setkeyv(c("subject_taxon_label","input_gene")) - data.table::setnames(homol,"input_gene","subject_label") - message("Unique orthologs: ", - data.table::uniqueN( - homol[subject_taxon_label!="Homo sapiens"]$subject_label)) - } - #### Map non-human genes onto human orthologs #### - { - genes_homol <- data.table::merge.data.table( - genes, - homol[,c("hgnc_id","hgnc_label","gene_id","gene_label")], - by.x="subject", - by.y="gene_id") - messager(formatC(nrow(genes_homol),big.mark = ","),"/", - formatC(nrow(genes),big.mark = ","), - "rows remain after cross-species gene mapping.") - messager(data.table::uniqueN(genes_homol$subject_taxon_label),"/", - data.table::uniqueN(genes$subject_taxon_label), - "species remain after cross-species gene mapping.") - } - - #### Map non-human phenotypes onto human phenotypes #### - #### Merge nonhuman ontology genes with human HPO genes #### - { - pheno_map_genes <- data.table::merge.data.table( - pheno_map, - genes_homol, - by.x="id1", - by.y="object", - all.x = keep_nogenes, - allow.cartesian = TRUE) |> - #### Merge nonhuman ontology genes with human HPO genes #### - data.table::merge.data.table( - genes_homol, - by.x="id2", - by.y="object", - all.y = keep_nogenes, - suffixes = c(1,2), - allow.cartesian = TRUE - ) - ## Fill in missing species for those without gene data - pheno_map_genes[ - is.na(subject_taxon_label1), - subject_taxon_label1:=species_map[db1]$subject_taxon_label] - pheno_map_genes[ - is.na(subject_taxon_label2), - subject_taxon_label2:=species_map[db2]$subject_taxon_label] - ## Add gene counts - pheno_map_genes[,n_genes_db1:=data.table::uniqueN(gene_label1), by="id1"] - pheno_map_genes[,n_genes_db2:=data.table::uniqueN(gene_label2), by="id2"] - ## Report - messager(data.table::uniqueN(pheno_map_genes$subject_taxon_label2),"/", - data.table::uniqueN(genes_homol$subject_taxon_label), - "species remain after cross-species phenotype mapping.") - ## Remove - # remove(genes_human,genes_nonhuman,pheno_map) - } - - #### Count the number of overlapping genes - { - if(isFALSE(keep_nogenes)){ - pheno_map_genes_match <- pheno_map_genes[hgnc_label1==hgnc_label2,] - } else { - pheno_map_genes_match <- pheno_map_genes |> data.table::copy() - } - pheno_map_genes_match <- - pheno_map_genes_match[, - list(n_genes_intersect=data.table::uniqueN(hgnc_id2)), - by=c("id1","db1","label1","n_genes_db1", - "id2","db2","label2","n_genes_db2", - "subject_taxon1","subject_taxon_label1", - "subject_taxon2","subject_taxon_label2", - "equivalence_score","subclass_score") - ] |> - data.table::setorderv("n_genes_intersect",-1) - pheno_map_genes_match[,n_phenotypes:=data.table::uniqueN(id1), - by=c("db1","db2", - "subject_taxon1","subject_taxon2", - "subject_taxon_label1","subject_taxon_label2" - )] - pheno_map_genes_match[,prop_intersect:=(n_genes_intersect/n_genes_db1)] - ## Compute a score that captures both the phenotype mapping score and - ## the poportional gene overlap score. - pheno_map_genes_match[,phenotype_genotype_score:=data.table::nafill( - (equivalence_score*prop_intersect)^(1/2),fill = 0)] - # remove(pheno_map_genes) - } - ## Fill missing data - if(!is.null(fill_scores)){ - data.table::setnafill(x = pheno_map_genes_match, - fill = fill_scores, - cols=c("equivalence_score","subclass_score")) - } - ## Check that the number of intersecting nonhuman ontology genes is always - ## less than or equal to the number of total HPO genes. - # pheno_map_genes_match[n_genes>n_genes_hpo,] - return(pheno_map_genes_match) -} diff --git a/R/map_upheno_heatmap.R b/R/map_upheno_heatmap.R deleted file mode 100644 index 9ad5911..0000000 --- a/R/map_upheno_heatmap.R +++ /dev/null @@ -1,97 +0,0 @@ -map_upheno_heatmap <- function(plot_dat, - hpo_ids=NULL, - value.var=c("phenotype_genotype_score", - "prop_intersect", - "equivalence_score", - "subclass_score"), - min_rowsums=NULL, - cluster_from_ontology=FALSE, - save_dir=tempdir(), - height = 15, - width = 10){ - requireNamespace("scKirby") - requireNamespace("ComplexHeatmap") - id1 <- hpo_id <- NULL; - set.seed(2023) - value.var <- match.arg(value.var) - # hpo_ids <- MultiEWCE::example_targets$top_targets$hpo_id - - ### Subset phenotypes - if(!is.null(hpo_ids)) plot_dat <- plot_dat[id1 %in% unique(hpo_ids)] - plot_dat[,hpo_id:=id1][,label1:=gsub(" (HPO)","",label1,fixed = TRUE)] - plot_dat <- add_ancestor(plot_dat) - data.table::setkeyv(plot_dat,"label1") - - ### Plot - X <- data.table::dcast.data.table(plot_dat, - formula = label1 ~ subject_taxon_label2, - fill = 0, - value.var = value.var, - fun.aggregate = mean, - na.rm=TRUE) |> - scKirby::to_sparse() - #### Filter by min_rowsums #### - if(!is.null(min_rowsums)){ - X <- X[Matrix::rowSums(X, na.rm = TRUE)>=min_rowsums,] - } - if(nrow(X)==0) stop("No rows remain after filtering by `min_rowsums`.") - - #### Get clusters from ontology #### - if(isTRUE(cluster_from_ontology)){ - ids <- harmonise_phenotypes(plot_dat$id1,keep_order = FALSE) - ids <- ids[ids %in% rownames(X)] - ## best to do this on the entire HPO, then subset - cluster_rows <- convert_ontology(to="igraph_dist_hclust", - terms = names(ids)) - # leaves <- dendextend::get_leaves_attr(cluster_rows,"label") - # c2 <- dendextend::prune(cluster_rows, - # leaves[!leaves %in% names(ids)], - # keep_branches = FALSE) - ## subset to only those in the heatmap - X <- X[ids,] - } else { - cluster_rows <- TRUE - } - #### Add annotation #### - annot_dat <- plot_dat[rownames(X), - c("label1","n_genes_db1", - "ancestor_name")] |> unique() - col_fun <- colorRamp2::colorRamp2( - seq(min(annot_dat$n_genes_db1), - max(annot_dat$n_genes_db1), - length.out=4), - pals::gnuplot(4)) - la <- ComplexHeatmap::rowAnnotation( - df=data.frame(annot_dat[,-c("label1")], - row.names = annot_dat$label1), - # ?ComplexHeatmap::Legend - show_legend = c(TRUE, FALSE), - annotation_legend_param = list( - n_genes_db1= list(title = "HPO genes", - col_fun = col_fun)) - ) - row_split <- if(isFALSE(cluster_from_ontology)) annot_dat$ancestor_name - #### make heatmap #### - ch <- ComplexHeatmap::Heatmap(matrix = as.matrix(X), - name = value.var, - cluster_rows = cluster_rows, - row_title_rot = 0, - row_names_gp = grid::gpar(fontsize = 7), - row_title_gp = grid::gpar(fontsize = 9), - row_split = row_split, - col = pals::viridis(n = 20), - cluster_columns = FALSE, - left_annotation = la) - # methods::show(ch) - #### Save #### - if(!is.null(save_dir)){ - grDevices::pdf(file = file.path(save_dir, - paste0("map_upheno_heatmap-", - value.var,".pdf")), - height = height, - width = width) - methods::show(ch) - grDevices::dev.off() - } - return(ch) -} diff --git a/R/map_upheno_nn.R b/R/map_upheno_nn.R deleted file mode 100644 index d629cb4..0000000 --- a/R/map_upheno_nn.R +++ /dev/null @@ -1,62 +0,0 @@ -map_upheno_nn <- function(){ - - #### Find nearest neighbors for each HPO term in each non-human ontology #### - Xnonhuman <- data.table::dcast.data.table( - genes_nonhuman, - formula = ortholog_hgnc_label ~ alt_id, - fun.aggregate = length, - ) |> scKirby::to_sparse() - Xhuman <- data.table::dcast.data.table( - genes_human, - formula = hgnc_label ~ hpo_id, - fun.aggregate = length, - ) |> scKirby::to_sparse() - X <- Seurat::RowMergeSparseMatrices(mat1 = Xhuman, Xnonhuman) - obj <- scKirby::process_seurat( - list(data=list(genes=X), - obs=data.frame(genes_map, - row.names = genes_map$object) - ), - nfeatures = 4600 - ) - - dbs <- stringr::str_split(colnames(Xnonhuman),"[:]",simplify = TRUE)[,1] |> - unique() - BPPARAM <- BiocParallel::MulticoreParam(10,progressbar = TRUE) - hpo_ids <- grep("^HP:",rownames(obj@graphs$RNA_snn), value = TRUE) - nei_mat <- BiocParallel::bplapply( - BPPARAM = BPPARAM, - X = stats::setNames(hpo_ids,hpo_ids), - FUN = function(hpo_id){ - lapply(dbs, - function(db){ - obj@graphs$RNA_snn[ - hpo_id, - grepl(db,colnames(obj@graphs$RNA_snn))] |> - sort() |> - tail(10) - }) - }) - dt <- lapply(nei_mat, - function(x) { - lapply(x, - function(y){ - data.table::as.data.table(data.frame(val=y), - keep.rownames = "alt_id") - }) |> - data.table::rbindlist() - }) |> - data.table::rbindlist(idcol = "hpo_id") - - dt_map <- genes_map[dt[val>.5,], on=c("object"="alt_id"), allow.cartesian = TRUE] - dt_map <- genes_map[dt_map, on=c("object"="hpo_id"), allow.cartesian = TRUE] - - # View(dt_map[val>.95]) - # o = order(obj@graphs$RNA_snn, decreasing=TRUE)[1:10] - # mm <- MatrixModels::glm4() - - # res <- phenomix::iterate_lm(xmat = Xhuman, ymat = Xnonhuman, workers = 10) - # orthogene:::sparsity(Xg) - # Xc <- fastcluster::hclust(dist(Xg)) - -} diff --git a/R/map_upheno_plots.R b/R/map_upheno_plots.R deleted file mode 100644 index f5fbdba..0000000 --- a/R/map_upheno_plots.R +++ /dev/null @@ -1,52 +0,0 @@ -#' Map uPheno plot -#' -#' Generate multiple kinds of plots summarising mappings of phenotypes and genes -#' between the HPO and various non-human ontologies within uPheno. -#' @param types A character vector of plot types to generate. -#' @param pheno_map_genes_match uPheno cross-species mapping data generated by -#' \link[HPOExplorer]{map_upheno_data}. -#' @param subset_db1 A character vector of reference ontologies to subset -#' \code{pheno_map_genes_match} by. -#' @returns A named list of \pkg{ggplot2} objects. -#' -#' @export -#' @examples -#' pheno_map_genes_match <- map_upheno_data() -#' upheno_plots <- map_upheno_plot( -#' pheno_map_genes_match = pheno_map_genes_match) -map_upheno_plot <- function(pheno_map_genes_match=NULL, - subset_db1="HP", - types=c("rainplot","scatterplot","heatmap")){ - ## Prepare plot data - n_phenotypes <- db1 <- id1 <-NULL; - { - #### Subset data #### - if(!is.null(subset_db1)) { - plot_dat <- pheno_map_genes_match[db1 %in% subset_db1,] - messager(data.table::uniqueN(plot_dat$subject_taxon_label2),"/", - data.table::uniqueN(pheno_map_genes_match$subject_taxon_label2), - "species remain after filtering by `subset_db1`.") - }else { - plot_dat <- data.table::copy(pheno_map_genes_match) - } - ## Only use one phenotype-phenotype per row - plot_dat <- plot_dat[,.SD[1],by=c("db1","id1","db2","id2")] - ## Recompute n_phenotypes - plot_dat[,n_phenotypes:=data.table::uniqueN(id1), - by=c("db1","db2", - "subject_taxon1","subject_taxon2", - "subject_taxon_label1","subject_taxon_label2" - )] - } - plots <- list() - if("rainplot" %in% types){ - plots[["rainplot"]] <- map_upheno_rainplot(plot_dat = plot_dat) - } - if("scatterplot" %in% types){ - plots[["scatterplot"]] <- map_upheno_scatterplot(plot_dat = plot_dat) - } - if("heatmap" %in% types){ - plots[["heatmap"]] <- map_upheno_heatmap(plot_dat = plot_dat) - } - return(plots) -} diff --git a/R/map_upheno_rainplot.R b/R/map_upheno_rainplot.R deleted file mode 100644 index e3a5ab4..0000000 --- a/R/map_upheno_rainplot.R +++ /dev/null @@ -1,51 +0,0 @@ -map_upheno_rainplot <- function(plot_dat){ - - requireNamespace("ggplot2") - requireNamespace("ggdist") - requireNamespace("tidyquant") - - - ### Plot proportion of intersecting orthologs per ontology #### - ggplot(plot_dat, - aes(x=paste0(subject_taxon_label2, - "\n(n = ",n_phenotypes," phenotypes)"), - y=(n_genes_intersect/n_genes_db1), - fill=factor(db2))) + - facet_grid(db1~., - scales = "free_y", - space = "free_y") + - # add half-violin from {ggdist} package - ggdist::stat_halfeye( - # adjust bandwidth - adjust = 0.5, - # move to the right - justification = -0.1, - # remove the slub interval - .width = 0, - point_colour = NA - ) + - geom_boxplot( - show.legend = FALSE, - width = 0.12, - # removing outliers - outlier.color = NA, - alpha = 0.5 - ) + - # ggdist::stat_dots( - # aes(color=factor(db2)), - # show.legend = FALSE, - # # ploting on left side - # side = "left", - # # adjusting position - # justification = 1.1, - # # adjust grouping (binning) of observations - # # binwidth = 0.25 - # ) + - # Themes and Labels - tidyquant::scale_fill_tq() + - tidyquant::scale_color_tq() + - tidyquant::theme_tq() + - coord_flip() + - labs(x="Species", - fill="Ontology") -} diff --git a/R/map_upheno_scatterplot.R b/R/map_upheno_scatterplot.R deleted file mode 100644 index 81527e1..0000000 --- a/R/map_upheno_scatterplot.R +++ /dev/null @@ -1,11 +0,0 @@ -map_upheno_scatterplot <- function(plot_dat){ - - #### Check if there's a relationship between phenotype mapping scores - # and number of shared genes #### - ggplot(plot_dat, - aes(x=(n_genes_intersect/n_genes_db1), - y=equivalence_score)) + - geom_point() + - facet_grid(rows = "subject_taxon_label2") + - geom_smooth() -} diff --git a/R/mondo_to_matrix.R b/R/mondo_to_matrix.R deleted file mode 100644 index 0e3d54c..0000000 --- a/R/mondo_to_matrix.R +++ /dev/null @@ -1,48 +0,0 @@ -mondo_to_matrix <- function(species=c("Homo sapiens")){ - - subject_taxon_label <- evidence_score <- evidence <- object_definition <- - object <- NULL; - - #### Prepare data #### - dat <- data.table::fread(paste0( - "https://data.monarchinitiative.org/latest/tsv/", - "all_associations/gene_disease.all.tsv.gz" - )) - dat[,evidence_score:=sapply(evidence, - function(x){length(strsplit(x,"|")[[1]])})] - dat <- dat[subject_taxon_label %in% species] - mondo <- get_mondo() - dat[,object_definition:=mondo$def[object]] - #### Make matrix #### - X_dt <- data.table::dcast.data.table(data = dat, - formula = "subject_label ~ object", - value.var = "evidence_score", - fun.aggregate = sum, - fill = 0) - X <- as.matrix(X_dt[,-1], rownames = X_dt[[1]]) |> - methods::as("sparseMatrix") - #### Make col meta.data #### - col_data <- dat[,c("subject_taxon", - "subject_taxon_label", - "object", - "object_label", - "object_definition")] |> - unique() |> - data.frame() - rownames(col_data) <- col_data$object - - # obj <- scNLP::seurat_pipeline(obj = X, - # meta.data = col_data, - # vars.to.regress = "nFeature_RNA", - # nfeatures = NULL) - # tfidf_plt <- scNLP::plot_tfidf(object = obj, - # label_var = "object_definition") - # dp <- Seurat::DimPlot(obj, group.by = "object_label") + Seurat::NoLegend() - # plotly::ggplotly(dp) - # fp <- Seurat::FeaturePlot(obj, features = "n_genes") - - return(list(X=X, - col_data=col_data, - row_data=dat)) - -} diff --git a/R/network_3d.R b/R/network_3d.R deleted file mode 100644 index a64ae4b..0000000 --- a/R/network_3d.R +++ /dev/null @@ -1,231 +0,0 @@ -#' 3D network -#' -#' Plot a subset of the HPO as a 3D network. -#' @param g \link[igraph]{igraph} object -#' generated by \link[HPOExplorer]{make_igraph_object}. -#' @param layout_func Layout function for the graph. -#' @param node_color_var Variable in the vertex metadata to color nodes by. -#' @param edge_color_var Variable in the edge metadata to color edges by. -#' @param text_color_var Variable in the node metadata to color text by. -#' @param node_symbol_var Variable in the vertex metadata to shape nodes by. -#' @param node_opacity Node opacity. -#' @param edge_opacity Edge opacity. -#' @param node_palette Color palette function for the nodes/points. -#' @param edge_palette Color palette function for the edges/lines. -#' @param kde_palette Color palette function for the KDE plot. -#' @param add_kde Add a kernel density estimation (KDE) plot -#' below the 3D scatter plot (i.e. the "mountains" beneath the points). -#' @param extend_kde Extend the area that the KDE plot covers. -#' @param bg_color Plot background color. -#' @param add_labels Add phenotype name labels to each point. -#' @param keep_grid Keep all grid lines and axis labels. -#' @param aspectmode The proportions of the 3D plot. See the -#' \href{https://plotly.com/python/reference/layout/scene/#layout-scene-aspectmode}{ -#' plotly documentation site} for details. -#' @param hover_width Maximum width of the hover text. -#' @param label_width Maximum width of the label text. -#' @param seed Random seed to enable reproducibility. -#' @param showlegend Show node fill legend. -#' @param show_plot Print the plot after it's been generated. -#' @param save_path Path to save interactive plot to -#' as a self-contained HTML file. -#' @param verbose Print messages. -#' @returns A 3D interactive \link[plotly]{plotly} object. -#' -#' @source -#' \href{https://www.r-bloggers.com/2013/09/network-visualization-part-4-3d-networks/}{ -#' R bloggers} -#' @source -#' \href{https://community.plotly.com/t/is-it-possible-to-connect-scatters-in-3d-scatter-plot/}{ -#' Plotly: Connect points in 3D plot} -#' @source \href{https://plotly.com/r/line-charts/}{ -#' Plotly: Connect points in 2D plot} -#' @source \href{https://plotly.com/r/3d-line-plots/}{ -#' Plotly: 3D lines plots} -#' @source \href{https://plotly.com/python/v3/3d-network-graph/}{ -#' Plotly: 3D network plot} -#' -#' @export -#' @importFrom stringr str_wrap -#' @importFrom methods show -#' @examples -#' phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -#' g <- make_igraph_object(phenos = phenos) -#' plt <- network_3d(g=g, show_plot=FALSE) -network_3d <- function(g, - layout_func = igraph::layout.fruchterman.reingold, - node_color_var = "ontLvl", - edge_color_var = "zend", - text_color_var = node_color_var, - node_symbol_var = "ancestor_name", - node_palette = pals::kovesi.cyclic_mrybm_35_75_c68_s25, - edge_palette = pals::kovesi.cyclic_mrybm_35_75_c68_s25, - node_opacity = .75, - edge_opacity = .5, - kde_palette = pals::gnuplot, - add_kde = TRUE, - extend_kde = 1.5, - bg_color = kde_palette(6)[1], - add_labels = FALSE, - keep_grid = FALSE, - aspectmode = 'cube', - hover_width=80, - label_width=80, - seed = 2023, - showlegend = TRUE, - show_plot = TRUE, - save_path = tempfile(fileext = "network_3d.html"), - verbose = TRUE){ - # devoptera::args2vars(network_3d) - # anc <- "Abnormality of the nervous system" - # phenos <- make_phenos_dataframe(ancestor = anc)[ancestor_name==anc,] - # g <- make_igraph_object(phenos = phenos) - # g <- readRDS("~/Downloads/priotised_igraph.rds") - requireNamespace("plotly") - requireNamespace("pals") - requireNamespace("htmlwidgets") - label <- hpo_name <- NULL; - - #### Convert igraph to plotly data #### - d <- igraph_to_plotly(g = g, - layout_func = layout_func, - dim = 3, - seed = seed, - verbose = verbose) - vdf <- d$vertices - vdf[,label:=gsub("\n","
", - stringr::str_wrap(hpo_name, width = label_width))] - edf <- d$edges - remove(d) - #### Create paths and nodes #### - fig <- - plotly::plot_ly() |> - plotly::add_paths(data = edf, - x = ~xend, - y = ~yend, - z = ~zend, - xend = ~xend, - yend = ~yend, - # zend = ~zend, - color = ~get(edge_color_var), - colors = rev(edge_palette(50)), - line = list(shape = "spline"), - type = "scatter3d", - name = "edge", - opacity = edge_opacity, - mode = "lines", - hoverinfo = "none", - showlegend = FALSE, - inherit = FALSE) |> - plotly::add_markers(data = vdf, - x = ~x, - y = ~y, - z = ~z, - symbol = ~stringr::str_wrap( - get(node_symbol_var), - width = label_width - ), - # size = ~ontLvl, - color = ~ get(node_color_var), - colors = ( - node_palette(length( - unique(vdf[[node_color_var]]) - )) - ), - marker = list( - line = list( - color = bg_color - ) - ), - hovertext = ~ stringr::str_wrap( - paste( - paste0('name: ',name), - paste0('hpo_id: ',hpo_id), - paste0('hpo_name: ',hpo_name), - paste0('ontLvl: ',ontLvl), - paste0('ancestor_name: ',ancestor_name), - sep = "
"), - width = hover_width - ), - opacity = node_opacity, - showlegend = showlegend, - type = "scatter3d", - mode = "markers") - #### Add KDE #### - if(isTRUE(add_kde)){ - kd <- kde_surface(xyz = vdf, - extend_kde = extend_kde) - fig <- fig |> - plotly::add_surface(data = kd, - x = ~x, - y = ~y, - z = ~z, - opacity = 1, - hoverinfo = "none", - colorscale = list( - seq(0,1,length.out=6), - kde_palette(n = 6) - ), - showlegend = FALSE, - inherit = FALSE) - } - #### Add text #### - if(isTRUE(add_labels)){ - fig <- fig |> - plotly::add_text(data = vdf, - x = ~x, - y = ~y, - z = ~z, - text = ~label, - color = ~ get(text_color_var), - colors = ( - node_palette(length( - unique(vdf[[text_color_var]]) - )) - ), - # textfont = list(color="rbga(255,255,255,.8"), - hoverinfo = "none", - inherit = FALSE, - showlegend = FALSE) - } - #### Add layout #### - scene <- lapply(stats::setNames(c("xaxis","yaxis","zaxis"), - c("xaxis","yaxis","zaxis")), - function(x){list(showgrid = keep_grid, - showline = keep_grid, - showspikes = keep_grid, - zeroline = keep_grid, - title = list( - text=if(isTRUE(keep_grid)){ - x - } else {""} - ), - showticklabels = keep_grid)} - ) - scene$aspectmode <- aspectmode - fig <- fig |> - plotly::layout( - hoverlabel = list(align = "left"), - plot_bgcolor = bg_color, - paper_bgcolor = bg_color, - scene = scene - # showlegend = FALSE - ) |> - plotly::colorbar(title=edge_color_var) - # file <- file.path("~/Downloads","hpo_plotly.png") - # plotly::export(p = fig, - # file = file, - # selenium = RSelenium::rsDriver(browser = "chrome")) - - # reticulate::py_install(packages = "kaleido",) - # plotly::save_image(p = fig,file = file, width = 10, height =10) - if(isTRUE(show_plot)) methods::show(fig) - if(!is.null(save_path)) { - messager("Saving interactive plot -->",save_path,v=verbose) - dir.create(dirname(save_path),showWarnings = FALSE, recursive = TRUE) - htmlwidgets::saveWidget(widget = fig, - file = save_path, - selfcontained = TRUE) - } - return(fig) -} diff --git a/R/oard_query_api.R b/R/oard_query_api.R deleted file mode 100644 index b5b07f9..0000000 --- a/R/oard_query_api.R +++ /dev/null @@ -1,49 +0,0 @@ -oard_query_api <- function(ids, - concept_prefix="q=", - domain="https://rare.cohd.io/api/", - dataset_id=NULL, - endpoint="vocabulary/findConceptByAny", - batch_size=100, - workers=1, - verbose=TRUE){ - # devoptera::args2vars(oard_query_api) - requireNamespace("BiocParallel") - - ids <- na.omit(unique(ids)) - messager("Querying OARD API for",formatC(length(ids),big.mark = ","), - "IDs.",v=verbose) - batches <- split(ids, ceiling(seq_along(ids)/batch_size)) - oard_query_api_i <- function(batch, - ...){ - URL <- paste0(paste0(domain,endpoint),"?", - ifelse(is.null(dataset_id), - "", - paste0("dataset_id=",dataset_id,"&") - ), - if(!is.null(batch)){ - paste0(concept_prefix, - htmltools::urlEncodePath( - paste(batch,collapse = ";") - ) - ) - } else { - "" - } - ) - # message(URL) - res <- httr::GET(URL) - cont <- httr::content(res, as = "text", encoding = "UTF-8") - js <- jsonlite::fromJSON(cont, simplifyDataFrame = TRUE) - dt <- js$results - if(length(dt)==0) return(dt) - if(nrow(dt)==length(js$parameter$q)) dt$query <- js$parameter$q - return(dt) - } - BiocParallel::register(BiocParallel::MulticoreParam(workers=workers, - progressbar = TRUE)) - RES <- BiocParallel::bplapply(batches, - oard_query_api_i, - match.call()) |> - data.table::rbindlist(idcol = "batch", fill = TRUE) - return(RES) -} diff --git a/R/parse_pheno_frequency.R b/R/parse_pheno_frequency.R index 7bff400..e286ad0 100644 --- a/R/parse_pheno_frequency.R +++ b/R/parse_pheno_frequency.R @@ -5,28 +5,28 @@ parse_pheno_frequency <- function(annot){ freq_dt <- lapply(seq(nrow(annot)), function(i){ f <- annot[i,]$frequency if(grepl("^HP",f)){ - dt <- data.table::data.table( + dat <- data.table::data.table( pheno_freq_name = get_freq_dict()[f], pheno_freq_min = get_freq_dict(type="min")[f], pheno_freq_max = get_freq_dict(type="max")[f]) } else if(grepl("/",f)){ splt <- as.numeric(strsplit(f,"/")[[1]]) val <- splt[[1]] / splt[[2]]*100 - dt <- data.table::data.table( + dat <- data.table::data.table( pheno_freq_name="ratio", pheno_freq_min=val, pheno_freq_max=val) } else if(grepl("[%]",f)){ val <- as.numeric(gsub("[%]","",f)) - dt <- data.table::data.table( + dat <- data.table::data.table( pheno_freq_name="percentage", pheno_freq_min=val, pheno_freq_max=val) } else { return(NULL) } - dt[,hpo_id:=annot[i,]$hpo_id][,disease_id:=annot[i,]$disease_id] - return(dt) + dat[,hpo_id:=annot[i,]$hpo_id][,disease_id:=annot[i,]$disease_id] + return(dat) }) |> data.table::rbindlist(fill=TRUE) freq_dt$pheno_freq_mean <- rowMeans( freq_dt[,c("pheno_freq_min","pheno_freq_max")], na.rm = TRUE diff --git a/R/per_branch_plot.R b/R/per_branch_plot.R index d158678..97005d7 100644 --- a/R/per_branch_plot.R +++ b/R/per_branch_plot.R @@ -17,54 +17,60 @@ #' @returns ggplot object #' #' @export -#' @import ggplot2 -#' @importFrom ontologyIndex get_descendants #' @examples -#' ## Selecting child terms of -#' ## "Abnormality of the nervous system" as background branches #' plt <- per_branch_plot( #' highlighted_branches = "Abnormality of nervous system physiology", #' ancestor = "Abnormality of the nervous system") per_branch_plot <- function(highlighted_branches, ancestor, hpo = get_hpo(), - background_branches = hpo$children[ - hpo$id[match(ancestor, hpo$name)] - ][[1]], + background_branches = simona::dag_children( + hpo, + term = map_phenotypes(terms = ancestor, + hpo = hpo, + to = "id") + ), phenotype_to_genes = load_phenotype_to_genes()) { - - # templateR:::source_all() - # devoptera::args2vars(per_branch_plot) - requireNamespace("ggplot2") - n_phenos <- branch <- target <- NULL; - highlighted_branches_ids <- hpo$id[match(highlighted_branches, hpo$name)] + highlighted_branches_ids <- map_phenotypes(terms = highlighted_branches, + hpo = hpo, + to = "id", + keep_order = FALSE) #### Count phenotypes per branch #### phenos_per_branch <- lapply(background_branches, function(b){ - n <- length(ontologyIndex::get_descendants(ontology = hpo, - roots = b)) + n <- length(simona::dag_offspring(hpo,term = b)) if (b %in% highlighted_branches_ids) { target_branch <- "target" } else { target_branch <- "other" } - data.table::data.table("branch" = hpo$name[b], + data.table::data.table("branch_id" = b, + "branch_name"=map_phenotypes(terms = b, + hpo = hpo, + to = "name"), "n_phenos" = n, "target" = target_branch) }) |> data.table::rbindlist() data.table::setkeyv(phenos_per_branch, "n_phenos") - phenos_per_branch$branch <- factor(x = phenos_per_branch$branch, - levels = unique(phenos_per_branch$branch), - ordered = TRUE) + phenos_per_branch$branch_name <- factor( + x = phenos_per_branch$branch_name, + levels = unique(phenos_per_branch$branch_name), + ordered = TRUE) + #### Plot #### plt <- ggplot(phenos_per_branch, - aes_string(x = "n_phenos", y = "branch", - color = "target", fill = "target")) + + aes(x = !!sym("n_phenos"), + y = !!sym("branch_name"), + color = !!sym("target"), + fill = !!sym("target") + ) + )+ geom_col(width = .5) + labs(x="Descendants (n)", y="hpo_name", fill="Group", color="Group") + theme_bw() + #### Return #### return(plt) } diff --git a/R/phenos_to_granges.R b/R/phenos_to_granges.R index f74bde4..a5c86cd 100644 --- a/R/phenos_to_granges.R +++ b/R/phenos_to_granges.R @@ -6,7 +6,7 @@ #' The resulting object will contain genes (and gene metadata) for all #' genes associated with each phenotypes. #' @param as_datatable Return as a \link[data.table]{data.table}. -#' @param keep_seqnames Chromosomes to keep. +#' @param keep_chr Chromosomes to keep. #' @inheritParams add_genes #' @inheritParams make_network_object #' @inheritParams make_phenos_dataframe @@ -23,7 +23,7 @@ phenos_to_granges <- function(phenos = NULL, phenotype_to_genes = load_phenotype_to_genes(), hpo = get_hpo(), - keep_seqnames = c(seq(22),"X","Y"), + keep_chr = c(seq(22),"X","Y"), by = c("hpo_id","disease_id"), gene_col = "intersection", split.field = "hpo_id", @@ -42,12 +42,10 @@ phenos_to_granges <- function(phenos = NULL, hpo = hpo, by = by, gene_col = gene_col, - allow.cartesian = allow.cartesian, - verbose = verbose) + allow.cartesian = allow.cartesian) #### Get gene lengths ##### - gr <- get_gene_lengths(gene_list = phenos$gene_symbol, - keep_seqnames = keep_seqnames, - verbose = verbose) + gr <- KGExplorer::get_gene_lengths(genes = phenos$gene_symbol, + keep_chr = keep_chr) #### Merge in gene length data #### gr_dt <- data.table::merge.data.table( phenos, diff --git a/R/read_enrichr.R b/R/read_enrichr.R deleted file mode 100644 index 8b5bd35..0000000 --- a/R/read_enrichr.R +++ /dev/null @@ -1,7 +0,0 @@ -read_enrichr <- function(file){ - lines <- readLines(file) - lapply(strsplit(lines,"\t"), function(l){ - data.table::data.table(term=l[1], - gene=l[-c(1,2)]) - }) |> data.table::rbindlist(fill = TRUE) -} diff --git a/R/report_missing.R b/R/report_missing.R index 1f09289..1b9d74a 100644 --- a/R/report_missing.R +++ b/R/report_missing.R @@ -1,12 +1,12 @@ -report_missing <- function(phenos, - id_col, +report_missing <- function(dat, + input_col, report_col, verbose=TRUE){ - report_missing_i <- function(phenos, - id_col, + report_missing_i <- function(dat, + input_col, report_col, verbose=TRUE){ - phenos2 <- phenos[,c(id_col,report_col),with=FALSE] |> unique() + phenos2 <- dat[,c(input_col,report_col),with=FALSE] |> unique() n_missing <- sum(is.na(phenos2[[report_col]])) n_total <- nrow(phenos2) messager(formatC(n_missing,big.mark = ","), @@ -16,8 +16,8 @@ report_missing <- function(phenos, report_col,"missing.",v=verbose) } for(rc in report_col){ - report_missing_i(phenos = phenos, - id_col = id_col, + report_missing_i(dat = dat, + input_col = input_col, report_col = rc, verbose = verbose) } diff --git a/R/search_hpo.R b/R/search_hpo.R index 1b67a95..52aaa64 100644 --- a/R/search_hpo.R +++ b/R/search_hpo.R @@ -11,7 +11,6 @@ #' @returns Named list of HPO IDs. #' #' @export -#' @importFrom ontologyIndex get_descendants #' @examples #' query_hits <- search_hpo() search_hpo <- function(hpo = get_hpo(), @@ -38,24 +37,24 @@ search_hpo <- function(hpo = get_hpo(), include_descendants=TRUE, include_ancestors=FALSE, verbose=TRUE){ - # devoptera::args2vars(search_hpo) + name <- NULL; query_hits <- lapply(queries, function(q){ terms <- grep(paste(q,collapse = "|"), - hpo$name, + hpo@elementMetadata$name, ignore.case = TRUE, value = TRUE) + dat <- subset(hpo@elementMetadata, name %in% terms) res <- c() if(isTRUE(include_descendants)){ res <- c(res, - ontologyIndex::get_descendants(ontology = hpo, - roots = names(terms), - exclude_roots = FALSE) + simona::dag_offspring(hpo, + term = dat$id) ) } if(isTRUE(include_ancestors)){ res <- c(res, - ontologyIndex::get_ancestors(ontology = hpo, - terms = names(terms)) + simona::dag_ancestors(hpo, + term = dat$id) ) } return(unique(res)) diff --git a/R/subset_descendants.R b/R/subset_descendants.R deleted file mode 100644 index bfb0006..0000000 --- a/R/subset_descendants.R +++ /dev/null @@ -1,46 +0,0 @@ -#' Subset descendants -#' -#' Subset a \code{phenos} datatable to only -#' descendants of an ancestor HPO ID term. -#' @param ancestor Phenotype names (or HPO ID) of an ancestor in the -#' \href{https://hpo.jax.org/}{Human Phenotype Ontology}. -#' Only phenotypes that are descendants of this ancestor will be kept. -#' Set to \code{NULL} (default) to skip this filtering step. -#' @inheritParams make_phenos_dataframe -#' @inheritParams make_network_object -#' @inheritParams harmonise_phenotypes -#' @returns data.table of phenotypes, with additional columns: -#' "ancestor", "ancestor_id" -#' -#' @export -#' @importFrom ontologyIndex get_descendants -#' @importFrom data.table := -#' @examples -#' phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -#' phenos2 <- subset_descendants(phenos = phenos, -#' ancestor = "Motor delay") -subset_descendants <- function(phenos, - ancestor = NULL, - hpo = get_hpo(), - ignore_case = TRUE, - verbose = TRUE){ - - hpo_id <- NULL; - - if(!is.null(ancestor)){ - messager("Subsetting phenotypes to only ancestors of:", - paste(ancestor,collapse = ","),v=verbose) - ancestor_id <- harmonise_phenotypes(phenotypes = ancestor, - hpo = hpo, - as_hpo_ids = TRUE, - ignore_case = ignore_case) - all_ids <- ontologyIndex::get_descendants(ontology = hpo, - roots = ancestor_id, - exclude_roots = FALSE) - phenos <- phenos[hpo_id %in% all_ids, - ][,ancestor:=ancestor][,ancestor_id:=ancestor_id] - messager(formatC(nrow(phenos),big.mark = ","), - "associations remain after filtering.",v=verbose) - } - return(phenos) -} diff --git a/R/unlist_col.R b/R/unlist_col.R index d3e1ec0..3f58163 100644 --- a/R/unlist_col.R +++ b/R/unlist_col.R @@ -1,13 +1,13 @@ #' Unlist column #' #' Unlist a column in a \link[data.table]{data.table}. -#' @param dt \link[data.table]{data.table} +#' @param dat \link[data.table]{data.table} #' @param col Column name. #' @returns \link[data.table]{data.table} #' #' @keywords internal -unlist_col <- function(dt, +unlist_col <- function(dat, col){ - dt[rep(dt[,.I],lengths(get(col))) - ][, eval(col) := unlist(dt[[col]])][] + dat[rep(dat[,.I],lengths(get(col))) + ][, eval(col) := unlist(dat[[col]])][] } diff --git a/inst/.DS_Store b/inst/.DS_Store index aa49b00d91c0525230f94a2bc3219ecb21a9e3d2..368127de32492bb7981e1f676f7c35ef4971e844 100644 GIT binary patch delta 56 zcmZoMXfc@J&&atkU^gQp=VTtH$^Bg8$ K*3Il3fB6Bdoew1d delta 31 ncmZoMXfc@J&&aVcU^gQp$7CL+$(#2wd9hAxklW18@s}R}pAZTO diff --git a/inst/extdata/.DS_Store b/inst/extdata/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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�J{s6}$TreDF*9*9 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

$5u{T=JU9GRF$pPELKHXgQmpX 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

xrr*s*G9`1`OLscPadp5sC?Gaea^%P^cC-TTF+ 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�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 diff --git a/inst/hex/hexSticker.Rmd b/inst/hex/hexSticker.Rmd index ef23e9f..2047054 100644 --- a/inst/hex/hexSticker.Rmd +++ b/inst/hex/hexSticker.Rmd @@ -2,7 +2,7 @@ title: "hexSticker" date: "

Updated: `r format( Sys.Date(), '%b-%d-%Y')`

" output: - BiocStyle::html_document + rmarkdown::html_document vignette: > %\VignetteIndexEntry{hexSticker} %\VignetteEngine{knitr::rmarkdown} diff --git a/man/add_.Rd b/man/add_.Rd new file mode 100644 index 0000000..f38d171 --- /dev/null +++ b/man/add_.Rd @@ -0,0 +1,594 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/_docs.R, R/add_ancestor.R, R/add_death.R, +% R/add_disease.R, R/add_disease_genes.R, R/add_evidence.R, +% R/add_gene_frequency.R, R/add_genes.R, R/add_hpo_definition.R, +% R/add_hpo_id.R, R/add_info_content.R, R/add_mondo.R, R/add_ndisease.R, +% R/add_omop.R, R/add_onset.R, R/add_ont_lvl.R, R/add_pheno_frequency.R, +% R/add_prevalence.R, R/add_severity.R, R/add_tier.R +\name{add_} +\alias{add_} +\alias{add_ancestor} +\alias{add_death} +\alias{add_disease} +\alias{add_disease_genes} +\alias{add_evidence} +\alias{add_gene_frequency} +\alias{add_genes} +\alias{add_hpo_definition} +\alias{add_hpo_id} +\alias{add_info_content} +\alias{add_mondo} +\alias{add_ndisease} +\alias{add_omop} +\alias{add_onset} +\alias{add_ont_lvl} +\alias{add_pheno_frequency} +\alias{add_prevalence} +\alias{add_severity} +\alias{add_tier} +\title{Add functions} +\usage{ +add_ancestor(phenos, lvl = 3, hpo = get_hpo(), remove_descendants = NULL) + +add_death( + phenos, + keep_deaths = NULL, + all.x = TRUE, + allow.cartesian = FALSE, + agg_by = NULL +) + +add_disease( + phenos, + extra_cols = NULL, + all.x = TRUE, + allow.cartesian = FALSE, + add_definitions = FALSE +) + +add_disease_genes(phenos, all.x = TRUE, verbose = TRUE) + +add_evidence( + phenos, + keep_evidence = NULL, + all.x = TRUE, + allow.cartesian = FALSE, + agg_by = c("disease_id", "gene_symbol"), + default_score = 1 +) + +add_gene_frequency( + phenotype_to_genes = load_phenotype_to_genes(), + gene_frequency_threshold = NULL, + all.x = TRUE, + verbose = TRUE +) + +add_genes( + phenos = NULL, + phenotype_to_genes = load_phenotype_to_genes(), + hpo = get_hpo(), + by = c("hpo_id", "disease_id"), + gene_col = "gene_symbol", + all.x = FALSE, + allow.cartesian = FALSE +) + +add_hpo_definition( + phenos, + line_length = FALSE, + use_api = FALSE, + verbose = TRUE +) + +add_hpo_id(phenos, hpo = get_hpo(), phenotype_to_genes = NULL) + +add_info_content(phenos, hpo = get_hpo()) + +add_mondo(phenos, input_col = "disease_id", map_to = "hpo", ...) + +add_ndisease( + phenos, + pheno_ndiseases_threshold = NULL, + all.x = TRUE, + allow.cartesian = FALSE, + verbose = TRUE +) + +add_omop( + phenos, + input_col = "hpo_id", + all.x = TRUE, + allow.cartesian = FALSE, + force_new = FALSE, + verbose = TRUE +) + +add_onset( + phenos, + keep_onsets = NULL, + agg_by = NULL, + all.x = TRUE, + allow.cartesian = FALSE +) + +add_ont_lvl( + phenos, + hpo = get_hpo(), + absolute = TRUE, + keep_ont_levels = NULL, + ... +) + +add_pheno_frequency( + phenos, + pheno_frequency_threshold = NULL, + all.x = TRUE, + allow.cartesian = FALSE +) + +add_prevalence( + phenos, + input_col = "disease_id", + drop_na = TRUE, + method = "orphanet" +) + +add_severity( + phenos, + hpo = get_hpo(), + all.x = TRUE, + allow.cartesian = FALSE, + severity_threshold = NULL +) + +add_tier( + phenos, + all.x = TRUE, + include_disease_characteristics = TRUE, + auto_assign = TRUE, + hpo = get_hpo(), + keep_tiers = NULL, + verbose = TRUE +) +} +\arguments{ +\item{phenos}{A data.table containing HPO IDs and other metadata.} + +\item{lvl}{How many levels deep into the ontology to get ancestors from. +For example: +\itemize{ +\item{1: }{"All"} +\item{2: }{"Phenotypic abnormality"} +\item{3: }{"Abnormality of the nervous system"} +\item{4: }{"Abnormality of nervous system physiology"} +\item{5: }{"Neurodevelopmental abnormality" or "Behavioral abnormality"} +}} + +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} + +\item{remove_descendants}{Remove HPO terms that are descendants of a given +ancestral HPO term. Ancestral terms be provided as a character vector of +phenotype names (e.g. \code{c("Clinical course")}), +HPO IDs (e.g. \code{"HP:0031797" }) or a mixture of the two. +See \link{add_ancestor} for details.} + +\item{keep_deaths}{The age of death associated with each HPO ID to keep. +If >1 age of death is associated with the term, +only the earliest age is considered. +See \link{add_death} for details.} + +\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the +output, one for each row in \code{x} that has no matching row in \code{y}. +These rows will have 'NA's in those columns that are usually filled with values +from \code{y}. The default is \code{FALSE}, so that only rows with data from both +\code{x} and \code{y} are included in the output.} + +\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} + +\item{agg_by}{Column to aggregate age of onset metadata by.} + +\item{extra_cols}{Extra metadata columns from the"phenotype.hpoa" +annotations file to include. +See +\href{https://hpo-annotation-qc.readthedocs.io/en/latest/annotationFormat.html}{ +here for column descriptions}.} + +\item{add_definitions}{Add disease definitions using \link{add_mondo}.} + +\item{verbose}{Print messages.} + +\item{keep_evidence}{The evidence scores of each gene-disease +association to keep.} + +\item{default_score}{Default evidence score to +apply to gene-disease associations that are present in the HPO annotations +but don't have evidence scores in the GenCC annotations.} + +\item{phenotype_to_genes}{Output of +\link{load_phenotype_to_genes} mapping phenotypes +to gene annotations.} + +\item{gene_frequency_threshold}{Only keep genes with frequency +above the set threshold. Frequency ranges from 0-100 where 100 is +a gene that occurs 100\% of the time in a given phenotype. +Include \code{NA} if you wish to retain genes that +do not have any frequency data. +See \link{add_gene_frequency} for details.} + +\item{by}{A vector of shared column names in \code{x} and \code{y} to merge on. +This defaults to the shared key columns between the two tables. +If \code{y} has no key columns, this defaults to the key of \code{x}.} + +\item{gene_col}{Name of the gene column.} + +\item{line_length}{The number of desired words per line \} + +\item{use_api}{Get definitions from the HPO API, +as opposed to a static local dataset.} + +\item{input_col}{Name of the column containing the disease or phenotype IDs.} + +\item{map_to}{Mapping outputs to include +(from Mondo IDs to another database's IDs).} + +\item{...}{ + Arguments passed on to \code{\link[KGExplorer:map_]{KGExplorer::map_mondo}}, \code{\link[KGExplorer:get_]{KGExplorer::get_ontology_levels}} + \describe{ + \item{\code{dat}}{\link[data.table]{data.table} with genes.} + \item{\code{output_col}}{Column name of output IDs.} + \item{\code{to}}{Character vector of database(s) to map IDs to. +When not \code{"mondo"}, can supply multiple alternative databases to map to + (e.g. \code{c("OMIM","Orphanet","DECIPHER")}).} + \item{\code{map_types}}{Mapping types to include.} + \item{\code{top_n}}{Top number of mappings to return per \code{top_by} grouping. +Set to \code{NULL} to skip this step.} + \item{\code{add_name}}{Logical, if TRUE, add mondo name column.} + \item{\code{save_dir}}{Directory to save cached data.} + \item{\code{ont}}{An ontology of class \link[simona]{ontology_DAG}.} + \item{\code{terms}}{Term IDs to include. Can alternatively be an integer, +which will be used to randomly sample N terms from the data.} + \item{\code{remove_terms}}{Character vector of term IDs to exclude.} + \item{\code{reverse}}{If \code{TRUE}, ontology +level numbers with be revered such that the level of the parent terms +are larger than the child terms.} + }} + +\item{pheno_ndiseases_threshold}{Filter phenotypes by the +maximum number of diseases they are associated with.} + +\item{force_new}{Force a new query to the OARD API instead of +using pre-downloaded data.} + +\item{keep_onsets}{The age of onset associated with each HPO ID to keep. +If >1 age of onset is associated with the term, +only the earliest age is considered. +See \link[HPOExplorer]{add_onset} for details.} + +\item{absolute}{Make the levels absolute in the sense that they consider +the entire ontology (\code{TRUE}). +Otherwise, levels will be relative to only the terms that are in + the provided subset of \code{terms} AND are directly adjacent (connected) + to a given cluster of terms (\code{FALSE}).} + +\item{keep_ont_levels}{Only keep phenotypes at certain \emph{absolute} +ontology levels to keep. +See \link{add_ont_lvl} for details.} + +\item{pheno_frequency_threshold}{Only keep phenotypes with frequency +above the set threshold. Frequency ranges from 0-100 where 100 is +a phenotype that occurs 100\% of the time in all associated diseases. +Include \code{NA} if you wish to retain phenotypes that +do not have any frequency data. +See \link[HPOExplorer]{add_pheno_frequency} for details.} + +\item{drop_na}{Whether to drop rows with missing prevalence data.} + +\item{method}{One of "orphanet" or "oard".} + +\item{severity_threshold}{Only keep phenotypes with a mean +severity score (averaged across multiple associated diseases) below the +set threshold. The severity score ranges from 1-4 where 1 is the MOST severe. +Include \code{NA} if you wish to retain phenotypes that +do not have any severity score.} + +\item{include_disease_characteristics}{Include \code{phenotypes} that +are also high-level \code{include_disease_characteristics}.} + +\item{auto_assign}{Automatically assing HPO IDs to Tiers by conducting +regex searches for keywords that appear in the term name, +or the names of its descendants or ancestors.} + +\item{keep_tiers}{Tiers from \link[HPOExplorer]{hpo_tiers} to keep. +Include \code{NA} if you wish to retain phenotypes that +do not have any Tier assignment.} +} +\value{ +Annotated data. + +phenos data.table with extra columns: +\itemize{ +\item{"AgeOfDeath": }{AgeOfDeath HPO IDs of disease phenotypes associated +with the target hpo_id phenotype.} +\item{"AgeOfDeath_names": }{AgeOfDeath HPO names of disease phenotypes +associated with the target hpo_id phenotype.} +\item{"AgeOfDeath_counts": }{The number of times each term in +"AgeOfDeath_names" appears across associated disease phenotypes.} +\item{"AgeOfDeath_score_mean": }{Mean age of death score.} +\item{"AgeOfDeath_score_min": }{Minimum age of death score.} +\item{"AgeOfDeath_top": }{The most common age of death term.} +\item{"AgeOfDeath_earliest": }{The earliest age of death.} +\item{"AgeOfDeath_latest": }{The latest age of death.} +} + +phenos data.table with extra columns: +\itemize{ +\item{"evidence_score_min": }{Minimum evidence score.} +\item{"evidence_score_max": }{Maximum evidence score.} +\item{"evidence_score_mean": }{Mean evidence score.} +} + +phenos data.table with extra column + +A named vector of HPO term descriptions. + +phenos data.table with extra column + +phenos data.table with extra columns. + +phenos data.table with extra columns + +phenos data.table with extra columns: +\itemize{ +\item{"onset": }{onset HPO IDs of disease phenotypes associated +with the target hpo_id phenotype.} +\item{"onset_names": }{onset HPO names of disease phenotypes associated +with the target hpo_id phenotype.} +\item{"onset_counts": }{The number of times each term in +"onset_names" appears across associated disease phenotypes.} +\item{"onset_score_mean": }{Mean onset score.} +\item{"onset_score_min": }{Minimum onset score.} +\item{"onset_top": }{The most common onset term.} +\item{"onset_earliest": }{The earliest age of onset.} +\item{"onset_latest": }{The latest age of onset.} +} + +phenos data.table with extra column + +phenos data.table with extra column + +phenos data.table with extra columns + +phenos data.table with extra column +} +\description{ +Functions to add metadata to data.table objects. +} +\section{Functions}{ +\itemize{ +\item \code{add_ancestor()}: add_ +Add ancestor + +Assign each HPO ID to the higher-order ancestral term that it is part of. + +\item \code{add_death()}: add_ +Add age of death + +Add age of death for each HPO ID. +AgeOfDeath IDs and assigned "AgeOfDeath_score" values: +\itemize{ +\item{HP:0005268 }{"Miscarriage" (AgeOfDeath_score=1)} +\item{HP:0003826 }{"Stillbirth" (AgeOfDeath_score=1)} +\item{HP:0034241 }{"Prenatal death" (AgeOfDeath_score=1)} +\item{HP:0003811 }{"Neonatal death" (AgeOfDeath_score=2)} +\item{HP:0001522 }{"Death in infancy" (AgeOfDeath_score=3)} +\item{HP:0003819 }{"Death in childhood" (AgeOfDeath_score=4)} +\item{HP:0011421 }{"Death in adolescence" (AgeOfDeath_score=5)} +\item{HP:0100613 }{"Death in early adulthood" (AgeOfDeath_score=6)} +\item{HP:0033764 }{"Death in middle age" (AgeOfDeath_score=7)} +\item{HP:0033763 }{"Death in adulthood" (AgeOfDeath_score=7)} +\item{HP:0033765 }{"Death in late adulthood" (AgeOfDeath_score=8)} +} + +\item \code{add_disease()}: add_ +Add diseases + +Annotate each HPO term with diseases that they are associated with. + +\item \code{add_disease_genes()}: add_ +Add disease genes + +Add genes that overlap between an HPO ID and an associated phenotype. + +\item \code{add_evidence()}: add_ +Add evidence + +Add the strength of evidence supporting each gene-disease association. +\href{https://thegencc.org/faq.html#validity-termsdelphi-survey}{ +Delphi survey} evidence classification IDs and +assigned "evidence_score" values: +\itemize{ +\item{GENCC:100001 }{"Definitive" (evidence_score=6)} +\item{GENCC:100002 }{"Strong" (evidence_score=5)} +\item{GENCC:100003 }{"Moderate" (evidence_score=4)} +\item{GENCC:100009 }{"Supportive" (evidence_score=3)} +\item{GENCC:100004 }{"Limited" (evidence_score=2)} +\item{GENCC:100005 }{"Disputed Evidence" (evidence_score=1)} +\item{GENCC:100006 }{"Refuted Evidence" (evidence_score=0)} +\item{GENCC:100008 }{"No Known Disease Relationship" (evidence_score=0)} +} + +\item \code{add_gene_frequency()}: add_ +Add gene frequency + +Add gene-level frequency, i.e. how often mutations in a given gene +are associated with a given phenotype. +Numeric frequency columns are on a 0-100\% scale. + +\item \code{add_genes()}: add_ +Add genes + +Add genes associated with each phenotype +(in the context of a particular disease). + +\item \code{add_hpo_definition()}: add_ +Get term definition + +This function accesses the HPO API to get a description/definition of an +HPO term. If a \code{line_length} \> 0 is passed to the function, it will add +newlines every nth word. This can be useful when displaying the description +in plots with limited space. + +\item \code{add_hpo_id()}: add_ +Add HPO ID column to dataframe + +Adds the HPO term ID column "hpo_id". + +\item \code{add_info_content()}: add_ +Add information content + +Add a column containing the information content score for each HPO ID. + +\item \code{add_mondo()}: add_ +Add Mondo metadata + +Add Mondo metadata (MONDO ID mappings, names, and definitions) for diseases +using files from their respective databases: +e.g. OMIM, DECIPHER, Orphanet. + +\item \code{add_ndisease()}: add_ +Add N diseases + +Annotate each HPO term with the total number of disease +they are associated with. + +\item \code{add_omop()}: add_ +Add OMOP + +Add metadata from \href{https://mondo.monarchinitiative.org/}{MONDO}, +including: +\itemize{ +\item{mondo_id: }{MONDO term ID.} +\item{mondo_name: }{MONDO term name.} +\item{mondo_def: }{MONDO term definition.} +} + +\item \code{add_onset()}: add_ +Add age of onset + +Add age of onset for each HPO ID. +onset IDs and assigned "onset_score" values: +\itemize{ +\item{HP:0011461 }{"Fetal onset" (onset_score=1)} +\item{HP:0030674 }{"Antenatal onset" (onset_score=2)} +\item{HP:0003577 }{"Congenital onset" (onset_score=3)} +\item{HP:0003623 }{"Neonatal onset" (onset_score=4)} +\item{HP:0003593 }{"Infantile onset" (onset_score=5)} +\item{HP:0011463 }{"Childhood onset" (onset_score=6)} +\item{HP:0003621 }{"Juvenile onset" (onset_score=7)} +\item{HP:0011462 }{"Young adult onset" (onset_score=8)} +\item{HP:0003581 }{"Adult onset" (onset_score=9)} +\item{HP:0003596 }{"Middle age onset" (onset_score=10)} +\item{HP:0003584 }{"Late onset" (onset_score=11)} +} + +\item \code{add_ont_lvl()}: add_ +Add ontology level + +Add the relative ontology level for each HPO ID. + +\item \code{add_pheno_frequency()}: add_ +Add phenotype frequency + +Add phenotype-level frequency, i.e. +how often a phenotype occurs in a given disease. + +\item \code{add_prevalence()}: add_ +Add prevalence + +Add a column containing the prevalence score for each disease ("disease_id") +or phenotype ("hpo_id"). + +\item \code{add_severity()}: add_ +Add HPO modifiers + +Annotate each HPO with modifier terms, including +(but not limited to) progression and severity ratings. +In order of increasing severity: +\itemize{ +\item{HP:0012825 }{"Mild" (Severity_score=4)} +\item{HP:0012827 }{"Borderline" (Severity_score=3)} +\item{HP:0012828 }{"Severe" (Severity_score=2)} +\item{HP:0012829}{"Profound" (Severity_score=1)} +} + +\item \code{add_tier()}: add_ +Add severity Tiers + +Add severity Tier for each HPO ID, in accordance with the +rating system provided by +\href{https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4262393/}{ +Lazarin et al (2014)}. +In order of increasing severity: +\itemize{ +\item{Tier 4 }{Reduced fertility} +\item{Tier 3 }{Sensory impairment: vision, +Immunodeficiency/cancer, +Sensory impairment: hearing, +Sensory impairment: touch, other (including pain), +Mental illness, +Dysmorphic features} +\item{Tier 2 }{Shortened life span: premature adulthood, +Impaired mobility, +Internal physical malformation} +\item{Tier 1 }{Shortened life span: infancy, +Shortened life span: childhood/adolescence, +Intellectual disability} +} + +}} +\examples{ +phenos <- example_phenos() +phenos2 <- add_ancestor(phenos = phenos, lvl=5) +phenos <- example_phenos() +phenos2 <- add_death(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_disease(phenos = phenos) +\dontrun{ +phenos <- load_phenotype_to_genes() +phenos2 <- add_severity(phenos = phenos) +} +phenos <- load_phenotype_to_genes() +phenos2 <- add_evidence(phenos = phenos) +phenotype_to_genes <- load_phenotype_to_genes()[seq(1000),] +phenos2 <- add_gene_frequency(phenotype_to_genes = phenotype_to_genes) +phenos <- example_phenos() +phenos2 <- add_genes(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_hpo_definition(phenos = phenos) +phenotype_to_genes <- load_phenotype_to_genes() +phenos <- unique(phenotype_to_genes[,c("hpo_id","hpo_name")]) +phenos2 <- add_hpo_id(phenos=phenos) +phenos <- example_phenos() +phenos2 <- add_info_content(phenos = phenos) +phenos <- load_phenotype_to_genes(3)[seq(1000)] +phenos2 <- add_mondo(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_ndisease(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_omop(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_onset(phenos = phenos) +phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +phenos2 <- add_ont_lvl(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_pheno_frequency(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_prevalence(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_severity(phenos = phenos) +phenos <- example_phenos() +phenos2 <- add_tier(phenos = phenos) +} +\concept{add_} diff --git a/man/add_ancestor.Rd b/man/add_ancestor.Rd deleted file mode 100644 index 0f0b562..0000000 --- a/man/add_ancestor.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_ancestor.R -\name{add_ancestor} -\alias{add_ancestor} -\title{Add ancestor} -\usage{ -add_ancestor( - phenos, - lvl = 3, - hpo = get_hpo(), - remove_descendants = NULL, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{lvl}{How many levels deep into the ontology to get ancestors from. -For example: -\itemize{ -\item{1: }{"All"} -\item{2: }{"Phenotypic abnormality"} -\item{3: }{"Abnormality of the nervous system"} -\item{4: }{"Abnormality of nervous system physiology"} -\item{5: }{"Neurodevelopmental abnormality" or "Behavioral abnormality"} -}} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{remove_descendants}{Remove HPO terms that are descendants of a given -ancestral HPO term. Ancestral terms be provided as a character vector of -phenotype names (e.g. \code{c("Clinical course")}), -HPO IDs (e.g. \code{"HP:0031797" }) or a mixture of the two. -See \link[HPOExplorer]{add_ancestor} for details.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Assign each HPO ID to the higher-order ancestral term that it is part of. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_ancestor(phenos = phenos, lvl=5) -} diff --git a/man/add_death.Rd b/man/add_death.Rd deleted file mode 100644 index 1e247f5..0000000 --- a/man/add_death.Rd +++ /dev/null @@ -1,72 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_death.R -\name{add_death} -\alias{add_death} -\title{Add age of death} -\usage{ -add_death( - phenos, - keep_deaths = NULL, - all.x = TRUE, - allow.cartesian = FALSE, - agg_by = NULL, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{keep_deaths}{The age of death associated with each HPO ID to keep. -If >1 age of death is associated with the term, -only the earliest age is considered. -See \link[HPOExplorer]{add_death} for details.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{agg_by}{Column to aggregate age of death metadata by.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns: -\itemize{ -\item{"AgeOfDeath": }{AgeOfDeath HPO IDs of disease phenotypes associated -with the target hpo_id phenotype.} -\item{"AgeOfDeath_names": }{AgeOfDeath HPO names of disease phenotypes -associated with the target hpo_id phenotype.} -\item{"AgeOfDeath_counts": }{The number of times each term in -"AgeOfDeath_names" appears across associated disease phenotypes.} -\item{"AgeOfDeath_score_mean": }{Mean age of death score.} -\item{"AgeOfDeath_score_min": }{Minimum age of death score.} -\item{"AgeOfDeath_top": }{The most common age of death term.} -\item{"AgeOfDeath_earliest": }{The earliest age of death.} -\item{"AgeOfDeath_latest": }{The latest age of death.} -} -} -\description{ -Add age of death for each HPO ID. -AgeOfDeath IDs and assigned "AgeOfDeath_score" values: -\itemize{ -\item{HP:0005268 }{"Miscarriage" (AgeOfDeath_score=1)} -\item{HP:0003826 }{"Stillbirth" (AgeOfDeath_score=1)} -\item{HP:0034241 }{"Prenatal death" (AgeOfDeath_score=1)} -\item{HP:0003811 }{"Neonatal death" (AgeOfDeath_score=2)} -\item{HP:0001522 }{"Death in infancy" (AgeOfDeath_score=3)} -\item{HP:0003819 }{"Death in childhood" (AgeOfDeath_score=4)} -\item{HP:0011421 }{"Death in adolescence" (AgeOfDeath_score=5)} -\item{HP:0100613 }{"Death in early adulthood" (AgeOfDeath_score=6)} -\item{HP:0033764 }{"Death in middle age" (AgeOfDeath_score=7)} -\item{HP:0033763 }{"Death in adulthood" (AgeOfDeath_score=7)} -\item{HP:0033765 }{"Death in late adulthood" (AgeOfDeath_score=8)} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_death(phenos = phenos) -} diff --git a/man/add_disease.Rd b/man/add_disease.Rd deleted file mode 100644 index e16c491..0000000 --- a/man/add_disease.Rd +++ /dev/null @@ -1,51 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_disease.R -\name{add_disease} -\alias{add_disease} -\title{Add diseases} -\usage{ -add_disease( - phenos, - extra_cols = NULL, - include_mondo = TRUE, - all.x = TRUE, - allow.cartesian = FALSE, - add_definitions = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{extra_cols}{Extra metadata columns from the"phenotype.hpoa" -annotations file to include. -See -\href{https://hpo-annotation-qc.readthedocs.io/en/latest/annotationFormat.html}{ -here for column descriptions}.} - -\item{include_mondo}{Add IDs/names/definitions from MONDO via -\link[HPOExplorer]{add_mondo}.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{add_definitions}{Add disease definitions using -\link[HPOExplorer]{add_disease_definition}.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns -} -\description{ -Annotate each HPO term with diseases that they are associated with. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_disease(phenos = phenos) -} diff --git a/man/add_disease_definition.Rd b/man/add_disease_definition.Rd deleted file mode 100644 index e278985..0000000 --- a/man/add_disease_definition.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_disease_definition.R -\name{add_disease_definition} -\alias{add_disease_definition} -\title{Add disease definition} -\usage{ -add_disease_definition( - phenos, - cols = c("Definitions", "Preferred.Label"), - id_col = "disease_id", - save_dir = file.path(tools::R_user_dir("HPOExplorer", which = "cache")), - include_mondo = TRUE, - all.x = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{cols}{Metadata columns to include.} - -\item{id_col}{Name of the disease ID column.} - -\item{save_dir}{Directory to save metadata files to.} - -\item{include_mondo}{Add IDs/names/definitions from MONDO via -\link[HPOExplorer]{add_mondo}.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns. -} -\description{ -Add metadata for diseases using files from their respective databases: -OMIM, DECIPHER, Orphanet. -} -\examples{ -phenos <- load_phenotype_to_genes(3)[seq(1000)] -phenos2 <- add_disease_definition(phenos = phenos) -} diff --git a/man/add_disease_genes.Rd b/man/add_disease_genes.Rd deleted file mode 100644 index c11ed68..0000000 --- a/man/add_disease_genes.Rd +++ /dev/null @@ -1,31 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_disease_genes.R -\name{add_disease_genes} -\alias{add_disease_genes} -\title{Add disease genes} -\usage{ -add_disease_genes(phenos, all.x = TRUE, verbose = TRUE) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns -} -\description{ -Add genes that overlap between an HPO ID and an associated phenotype. -} -\examples{ -\dontrun{ -phenos <- load_phenotype_to_genes() -phenos2 <- add_severity(phenos = phenos) -} -} diff --git a/man/add_evidence.Rd b/man/add_evidence.Rd deleted file mode 100644 index 6e4b7da..0000000 --- a/man/add_evidence.Rd +++ /dev/null @@ -1,66 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_evidence.R -\name{add_evidence} -\alias{add_evidence} -\title{Add evidence} -\usage{ -add_evidence( - phenos, - keep_evidence = NULL, - all.x = TRUE, - allow.cartesian = FALSE, - agg_by = c("disease_id", "gene_symbol"), - default_score = 1, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{keep_evidence}{The evidence scores of each gene-disease -association to keep.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{agg_by}{Column to aggregate metadata by.} - -\item{default_score}{Default evidence score to -apply to gene-disease associations that are present in the HPO annotations -but don't have evidence scores in the GenCC annotations.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns: -\itemize{ -\item{"evidence_score_min": }{Minimum evidence score.} -\item{"evidence_score_max": }{Maximum evidence score.} -\item{"evidence_score_mean": }{Mean evidence score.} -} -} -\description{ -Add the strength of evidence supporting each gene-disease association. -\href{https://thegencc.org/faq.html#validity-termsdelphi-survey}{ -Delphi survey} evidence classification IDs and -assigned "evidence_score" values: -\itemize{ -\item{GENCC:100001 }{"Definitive" (evidence_score=6)} -\item{GENCC:100002 }{"Strong" (evidence_score=5)} -\item{GENCC:100003 }{"Moderate" (evidence_score=4)} -\item{GENCC:100009 }{"Supportive" (evidence_score=3)} -\item{GENCC:100004 }{"Limited" (evidence_score=2)} -\item{GENCC:100005 }{"Disputed Evidence" (evidence_score=1)} -\item{GENCC:100006 }{"Refuted Evidence" (evidence_score=0)} -\item{GENCC:100008 }{"No Known Disease Relationship" (evidence_score=0)} -} -} -\examples{ -phenos <- load_phenotype_to_genes() -phenos2 <- add_evidence(phenos = phenos) -} diff --git a/man/add_gene_frequency.Rd b/man/add_gene_frequency.Rd deleted file mode 100644 index 2d669b0..0000000 --- a/man/add_gene_frequency.Rd +++ /dev/null @@ -1,45 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_gene_frequency.R -\name{add_gene_frequency} -\alias{add_gene_frequency} -\title{Add gene frequency} -\usage{ -add_gene_frequency( - phenotype_to_genes = load_phenotype_to_genes(), - gene_frequency_threshold = NULL, - all.x = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -to gene annotations.} - -\item{gene_frequency_threshold}{Only keep genes with frequency -above the set threshold. Frequency ranges from 0-100 where 100 is -a gene that occurs 100\% of the time in a given phenotype. -Include \code{NA} if you wish to retain genes that -do not have any frequency data. -See \link[HPOExplorer]{add_gene_frequency} for details.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Add gene-level frequency, i.e. how often mutations in a given gene -are associated with a given phenotype. -Numeric frequency columns are on a 0-100\% scale. -} -\examples{ -phenotype_to_genes <- load_phenotype_to_genes()[seq(1000),] -phenos2 <- add_gene_frequency(phenotype_to_genes = phenotype_to_genes) -} diff --git a/man/add_genes.Rd b/man/add_genes.Rd deleted file mode 100644 index c11864f..0000000 --- a/man/add_genes.Rd +++ /dev/null @@ -1,50 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_genes.R -\name{add_genes} -\alias{add_genes} -\title{Add genes} -\usage{ -add_genes( - phenos = NULL, - phenotype_to_genes = load_phenotype_to_genes(), - hpo = get_hpo(), - by = c("hpo_id", "disease_id"), - gene_col = "gene_symbol", - all.x = FALSE, - allow.cartesian = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -to gene annotations.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{by}{A vector of shared column names in \code{x} and \code{y} to merge on. -This defaults to the shared key columns between the two tables. -If \code{y} has no key columns, this defaults to the key of \code{x}.} - -\item{gene_col}{Name of the gene column.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{verbose}{Print messages.} -} -\description{ -Add genes associated with each phenotype -(in the context of a particular disease). -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_genes(phenos = phenos) -} diff --git a/man/add_hpo_definition.Rd b/man/add_hpo_definition.Rd deleted file mode 100644 index ec057ee..0000000 --- a/man/add_hpo_definition.Rd +++ /dev/null @@ -1,36 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_hpo_definition.R -\name{add_hpo_definition} -\alias{add_hpo_definition} -\title{Get term definition} -\usage{ -add_hpo_definition( - phenos, - line_length = FALSE, - use_api = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{line_length}{The number of desired words per line \} - -\item{use_api}{Get definitions from the HPO API, -as opposed to a static local dataset.} - -\item{verbose}{Print messages.} -} -\value{ -A named vector of HPO term descriptions. -} -\description{ -This function accesses the HPO API to get a description/definition of an -HPO term. If a \code{line_length} \> 0 is passed to the function, it will add -newlines every nth word. This can be useful when displaying the description -in plots with limited space. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_hpo_definition(phenos = phenos) -} diff --git a/man/add_hpo_id.Rd b/man/add_hpo_id.Rd deleted file mode 100644 index 3185612..0000000 --- a/man/add_hpo_id.Rd +++ /dev/null @@ -1,35 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_hpo_id.R -\name{add_hpo_id} -\alias{add_hpo_id} -\title{Add HPO ID column to dataframe} -\usage{ -add_hpo_id(phenos, hpo = get_hpo(), phenotype_to_genes = NULL, verbose = FALSE) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -to gene annotations.} - -\item{verbose}{Print messages.} -} -\value{ -The subset of EWCE results dataframe with a HPO Id column added. -} -\description{ -This adds the HPO term id column to the subset of ewce results data -to be plotted -in the cell select app. It also checks if it is a valid HPO term id to -prevent error and adds -a boolean column where TRUE if term is valid. If the HPO Id is not correct, -it caused an error in the ontologyPlot package. -} -\examples{ -phenotype_to_genes <- load_phenotype_to_genes() -phenos <- unique(phenotype_to_genes[,c("hpo_id","hpo_name")]) -phenos2 <- add_hpo_id(phenos=phenos) -} diff --git a/man/add_hpo_synonym.Rd b/man/add_hpo_synonym.Rd deleted file mode 100644 index ea5a0a4..0000000 --- a/man/add_hpo_synonym.Rd +++ /dev/null @@ -1,37 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_hpo_synonym.R -\name{add_hpo_synonym} -\alias{add_hpo_synonym} -\title{Add HPO ID synonyms} -\usage{ -add_hpo_synonym( - phenos, - to = "UMLS", - to_col = paste0(to, "_ID"), - hpo = get_hpo(), - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{to}{The ontology to map to. Default is \code{UMLS}.} - -\item{to_col}{The name of the new column to add the synonyms to.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{verbose}{Print messages.} -} -\value{ -A data.table with the HPO ID synonyms in a new column with -the same name as \code{to}. -} -\description{ -Map HPO IDs to synonynmous IDs from other ontologies -(e.g. UMLS, SNOMEDCT_US, MSH, ICD-10) -} -\examples{ -phenos <- HPOExplorer::example_phenos() -phenos2 <- add_hpo_synonym(phenos) -} diff --git a/man/add_info_content.Rd b/man/add_info_content.Rd deleted file mode 100644 index c5f1a50..0000000 --- a/man/add_info_content.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_info_content.R -\name{add_info_content} -\alias{add_info_content} -\title{Add information content} -\usage{ -add_info_content(phenos, hpo = get_hpo(), verbose = TRUE) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Add a column containing the information content score for each HPO ID. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_info_content(phenos = phenos) -} diff --git a/man/add_mondo.Rd b/man/add_mondo.Rd deleted file mode 100644 index 7cb4206..0000000 --- a/man/add_mondo.Rd +++ /dev/null @@ -1,46 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_mondo.R -\name{add_mondo} -\alias{add_mondo} -\title{Add MONDO} -\usage{ -add_mondo( - phenos, - id_col = "disease_id", - add_definitions = TRUE, - all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{id_col}{ID column to map to MONDO IDs.} - -\item{add_definitions}{Add disease definitions using -\link[HPOExplorer]{add_disease_definition}.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{verbose}{Print messages.} -} -\description{ -Add metadata from \href{https://mondo.monarchinitiative.org/}{MONDO}, -including: -\itemize{ -\item{MONDO_ID: }{MONDO term ID.} -\item{MONDO_name: }{MONDO term name.} -\item{MONDO_definition: }{MONDO term definition.} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_mondo(phenos = phenos) -} diff --git a/man/add_ndisease.Rd b/man/add_ndisease.Rd deleted file mode 100644 index 5b0acfd..0000000 --- a/man/add_ndisease.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_ndisease.R -\name{add_ndisease} -\alias{add_ndisease} -\title{Add N diseases} -\usage{ -add_ndisease( - phenos, - pheno_ndiseases_threshold = NULL, - all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{pheno_ndiseases_threshold}{Filter phenotypes by the -maximum number of diseases they are associated with.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns -} -\description{ -Annotate each HPO term with the total number of disease -they are associated with. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_ndisease(phenos = phenos) -} diff --git a/man/add_omop.Rd b/man/add_omop.Rd deleted file mode 100644 index 5e138ad..0000000 --- a/man/add_omop.Rd +++ /dev/null @@ -1,46 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_omop.R -\name{add_omop} -\alias{add_omop} -\title{Add MONDO} -\usage{ -add_omop( - phenos, - id_col = "hpo_id", - all.x = TRUE, - allow.cartesian = FALSE, - force_new = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{id_col}{ID column to map to MONDO IDs.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{force_new}{Force a new query to the OARD API instead of -using pre-downloaded data.} - -\item{verbose}{Print messages.} -} -\description{ -Add metadata from \href{https://mondo.monarchinitiative.org/}{MONDO}, -including: -\itemize{ -\item{MONDO_ID: }{MONDO term ID.} -\item{MONDO_name: }{MONDO term name.} -\item{MONDO_definition: }{MONDO term definition.} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_omop(phenos = phenos) -} diff --git a/man/add_onset.Rd b/man/add_onset.Rd deleted file mode 100644 index 23f4ab0..0000000 --- a/man/add_onset.Rd +++ /dev/null @@ -1,72 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_onset.R -\name{add_onset} -\alias{add_onset} -\title{Add age of onset} -\usage{ -add_onset( - phenos, - keep_onsets = NULL, - agg_by = NULL, - all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{keep_onsets}{The age of onset associated with each HPO ID to keep. -If >1 age of onset is associated with the term, -only the earliest age is considered. -See \link[HPOExplorer]{add_onset} for details.} - -\item{agg_by}{Column to aggregate age of onset metadata by.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns: -\itemize{ -\item{"onset": }{onset HPO IDs of disease phenotypes associated -with the target hpo_id phenotype.} -\item{"onset_names": }{onset HPO names of disease phenotypes associated -with the target hpo_id phenotype.} -\item{"onset_counts": }{The number of times each term in -"onset_names" appears across associated disease phenotypes.} -\item{"onset_score_mean": }{Mean onset score.} -\item{"onset_score_min": }{Minimum onset score.} -\item{"onset_top": }{The most common onset term.} -\item{"onset_earliest": }{The earliest age of onset.} -\item{"onset_latest": }{The latest age of onset.} -} -} -\description{ -Add age of onset for each HPO ID. -onset IDs and assigned "onset_score" values: -\itemize{ -\item{HP:0011461 }{"Fetal onset" (onset_score=1)} -\item{HP:0030674 }{"Antenatal onset" (onset_score=2)} -\item{HP:0003577 }{"Congenital onset" (onset_score=3)} -\item{HP:0003623 }{"Neonatal onset" (onset_score=4)} -\item{HP:0003593 }{"Infantile onset" (onset_score=5)} -\item{HP:0011463 }{"Childhood onset" (onset_score=6)} -\item{HP:0003621 }{"Juvenile onset" (onset_score=7)} -\item{HP:0011462 }{"Young adult onset" (onset_score=8)} -\item{HP:0003581 }{"Adult onset" (onset_score=9)} -\item{HP:0003596 }{"Middle age onset" (onset_score=10)} -\item{HP:0003584 }{"Late onset" (onset_score=11)} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_onset(phenos = phenos) -} diff --git a/man/add_ont_lvl.Rd b/man/add_ont_lvl.Rd deleted file mode 100644 index 5c02607..0000000 --- a/man/add_ont_lvl.Rd +++ /dev/null @@ -1,55 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_ont_lvl.R -\name{add_ont_lvl} -\alias{add_ont_lvl} -\title{Add ontology level} -\usage{ -add_ont_lvl( - phenos, - hpo = get_hpo(), - adjacency = NULL, - absolute = TRUE, - exclude_top_lvl = TRUE, - keep_ont_levels = NULL, - reverse = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{absolute}{Make the levels absolute in the sense that they consider -the entire HPO ontology (\code{TRUE}). -Otherwise, levels will be relative to only the HPO terms that are in -the provided subset of \code{terms} AND are directly adjacent (connected) -to a given cluster of terms (\code{FALSE}).} - -\item{exclude_top_lvl}{Exclude the top level term of the HPO -(i.e. "All" (HP:0000001)) when computing \emph{absolute} levels. -This argument is not used when computing \emph{relative} levels.} - -\item{keep_ont_levels}{Only keep phenotypes at certain \emph{absolute} -ontology levels to keep. -See \link[HPOExplorer]{add_ont_lvl} for details.} - -\item{reverse}{If \code{TRUE}, ontology -level numbers with be revered such that the level of the parent terms -are larger than the child terms.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Add the relative ontology level for each HPO ID. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -phenos2 <- add_ont_lvl(phenos = phenos) -} diff --git a/man/add_pheno_frequency.Rd b/man/add_pheno_frequency.Rd deleted file mode 100644 index 9305c49..0000000 --- a/man/add_pheno_frequency.Rd +++ /dev/null @@ -1,45 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_pheno_frequency.R -\name{add_pheno_frequency} -\alias{add_pheno_frequency} -\title{Add phenotype frequency} -\usage{ -add_pheno_frequency( - phenos, - pheno_frequency_threshold = NULL, - all.x = TRUE, - allow.cartesian = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{pheno_frequency_threshold}{Only keep phenotypes with frequency -above the set threshold. Frequency ranges from 0-100 where 100 is -a phenotype that occurs 100\% of the time in all associated diseases. -Include \code{NA} if you wish to retain phenotypes that -do not have any frequency data. -See \link[HPOExplorer]{add_pheno_frequency} for details.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Add phenotype-level frequency, i.e. -how often a phenotype occurs in a given disease. -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_pheno_frequency(phenos = phenos) -} diff --git a/man/add_prevalence.Rd b/man/add_prevalence.Rd deleted file mode 100644 index 6f7ca57..0000000 --- a/man/add_prevalence.Rd +++ /dev/null @@ -1,36 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_prevalence.R -\name{add_prevalence} -\alias{add_prevalence} -\title{Add prevalence} -\usage{ -add_prevalence( - phenos, - id_col = "disease_id", - drop_na = TRUE, - verbose = TRUE, - method = "orphanet" -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{id_col}{Name of the column containing the disease or phenotype IDs.} - -\item{drop_na}{Whether to drop rows with missing prevalence data.} - -\item{verbose}{Print messages.} - -\item{method}{One of "orphanet" or "oard".} -} -\value{ -phenos data.table with extra column -} -\description{ -Add a column containing the prevalence score for each disease ("disease_id") -or phenotype ("hpo_id"). -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_prevalence(phenos = phenos) -} diff --git a/man/add_severity.Rd b/man/add_severity.Rd deleted file mode 100644 index 44d3328..0000000 --- a/man/add_severity.Rd +++ /dev/null @@ -1,54 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_severity.R -\name{add_severity} -\alias{add_severity} -\title{Add HPO modifiers} -\usage{ -add_severity( - phenos, - hpo = get_hpo(), - all.x = TRUE, - allow.cartesian = FALSE, - severity_threshold = NULL, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{allow.cartesian}{See \code{allow.cartesian} in \code{\link[data.table]{[.data.table}}.} - -\item{severity_threshold}{Only keep phenotypes with a mean -severity score (averaged across multiple associated diseases) below the -set threshold. The severity score ranges from 1-4 where 1 is the MOST severe. -Include \code{NA} if you wish to retain phenotypes that -do not have any severity score.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra columns -} -\description{ -Annotate each HPO with modifier terms, including -(but not limited to) progression and severity ratings. -In order of increasing severity: -\itemize{ -\item{HP:0012825 }{"Mild" (Severity_score=4)} -\item{HP:0012827 }{"Borderline" (Severity_score=3)} -\item{HP:0012828 }{"Severe" (Severity_score=2)} -\item{HP:0012829}{"Profound" (Severity_score=1)} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_severity(phenos = phenos) -} diff --git a/man/add_tier.Rd b/man/add_tier.Rd deleted file mode 100644 index eb347d6..0000000 --- a/man/add_tier.Rd +++ /dev/null @@ -1,69 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/add_tier.R -\name{add_tier} -\alias{add_tier} -\title{Add severity Tiers} -\usage{ -add_tier( - phenos, - all.x = TRUE, - include_disease_characteristics = TRUE, - auto_assign = TRUE, - hpo = get_hpo(), - keep_tiers = NULL, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{all.x}{logical; if \code{TRUE}, then extra rows will be added to the -output, one for each row in \code{x} that has no matching row in \code{y}. -These rows will have 'NA's in those columns that are usually filled with values -from \code{y}. The default is \code{FALSE}, so that only rows with data from both -\code{x} and \code{y} are included in the output.} - -\item{include_disease_characteristics}{Include \code{phenotypes} that -are also high-level \code{include_disease_characteristics}.} - -\item{auto_assign}{Automatically assing HPO IDs to Tiers by conducting -regex searches for keywords that appear in the term name, -or the names of its descendants or ancestors.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{keep_tiers}{Tiers from \link[HPOExplorer]{hpo_tiers} to keep. -Include \code{NA} if you wish to retain phenotypes that -do not have any Tier assignment.} - -\item{verbose}{Print messages.} -} -\value{ -phenos data.table with extra column -} -\description{ -Add severity Tier for each HPO ID, in accordance with the -rating system provided by -\href{https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4262393/}{ -Lazarin et al (2014)}. -In order of increasing severity: -\itemize{ -\item{Tier 4 }{Reduced fertility} -\item{Tier 3 }{Sensory impairment: vision, -Immunodeficiency/cancer, -Sensory impairment: hearing, -Sensory impairment: touch, other (including pain), -Mental illness, -Dysmorphic features} -\item{Tier 2 }{Shortened life span: premature adulthood, -Impaired mobility, -Internal physical malformation} -\item{Tier 1 }{Shortened life span: infancy, -Shortened life span: childhood/adolescence, -Intellectual disability} -} -} -\examples{ -phenos <- example_phenos() -phenos2 <- add_tier(phenos = phenos) -} diff --git a/man/adjacency_matrix.Rd b/man/adjacency_matrix.Rd deleted file mode 100644 index 5533342..0000000 --- a/man/adjacency_matrix.Rd +++ /dev/null @@ -1,35 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/adjacency_matrix.R -\name{adjacency_matrix} -\alias{adjacency_matrix} -\title{Adjacency matrix} -\usage{ -adjacency_matrix( - hpo = get_hpo(), - terms = unique(hpo$id), - remove_terms = grep(":", terms, invert = TRUE, value = TRUE), - method = "HPOExplorer", - verbose = TRUE -) -} -\arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{terms}{Character vector of term IDs to include.} - -\item{remove_terms}{Character vector of term IDs to exclude.} - -\item{method}{Method to use to create the adjacency matrix.} - -\item{verbose}{Print messages.} -} -\value{ -adjacency matrix -} -\description{ -Create adjacency matrix of HPO child-parent relationships. -} -\examples{ -terms <- get_hpo()$id[seq(1000)] -adjacency <- adjacency_matrix(terms = terms) -} diff --git a/man/assign_tiers.Rd b/man/assign_tiers.Rd deleted file mode 100644 index 6881458..0000000 --- a/man/assign_tiers.Rd +++ /dev/null @@ -1,77 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/assign_tiers.R -\name{assign_tiers} -\alias{assign_tiers} -\title{Add severity Tiers (auto)} -\usage{ -assign_tiers( - hpo = get_hpo(), - terms = hpo$id, - keyword_sets = list(Tier1 = c("intellectual disability", "death"), Tier2 = - c("impaired mobility", "malform"), Tier3 = c("sight", "vision", "immunodeficien", - "cancer", "hearing", "touch", "pain ", " pain", "mental illness", "dysmorphic"), - Tier4 = c("fertility")), - check_names = TRUE, - check_definitions = TRUE, - check_diseases = FALSE, - search_ancestors = TRUE, - search_descendants = TRUE, - as_datatable = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{terms}{A subset of HPO IDs to assign Tiers to.} - -\item{keyword_sets}{A named list of regex queries to be used when searching -for phenotypes that have matching metadata.} - -\item{check_names}{When regexsearching for matching terms, -check the phenotype names.} - -\item{check_definitions}{When regex searching for matching terms, -check the phenotype definition.} - -\item{check_diseases}{When regex searching for matching terms, -check the names of diseases associated with the phenotype.} - -\item{search_ancestors}{Inherit Tiers of ancestors.} - -\item{search_descendants}{Inherit Tiers of descendants.} - -\item{as_datatable}{Return the results as a \link[data.table]{data.table}.} - -\item{verbose}{Print messages.} -} -\value{ -Tier assignments for each term in \code{terms}. -Will be returned as either a named vector or a \link[data.table]{data.table}. -} -\description{ -Automatically add severity Tier for each HPO ID, in accordance with the -rating system provided by -\href{https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4262393/}{ -Lazarin et al (2014)}. -In order of increasing severity: -\itemize{ -\item{Tier 4 }{Reduced fertility} -\item{Tier 3 }{Sensory impairment: vision, -Immunodeficiency/cancer, -Sensory impairment: hearing, -Sensory impairment: touch, other (including pain), -Mental illness, -Dysmorphic features} -\item{Tier 2 }{Shortened life span: premature adulthood, -Impaired mobility, -Internal physical malformation} -\item{Tier 1 }{Shortened life span: infancy, -Shortened life span: childhood/adolescence, -Intellectual disability} -} -} -\examples{ -terms <- get_hpo()$id[seq(10)] -tiers <- assign_tiers(terms = terms) -} diff --git a/man/clear_cache.Rd b/man/clear_cache.Rd deleted file mode 100644 index d053c03..0000000 --- a/man/clear_cache.Rd +++ /dev/null @@ -1,42 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/clear_cache.R -\name{clear_cache} -\alias{clear_cache} -\title{Clear cache} -\usage{ -clear_cache( - save_dir = tools::R_user_dir(package = "HPOExplorer", which = "cache"), - recursive = TRUE, - verbose = TRUE, - ... -) -} -\arguments{ -\item{save_dir}{Path to cache directory.} - -\item{recursive}{logical. Should directories be deleted recursively?} - -\item{verbose}{Print messages.} - -\item{...}{ - Arguments passed on to \code{\link[base:unlink]{base::unlink}} - \describe{ - \item{\code{x}}{a character vector with the names of the file(s) or - directories to be deleted.} - \item{\code{force}}{logical. Should permissions be changed (if possible) to - allow the file or directory to be removed?} - \item{\code{expand}}{logical. Should wildcards (see \sQuote{Details} below) and - tilde (see \code{\link[base]{path.expand}}) be expanded?} - }} -} -\value{ -Null. -} -\description{ -Remove all data cached by \pkg{HPOExplorer}. -} -\examples{ -\dontrun{ -clear_cache() -} -} diff --git a/man/convert_ontology.Rd b/man/convert_ontology.Rd deleted file mode 100644 index 0619099..0000000 --- a/man/convert_ontology.Rd +++ /dev/null @@ -1,39 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/convert_ontology.R -\name{convert_ontology} -\alias{convert_ontology} -\title{Convert ontology} -\usage{ -convert_ontology( - ont = get_hpo(), - terms = unique(ont$id), - remove_terms = grep(":", terms, invert = TRUE, value = TRUE), - to = c("adjacency", "descendancy", "dist", "dist_hclust", "dist_hclust_dendrogram", - "clusters", "igraph", "igraph_dist", "igraph_dist_hclust", - "igraph_dist_hclust_dendrogram", "tidygraph", "data.frame", "data.table"), - as_sparse = FALSE -) -} -\arguments{ -\item{ont}{An \link[ontologyIndex]{ontology_index} object.} - -\item{terms}{Character vector of term IDs to include.} - -\item{remove_terms}{Character vector of term IDs to exclude.} - -\item{to}{A character string specifying the format to convert to.} - -\item{as_sparse}{If TRUE, return a sparse matrix where possible.} -} -\value{ -An object of the specified format. -} -\description{ -Convert an \link[ontologyIndex]{ontology_index} to -a number of other useful formats. -} -\examples{ -ont <- get_hpo() -terms <- head(ont$id,100) -obj <- convert_ontology(ont=ont, terms=terms, to="igraph_dist_hclust") -} diff --git a/man/disease_id_to_omop.Rd b/man/disease_id_to_omop.Rd index 9cb7006..2a7bd6b 100644 --- a/man/disease_id_to_omop.Rd +++ b/man/disease_id_to_omop.Rd @@ -10,7 +10,7 @@ An object of class \code{data.table} (inherits from \code{data.frame}) with 5354 \source{ \code{ annot <- load_phenotype_to_genes(3) - id_col <- "disease_id" + input_col <- "disease_id" ## NOTE: must keep batch_size=1 as the OARD API returns results only for ## the IDs it can map. This leads to a mismatch between the input and output ## which is exacerbated that the concept_id is automatically converted to @@ -21,8 +21,8 @@ An object of class \code{data.table} (inherits from \code{data.frame}) with 5354 data.table::setnames(disease_id_to_omop, toupper(gsub("concept_","OMOP_",names(disease_id_to_omop))) ) - data.table::setnames(disease_id_to_omop,"QUERY",id_col) - disease_id_to_omop <- disease_id_to_omop[,c(id_col,"OMOP_ID","OMOP_NAME"), + data.table::setnames(disease_id_to_omop,"QUERY",input_col) + disease_id_to_omop <- disease_id_to_omop[,c(input_col,"OMOP_ID","OMOP_NAME"), with=FALSE] usethis::use_data(disease_id_to_omop, overwrite = TRUE) } diff --git a/man/example_phenos.Rd b/man/example_phenos.Rd deleted file mode 100644 index 602e240..0000000 --- a/man/example_phenos.Rd +++ /dev/null @@ -1,20 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/example_phenos.R -\name{example_phenos} -\alias{example_phenos} -\title{Example phenotypes dataframe} -\usage{ -example_phenos(i = seq(10)) -} -\arguments{ -\item{i}{Indices of HPO IDs to use.} -} -\value{ -phenotype data.table -} -\description{ -Create a minimal example of a phenos dataframe. -} -\examples{ -phenos <- example_phenos() -} diff --git a/man/filter_.Rd b/man/filter_.Rd new file mode 100644 index 0000000..48c1d92 --- /dev/null +++ b/man/filter_.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/_docs.R, R/filter_descendants.R +\name{filter_} +\alias{filter_} +\alias{filter_descendants} +\title{Filter functions} +\usage{ +filter_descendants(phenos, ancestor = NULL, hpo = get_hpo()) +} +\arguments{ +\item{phenos}{A data.table containing HPO IDs and other metadata.} + +\item{ancestor}{Phenotype names (or HPO ID) of an ancestor in the +\href{https://hpo.jax.org/}{Human Phenotype Ontology}. +Only phenotypes that are descendants of this ancestor will be kept. +Set to \code{NULL} (default) to skip this filtering step.} + +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} +} +\value{ +Filtered data. + +data.table of phenotypes, with additional columns: +"ancestor", "ancestor_id" +} +\description{ +Functions to filter data.table objects. +} +\section{Functions}{ +\itemize{ +\item \code{filter_descendants()}: filter_ +Filter descendants + +Subset a \code{phenos} data.table to only +descendants of an ancestor HPO ID term. + +}} +\examples{ +phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +phenos2 <- filter_descendants(phenos = phenos, + ancestor = "Motor delay") +} +\concept{filter_} diff --git a/man/fix_hpo_ids.Rd b/man/fix_hpo_ids.Rd index a3d6560..cd903f4 100644 --- a/man/fix_hpo_ids.Rd +++ b/man/fix_hpo_ids.Rd @@ -4,15 +4,11 @@ \alias{fix_hpo_ids} \title{Fix missing HPO IDs} \usage{ -fix_hpo_ids(dt, phenotype_to_genes = load_phenotype_to_genes()) +fix_hpo_ids(dat, phenotype_to_genes = load_phenotype_to_genes()) } \arguments{ -\item{dt}{\link[data.table]{data.table} +\item{dat}{\link[data.table]{data.table} containing a column named "hpo_name".} - -\item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -to gene annotations.} } \value{ data.table with the column "hpo_id" diff --git a/man/get_.Rd b/man/get_.Rd new file mode 100644 index 0000000..2dfbbdd --- /dev/null +++ b/man/get_.Rd @@ -0,0 +1,95 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/_docs.R, R/get_hpo.R, R/get_hpo_id_direct.R +\name{get_} +\alias{get_} +\alias{get_hpo} +\alias{get_hpo_id_direct} +\title{Get functions} +\usage{ +get_hpo(lvl, force_new = FALSE, ...) + +get_hpo_id_direct(term, hpo = get_hpo()) +} +\arguments{ +\item{lvl}{How many levels deep into the ontology to get ancestors from. +For example: +\itemize{ +\item{1: }{"All"} +\item{2: }{"Phenotypic abnormality"} +\item{3: }{"Abnormality of the nervous system"} +\item{4: }{"Abnormality of nervous system physiology"} +\item{5: }{"Neurodevelopmental abnormality" or "Behavioral abnormality"} +}} + +\item{force_new}{Force a new download or creation of a data resource.} + +\item{...}{ + Arguments passed on to \code{\link[KGExplorer:get_]{KGExplorer::get_ontology}} + \describe{ + \item{\code{save_dir}}{Directory to save a file to.} + \item{\code{name}}{\itemize{ +\item{"mondo"}{ +Import the \href{https://mondo.monarchinitiative.org/}{Mondo} ontology. +\href{https://github.com/monarch-initiative/mondo/release}{ +GitHub.}}. +\item{"hpo"}{ +Import the \href{https://hpo.jax.org/app/}{Human Phenotype Ontology}. +\href{https://github.com/obophenotype/human-phenotype-ontology/release}{ +GitHub.}} +}} + \item{\code{terms}}{Term IDs to include. Can alternatively be an integer, +which will be used to randomly sample N terms from the data.} + \item{\code{filetype}}{File type to search for.} + \item{\code{method}}{Compute ontology levels using: +\itemize{ + \item{"height" (default)} \link[simona]{dag_height}. + \item{"depth"} \link[simona]{dag_depth}. +}} + \item{\code{add_metadata}}{Add metadata to the resulting ontology object.} + \item{\code{add_ancestors}}{Add ancestors for each term.} + \item{\code{add_n_edges}}{Add the number of edges (connections) for each term.} + \item{\code{add_ontology_levels}}{Add the ontology level for each term.} + }} + +\item{term}{One or more ontology IDs.} + +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} +} +\value{ +Data. + +\link[simona]{ontology_DAG} object. + +The HPO ID(s) of phenotype(s) +} +\description{ +Functions to get data objects and extract elements. +} +\section{Functions}{ +\itemize{ +\item \code{get_hpo()}: get_ +Get Human Phenotype Ontology (HPO) + +Updated version of Human Phenotype Ontology (HPO). +Created from the OBO files distributed by the HPO project's +\href{https://github.com/obophenotype/human-phenotype-ontology}{GitHub}. + +By comparison, the \code{hpo} data from \pkg{ontologyIndex} is from 2016. +Note that the maximum ontology level depth in the 2016 version was 14, +whereas in the 2023 version the maximum ontology level depth is 16 +(due to an expansion of the HPO). + +\item \code{get_hpo_id_direct()}: get_ +Get HPO term ID direct + +Directly retrieves it from the HPO +ontology object. + +}} +\examples{ +hpo <- get_hpo() +term = "Phenotypic abnormality" +pheno_abnormality_id <- get_hpo_id_direct(term = term) +} +\concept{get_} diff --git a/man/get_data.Rd b/man/get_data.Rd index 2b911cf..708f5b2 100644 --- a/man/get_data.Rd +++ b/man/get_data.Rd @@ -8,7 +8,7 @@ get_data( file, tag = "latest", repo = "neurogenomics/HPOExplorer", - save_dir = tools::R_user_dir(package = "HPOExplorer", which = "cache"), + save_dir = KGExplorer::cache_dir(package = "HPOExplorer"), add_version = FALSE, overwrite = TRUE ) diff --git a/man/get_gencc.Rd b/man/get_gencc.Rd deleted file mode 100644 index 4e7c155..0000000 --- a/man/get_gencc.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_gencc.R -\name{get_gencc} -\alias{get_gencc} -\title{Get GenCC} -\usage{ -get_gencc( - agg_by = c("disease_id", "gene_symbol"), - dict = c(Definitive = 6, Strong = 5, Moderate = 4, Supportive = 3, Limited = 2, - `Disputed Evidence` = 1, `Refuted Evidence` = 0, `No Known Disease Relationship` = 0), - save_dir = tools::R_user_dir("HPOExplorer", which = "cache"), - verbose = TRUE -) -} -\arguments{ -\item{agg_by}{Column to aggregate metadata by.} - -\item{dict}{A named vector of evidence score mappings. -See \href{https://thegencc.org/faq.html#validity-termsdelphi-survey}{here} -for more information.} - -\item{save_dir}{Directory to save data to.} - -\item{verbose}{Print messages.} -} -\value{ -\link[data.table]{data.table} with columns: -\itemize{ -\item{"disease_id": }{Disease ID.} -\item{"gene_symbol": }{Gene symbol.} -\item{"evidence_score": }{Evidence score.} -} -} -\description{ -Get phenotype-gene evidence score from the -\href{https://thegencc.org/}{Gene Curation Coalition}. -Data downloaded from \href{https://search.thegencc.org/download}{here}.\cr -\emph{NOTE:} Due to licensing restrictions, a GenCC download does not -include OMIM data. OMIM data can be accessed and downloaded through -\href{https://omim.org/downloads/}{OMIM}.\cr -\emph{NOTE:} GenCC does not currently have any systematic versioning. -There for the \code{attr(obj,"version")} attribute is set to the date it was -downloaded and cached by \link[HPOExplorer]{get_gencc}. -} -\examples{ -d <- get_gencc() -} diff --git a/man/get_gene_lists.Rd b/man/get_gene_lists.Rd index f30996c..aad0a20 100644 --- a/man/get_gene_lists.Rd +++ b/man/get_gene_lists.Rd @@ -17,10 +17,11 @@ get_gene_lists( (e.g. "Phenotypic abnormality") \.} \item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes +\link{load_phenotype_to_genes} mapping phenotypes to gene annotations.} -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} \item{as_list}{Return as a named list instead of a data.table.} diff --git a/man/get_hpo.Rd b/man/get_hpo.Rd deleted file mode 100644 index 7985c1f..0000000 --- a/man/get_hpo.Rd +++ /dev/null @@ -1,43 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_hpo.R -\name{get_hpo} -\alias{get_hpo} -\title{Get Human Phenotype Ontology (HPO)} -\source{ -\href{https://bioportal.bioontology.org/ontologies/HP}{BioPortal} -\code{ -hpo <- HPOExplorer:::make_ontology(upload_tag="latest") -} -} -\usage{ -get_hpo( - save_dir = tools::R_user_dir("HPOExplorer", which = "cache"), - tag = "latest", - overwrite = TRUE -) -} -\arguments{ -\item{save_dir}{Directory to save data to.} - -\item{tag}{tag for the GitHub release to which this data should be attached.} - -\item{overwrite}{Should any local files of the same name be overwritten? -default \code{TRUE}.} -} -\value{ -\link[ontologyIndex]{ontology_index} object. -} -\description{ -Updated version of Human Phenotype Ontology (HPO) from 2023-10-09. -Created from the OBO files distributed by the HPO project's -\href{https://github.com/obophenotype/human-phenotype-ontology}{GitHub}. -} -\details{ -By comparison, the \code{hpo} data from \pkg{ontologyIndex} is from 2016. -Note that the maximum ontology level depth in the 2016 version was 14, -whereas in the 2023 version the maximum ontology level depth is 16 -(due to an expansion of the HPO). -} -\examples{ -hpo <- get_hpo() -} diff --git a/man/get_hpo_id_direct.Rd b/man/get_hpo_id_direct.Rd deleted file mode 100644 index 2d5dd15..0000000 --- a/man/get_hpo_id_direct.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_hpo_id_direct.R -\name{get_hpo_id_direct} -\alias{get_hpo_id_direct} -\title{Get HPO term ID direct} -\usage{ -get_hpo_id_direct(phenotype, hpo = get_hpo()) -} -\arguments{ -\item{phenotype}{One or more phenotype names in to get HPO IDs for.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} -} -\value{ -The HPO ID(s) of phenotype(s) -} -\description{ -Directly retrieves it from the HPO -ontology object (found in the \pkg{ontologyIndex} package \code{data(hpo)}). -} -\examples{ -phenotype = "Phenotypic abnormality" -pheno_abnormality_id <- get_hpo_id_direct(phenotype = phenotype) -} diff --git a/man/get_kg_monarch.Rd b/man/get_kg_monarch.Rd deleted file mode 100644 index 1a10159..0000000 --- a/man/get_kg_monarch.Rd +++ /dev/null @@ -1,18 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_kg_monarch.R -\name{get_kg_monarch} -\alias{get_kg_monarch} -\title{Get knowledge graph: Monarch} -\source{ -\href{https://pubmed.ncbi.nlm.nih.gov/37707514/}{BioThings Explorer} -} -\usage{ -get_kg_monarch() -} -\description{ -Option 1: Use the \href{https://api.monarchinitiative.org/api/}{biolink API} -to efficiently extract specific subset of data -from the Monarch server. -Option 2: Import the entire knowledge graph from the -\href{https://data.monarchinitiative.org/monarch-kg/latest/}{Monarch server}. -} diff --git a/man/get_monarch.Rd b/man/get_monarch.Rd deleted file mode 100644 index 014f18c..0000000 --- a/man/get_monarch.Rd +++ /dev/null @@ -1,85 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_monarch.R -\name{get_monarch} -\alias{get_monarch} -\title{Get Monarch} -\usage{ -get_monarch( - file = c("gene_to_gene", "phenotype_to_gene", "disease_to_model", - "phenotype_to_phenotype"), - file_map = list(gene_to_gene = paste0("monarch-kg-dev/latest/tsv/all_associations/", - "gene_to_gene_homology_association.all.tsv.gz"), phenotype_to_gene = - paste0("monarch-kg-dev/latest/tsv/all_associations/", - "gene_to_phenotypic_feature_association.all.tsv.gz"), disease_to_model = - paste0("latest/tsv/model_associations/", "model_disease.all.tsv.gz"), - phenotype_to_phenotype = paste0("upheno2/current/upheno-release/all/", - "upheno_mapping_all.csv")), - domain = "https://data.monarchinitiative.org", - ... -) -} -\arguments{ -\item{file}{Short name of the file to retrieve. -\itemize{ -\item{"gene_to_gene"}{Gene-to-gene mappings across species orthologous.} -\item{"phenotype_to_gene"}{Phenotype-to-gene mappings for multiple species.} -\item{"disease_to_model"}{Disease-to-model mappings for multiple -model species.} -\item{"phenotype_to_phenotype"}{Phenotype-to-phenotype mappings across -species homologs.} -}} - -\item{file_map}{Mapping between short name and full name of each file.} - -\item{domain}{Monarch Initiative server domain.} - -\item{...}{ - Arguments passed on to \code{\link[data.table:fread]{data.table::fread}} - \describe{ - \item{\code{input}}{ A single character string. The value is inspected and deferred to either \code{file=} (if no \\n present), \code{text=} (if at least one \\n is present) or \code{cmd=} (if no \\n is present, at least one space is present, and it isn't a file name). Exactly one of \code{input=}, \code{file=}, \code{text=}, or \code{cmd=} should be used in the same call. } - \item{\code{text}}{ The input data itself as a character vector of one or more lines, for example as returned by \code{readLines()}. } - \item{\code{cmd}}{ A shell command that pre-processes the file; e.g. \code{fread(cmd=paste("grep",word,"filename"))}. See Details. } - \item{\code{sep}}{ The separator between columns. Defaults to the character in the set \code{[,\\t |;:]} that separates the sample of rows into the most number of lines with the same number of fields. Use \code{NULL} or \code{""} to specify no separator; i.e. each line a single character column like \code{base::readLines} does.} - \item{\code{sep2}}{ The separator \emph{within} columns. A \code{list} column will be returned where each cell is a vector of values. This is much faster using less working memory than \code{strsplit} afterwards or similar techniques. For each column \code{sep2} can be different and is the first character in the same set above [\code{,\\t |;}], other than \code{sep}, that exists inside each field outside quoted regions in the sample. NB: \code{sep2} is not yet implemented. } - \item{\code{nrows}}{ The maximum number of rows to read. Unlike \code{read.table}, you do not need to set this to an estimate of the number of rows in the file for better speed because that is already automatically determined by \code{fread} almost instantly using the large sample of lines. \code{nrows=0} returns the column names and typed empty columns determined by the large sample; useful for a dry run of a large file or to quickly check format consistency of a set of files before starting to read any of them. } - \item{\code{header}}{ Does the first data line contain column names? Defaults according to whether every non-empty field on the first data line is type character. If so, or TRUE is supplied, any empty column names are given a default name. } - \item{\code{na.strings}}{ A character vector of strings which are to be interpreted as \code{NA} values. By default, \code{",,"} for columns of all types, including type \code{character} is read as \code{NA} for consistency. \code{,"",} is unambiguous and read as an empty string. To read \code{,NA,} as \code{NA}, set \code{na.strings="NA"}. To read \code{,,} as blank string \code{""}, set \code{na.strings=NULL}. When they occur in the file, the strings in \code{na.strings} should not appear quoted since that is how the string literal \code{,"NA",} is distinguished from \code{,NA,}, for example, when \code{na.strings="NA"}. } - \item{\code{stringsAsFactors}}{ Convert all character columns to factors? } - \item{\code{verbose}}{ Be chatty and report timings? } - \item{\code{skip}}{ If 0 (default) start on the first line and from there finds the first row with a consistent number of columns. This automatically avoids irregular header information before the column names row. \code{skip>0} means ignore the first \code{skip} rows manually. \code{skip="string"} searches for \code{"string"} in the file (e.g. a substring of the column names row) and starts on that line (inspired by read.xls in package gdata). } - \item{\code{select}}{ A vector of column names or numbers to keep, drop the rest. \code{select} may specify types too in the same way as \code{colClasses}; i.e., a vector of \code{colname=type} pairs, or a \code{list} of \code{type=col(s)} pairs. In all forms of \code{select}, the order that the columns are specified determines the order of the columns in the result. } - \item{\code{drop}}{ Vector of column names or numbers to drop, keep the rest. } - \item{\code{colClasses}}{ As in \code{\link[utils:read.table]{utils::read.csv}}; i.e., an unnamed vector of types corresponding to the columns in the file, or a named vector specifying types for a subset of the columns by name. The default, \code{NULL} means types are inferred from the data in the file. Further, \code{data.table} supports a named \code{list} of vectors of column names \emph{or numbers} where the \code{list} names are the class names; see examples. The \code{list} form makes it easier to set a batch of columns to be a particular class. When column numbers are used in the \code{list} form, they refer to the column number in the file not the column number after \code{select} or \code{drop} has been applied. - If type coercion results in an error, introduces \code{NA}s, or would result in loss of accuracy, the coercion attempt is aborted for that column with warning and the column's type is left unchanged. If you really desire data loss (e.g. reading \code{3.14} as \code{integer}) you have to truncate such columns afterwards yourself explicitly so that this is clear to future readers of your code. - } - \item{\code{integer64}}{ "integer64" (default) reads columns detected as containing integers larger than 2^31 as type \code{bit64::integer64}. Alternatively, \code{"double"|"numeric"} reads as \code{utils::read.csv} does; i.e., possibly with loss of precision and if so silently. Or, "character". } - \item{\code{dec}}{ The decimal separator as in \code{utils::read.csv}. If not "." (default) then usually ",". See details. } - \item{\code{col.names}}{ A vector of optional names for the variables (columns). The default is to use the header column if present or detected, or if not "V" followed by the column number. This is applied after \code{check.names} and before \code{key} and \code{index}. } - \item{\code{check.names}}{default is \code{FALSE}. If \code{TRUE} then the names of the variables in the \code{data.table} are checked to ensure that they are syntactically valid variable names. If necessary they are adjusted (by \code{\link{make.names}}) so that they are, and also to ensure that there are no duplicates.} - \item{\code{encoding}}{ default is \code{"unknown"}. Other possible options are \code{"UTF-8"} and \code{"Latin-1"}. Note: it is not used to re-encode the input, rather enables handling of encoded strings in their native encoding. } - \item{\code{quote}}{ By default (\code{"\\""}), if a field starts with a double quote, \code{fread} handles embedded quotes robustly as explained under \code{Details}. If it fails, then another attempt is made to read the field \emph{as is}, i.e., as if quotes are disabled. By setting \code{quote=""}, the field is always read as if quotes are disabled. It is not expected to ever need to pass anything other than \\"\\" to quote; i.e., to turn it off. } - \item{\code{strip.white}}{ default is \code{TRUE}. Strips leading and trailing whitespaces of unquoted fields. If \code{FALSE}, only header trailing spaces are removed. } - \item{\code{fill}}{logical (default is \code{FALSE}). If \code{TRUE} then in case the rows have unequal length, blank fields are implicitly filled.} - \item{\code{blank.lines.skip}}{\code{logical}, default is \code{FALSE}. If \code{TRUE} blank lines in the input are ignored.} - \item{\code{key}}{Character vector of one or more column names which is passed to \code{\link[data.table]{setkey}}. It may be a single comma separated string such as \code{key="x,y,z"}, or a vector of names such as \code{key=c("x","y","z")}. Only valid when argument \code{data.table=TRUE}. Where applicable, this should refer to column names given in \code{col.names}. } - \item{\code{index}}{ Character vector or list of character vectors of one or more column names which is passed to \code{\link[data.table]{setindexv}}. As with \code{key}, comma-separated notation like \code{index="x,y,z"} is accepted for convenience. Only valid when argument \code{data.table=TRUE}. Where applicable, this should refer to column names given in \code{col.names}. } - \item{\code{showProgress}}{ \code{TRUE} displays progress on the console if the ETA is greater than 3 seconds. It is produced in fread's C code where the very nice (but R level) txtProgressBar and tkProgressBar are not easily available. } - \item{\code{data.table}}{ TRUE returns a \code{data.table}. FALSE returns a \code{data.frame}. The default for this argument can be changed with \code{options(datatable.fread.datatable=FALSE)}.} - \item{\code{nThread}}{The number of threads to use. Experiment to see what works best for your data on your hardware.} - \item{\code{logical01}}{If TRUE a column containing only 0s and 1s will be read as logical, otherwise as integer.} - \item{\code{keepLeadingZeros}}{If TRUE a column containing numeric data with leading zeros will be read as character, otherwise leading zeros will be removed and converted to numeric.} - \item{\code{yaml}}{ If \code{TRUE}, \code{fread} will attempt to parse (using \code{\link[yaml]{yaml.load}}) the top of the input as YAML, and further to glean parameters relevant to improving the performance of \code{fread} on the data itself. The entire YAML section is returned as parsed into a \code{list} in the \code{yaml_metadata} attribute. See \code{Details}. } - \item{\code{autostart}}{ Deprecated and ignored with warning. Please use \code{skip} instead. } - \item{\code{tmpdir}}{ Directory to use as the \code{tmpdir} argument for any \code{tempfile} calls, e.g. when the input is a URL or a shell command. The default is \code{tempdir()} which can be controlled by setting \code{TMPDIR} before starting the R session; see \code{\link[base:tempfile]{base::tempdir}}. } - \item{\code{tz}}{ Relevant to datetime values which have no Z or UTC-offset at the end, i.e. \emph{unmarked} datetime, as written by \code{\link[utils:write.table]{utils::write.csv}}. The default \code{tz="UTC"} reads unmarked datetime as UTC POSIXct efficiently. \code{tz=""} reads unmarked datetime as type character (slowly) so that \code{as.POSIXct} can interpret (slowly) the character datetimes in local timezone; e.g. by using \code{"POSIXct"} in \code{colClasses=}. Note that \code{fwrite()} by default writes datetime in UTC including the final Z and therefore \code{fwrite}'s output will be read by \code{fread} consistently and quickly without needing to use \code{tz=} or \code{colClasses=}. If the \code{TZ} environment variable is set to \code{"UTC"} (or \code{""} on non-Windows where unset vs `""` is significant) then the R session's timezone is already UTC and \code{tz=""} will result in unmarked datetimes being read as UTC POSIXct. For more information, please see the news items from v1.13.0 and v1.14.0. } - }} -} -\value{ -\link[data.table]{data.table} -} -\description{ -Get key datasets from the Monarch Initiative server. -} -\examples{ -dat <- get_monarch() -} diff --git a/man/get_mondo.Rd b/man/get_mondo.Rd deleted file mode 100644 index 75809be..0000000 --- a/man/get_mondo.Rd +++ /dev/null @@ -1,36 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_mondo.R -\name{get_mondo} -\alias{get_mondo} -\title{Get Mondo Disease Ontology} -\source{ -\code{ -mondo <- HPOExplorer:::make_ontology(file="mondo-base.obo", - repo="monarch-initiative/mondo", - upload_tag="latest") -} -} -\usage{ -get_mondo( - save_dir = tools::R_user_dir("HPOExplorer", which = "cache"), - tag = "latest", - overwrite = TRUE -) -} -\arguments{ -\item{save_dir}{Directory to save data to.} - -\item{tag}{tag for the GitHub release to which this data should be attached.} - -\item{overwrite}{Should any local files of the same name be overwritten? -default \code{TRUE}.} -} -\value{ -\link[ontologyIndex]{ontology_index} -} -\description{ -Import \href{https://mondo.monarchinitiative.org/}{Mondo} as an R object. -} -\examples{ -mondo <- get_mondo() -} diff --git a/man/get_ont_lvl.Rd b/man/get_ont_lvl.Rd deleted file mode 100644 index e36d1cd..0000000 --- a/man/get_ont_lvl.Rd +++ /dev/null @@ -1,40 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_ont_lvl.R -\name{get_ont_lvl} -\alias{get_ont_lvl} -\title{Get HPO term level} -\source{ -\code{ -lvl_absolute <- get_ont_lvl(term = "HP:0000001", absolute=TRUE) -lvl_relative <- get_ont_lvl(term = "HP:0000001", absolute=FALSE) -} -} -\usage{ -get_ont_lvl( - term, - hpo = get_hpo(), - adjacency = NULL, - absolute = TRUE, - verbose = FALSE -) -} -\arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{verbose}{Print messages.} -} -\value{ -Ontology level of HPO ID. -} -\description{ -In this function, ontology level refers to the number of generations of -sub-phenotypes a term has below it in the HPO DAG. For example, the root of -the HPO is term "HP:0000001", the longest path to a term with no child terms -is 14. In other words there are 14 generations of "is-a" relationships below -HP:0000001 and it is therefore at ontology level 14. A term with no -sub-phenotypes below it (a leaf node), is at ontology level 0. -} -\keyword{internal} diff --git a/man/get_ont_lvls.Rd b/man/get_ont_lvls.Rd deleted file mode 100644 index 5bc6a29..0000000 --- a/man/get_ont_lvls.Rd +++ /dev/null @@ -1,61 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_ont_lvls.R -\name{get_ont_lvls} -\alias{get_ont_lvls} -\title{Get ontology level for HPO terms} -\usage{ -get_ont_lvls( - terms, - hpo = get_hpo(), - adjacency = NULL, - absolute = TRUE, - exclude_top_lvl = TRUE, - reverse = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{terms}{Character vector of term IDs to include.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{absolute}{Make the levels absolute in the sense that they consider -the entire HPO ontology (\code{TRUE}). -Otherwise, levels will be relative to only the HPO terms that are in -the provided subset of \code{terms} AND are directly adjacent (connected) -to a given cluster of terms (\code{FALSE}).} - -\item{exclude_top_lvl}{Exclude the top level term of the HPO -(i.e. "All" (HP:0000001)) when computing \emph{absolute} levels. -This argument is not used when computing \emph{relative} levels.} - -\item{reverse}{If \code{TRUE}, ontology -level numbers with be revered such that the level of the parent terms -are larger than the child terms.} - -\item{verbose}{Print messages.} -} -\value{ -A named vector of relative ontology level, -where names are HPO Ids and -value is relative ontology level. -} -\description{ -For a given set of HPO terms, get their level -within the hierarchically organised HPO ontology. -Ontology level can be computed either absolute mode (\code{absolute=TRUE}) -where the entire ontology is considered when assigning levels, or -relative mode (\code{absolute=FALSE}) where only a subset of the ontology -that is connected to a given term is considered when assigning levels. -Relative mode can be helpful when trying to make plot where nodes are -scaled to the ontology level. -} -\examples{ -terms <- ontologyIndex::get_descendants(ontology = get_hpo(), - roots = "HP:0000002") -lvls <- get_ont_lvls(terms = terms) -lvls_abs <- get_ont_lvls(terms = terms, absolute=TRUE) -} diff --git a/man/get_ont_lvls2.Rd b/man/get_ont_lvls2.Rd deleted file mode 100644 index a530992..0000000 --- a/man/get_ont_lvls2.Rd +++ /dev/null @@ -1,50 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_ont_lvls2.R -\name{get_ont_lvls2} -\alias{get_ont_lvls2} -\title{Get relative ontology level for multiple HPO terms} -\usage{ -get_ont_lvls2( - terms, - hpo = get_hpo(), - adjacency = adjacency_matrix(terms = terms, hpo = hpo), - absolute = FALSE, - reverse = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{terms}{Character vector of term IDs to include.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{absolute}{Make the levels absolute in the sense that they consider -the entire HPO ontology (\code{TRUE}). -Otherwise, levels will be relative to only the subset \code{terms} provided -(\code{FALSE}).} - -\item{reverse}{A boolean, if TRUE it will reverse the ontology -level numbers so that -the parent terms are larger than the child terms.} - -\item{verbose}{Print messages.} -} -\value{ -A named vector of relative ontology level, -where names are HPO Ids and -value is relative ontology level. -} -\description{ -This calls the \code{get_ont_lvl} function on all phenotypes in a -subset of the HPO. The subset chosen when creating the adjacency from the main -adjacency matrix of all phenotypes. So, the phenotypes can be found in the -row and column names of adjacency. -} -\examples{ -terms <- ontologyIndex::get_descendants(ontology = get_hpo(), - roots = "HP:0000002") -lvls <- get_ont_lvls2(terms = terms) -} diff --git a/man/get_term_definition_api.Rd b/man/get_term_definition_api.Rd index 2dc207c..78c2e5d 100644 --- a/man/get_term_definition_api.Rd +++ b/man/get_term_definition_api.Rd @@ -6,9 +6,6 @@ \usage{ get_term_definition_api(term, line_length = FALSE) } -\arguments{ -\item{term}{One or more HPO IDs.} -} \value{ Character vector of definitions. } diff --git a/man/get_upheno.Rd b/man/get_upheno.Rd deleted file mode 100644 index 1386e0c..0000000 --- a/man/get_upheno.Rd +++ /dev/null @@ -1,37 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_upheno.R -\name{get_upheno} -\alias{get_upheno} -\title{Get UPHENO} -\usage{ -get_upheno(file = c("ontology", "bestmatches", "upheno_mapping")) -} -\arguments{ -\item{file}{Can be one of the following: -\itemize{ -\item{"ontology"}{Creates an \link[ontologyIndex]{ontologyIndex} R object by -importing the OBO file directly from the official -\href{https://github.com/obophenotype/upheno}{UPHENO GitHub repository}.} -\item{"bestmatches"}{Returns a merged table with the best matches between -human and non-human homologous phenotypes (from multiple species). -Distributed by the official -\href{https://github.com/obophenotype/upheno/tree/master/mappings}{ -UPHENO GitHub repository}.} -\item{"upheno_mapping"}{Return a merged table with matches bteween human -and non-human homologous phenotypes (from multiple species). -Distributed by the -\href{https://data.monarchinitiative.org/upheno2/current/upheno-release/all/index.html}{ -Monarch Initiative server}.} -}} -} -\value{ -\link[ontologyIndex]{ontologyIndex} or -\link[data.table]{data.table}. -} -\description{ -Get data from the \href{https://github.com/obophenotype/upheno}{ -Unified Phenotype Ontology (UPHENO)}. -} -\examples{ -upheno <- get_upheno() -} diff --git a/man/get_version.Rd b/man/get_version.Rd deleted file mode 100644 index 0ed0bb3..0000000 --- a/man/get_version.Rd +++ /dev/null @@ -1,30 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_version.R -\name{get_version} -\alias{get_version} -\title{Get version} -\usage{ -get_version(obj, return_version = FALSE, verbose = TRUE) -} -\arguments{ -\item{obj}{An object from -\link[HPOExplorer]{get_hpo} or -\link[HPOExplorer]{load_phenotype_to_genes}.} - -\item{return_version}{Return the version as a character string.} - -\item{verbose}{Print messages.} -} -\value{ -HPO Release version a character string. -} -\description{ -Extract the precise version of the HPO release that the data object -was built from. All HPO Releases can be found at the official -\href{https://github.com/obophenotype/human-phenotype-ontology/releases}{ -HPO GitHub Releases page}. -} -\examples{ -obj <- get_hpo() -get_version(obj=obj) -} diff --git a/man/gpt_annot_plot.Rd b/man/gpt_annot_plot.Rd index fb192b9..8284eb9 100644 --- a/man/gpt_annot_plot.Rd +++ b/man/gpt_annot_plot.Rd @@ -18,13 +18,13 @@ gpt_annot_plot( \item{keep_ont_levels}{Only keep phenotypes at certain \emph{absolute} ontology levels to keep. -See \link[HPOExplorer]{add_ont_lvl} for details.} +See \link{add_ont_lvl} for details.} \item{remove_descendants}{Remove HPO terms that are descendants of a given ancestral HPO term. Ancestral terms be provided as a character vector of phenotype names (e.g. \code{c("Clinical course")}), HPO IDs (e.g. \code{"HP:0031797" }) or a mixture of the two. -See \link[HPOExplorer]{add_ancestor} for details.} +See \link{add_ancestor} for details.} \item{top_n}{Top number of most severe phenotypes to plot in heatmap.} diff --git a/man/harmonise_phenotypes.Rd b/man/harmonise_phenotypes.Rd deleted file mode 100644 index 1be50b3..0000000 --- a/man/harmonise_phenotypes.Rd +++ /dev/null @@ -1,54 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/harmonise_phenotypes.R -\name{harmonise_phenotypes} -\alias{harmonise_phenotypes} -\title{Harmonise phenotypes} -\usage{ -harmonise_phenotypes( - phenotypes, - hpo = get_hpo(), - as_hpo_ids = FALSE, - validate = TRUE, - ignore_case = TRUE, - keep_order = TRUE, - invert = FALSE, - verbose = TRUE -) -} -\arguments{ -\item{phenotypes}{A character vector of phenotype names and/or HPO IDs.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{as_hpo_ids}{Return all \code{phenotypes} as HPO IDs (\code{TRUE}), -or phenotype names (\code{FALSE}).} - -\item{validate}{Remove any phenotype names or IDs that cannot be found in the -\code{hpo}.} - -\item{ignore_case}{Ignore casing when searching for matches.} - -\item{keep_order}{Return a named list of the same length and order -as \code{phenotypes}. -If \code{FALSE}, return a named list of only the unique \code{phenotypes}, -sometimes in a different order.} - -\item{invert}{Invert the keys/values of the dictionary, -such that the key becomes the values (and vice versa).} - -\item{verbose}{Print messages.} -} -\value{ -Character vector -} -\description{ -Harmonise a mixed vector of phenotype names (e.g. "Focal motor seizure") -and HPO IDs (e.g. c("HP:0000002","HP:0000003")). -} -\examples{ -phenotypes <- c("Focal motor seizure","HP:0000002","HP:0000003") -#### As phenotype names #### -pheno_names <- harmonise_phenotypes(phenotypes=phenotypes) -#### As HPO IDs #### -pheno_ids <- harmonise_phenotypes(phenotypes=phenotypes, as_hpo_ids=TRUE) -} diff --git a/man/hpo_deaths.Rd b/man/hpo_deaths.Rd index 8640b07..9d277e7 100644 --- a/man/hpo_deaths.Rd +++ b/man/hpo_deaths.Rd @@ -9,9 +9,7 @@ data.table } \source{ \code{ -terms <- ontologyIndex::get_descendants(ontology = get_hpo(), - roots = "HP:0011420", - exclude_roots = TRUE) +terms <- simona::dag_offspring(get_hpo(), term = "HP:0011420") aod <- lapply(stats::setNames(terms, terms), function(hpo_id){ message("Extracting API data for",hpo_id) @@ -19,8 +17,7 @@ aod <- lapply(stats::setNames(terms, terms), }) |> data.table::rbindlist(fill = TRUE, use.names = TRUE, idcol = "AgeOfDeath") -aod$AgeOfDeath_name <- harmonise_phenotypes(phenotypes = aod$AgeOfDeath, - as_hpo_ids = FALSE) +aod$AgeOfDeath_name <- map_phenotypes(terms = aod$AgeOfDeath) #### Convert AoD to numeric scores #### dict <- HPOExplorer:::hpo_dict(type="AgeOfDeath") aod$AgeOfDeath_score <- dict[aod$AgeOfDeath_name] diff --git a/man/hpo_frequencies.Rd b/man/hpo_frequencies.Rd index 5a938e5..63c545f 100644 --- a/man/hpo_frequencies.Rd +++ b/man/hpo_frequencies.Rd @@ -13,7 +13,7 @@ data.table \code{ annot <- load_phenotype_to_genes("phenotype.hpoa") hpo_frequencies <- HPOExplorer:::parse_pheno_frequency(annot=annot) -hpo_frequencies <- HPOExplorer:::as_ascii(dt=hpo_frequencies) +hpo_frequencies <- HPOExplorer:::as_ascii(dat=hpo_frequencies) data.table::setcolorder(hpo_frequencies,c("disease_id","hpo_id")) usethis::use_data(hpo_frequencies, overwrite = TRUE) } diff --git a/man/hpo_id_to_omop.Rd b/man/hpo_id_to_omop.Rd index 9d9bac0..df25c64 100644 --- a/man/hpo_id_to_omop.Rd +++ b/man/hpo_id_to_omop.Rd @@ -10,14 +10,14 @@ An object of class \code{data.table} (inherits from \code{data.frame}) with 1642 \source{ \code{ hpo <- get_hpo() - ids <- unique(hpo$id) + ids <- unique(hpo@terms) hpo_id_to_omop <- oard_query_api(ids = ids, workers=10) - id_col="hpo_id" + input_col="hpo_id" data.table::setnames(hpo_id_to_omop, toupper(gsub("concept_","OMOP_",names(hpo_id_to_omop))) ) - data.table::setnames(hpo_id_to_omop, "OMOP_CODE",id_col) - hpo_id_to_omop <- hpo_id_to_omop[,c(id_col,"OMOP_ID","OMOP_NAME"), + data.table::setnames(hpo_id_to_omop, "OMOP_CODE",input_col) + hpo_id_to_omop <- hpo_id_to_omop[,c(input_col,"OMOP_ID","OMOP_NAME"), with=FALSE] usethis::use_data(hpo_id_to_omop, overwrite = TRUE) } diff --git a/man/hpo_modifiers.Rd b/man/hpo_modifiers.Rd index 360b4e2..c04862c 100644 --- a/man/hpo_modifiers.Rd +++ b/man/hpo_modifiers.Rd @@ -16,7 +16,7 @@ data.table annot <- HPOExplorer::load_phenotype_to_genes(3) annot <- annot[modifier!=""] parse_mod <- function(x){ - unique(harmonise_phenotypes(strsplit(x,";")[[1]])) + unique(map_phenotypes(strsplit(x,";")[[1]])) } annot <- annot[,modifier_name:=lapply(modifier,parse_mod)][modifier!="",] annot <- annot[,.(modifier_name=unlist(modifier_name)), diff --git a/man/hpo_onsets.Rd b/man/hpo_onsets.Rd index b27cb58..1c1b73f 100644 --- a/man/hpo_onsets.Rd +++ b/man/hpo_onsets.Rd @@ -11,8 +11,7 @@ data.table \code{ annot <- load_phenotype_to_genes(file = "phenotype.hpoa") annot <- annot[onset!="",] -annot$onset_name <- harmonise_phenotypes(phenotypes = annot$onset, - as_hpo_ids = FALSE) +annot$onset_name <- map_phenotypes(terms = annot$onset) counts <- dplyr::group_by(annot, disease_id) |> dplyr::summarise(hpo_ids=length(unique(hpo_id)), onsets=length(unique(onset))) diff --git a/man/hpo_tiers_auto.Rd b/man/hpo_tiers_auto.Rd index ebdd10a..761a19e 100644 --- a/man/hpo_tiers_auto.Rd +++ b/man/hpo_tiers_auto.Rd @@ -9,7 +9,7 @@ data.table } \source{ \code{ -hpo_tiers_auto <- HPOExplorer:::assign_tiers(as_datatable=TRUE) +hpo_tiers_auto <- HPOExplorer:::make_tiers(as_datatable=TRUE) hpo_tiers_auto <- add_onset(phenos = hpo_tiers_auto) #### Filter by onset criterion #### ### Tier 1: Shortened life span: infancy @@ -28,6 +28,6 @@ data("hpo_tiers_auto") } \description{ HPO severity tiers automatically assigned using -\link[HPOExplorer]{assign_tiers}. +\link[HPOExplorer]{make_tiers}. } \keyword{datasets} diff --git a/man/hpo_to_matrix.Rd b/man/hpo_to_matrix.Rd index 5e6a930..86bd940 100644 --- a/man/hpo_to_matrix.Rd +++ b/man/hpo_to_matrix.Rd @@ -23,7 +23,7 @@ hpo_to_matrix( Set to \code{NULL} (default) to include all terms.} \item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes +\link{load_phenotype_to_genes} mapping phenotypes to gene annotations.} \item{formula}{A formula of the form LHS ~ RHS to cast, see Details.} diff --git a/man/igraph_to_plotly.Rd b/man/igraph_to_plotly.Rd deleted file mode 100644 index eb9c5ee..0000000 --- a/man/igraph_to_plotly.Rd +++ /dev/null @@ -1,33 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/igraph_to_plotly.R -\name{igraph_to_plotly} -\alias{igraph_to_plotly} -\title{igraph to plotly data} -\usage{ -igraph_to_plotly( - g, - layout_func = igraph::layout.fruchterman.reingold, - dim = 3, - seed = 2023, - verbose = TRUE -) -} -\arguments{ -\item{g}{\link[igraph]{igraph} object -generated by \link[HPOExplorer]{make_igraph_object}.} - -\item{layout_func}{Layout function for the graph.} - -\item{dim}{Number of dimensions to create layout in.} - -\item{seed}{Random seed to enable reproducibility.} - -\item{verbose}{Print messages.} -} -\value{ -Named list of data.frames. -} -\description{ -Convert an igraph to data for a 3D plotly plot. -} -\keyword{internal} diff --git a/man/kde_surface.Rd b/man/kde_surface.Rd deleted file mode 100644 index 4d2f47b..0000000 --- a/man/kde_surface.Rd +++ /dev/null @@ -1,46 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/kde_surface.R -\name{kde_surface} -\alias{kde_surface} -\title{Kernel Density Estimation (KDE) surface} -\usage{ -kde_surface(xyz, n = 50, extend_kde = 1, rescale_z = TRUE) -} -\arguments{ -\item{xyz}{A data.frame containing the columns "x" and "y" (required). -Can also include a third column "z" (optional).} - -\item{n}{ -Number of grid points in each direction. Can be scalar or a length-2 -integer vector. -} - -\item{extend_kde}{Extend the limits of the KDE area by setting -\code{extend_kde>1}. -This makes the "mountains' of the KDE end more smoothly along the edges of -the x/y coordinates.} - -\item{rescale_z}{Rescale the z-axis so that the KDE can be positioned -below the original data points (when plotting them together).} -} -\value{ -\itemize{ -\item{\code{x, y}: }{ -The x and y coordinates of the grid points, vectors of length n. -} -\item{\code{z}: }{ -An \code{n[1]} by \code{n[2]} matrix of the estimated density: -rows correspond to the value of \code{x}, columns to the value of \code{y}. -} -} -} -\description{ -Compute a KDE surface based on the density of points along -an x- and y-axis. -} -\examples{ -xyz <- data.frame(x=stats::rnorm(50), - y=stats::rnorm(50), - z=stats::rnorm(50)) -kd <- kde_surface(xyz = xyz) -} diff --git a/man/list_columns.Rd b/man/list_columns.Rd index da7d33b..b9f0108 100644 --- a/man/list_columns.Rd +++ b/man/list_columns.Rd @@ -8,7 +8,7 @@ list_columns(columns = NULL, add_gene_cols = FALSE, extra_cols = NULL) } \arguments{ \item{columns}{A named vector of columns in \code{phenos} -to add to the hoverdata via \link[HPOExplorer]{make_hoverboxes}.} +to add to the hoverdata via \link[KGExplorer]{add_hoverboxes}.} \item{add_gene_cols}{Add columns related to genes.} diff --git a/man/list_deaths.Rd b/man/list_deaths.Rd deleted file mode 100644 index d85cdf8..0000000 --- a/man/list_deaths.Rd +++ /dev/null @@ -1,34 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/list_deaths.R -\name{list_deaths} -\alias{list_deaths} -\title{List age of death HPO terms} -\usage{ -list_deaths( - hpo = get_hpo(), - exclude = FALSE, - as_hpo_ids = FALSE, - include_na = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{exclude}{HPO phenotype names to exclude.} - -\item{as_hpo_ids}{Return as a character vector vector HPO IDs only.} - -\item{include_na}{Include NA values for onset.} - -\item{verbose}{Print messages.} -} -\value{ -Named list of HPO IDs. -} -\description{ -List age of death phenotypes in the HPO. -} -\examples{ -deaths <- list_deaths() -} diff --git a/man/list_onsets.Rd b/man/list_onsets.Rd deleted file mode 100644 index 38b2cd4..0000000 --- a/man/list_onsets.Rd +++ /dev/null @@ -1,34 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/list_onsets.R -\name{list_onsets} -\alias{list_onsets} -\title{List age of onset HPO terms} -\usage{ -list_onsets( - hpo = get_hpo(), - exclude = FALSE, - as_hpo_ids = FALSE, - include_na = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{exclude}{HPO phenotype names to exclude.} - -\item{as_hpo_ids}{Return as a character vector vector HPO IDs only.} - -\item{include_na}{Include NA values for onset.} - -\item{verbose}{Print messages.} -} -\value{ -Named list of HPO IDs. -} -\description{ -List age of onset phenotypes in the HPO. -} -\examples{ -onsets <- list_onsets() -} diff --git a/man/load_disease_genes.Rd b/man/load_disease_genes.Rd deleted file mode 100644 index 42992d7..0000000 --- a/man/load_disease_genes.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/load_disease_genes.R -\name{load_disease_genes} -\alias{load_disease_genes} -\title{Load disease genes} -\usage{ -load_disease_genes(verbose = TRUE) -} -\arguments{ -\item{verbose}{Print messages.} -} -\value{ -data.table -} -\description{ -Load gene lists associated with each disease phenotype from: -\itemize{ -\item{DECIPHER} -\item{ORPHANET} -\item{OMIM} -} -} -\examples{ -dat <- load_disease_genes() -} diff --git a/man/load_phenotype_to_genes.Rd b/man/load_phenotype_to_genes.Rd index 213e86c..40b4426 100644 --- a/man/load_phenotype_to_genes.Rd +++ b/man/load_phenotype_to_genes.Rd @@ -9,7 +9,7 @@ \usage{ load_phenotype_to_genes( file = c("phenotype_to_genes.txt", "genes_to_phenotype.txt", "phenotype.hpoa"), - save_dir = file.path(tools::R_user_dir("HPOExplorer", which = "cache"), "data"), + save_dir = file.path(KGExplorer::cache_dir(package = "HPOExplorer"), "data"), repo = paste("obophenotype", "human-phenotype-ontology", sep = "/"), tag = "latest", overwrite = FALSE, diff --git a/man/annotate_phenos.Rd b/man/main.Rd similarity index 63% rename from man/annotate_phenos.Rd rename to man/main.Rd index 0817a6b..56f851a 100644 --- a/man/annotate_phenos.Rd +++ b/man/main.Rd @@ -1,16 +1,18 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/annotate_phenos.R -\name{annotate_phenos} +% Please edit documentation in R/_docs.R, R/annotate_phenos.R, +% R/example_phenos.R +\name{main} +\alias{main} \alias{annotate_phenos} -\title{Annotate phenotypes} +\alias{example_phenos} +\title{Main functions} \usage{ annotate_phenos( phenos, hpo = get_hpo(), - adjacency = NULL, add_ont_lvl_absolute = TRUE, add_ont_lvl_relative = FALSE, - add_info_contents = FALSE, + add_info_content = TRUE, add_description = TRUE, add_disease_data = FALSE, add_ndiseases = add_disease_data, @@ -23,25 +25,24 @@ annotate_phenos( include_mondo = FALSE, add_hoverboxes = FALSE, columns = list_columns(), - interactive = TRUE, - verbose = TRUE + interactive = TRUE ) + +example_phenos(i = seq(10), hpo = get_hpo()) } \arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} +\item{phenos}{A data.table containing HPO IDs and other metadata.} -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} \item{add_ont_lvl_absolute}{Add the absolute ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} +See \link[KGExplorer]{get_ontology_levels} for more details.} \item{add_ont_lvl_relative}{Add the relative ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} +See \link[KGExplorer]{get_ontology_levels} for more details.} -\item{add_info_contents}{Add information content column for each phenotype.} +\item{add_info_content}{Add information content column for each phenotype.} \item{add_description}{Whether to get the phenotype descriptions as well (slower).} @@ -72,20 +73,40 @@ each disease.} IDs, names, and definitions to each disease.} \item{add_hoverboxes}{Add hoverdata with -\link[HPOExplorer]{make_hoverboxes}.} +\link[KGExplorer]{add_hoverboxes}.} \item{columns}{A named vector of columns in \code{phenos} -to add to the hoverdata via \link[HPOExplorer]{make_hoverboxes}.} +to add to the hoverdata via \link[KGExplorer]{add_hoverboxes}.} + +\item{interactive}{Make the plot interactive.} -\item{interactive}{Make the plot interactive with \link[plotly]{ggplotly}.} +\item{i}{Indices of HPO IDs to use.} +} +\value{ +Data. -\item{verbose}{Print messages.} +phenotype data.table } \description{ +Main functions. +} +\section{Functions}{ +\itemize{ +\item \code{annotate_phenos()}: main +Annotate phenotypes + Annotate phenotypes \link[data.table]{data.table} without various types of metadata. -} + +\item \code{example_phenos()}: main +Example phenotypes dataframe + +Create a minimal example of a phenos dataframe. + +}} \examples{ phenos <- example_phenos() phenos2 <- annotate_phenos(phenos) +phenos <- example_phenos() } +\concept{main} diff --git a/man/make_.Rd b/man/make_.Rd new file mode 100644 index 0000000..599f041 --- /dev/null +++ b/man/make_.Rd @@ -0,0 +1,240 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/_docs.R, R/make_igraph_object.R, +% R/make_network_object.R, R/make_phenos_dataframe.R, R/make_tiers.R +\name{make_} +\alias{make_} +\alias{make_igraph_object} +\alias{make_network_object} +\alias{make_phenos_dataframe} +\alias{make_tiers} +\title{Make functions} +\usage{ +make_igraph_object( + phenos, + hpo = get_hpo(), + colour_var = "fold_change", + cols = list_columns(extra_cols = c(colour_var, grep("_count$|_values$", names(phenos), + value = TRUE))), + ... +) + +make_network_object( + phenos, + hpo = get_hpo(), + colour_var = "fold_change", + add_ont_lvl_absolute = FALSE, + cols = list_columns(extra_cols = c(colour_var, grep("_count$|_values$", names(phenos), + value = TRUE))), + as = c("ggnetwork", "tbl_graph"), + ... +) + +make_phenos_dataframe( + ancestor = NULL, + hpo = get_hpo(), + phenotype_to_genes = load_phenotype_to_genes(), + add_ont_lvl_absolute = TRUE, + add_ont_lvl_relative = FALSE, + add_info_content = FALSE, + add_description = TRUE, + add_disease_data = FALSE, + add_ndiseases = add_disease_data, + add_onsets = add_disease_data, + add_deaths = add_disease_data, + add_pheno_frequencies = add_disease_data, + add_tiers = add_disease_data, + add_severities = add_disease_data, + add_disease_definitions = add_disease_data, + include_mondo = FALSE, + add_hoverboxes = FALSE, + columns = list_columns(), + interactive = TRUE, + verbose = TRUE +) + +make_tiers( + hpo = get_hpo(), + terms = hpo@terms, + keyword_sets = list(Tier1 = c("intellectual disability", "death"), Tier2 = + c("impaired mobility", "malform"), Tier3 = c("sight", "vision", "immunodeficien", + "cancer", "hearing", "touch", "pain ", " pain", "mental illness", "dysmorphic"), + Tier4 = c("fertility")), + check_names = TRUE, + check_definitions = TRUE, + check_diseases = FALSE, + search_ancestors = TRUE, + search_descendants = TRUE, + as_datatable = FALSE, + verbose = TRUE +) +} +\arguments{ +\item{phenos}{A data.table containing HPO IDs and other metadata.} + +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} + +\item{colour_var}{The column from phenos that you wish +to map to node colour.} + +\item{cols}{Columns to add to metadata of \link[ggnetwork]{ggnetwork} object.} + +\item{...}{ + Arguments passed on to \code{\link[ggnetwork:fortify]{ggnetwork::fortify}} + \describe{ + \item{\code{}}{} + }} + +\item{add_ont_lvl_absolute}{Add the absolute ontology level of each HPO term. +See \link[KGExplorer]{get_ontology_levels} for more details.} + +\item{as}{R object class to return output as.} + +\item{ancestor}{The ancestor to get all descendants of. If \code{NULL}, +returns the entirely ontology.} + +\item{phenotype_to_genes}{Output of +\link{load_phenotype_to_genes} mapping phenotypes +to gene annotations.} + +\item{add_ont_lvl_relative}{Add the relative ontology level of each HPO term. +See \link[KGExplorer]{get_ontology_levels} for more details.} + +\item{add_info_content}{Add information content column for each phenotype.} + +\item{add_description}{Whether to get the phenotype descriptions as +well (slower).} + +\item{add_disease_data}{Add all disease metadata columns. +This will expand the data using \code{allow.cartesian=TRUE}.} + +\item{add_ndiseases}{Add the number of diseases per phenotype.} + +\item{add_onsets}{Add age of onset columns using +\link[HPOExplorer]{add_onset}.} + +\item{add_deaths}{Add age of death columns using +\link[HPOExplorer]{add_death}.} + +\item{add_pheno_frequencies}{Add the frequency of each phenotype in +each disease.} + +\item{add_tiers}{Add severity Tiers column using +\link[HPOExplorer]{add_tier}.} + +\item{add_severities}{Add severity column using +\link[HPOExplorer]{add_severity}.} + +\item{add_disease_definitions}{Add disease definitions.} + +\item{include_mondo}{Add \href{https://mondo.monarchinitiative.org/}{MONDO} +IDs, names, and definitions to each disease.} + +\item{add_hoverboxes}{Add hoverdata with +\link[KGExplorer]{add_hoverboxes}.} + +\item{columns}{A named vector of columns in \code{phenos} +to add to the hoverdata via \link[KGExplorer]{add_hoverboxes}.} + +\item{interactive}{Make the plot interactive.} + +\item{verbose}{Print messages.} + +\item{terms}{A subset of HPO IDs to assign Tiers to.} + +\item{keyword_sets}{A named list of regex queries to be used when searching +for phenotypes that have matching metadata.} + +\item{check_names}{When regexsearching for matching terms, +check the phenotype names.} + +\item{check_definitions}{When regex searching for matching terms, +check the phenotype definition.} + +\item{check_diseases}{When regex searching for matching terms, +check the names of diseases associated with the phenotype.} + +\item{search_ancestors}{Inherit Tiers of ancestors.} + +\item{search_descendants}{Inherit Tiers of descendants.} + +\item{as_datatable}{Return the results as a \link[data.table]{data.table}.} +} +\value{ +R object. + +A \link[igraph]{igraph} object. + +A \link[ggnetwork]{ggnetwork} object. + +The HPO in dataframe format. + +Tier assignments for each term in \code{terms}. +Will be returned as either a named vector or a \link[data.table]{data.table}. +} +\description{ +Functions to make complex R objects. +} +\section{Functions}{ +\itemize{ +\item \code{make_igraph_object()}: make_ +Make an \link[igraph]{igraph} object + +This uses the network package to coerce the adjacency matrix into a +network object. It also adds the fold change, label, +and relative ontology level parameters to each node in the network. + +It expects there to be a column of HPO IDs in the phenos dataframe called +hpo_id. + +\item \code{make_network_object()}: make_ +Make a \link[ggnetwork]{ggnetwork} object + +This uses the network package to coerce the adjacency matrix into a +network object. It also adds the fold change, label, +and relative ontology level parameters to each node in the network. + +It expects there to be a column of HPO IDs in the phenos dataframe called +hpo_id. + +\item \code{make_phenos_dataframe()}: make_ +Make phenotypes dataframe + +Make a dataframe from a subset of the Human Phenotype Ontology. + +\item \code{make_tiers()}: make_ +Make severity Tiers (auto) + +Automatically add severity Tier for each HPO ID, in accordance with the +rating system provided by +\href{https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4262393/}{ +Lazarin et al (2014)}. +In order of increasing severity: +\itemize{ +\item{Tier 4 }{Reduced fertility} +\item{Tier 3 }{Sensory impairment: vision, +Immunodeficiency/cancer, +Sensory impairment: hearing, +Sensory impairment: touch, other (including pain), +Mental illness, +Dysmorphic features} +\item{Tier 2 }{Shortened life span: premature adulthood, +Impaired mobility, +Internal physical malformation} +\item{Tier 1 }{Shortened life span: infancy, +Shortened life span: childhood/adolescence, +Intellectual disability} +} + +}} +\examples{ +phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +g <- make_igraph_object(phenos = phenos) +phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +phenoNet <- make_network_object(phenos = phenos, + colour_var = "ontLvl_geneCount_ratio") +phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") +terms <- get_hpo()@terms[seq(100)] +tiers <- make_tiers(terms = terms) +} +\concept{make_} diff --git a/man/make_hoverboxes.Rd b/man/make_hoverboxes.Rd deleted file mode 100644 index eca1831..0000000 --- a/man/make_hoverboxes.Rd +++ /dev/null @@ -1,54 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_hoverboxes.R -\name{make_hoverboxes} -\alias{make_hoverboxes} -\title{Make hoverboxes} -\usage{ -make_hoverboxes( - phenos, - columns = list_columns(), - interactive = TRUE, - width = 60, - digits = 3, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{columns}{A named vector of columns in \code{phenos} -to add to the hoverdata via \link[HPOExplorer]{make_hoverboxes}.} - -\item{interactive}{Make the plot interactive with \link[plotly]{ggplotly}.} - -\item{width}{Positive integer giving target line width (in number of -characters). A width less than or equal to 1 will put each word on its -own line.} - -\item{digits}{integer indicating the number of decimal places - (\code{round}) or significant digits (\code{signif}) to be used. - For \code{round}, negative values are allowed (see \sQuote{Details}).} - -\item{verbose}{Print messages.} -} -\value{ -A nicely formatted string with newlines etc, -to be used as a hoverbox. -} -\description{ -A hoverbox is a box of text that shows up when the cursor -hovers over something. -These can be useful when making interactive network plots -of the HPO phenotypes because we can include a hoverbox that gives -information and data associated with each phenotype. -} -\details{ -This function expects a dataframe of with a "hpo_name" column that has the -name of each phenotype. It must then include columns -for all of the parameters you wish to include in the hoverbox. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay", - add_hoverboxes = FALSE) -phenos <- make_hoverboxes(phenos = phenos) -} diff --git a/man/make_igraph_object.Rd b/man/make_igraph_object.Rd deleted file mode 100644 index 36d3dd3..0000000 --- a/man/make_igraph_object.Rd +++ /dev/null @@ -1,68 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_igraph_object.R -\name{make_igraph_object} -\alias{make_igraph_object} -\title{Make an \link[igraph]{igraph} object} -\usage{ -make_igraph_object( - phenos, - hpo = get_hpo(), - adjacency = adjacency_matrix(terms = phenos$hpo_id, hpo = hpo), - colour_var = "fold_change", - add_ont_lvl_absolute = FALSE, - cols = list_columns(extra_cols = c(colour_var, grep("_count$|_values$", names(phenos), - value = TRUE))), - layout = "fruchtermanreingold", - verbose = TRUE, - ... -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{colour_var}{The column from phenos that you wish -to map to node colour.} - -\item{add_ont_lvl_absolute}{Add the absolute ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} - -\item{cols}{Columns to add to metadata of \link[ggnetwork]{ggnetwork} object.} - -\item{layout}{a network layout supplied by \code{\link[sna]{gplot.layout}}, -such as \code{"fruchtermanreingold"} (the default), or a two-column matrix -with as many rows as there are nodes in the network, in which case the -matrix is used as nodes coordinates.} - -\item{verbose}{Print messages.} - -\item{...}{ - Arguments passed on to \code{\link[ggnetwork:ggnetwork]{ggnetwork::ggnetwork}} - \describe{ - \item{\code{x}}{an object of class \code{\link[network]{network}} or -\code{\link[igraph:igraph-package]{igraph}}, or any object that can be -coerced to that class, such as an adjacency or incidence matrix, or an -edge list: see \code{\link[network]{edgeset.constructors}} and -\code{\link[network]{network}} for details.} - }} -} -\value{ -A \link[igraph]{igraph} object. -} -\description{ -This uses the network package to coerce the adjacency matrix into a -network object. It also adds the fold change, label, -and relative ontology level parameters to each node in the network. -} -\details{ -It expects there to be a column of HPO IDs in the phenos dataframe called -hpo_id. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -g <- make_igraph_object(phenos = phenos) -} diff --git a/man/make_network_object.Rd b/man/make_network_object.Rd deleted file mode 100644 index 98860c7..0000000 --- a/man/make_network_object.Rd +++ /dev/null @@ -1,69 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_network_object.R -\name{make_network_object} -\alias{make_network_object} -\title{Make a \link[ggnetwork]{ggnetwork} object} -\usage{ -make_network_object( - phenos, - hpo = get_hpo(), - adjacency = adjacency_matrix(terms = phenos$hpo_id, hpo = hpo), - colour_var = "fold_change", - add_ont_lvl_absolute = FALSE, - cols = list_columns(extra_cols = c(colour_var, grep("_count$|_values$", names(phenos), - value = TRUE))), - layout = "fruchtermanreingold", - verbose = TRUE, - ... -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{colour_var}{The column from phenos that you wish -to map to node colour.} - -\item{add_ont_lvl_absolute}{Add the absolute ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} - -\item{cols}{Columns to add to metadata of \link[ggnetwork]{ggnetwork} object.} - -\item{layout}{a network layout supplied by \code{\link[sna]{gplot.layout}}, -such as \code{"fruchtermanreingold"} (the default), or a two-column matrix -with as many rows as there are nodes in the network, in which case the -matrix is used as nodes coordinates.} - -\item{verbose}{Print messages.} - -\item{...}{ - Arguments passed on to \code{\link[ggnetwork:ggnetwork]{ggnetwork::ggnetwork}} - \describe{ - \item{\code{x}}{an object of class \code{\link[network]{network}} or -\code{\link[igraph:igraph-package]{igraph}}, or any object that can be -coerced to that class, such as an adjacency or incidence matrix, or an -edge list: see \code{\link[network]{edgeset.constructors}} and -\code{\link[network]{network}} for details.} - }} -} -\value{ -A \link[ggnetwork]{ggnetwork} object. -} -\description{ -This uses the network package to coerce the adjacency matrix into a -network object. It also adds the fold change, label, -and relative ontology level parameters to each node in the network. -} -\details{ -It expects there to be a column of HPO IDs in the phenos dataframe called -hpo_id. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -phenoNet <- make_network_object(phenos = phenos, - colour_var = "ontLvl_geneCount_ratio") -} diff --git a/man/make_ontology.Rd b/man/make_ontology.Rd deleted file mode 100644 index fea3b67..0000000 --- a/man/make_ontology.Rd +++ /dev/null @@ -1,54 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_ontology.R -\name{make_ontology} -\alias{make_ontology} -\title{Make an ontologyIndex object} -\usage{ -make_ontology( - file = "hp-base.obo", - repo = "obophenotype/human-phenotype-ontology", - tag = "latest", - save_dir = tools::R_user_dir(package = "HPOExplorer", which = "cache"), - extract_tags = "everything", - fix_ascii = TRUE, - overwrite = TRUE, - upload_tag = NULL, - ... -) -} -\arguments{ -\item{file}{name or vector of names of files to be downloaded. If \code{NULL}, -all assets attached to the release will be downloaded.} - -\item{repo}{Repository name in format "owner/repo". Defaults to \code{guess_repo()}.} - -\item{tag}{tag for the GitHub release to which this data should be attached.} - -\item{save_dir}{Directory to save data to.} - -\item{extract_tags}{Character value: either "minimal" or "everything", determining whether to extract only the properties of terms which are required to run functions in the package - i.e. \code{"id", "name", "parents", "children"} and \code{"ancestors"} - or extract all properties provided in the file. Term properties are named in the resulting \code{ontology_index} as their corresponding tags in the OBO file (except \code{"parents"}, \code{"children"} and \code{"ancestors"} which are appended with \code{"_OBO"} to avoid clashing with standard \code{ontology_index} properties. Defaults to \code{"minimal"}.} - -\item{fix_ascii}{Fix non-ASCII characters in metadata.} - -\item{overwrite}{Should any local files of the same name be overwritten? -default \code{TRUE}.} - -\item{...}{ - Arguments passed on to \code{\link[ontologyIndex:get_ontology]{ontologyIndex::get_OBO}} - \describe{ - \item{\code{propagate_relationships}}{Character vector of relations} - \item{\code{merge_equivalent_terms}}{Logical value determining whether terms that are marked \code{"equivalent_to"} a target term should be merged, retaining properties of the target term when the property should have one value, e.g. the term ID and name. Defaults to \code{TRUE}.} - }} -} -\value{ -\link[ontologyIndex]{ontology_index} object -} -\description{ -Make a \link[ontologyIndex]{ontology_index} -object from the Open Biomedical Ontologies (OBO) file. -By default, this function uses the Human Phenotype Ontology (HPO) -distributed via the official -\href{https://github.com/obophenotype/human-phenotype-ontology/releases}{ -HPO GitHub Releases}. -} -\keyword{internal} diff --git a/man/make_phenos_dataframe.Rd b/man/make_phenos_dataframe.Rd deleted file mode 100644 index fefd80c..0000000 --- a/man/make_phenos_dataframe.Rd +++ /dev/null @@ -1,98 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/make_phenos_dataframe.R -\name{make_phenos_dataframe} -\alias{make_phenos_dataframe} -\title{Make phenotypes dataframe} -\usage{ -make_phenos_dataframe( - ancestor = NULL, - hpo = get_hpo(), - phenotype_to_genes = load_phenotype_to_genes(), - adjacency = NULL, - add_ont_lvl_absolute = TRUE, - add_ont_lvl_relative = FALSE, - add_info_contents = FALSE, - add_description = TRUE, - add_disease_data = FALSE, - add_ndiseases = add_disease_data, - add_onsets = add_disease_data, - add_deaths = add_disease_data, - add_pheno_frequencies = add_disease_data, - add_tiers = add_disease_data, - add_severities = add_disease_data, - add_disease_definitions = add_disease_data, - include_mondo = FALSE, - add_hoverboxes = FALSE, - columns = list_columns(), - interactive = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{ancestor}{The ancestor to get all descendants of. If \code{NULL}, -returns the entirely ontology.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes -to gene annotations.} - -\item{adjacency}{An adjacency matrix generated -by \link[HPOExplorer]{adjacency_matrix}.} - -\item{add_ont_lvl_absolute}{Add the absolute ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} - -\item{add_ont_lvl_relative}{Add the relative ontology level of each HPO term. -See \link[HPOExplorer]{get_ont_lvls} for more details.} - -\item{add_info_contents}{Add information content column for each phenotype.} - -\item{add_description}{Whether to get the phenotype descriptions as -well (slower).} - -\item{add_disease_data}{Add all disease metadata columns. -This will expand the data using \code{allow.cartesian=TRUE}.} - -\item{add_ndiseases}{Add the number of diseases per phenotype.} - -\item{add_onsets}{Add age of onset columns using -\link[HPOExplorer]{add_onset}.} - -\item{add_deaths}{Add age of death columns using -\link[HPOExplorer]{add_death}.} - -\item{add_pheno_frequencies}{Add the frequency of each phenotype in -each disease.} - -\item{add_tiers}{Add severity Tiers column using -\link[HPOExplorer]{add_tier}.} - -\item{add_severities}{Add severity column using -\link[HPOExplorer]{add_severity}.} - -\item{add_disease_definitions}{Add disease definitions.} - -\item{include_mondo}{Add \href{https://mondo.monarchinitiative.org/}{MONDO} -IDs, names, and definitions to each disease.} - -\item{add_hoverboxes}{Add hoverdata with -\link[HPOExplorer]{make_hoverboxes}.} - -\item{columns}{A named vector of columns in \code{phenos} -to add to the hoverdata via \link[HPOExplorer]{make_hoverboxes}.} - -\item{interactive}{Make the plot interactive with \link[plotly]{ggplotly}.} - -\item{verbose}{Print messages.} -} -\value{ -The HPO in dataframe format. -} -\description{ -Make a dataframe from a subset of the Human Phenotype Ontology. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -} diff --git a/man/map_.Rd b/man/map_.Rd new file mode 100644 index 0000000..48b7087 --- /dev/null +++ b/man/map_.Rd @@ -0,0 +1,99 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/_docs.R, R/list_deaths.R, R/list_onsets.R, +% R/map_phenotypes.R +\name{map_} +\alias{map_} +\alias{list_deaths} +\alias{list_onsets} +\alias{map_phenotypes} +\title{Map functions} +\usage{ +list_deaths( + hpo = get_hpo(), + exclude = FALSE, + to = c("name", "id"), + include_na = TRUE +) + +list_onsets( + hpo = get_hpo(), + exclude = FALSE, + to = c("name", "id"), + include_na = TRUE, + verbose = TRUE +) + +map_phenotypes( + terms, + hpo = get_hpo(), + to = c("name", "id"), + keep_order = TRUE, + invert = FALSE +) +} +\arguments{ +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} + +\item{exclude}{HPO phenotype names to exclude.} + +\item{to}{Character vector of database(s) to map IDs to. +When not \code{"mondo"}, can supply multiple alternative databases to map to + (e.g. \code{c("OMIM","Orphanet","DECIPHER")}).} + +\item{include_na}{Include NA values for onset.} + +\item{verbose}{Print messages.} + +\item{terms}{A subset of HPO IDs to include in the final dataset and plots +(e.g. c("HP:0001508","HP:0001507")).} + +\item{keep_order}{Return a named list of the same length and order +as \code{terms}. +If \code{FALSE}, return a named list of only the unique \code{terms}, +sometimes in a different order.} + +\item{invert}{Invert the keys/values of the dictionary, +such that the key becomes the values (and vice versa).} +} +\value{ +Mapped data. + +Named list of HPO IDs. + +Named list of HPO IDs. + +Character vector +} +\description{ +Functions to map IDs. +} +\section{Functions}{ +\itemize{ +\item \code{list_deaths()}: map_ +List age of death HPO terms + +List age of death phenotypes in the HPO. + +\item \code{list_onsets()}: map_ +List age of onset HPO terms + +List age of onset phenotypes in the HPO. + +\item \code{map_phenotypes()}: map_ +Harmonise phenotypes + +Harmonise a mixed vector of phenotype names (e.g. "Focal motor seizure") +and HPO IDs (e.g. c("HP:0000002","HP:0000003")). + +}} +\examples{ +deaths <- list_deaths() +onsets <- list_onsets() +terms <- c("Focal motor seizure","HP:0000002","HP:0000003") +#### As phenotype names #### +term_names <- map_phenotypes(terms=terms) +#### As HPO IDs #### +term_ids <- map_phenotypes(terms=terms, to="id") +} +\concept{map_} diff --git a/man/map_upheno.Rd b/man/map_upheno.Rd deleted file mode 100644 index f35bfb1..0000000 --- a/man/map_upheno.Rd +++ /dev/null @@ -1,69 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_upheno.R -\name{map_upheno} -\alias{map_upheno} -\title{Map phenotypes across uPheno} -\source{ -https://data.monarchinitiative.org/upheno2/current/qc/index - -https://data.monarchinitiative.org/upheno2/current/upheno-release/all/index.html -} -\usage{ -map_upheno( - pheno_map_method = c("upheno", "monarch"), - gene_map_method = c("monarch", "orthogene"), - subset_db1 = c("HP"), - terms = NULL, - fill_scores = NULL, - show_plot = TRUE, - force_new = FALSE, - save_dir = tools::R_user_dir(package = "HPOExplorer", which = "cache") -) -} -\arguments{ -\item{pheno_map_method}{Method to use for mapping phenotypes across ontologies. -\itemize{ -\item{"upheno"}{Use uPheno's phenotype-to-phenotype mappings. -Contains fewer ontologies but with greater coverage of phenotypes.} -\item{"monarch"}{Use Monarch's phenotype-to-phenotype mappings. -Contains more ontologies but with less coverage of phenotypes. -} -}} - -\item{gene_map_method}{Method to use for mapping genes across species. -\itemize{ -\item{"monarch"}{Use Monarch's gene-to-gene mappings.} -\item{"orthogene"}{Use \link[orthogene]{convert_orthologs} to generate -gene-to-gene mappings.} -}} - -\item{subset_db1}{Subset of ontologies to include in the plot.} - -\item{terms}{A subset of HPO IDs to include in the final dataset and plots -(e.g. c("HP:0001508","HP:0001507")).} - -\item{fill_scores}{Fill missing scores in the "equivalence_score" and -"subclass_score" columns with this value. These columns represent the -quality of mapping between two phenotypes on a scale from 0-1.} - -\item{show_plot}{Show the plot.} - -\item{force_new}{Force new data to be downloaded and processed.} - -\item{save_dir}{Directory to save cached data.} -} -\value{ -A list containing the data and plot. -} -\description{ -Map phenotypes across species within the Unified Phenotype Ontology (uPheno). -First, gathers phenotype-phenotype mappings across ontologies. -Next, gathers all phenotype-gene associations for each ontology, -converts all genes to human HGNC orthologs, and computes the number of -overlapping orthologs between all pairs mapped phenotypes. -Finally, plots the results as the proportion of intersecting genes between -all pairs of phenotypes. -} -\examples{ -res <- map_upheno() -} diff --git a/man/map_upheno_data.Rd b/man/map_upheno_data.Rd deleted file mode 100644 index 2d9e4e6..0000000 --- a/man/map_upheno_data.Rd +++ /dev/null @@ -1,68 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_upheno_data.R -\name{map_upheno_data} -\alias{map_upheno_data} -\title{Map uPheno data} -\usage{ -map_upheno_data( - pheno_map_method = c("upheno", "monarch"), - gene_map_method = c("monarch", "orthogene"), - keep_nogenes = FALSE, - fill_scores = NULL, - terms = NULL, - save_dir = tools::R_user_dir(package = "HPOExplorer", which = "cache"), - force_new = FALSE -) -} -\arguments{ -\item{pheno_map_method}{Method to use for mapping phenotypes across ontologies. -\itemize{ -\item{"upheno"}{Use uPheno's phenotype-to-phenotype mappings. -Contains fewer ontologies but with greater coverage of phenotypes.} -\item{"monarch"}{Use Monarch's phenotype-to-phenotype mappings. -Contains more ontologies but with less coverage of phenotypes. -} -}} - -\item{gene_map_method}{Method to use for mapping genes across species. -\itemize{ -\item{"monarch"}{Use Monarch's gene-to-gene mappings.} -\item{"orthogene"}{Use \link[orthogene]{convert_orthologs} to generate -gene-to-gene mappings.} -}} - -\item{keep_nogenes}{Logical indicating whether to keep mappings that do not -have any orthologous genes.} - -\item{fill_scores}{Fill missing scores in the "equivalence_score" and -"subclass_score" columns with this value. These columns represent the -quality of mapping between two phenotypes on a scale from 0-1.} - -\item{terms}{A subset of HPO IDs to include in the final dataset and plots -(e.g. c("HP:0001508","HP:0001507")).} - -\item{save_dir}{Directory to save cached data.} - -\item{force_new}{Force new data to be downloaded and processed.} -} -\value{ -A data.table containing the mapped data. -} -\description{ -Get uPheno cross-species mapping data by: -\itemize{ -\item{Downloading cross-species phenotype-phenotype mappings.} -\item{Downloading within-spceies phenotype-gene mappings, -and converting these genes to human orthologs.} -\item{Merging the phenotype-phenotype and phenotype-gene mappings.} -\item{Filtering out any mappings that do not have a human ortholog within -each respective phenotype.} -\item{Calculating the proportion of orthologous genes overlapping across -the species-specific phenotype-gene mappings.} -\item{Iterating the above steps using multiple methods -(\code{pheno_map_method}) and concatenating the results together.} -} -} -\examples{ -pheno_map_genes_match <- map_upheno_data() -} diff --git a/man/map_upheno_plot.Rd b/man/map_upheno_plot.Rd deleted file mode 100644 index 7ca8dd3..0000000 --- a/man/map_upheno_plot.Rd +++ /dev/null @@ -1,33 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/map_upheno_plots.R -\name{map_upheno_plot} -\alias{map_upheno_plot} -\title{Map uPheno plot} -\usage{ -map_upheno_plot( - pheno_map_genes_match = NULL, - subset_db1 = "HP", - types = c("rainplot", "scatterplot", "heatmap") -) -} -\arguments{ -\item{pheno_map_genes_match}{uPheno cross-species mapping data generated by -\link[HPOExplorer]{map_upheno_data}.} - -\item{subset_db1}{A character vector of reference ontologies to subset -\code{pheno_map_genes_match} by.} - -\item{types}{A character vector of plot types to generate.} -} -\value{ -A named list of \pkg{ggplot2} objects. -} -\description{ -Generate multiple kinds of plots summarising mappings of phenotypes and genes -between the HPO and various non-human ontologies within uPheno. -} -\examples{ -pheno_map_genes_match <- map_upheno_data() -upheno_plots <- map_upheno_plot( - pheno_map_genes_match = pheno_map_genes_match) -} diff --git a/man/network_3d.Rd b/man/network_3d.Rd deleted file mode 100644 index 0c4497e..0000000 --- a/man/network_3d.Rd +++ /dev/null @@ -1,114 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/network_3d.R -\name{network_3d} -\alias{network_3d} -\title{3D network} -\source{ -\href{https://www.r-bloggers.com/2013/09/network-visualization-part-4-3d-networks/}{ -R bloggers} - -\href{https://community.plotly.com/t/is-it-possible-to-connect-scatters-in-3d-scatter-plot/}{ -Plotly: Connect points in 3D plot} - -\href{https://plotly.com/r/line-charts/}{ -Plotly: Connect points in 2D plot} - -\href{https://plotly.com/r/3d-line-plots/}{ -Plotly: 3D lines plots} - -\href{https://plotly.com/python/v3/3d-network-graph/}{ -Plotly: 3D network plot} -} -\usage{ -network_3d( - g, - layout_func = igraph::layout.fruchterman.reingold, - node_color_var = "ontLvl", - edge_color_var = "zend", - text_color_var = node_color_var, - node_symbol_var = "ancestor_name", - node_palette = pals::kovesi.cyclic_mrybm_35_75_c68_s25, - edge_palette = pals::kovesi.cyclic_mrybm_35_75_c68_s25, - node_opacity = 0.75, - edge_opacity = 0.5, - kde_palette = pals::gnuplot, - add_kde = TRUE, - extend_kde = 1.5, - bg_color = kde_palette(6)[1], - add_labels = FALSE, - keep_grid = FALSE, - aspectmode = "cube", - hover_width = 80, - label_width = 80, - seed = 2023, - showlegend = TRUE, - show_plot = TRUE, - save_path = tempfile(fileext = "network_3d.html"), - verbose = TRUE -) -} -\arguments{ -\item{g}{\link[igraph]{igraph} object -generated by \link[HPOExplorer]{make_igraph_object}.} - -\item{layout_func}{Layout function for the graph.} - -\item{node_color_var}{Variable in the vertex metadata to color nodes by.} - -\item{edge_color_var}{Variable in the edge metadata to color edges by.} - -\item{text_color_var}{Variable in the node metadata to color text by.} - -\item{node_symbol_var}{Variable in the vertex metadata to shape nodes by.} - -\item{node_palette}{Color palette function for the nodes/points.} - -\item{edge_palette}{Color palette function for the edges/lines.} - -\item{node_opacity}{Node opacity.} - -\item{edge_opacity}{Edge opacity.} - -\item{kde_palette}{Color palette function for the KDE plot.} - -\item{add_kde}{Add a kernel density estimation (KDE) plot -below the 3D scatter plot (i.e. the "mountains" beneath the points).} - -\item{extend_kde}{Extend the area that the KDE plot covers.} - -\item{bg_color}{Plot background color.} - -\item{add_labels}{Add phenotype name labels to each point.} - -\item{keep_grid}{Keep all grid lines and axis labels.} - -\item{aspectmode}{The proportions of the 3D plot. See the -\href{https://plotly.com/python/reference/layout/scene/#layout-scene-aspectmode}{ -plotly documentation site} for details.} - -\item{hover_width}{Maximum width of the hover text.} - -\item{label_width}{Maximum width of the label text.} - -\item{seed}{Random seed to enable reproducibility.} - -\item{showlegend}{Show node fill legend.} - -\item{show_plot}{Print the plot after it's been generated.} - -\item{save_path}{Path to save interactive plot to -as a self-contained HTML file.} - -\item{verbose}{Print messages.} -} -\value{ -A 3D interactive \link[plotly]{plotly} object. -} -\description{ -Plot a subset of the HPO as a 3D network. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -g <- make_igraph_object(phenos = phenos) -plt <- network_3d(g=g, show_plot=FALSE) -} diff --git a/man/per_branch_plot.Rd b/man/per_branch_plot.Rd index 24f96aa..b607e08 100644 --- a/man/per_branch_plot.Rd +++ b/man/per_branch_plot.Rd @@ -8,7 +8,8 @@ per_branch_plot( highlighted_branches, ancestor, hpo = get_hpo(), - background_branches = hpo$children[hpo$id[match(ancestor, hpo$name)]][[1]], + background_branches = simona::dag_children(hpo, term = map_phenotypes(terms = ancestor, + hpo = hpo, to = "id")), phenotype_to_genes = load_phenotype_to_genes() ) } @@ -19,13 +20,14 @@ to highlight \\>} \item{ancestor}{The ancestor to get all descendants of. If \code{NULL}, returns the entirely ontology.} -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} \item{background_branches}{HPO Ids of all branches to be shown (including highlighted) \\>} \item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes +\link{load_phenotype_to_genes} mapping phenotypes to gene annotations.} } \value{ @@ -44,8 +46,6 @@ Note that the highlighted branches must be also present in the background branches. } \examples{ -## Selecting child terms of -## "Abnormality of the nervous system" as background branches plt <- per_branch_plot( highlighted_branches = "Abnormality of nervous system physiology", ancestor = "Abnormality of the nervous system") diff --git a/man/phenos_to_granges.Rd b/man/phenos_to_granges.Rd index b9e2101..9f8281f 100644 --- a/man/phenos_to_granges.Rd +++ b/man/phenos_to_granges.Rd @@ -8,7 +8,7 @@ phenos_to_granges( phenos = NULL, phenotype_to_genes = load_phenotype_to_genes(), hpo = get_hpo(), - keep_seqnames = c(seq(22), "X", "Y"), + keep_chr = c(seq(22), "X", "Y"), by = c("hpo_id", "disease_id"), gene_col = "intersection", split.field = "hpo_id", @@ -18,15 +18,16 @@ phenos_to_granges( ) } \arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} +\item{phenos}{A data.table containing HPO IDs and other metadata.} \item{phenotype_to_genes}{Output of -\link[HPOExplorer]{load_phenotype_to_genes} mapping phenotypes +\link{load_phenotype_to_genes} mapping phenotypes to gene annotations.} -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} -\item{keep_seqnames}{Chromosomes to keep.} +\item{keep_chr}{Chromosomes to keep.} \item{by}{A vector of shared column names in \code{x} and \code{y} to merge on. This defaults to the shared key columns between the two tables. diff --git a/man/search_hpo.Rd b/man/search_hpo.Rd index af6866f..a21b638 100644 --- a/man/search_hpo.Rd +++ b/man/search_hpo.Rd @@ -19,7 +19,8 @@ search_hpo( ) } \arguments{ -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} +\item{hpo}{Human Phenotype Ontology object, +loaded from \link[KGExplorer]{get_ontology}.} \item{queries}{A named list of character vectors. Each vector includes a phenoptype name (or a substring) diff --git a/man/subset_descendants.Rd b/man/subset_descendants.Rd deleted file mode 100644 index 894a5c6..0000000 --- a/man/subset_descendants.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/subset_descendants.R -\name{subset_descendants} -\alias{subset_descendants} -\title{Subset descendants} -\usage{ -subset_descendants( - phenos, - ancestor = NULL, - hpo = get_hpo(), - ignore_case = TRUE, - verbose = TRUE -) -} -\arguments{ -\item{phenos}{dataframe of phenotypes and values / parameters.} - -\item{ancestor}{Phenotype names (or HPO ID) of an ancestor in the -\href{https://hpo.jax.org/}{Human Phenotype Ontology}. -Only phenotypes that are descendants of this ancestor will be kept. -Set to \code{NULL} (default) to skip this filtering step.} - -\item{hpo}{Human Phenotype Ontology object, loaded from \pkg{ontologyIndex}.} - -\item{ignore_case}{Ignore casing when searching for matches.} - -\item{verbose}{Print messages.} -} -\value{ -data.table of phenotypes, with additional columns: -"ancestor", "ancestor_id" -} -\description{ -Subset a \code{phenos} datatable to only -descendants of an ancestor HPO ID term. -} -\examples{ -phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") -phenos2 <- subset_descendants(phenos = phenos, - ancestor = "Motor delay") -} diff --git a/man/unlist_col.Rd b/man/unlist_col.Rd index 0f0698e..7a7c79a 100644 --- a/man/unlist_col.Rd +++ b/man/unlist_col.Rd @@ -4,10 +4,10 @@ \alias{unlist_col} \title{Unlist column} \usage{ -unlist_col(dt, col) +unlist_col(dat, col) } \arguments{ -\item{dt}{\link[data.table]{data.table}} +\item{dat}{\link[data.table]{data.table}} \item{col}{Column name.} } diff --git a/tests/testthat/test-add_hpo_id.R b/tests/testthat/test-add_hpo_id.R index c152ac2..7ac555a 100644 --- a/tests/testthat/test-add_hpo_id.R +++ b/tests/testthat/test-add_hpo_id.R @@ -7,8 +7,8 @@ test_that("add_hpo_id works", { ## Several terms were omitted from later versions of the HPO ## due to becoming obsolete. testthat::expect_lte(sum(phenos2$hpo_id!=phenos2$hpo_id), 4) - mismatched_phenos <- harmonise_phenotypes( - phenotypes = phenos2$ID[phenos2$hpo_id!=phenos2$hpo_id] + mismatched_phenos <- map_phenotypes( + terms = phenos2$ID[phenos2$hpo_id!=phenos2$hpo_id] ) testthat::expect_true( all(grepl("^obsolete",mismatched_phenos, ignore.case = TRUE)) diff --git a/tests/testthat/test-add_omop.R b/tests/testthat/test-add_omop.R index f562804..ce1175d 100644 --- a/tests/testthat/test-add_omop.R +++ b/tests/testthat/test-add_omop.R @@ -3,7 +3,7 @@ test_that("add_omop works", { #### Using hpo_id #### phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") phenos2 <- add_omop(phenos = phenos, - id_col = "hpo_id") + input_col = "hpo_id") testthat::expect_true(all(!is.na(phenos2$OMOP_ID))) testthat::expect_true(all(!is.na(phenos2$OMOP_NAME))) @@ -11,7 +11,7 @@ test_that("add_omop works", { phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay", add_disease_data = TRUE) phenos2 <- add_omop(phenos = phenos, - id_col = "disease_id") + input_col = "disease_id") testthat::expect_gte(sum(!is.na(phenos2$OMOP_ID)),1200) testthat::expect_gte(sum(!is.na(phenos2$OMOP_NAME)),1200) }) diff --git a/tests/testthat/test-add_ont_lvl.R b/tests/testthat/test-add_ont_lvl.R index 0008d24..3a156b9 100644 --- a/tests/testthat/test-add_ont_lvl.R +++ b/tests/testthat/test-add_ont_lvl.R @@ -1,6 +1,7 @@ test_that("add_ont_lvl works", { - phenos <- data.table::data.table(hpo_id=get_hpo()$id[1:10]) + hp <- get_hpo() + phenos <- data.table::data.table(hpo_id=hp@terms[1:10]) #### Absolute #### phenos2 <- add_ont_lvl(phenos = data.table::copy(phenos)) cols <- c("ontLvl") diff --git a/tests/testthat/test-as_ascii.R b/tests/testthat/test-as_ascii.R index 2f18230..cd14dab 100644 --- a/tests/testthat/test-as_ascii.R +++ b/tests/testthat/test-as_ascii.R @@ -1,5 +1,5 @@ test_that("as_ascii works", { - dt <- HPOExplorer:::as_ascii(dt = HPOExplorer::hpo_deaths) - testthat::expect_true(methods::is(dt,"data.table")) + dat <- HPOExplorer:::as_ascii(dat = HPOExplorer::hpo_deaths) + testthat::expect_true(methods::is(dat,"data.table")) }) diff --git a/tests/testthat/test-assign_tiers.R b/tests/testthat/test-assign_tiers.R deleted file mode 100644 index 973f74f..0000000 --- a/tests/testthat/test-assign_tiers.R +++ /dev/null @@ -1,6 +0,0 @@ -test_that("assign_tiers works", { - - terms <- get_hpo()$id[seq(10)] - tiers <- assign_tiers(terms = terms) - testthat::expect_true(all(sort(unique(tiers))==paste0("Tier",seq(4)))) -}) diff --git a/tests/testthat/test-clear_cache.R b/tests/testthat/test-clear_cache.R deleted file mode 100644 index 9984ebb..0000000 --- a/tests/testthat/test-clear_cache.R +++ /dev/null @@ -1,11 +0,0 @@ -test_that("clear_cache works", { - - dat <- load_phenotype_to_genes() - f <- file.path(tools::R_user_dir("HPOExplorer", - which="cache"), - "data", - "phenotype_to_genes.rds") - testthat::expect_true(file.exists(f)) - clear_cache() - testthat::expect_false(file.exists(f)) -}) diff --git a/tests/testthat/test-subset_descendants.R b/tests/testthat/test-filter_descendants.R similarity index 71% rename from tests/testthat/test-subset_descendants.R rename to tests/testthat/test-filter_descendants.R index 96ddee1..48a5fc6 100644 --- a/tests/testthat/test-subset_descendants.R +++ b/tests/testthat/test-filter_descendants.R @@ -1,7 +1,7 @@ -test_that("subset_descendants works", { +test_that("filter_descendants works", { phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") - phenos2 <- subset_descendants(phenos = phenos, + phenos2 <- filter_descendants(phenos = phenos, ancestor = "Motor delay") testthat::expect_equal(nrow(phenos),23) testthat::expect_equal(nrow(phenos2),9) diff --git a/tests/testthat/test-get_hpo.R b/tests/testthat/test-get_hpo.R index ac514a7..ede8aa8 100644 --- a/tests/testthat/test-get_hpo.R +++ b/tests/testthat/test-get_hpo.R @@ -4,5 +4,5 @@ test_that("get_hpo works", { hpo <- get_hpo() items <- ls() testthat::expect_true("hpo" %in% ls()) - testthat::expect_true(methods::is(hpo,"ontology_index")) + testthat::expect_true(methods::is(hpo,"ontology_DAG")) }) diff --git a/tests/testthat/test-get_ont_lvls.R b/tests/testthat/test-get_ont_lvls.R deleted file mode 100644 index 00f1901..0000000 --- a/tests/testthat/test-get_ont_lvls.R +++ /dev/null @@ -1,44 +0,0 @@ -test_that("get_ont_lvls works", { - - hpo <- get_hpo() - parents <- grep("^HP",unique(hpo$id), value = TRUE)[seq(2)] - childs <- unlist(unname(hpo$children[parents])) - - terms1 <- c(parents,childs) - #### Using only immediate children #### - lvls1 <- get_ont_lvls(terms = terms1, absolute = TRUE) - testthat::expect_length(lvls1, length(terms1)) - testthat::expect_equal(min(lvls1),1) - testthat::expect_equal(max(lvls1),16) ## Increased from 14 to 16 in 2023 version - - #### Using all descendants #### - terms2 <- ontologyIndex::get_descendants(ontology = hpo, - roots = parents[[2]], - exclude_roots = FALSE) - lvls2 <- get_ont_lvls(terms = terms2) - testthat::expect_length(lvls2, length(terms2)) - testthat::expect_equal(min(lvls2),0) - testthat::expect_equal(max(lvls2),5) - - #### Using relative levels #### - lvls3 <- get_ont_lvls(terms = terms1, absolute = FALSE) - testthat::expect_length(lvls3, length(terms1)) - testthat::expect_equal(min(lvls3),0) - testthat::expect_equal(max(lvls3),1) - - lvls4 <- get_ont_lvls(terms = terms1, - absolute = TRUE, - exclude_top_lvl = FALSE, - reverse = FALSE) - testthat::expect_length(lvls4, length(terms1)) - testthat::expect_equal(min(lvls4),0) - testthat::expect_equal(max(lvls4),15) - - #### Visual confirmation of correct hierarchy #### - # ontologyPlot::onto_plot(ontology = hpo, - # label = terms1, - # terms = terms1) - # ontologyPlot::onto_plot(ontology = hpo, - # label = terms2, - # terms = terms2) -}) diff --git a/tests/testthat/test-ggnetwork_plot.R b/tests/testthat/test-ggnetwork_plot.R index 0b631fa..067543a 100644 --- a/tests/testthat/test-ggnetwork_plot.R +++ b/tests/testthat/test-ggnetwork_plot.R @@ -9,7 +9,7 @@ test_that("ggnetwork_plot works", { phenoNet <- make_network_object(phenos = phenos, colour_var = "ontLvl_geneCount_ratio") testthat::expect_true(methods::is(phenoNet,"data.frame")) - testthat::expect_equal(nrow(phenoNet),45) + testthat::expect_equal(nrow(phenoNet),71) #### ggnetwork_plot #### plt <- ggnetwork_plot(phenoNet = phenoNet, diff --git a/tests/testthat/test-list_onsets.R b/tests/testthat/test-list_onsets.R index 46fa144..a6ce97a 100644 --- a/tests/testthat/test-list_onsets.R +++ b/tests/testthat/test-list_onsets.R @@ -4,7 +4,6 @@ test_that("list_onsets works", { testthat::expect_length(onsets,12) onsets <- list_onsets(exclude = c("Antenatal","Fetal"), - as_hpo_ids = FALSE, include_na = FALSE) testthat::expect_length(onsets,9) }) diff --git a/tests/testthat/test-make_tiers.R b/tests/testthat/test-make_tiers.R new file mode 100644 index 0000000..3bf4b73 --- /dev/null +++ b/tests/testthat/test-make_tiers.R @@ -0,0 +1,6 @@ +test_that("make_tiers works", { + + terms <- get_hpo()@terms[seq(100)] + tiers <- make_tiers(terms = terms) + testthat::expect_true(all(sort(unique(tiers))==paste0("Tier",seq(4)))) +}) diff --git a/tests/testthat/test-map_upheno.R b/tests/testthat/test-map_upheno.R deleted file mode 100644 index 956c9db..0000000 --- a/tests/testthat/test-map_upheno.R +++ /dev/null @@ -1,21 +0,0 @@ -test_that("map_upheno works", { - - run_tests <- function(res){ - testthat::expect_true(methods::is(res$data,"data.table")) - for(x in res$plots){ - testthat::expect_true(methods::is(x,"gg") || - methods::is(x,"Heatmap")) - } - } - - terms <- example_phenos()$hpo_id - res <- map_upheno(force_new = TRUE, - terms = terms) - run_tests(res) - - #### Use cached data and filter by HPO terms - example_phenos <- example_phenos() - res <- map_upheno(force_new = FALSE, - terms = terms) - run_tests(res) -}) diff --git a/tests/testthat/test-network_3d.R b/tests/testthat/test-plot_graph_3d.R similarity index 54% rename from tests/testthat/test-network_3d.R rename to tests/testthat/test-plot_graph_3d.R index 91d24e1..cacd921 100644 --- a/tests/testthat/test-network_3d.R +++ b/tests/testthat/test-plot_graph_3d.R @@ -1,10 +1,12 @@ -test_that("network_3d works", { +test_that("plot_graph_3d works", { - phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay") + phenos <- make_phenos_dataframe(ancestor = "Neurodevelopmental delay")[seq(1,100),] g <- make_igraph_object(phenos = phenos) - plt <- network_3d(g=g) + plt <- suppressWarnings( + KGExplorer::plot_graph_3d(g=g, show_plot = FALSE) + ) testthat::expect_true(methods::is(g,"igraph")) - testthat::expect_length(g,23) + testthat::expect_length(g,34) testthat::expect_true(methods::is(plt,"plotly")) }) diff --git a/vignettes/HPOExplorer.Rmd b/vignettes/HPOExplorer.Rmd index 521b40d..58d5f90 100644 --- a/vignettes/HPOExplorer.Rmd +++ b/vignettes/HPOExplorer.Rmd @@ -3,7 +3,7 @@ title: "HPOExplorer" author: "

Authors: Robert Gordon-Smith, Brian M. Schilder, Nathan G .Skene

" date: "

Most recent update: `r format( Sys.Date(), '%b-%d-%Y')`

" output: - BiocStyle::html_document: + rmarkdown::html_document vignette: > %\VignetteIndexEntry{HPOExplorer} %\VignetteEngine{knitr::rmarkdown} @@ -27,7 +27,9 @@ library(HPOExplorer) The `HPOExplorer` package provides useful functions for working with the [Human Phenotype Ontology (HPO)](https://hpo.jax.org/app/). -The main HPO ontology object comes with the [`ontologyIndex`](https://CRAN.R-project.org/package=ontologyIndex) R package. +The main HPO ontology object comes with the +[`simona`](https://bioconductor.org/packages/release/bioc/html/simona.html) +R package. This tutorial will focus on creating an interactive network plot of a subset of the HPO, where disease descriptions and results from your

XK)|!WYp7n6h#UlDi1$vKg4IZp}Xr2 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%0A6?f5sB2 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