diff --git a/_targets/meta/meta b/_targets/meta/meta index 7e5152e..48e7ee4 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -2,14 +2,14 @@ name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iterat data_geno|stem|6c35052b46564eaa|2f6d6fac438e0c68|8846e09db8d257d5|-676849289||t19737.0760777314s|c999686471cd2bf1|1616600|rds|local|vector|||1.47|| data_metabo|stem|d373e47b182755db|91ad6cfa4064ca3b|a8b88e2a622ece40|-1296975954||t19737.0760063898s|6044e0195a090f92|19248|rds|local|vector|||1.715|| data_transcripto|stem|3f48590934bb1333|5d10bc167155482a|69f2986da2408dad|196911606||t19737.076051425s|a0d23620354f1de9|6494110|rds|local|vector|||1.74|| -dataset_file_geno|stem|af97a53623d6e7de|3b1c97c08470627d|ef46db3751d8e999|1960638429|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/genomics_dataset.csv|t19755.0560160261s|20566495b664ffb4|6850822|file|local|vector|||0|| -dataset_file_metabo|stem|175ac2cf6405fbad|fac79514e3d2c1b3|ef46db3751d8e999|1190506623|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/metabolomics_dataset.csv|t19755.0560163373s|c4e0ec1268286261|35815|file|local|vector|||0|| -dataset_file_transcripto|stem|71a95dd921de2179|453af68db7520e53|ef46db3751d8e999|-658525691|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/transcriptomics_dataset.csv|t19755.0560166078s|92b17bfefe92cde3|10702704|file|local|vector|||0|| -dataset_names_pca|stem|b7dcb1f702f808d7|cbd5b838d68f1692|ed471008ce8c9ddc|-1982688821||t19739.9580991333s|abbdb7fe746336f0|76|rds|local|vector||dataset_names_pca_266715e9*dataset_names_pca_90c252f2*dataset_names_pca_a29776a2|0|| +dataset_file_geno|stem|af97a53623d6e7de|184c3e8fedeae7be|ef46db3751d8e999|1960638429|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/genomics_dataset.csv|t19760.8101875749s|20566495b664ffb4|6850822|file|local|vector|||0.001|| +dataset_file_metabo|stem|175ac2cf6405fbad|a83d109058e2283e|ef46db3751d8e999|1190506623|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/metabolomics_dataset.csv|t19760.8101880575s|c4e0ec1268286261|35815|file|local|vector|||0|| +dataset_file_transcripto|stem|71a95dd921de2179|84a2124bad6e0027|ef46db3751d8e999|-658525691|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/transcriptomics_dataset.csv|t19760.8101889915s|92b17bfefe92cde3|10702704|file|local|vector|||0|| +dataset_names_pca|stem|b7dcb1f702f808d7|cbd5b838d68f1692|af610eec90adc4f0|-1982688821||t19760.9112392474s|abbdb7fe746336f0|76|rds|local|vector||dataset_names_pca_266715e9*dataset_names_pca_90c252f2*dataset_names_pca_a29776a2|0.001|| diablo_design_matrix|stem|29c6a413f89d3f67|348c9ac4eba4001a|9bfafd062325ed6e|1135312759||t19744.9620132827s|82d1d1c4d23d6aba|150|rds|local|vector|||0.001|| -diablo_enrichment_results|stem|9722628774f6fef0|b259d94f2e6c5a21|7878ff644e224051|-595620765||t19752.0894347721s|952c625ddd4d270b|620549|rds|local|vector|||25.829|| +diablo_enrichment_results|stem|aacf368d1c4d57bd|b259d94f2e6c5a21|5e637d31f008e23c|-595620765||t19760.9137385968s|4ab2901c8137265d|620547|rds|local|vector|||29.411|| diablo_final_run|stem|b299f53f75cc3c4f|23964c06fd68be70|ee3fac541fa5e2dd|-1601141966||t19744.9989792927s|99991ea38374c569|1124171|rds|local|vector|||0.178|| -diablo_input|stem|bc575282a1a9df6c|fd9ebf83f0d8e4ec|400124e1b0a7b165|-869543617||t19744.9619621332s|d034cfac3ae24f77|885435|rds|local|vector|||0.216|| +diablo_input|stem|bc575282a1a9df6c|fd9ebf83f0d8e4ec|5cdbfead4c9c12b6|-869543617||t19760.9120500097s|d034cfac3ae24f77|885435|rds|local|vector|||0.103|| diablo_novarsel|stem|6885b6b8c1d7aa2b|8fe852be6b9b41f7|e4904a9c1f54ff87|1830706287||t19744.962018169s|ff8972ff77713186|1244891|rds|local|vector|||0.278|| diablo_optim_ncomp|stem|a6a461d869af0842|3e60197686968000|cc3567e78258484e|1771925836||t19744.9629324703s|b6d2e014b07bc296|51|rds|local|vector|||0|| diablo_output|stem|910f8382868fc0dc|d4fcd06d6c43c791|4f5c341e56db42f4|1691982822||t19744.999026812s|1e27b08d2c1b7391|50404|rds|local|vector|||0.147|| @@ -22,25 +22,25 @@ diablo_pls_runs_list|pattern|2f971b2365c57f8f|077baa4499ed4701||168769497||||325 diablo_pls_runs_list_05fb1980|branch|8978e06a81d82296|077baa4499ed4701|808ab8ab13dfe87e|-315925453||t19744.9620049862s|86afaa552152ea05|1183467|rds|local|list|diablo_pls_runs_list||0.819|| diablo_pls_runs_list_1b4ec539|branch|13c6844f5914d08d|077baa4499ed4701|552562782a9af1fc|-1523597582||t19744.9620080562s|5660a35f35395807|295070|rds|local|list|diablo_pls_runs_list||0.014|| diablo_pls_runs_list_4f48d450|branch|3a05360ad3f5dae7|077baa4499ed4701|347c6916a5b7a039|-2051876326||t19744.9620113311s|b76452bf69dba440|1777952|rds|local|list|diablo_pls_runs_list||0.016|| -diablo_silhouette|stem|d684b4319ba75c8f|470351f586cde546|a3f1118815f284c3|1878372648||t19751.9117791012s|ef4fd13b3d44973b|2072|rds|local|vector|||0.048|| +diablo_silhouette|stem|d684b4319ba75c8f|470351f586cde546|c55858bde5192d45|1878372648||t19760.9133943549s|ef4fd13b3d44973b|2072|rds|local|vector|||0.096|| diablo_tune_plot|stem|b615a21be99179e9|8cf07375c3b3d80f|f4985a8965dde29e|-311548008||t19744.9990244999s|c965ce08dcbcf633|1386462|rds|local|vector|||3.082|| diablo_tune_res|stem|3c54bb7e00a94d6c|2e74485360175d64|50019954d23c4902|1659021768||t19744.9989759177s|2dabcffb297d71a5|8626|rds|local|vector|||3113.796|| -fmetadata_file_geno|stem|0d4f9d1abe758d58|8ac42325af16f9cc|0fce92a88a7882f5|987449262|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/a0cb1ab1c9bfde027266aa5d81f33617/moiraine/extdata/genomics_features_info.csv|t19737.0751431053s|e86eccc6c1038d8e|1462543|file|local|vector|||0.007|| -fmetadata_file_metabo|stem|ce74bd2201a2d6ed|e2c11a77fe45b231|ef46db3751d8e999|-1426493726|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/metabolomics_features_info.csv|t19755.0560163722s|9cb4cce6003c5d85|13765|file|local|vector|||9.091|| -fmetadata_file_transcripto|stem|5b0c736c6e2b1870|09300d99d043a94f|ef46db3751d8e999|1741435395|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/bos_taurus_gene_model.gff3|t19755.0560149143s|3c1bc2cfc685286e|47182268|file|local|vector|||0.001|| -fmetadata_geno|stem|6e05fc065a44eb05|6063db1a29e2c1f0|adbbfaf18ae42144|1845751809||t19737.9062294664s|7228e160b348b511|410111|rds|local|vector|||0.222|| +fmetadata_file_geno|stem|96f99116ff2c3d57|8ac42325af16f9cc|0fce92a88a7882f5|987449262|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/genomics_features_info.csv|t19760.8101878463s|b7283f11c3e630c2|1669543|file|local|vector|||5.507|| +fmetadata_file_metabo|stem|ce74bd2201a2d6ed|6185196bd5c98385|ef46db3751d8e999|-1426493726|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/metabolomics_features_info.csv|t19760.8101881967s|9cb4cce6003c5d85|13765|file|local|vector|||8.858|| +fmetadata_file_transcripto|stem|5b0c736c6e2b1870|2bbfffcc26f89d9e|ef46db3751d8e999|1741435395|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/bos_taurus_gene_model.gff3|t19760.8101869821s|3c1bc2cfc685286e|47182268|file|local|vector|||0|| +fmetadata_geno|stem|af6163b7d5aaacbc|6063db1a29e2c1f0|8816cfeb0b7b301c|1845751809||t19760.9099848469s|bdab355fb509891d|411494|rds|local|vector|||2.523|| fmetadata_metabo|stem|2fa264d9731315ae|6530e474805c7677|40a14803581cc40c|-1710108544||t19737.9062248138s|ebd621d71b90c5fd|5459|rds|local|vector|||0.879|| fmetadata_transcripto|stem|452e3b635689568a|588e73874bd5990b|af559c33c19b2822|650025152||t19737.9129876928s|90da4f7e51eb50af|869252|rds|local|vector|||17.12|| go_sets|stem|7ffdf222c8840aa7|8580bd9122b00498|ee58bfe05e566ecf|-177269063||t19751.9104659231s|7dd38b896d946406|318175|rds|local|vector|||6.328|| -go_sets_check|stem|b3cc2e9a1878cf1d|6a4bb9a9d74ee435|ccb517aecd7bbb68|1026252608||t19751.9105428209s|dcfb5579c9d2f932|290|rds|local|vector|||0.181|| -go_sets_filtered|stem|7ffdf222c8840aa7|43b67965f64e9cb0|d89b0c185100311e|-1735543738||t19751.9105373066s|7dd38b896d946406|318175|rds|local|vector|||0.109|| +go_sets_check|stem|b3cc2e9a1878cf1d|6a4bb9a9d74ee435|771b13ed81d15ea7|1026252608||t19760.9115991717s|dcfb5579c9d2f932|290|rds|local|vector|||0.201|| +go_sets_filtered|stem|7ffdf222c8840aa7|43b67965f64e9cb0|62f1d6311addd553|-1735543738||t19760.9115500225s|7dd38b896d946406|318175|rds|local|vector|||0.136|| go_sets_info|stem|06fb22289ecd8b6c|50994798d8f91463|dddf22893782b9e9|-1420349921||t19752.0879908277s|7bc8d1bae53808ec|146002|rds|local|vector|||0.01|| individual_mad_values|pattern|ee9ffe6e9abbd0a3|3f62ad91dcfdbb43||1752911574||||470374|rds|local|list||individual_mad_values_0bdea42a*individual_mad_values_19c0eba7|3.671|| individual_mad_values_0bdea42a|branch|60eab505e8c4eb51|3f62ad91dcfdbb43|103f3778e612df50|1893534945||t19740.1249913993s|7131e0c89f528eea|264412|rds|local|list|individual_mad_values||2.119|| individual_mad_values_19c0eba7|branch|1bcf124bd938c5ce|3f62ad91dcfdbb43|890fb9082e14e05e|-468269286||t19740.1250105147s|58d8c0b1cd192884|205962|rds|local|list|individual_mad_values||1.552|| individual_splsda_input|pattern|ca51724e7fc9b01a|c418d56ed8b0f203||-857610826||||19561155|rds|local|list||individual_splsda_input_a82e0f4d*individual_splsda_input_de775b91|0.979|| -individual_splsda_input_a82e0f4d|branch|50a9706cdd4ee9ee|c418d56ed8b0f203|3d975cbfe46cb92f|-1738760641||t19740.1249540103s|45fe49aa9993b4c7|17963767|rds|local|list|individual_splsda_input||0.78|| -individual_splsda_input_de775b91|branch|ff75668f2223658d|c418d56ed8b0f203|7e765ea9d1c0fe72|-369917504||t19740.1249655874s|d033c0fd6f86b5d4|1597388|rds|local|list|individual_splsda_input||0.199|| +individual_splsda_input_a82e0f4d|branch|50a9706cdd4ee9ee|c418d56ed8b0f203|2b2a1da503e4dcb0|-1738760641||t19760.9115288554s|45fe49aa9993b4c7|17963767|rds|local|list|individual_splsda_input||0.127|| +individual_splsda_input_de775b91|branch|ff75668f2223658d|c418d56ed8b0f203|17779bdbc448ea6b|-369917504||t19760.9115446407s|d033c0fd6f86b5d4|1597388|rds|local|list|individual_splsda_input||0.204|| individual_splsda_perf|pattern|0f4d33c035a896d1|f44bca7322f5e277||376579575||||1135907|rds|local|list||individual_splsda_perf_68d22d74*individual_splsda_perf_746586a5|741.811|| individual_splsda_perf_68d22d74|branch|25dab618328e5358|f44bca7322f5e277|9eeeb150a92bad87|1791752001||t19740.1294384258s|78630102424ba791|570340|rds|local|list|individual_splsda_perf||382.493|| individual_splsda_perf_746586a5|branch|ca46d907d7ee14e8|f44bca7322f5e277|da53f8a8641b68d0|-1591100874||t19740.1335981715s|6c8318840804f011|565567|rds|local|list|individual_splsda_perf||359.318|| @@ -48,46 +48,46 @@ individual_splsda_run|pattern|cb3de8caf946c3ab|daafd73eccc1a544||-1224126645|||| individual_splsda_run_4a7ecf19|branch|7e0a4e3d819dd4ca|daafd73eccc1a544|abdf9eca33556041|-1795274176||t19740.1338336227s|fd667fed47369bab|4784480|rds|local|list|individual_splsda_run||0.23|| individual_splsda_run_fe6f99fe|branch|a6649100bc6735a0|daafd73eccc1a544|ee8b0e2f484e553f|-1795258471||t19740.1338116932s|188f2d9203e75714|39581349|rds|local|list|individual_splsda_run||1.264|| mad_mat|pattern|92b78979f76d8b34|c1c091fc70d5003a||696742516||||12225589|rds|local|list||mad_mat_e428ef62*mad_mat_d5a0e3cc|0.678|| -mad_mat_d5a0e3cc|branch|d409110391e22abd|c1c091fc70d5003a|0f5214dd429ab4b5|663985671||t19740.1249311603s|3a25ff56c2ab5341|1708251|rds|local|list|mad_mat||0.079|| -mad_mat_e428ef62|branch|bd51023c181a45d9|c1c091fc70d5003a|a422ad2cf0af16e2|588923247||t19740.1249194966s|473ba920375be136|10517338|rds|local|list|mad_mat||0.599|| +mad_mat_d5a0e3cc|branch|d409110391e22abd|c1c091fc70d5003a|e562cb6a47e3a5e5|663985671||t19760.9115952651s|3a25ff56c2ab5341|1708251|rds|local|list|mad_mat||0.006|| +mad_mat_e428ef62|branch|bd51023c181a45d9|c1c091fc70d5003a|daa0b1f22cefb3f5|588923247||t19760.9115828414s|473ba920375be136|10517338|rds|local|list|mad_mat||0.013|| mad_spec|stem|c2896ffc95a5b772|a46ba617a0df9ac6|6f5c7957329b075c|1673929129||t19740.1248336064s|23174e8584d69801|187|rds|local|group||mad_spec_c265bd27*mad_spec_8726ff93|2.09|| -mo_presel_supervised|stem|f66d9afd466bd3b1|ad2976ef3ac5c859|bd407bd4520956a2|853638321||t19740.1340079833s|61292318bd232cfd|64512076|rds|local|vector|||0.047|| -mo_presel_unsupervised|stem|b3cbe0b3f9cae9ac|e5ed7b9ba6a9375c|51696773836559a6|912108120||t19740.1337679073s|f1f252f4aac6c91f|65942855|rds|local|vector|||0.108|| -mo_set|stem|1d4d54ce13ecca5d|3230a4751cf4b45d|9b77a47f05b21c4c|-1876565291||t19738.0556140068s|8b6cf5ea29453dd2|36753599|rds|local|vector|||0.117|| -mo_set_complete|stem|d79178dd6687be97|d76a85ef218e0cef|952f06b34b51e191|1739868812||t19739.9583289432s|8817fe0bcb68c9f4|65894487|rds|local|vector|||0.331|| -mo_set_de|stem|2b7e2ace37c0bed5|50f81c565a9dc6aa|1d4929f8d72b5561|1698094396||t19739.0034448046s|fa7930e7b638c680|37442539|rds|local|vector|||0.167|rnaseq dataset 1594 feature IDs missing from df dataframe.| -mo_set_transformed|stem|28334a82bdfebaa7|1a49152e06c5222d|6f732476e2857317|385723480||t19739.9580970037s|5c19986154657d81|57773059|rds|local|vector|||0.252|| -mo_set_with_names|stem|e64ebcd89ddb70bd|b88cddcfa5d2a267|6eebd2f68cb73320|-1640374052||t19738.0568285842s|593ace30823e21f2|36753195|rds|local|vector|||0.114|| -mofa_enrichment_results|stem|78eaab1a0af03fee|ef7cc36ac210afd1|af559c033d9d4f74|-518223786||t19752.0891323677s|a872b808d80823e1|518071|rds|local|vector|||23.964|| -mofa_input|stem|4d8e1c14434288d1|3d5db0316055019b|b1ff01b4e620143d|1284502458||t19746.8899165855s|4110beb5e0ca03cd|877459|rds|local|vector|||0.201|Dataset snps is to be modelled with a poisson likelihood, but is not integer. Transforming to integer.| -mofa_output|stem|5352fa96ef81a7b7|0d8c9707690b395c|e568211333f1077a|-1474909642||t19746.9922984972s|a3806d14d44620e6|524047|rds|local|vector|||0.733|| -mofa_silhouette|stem|38befb8909ac2f5d|b3993a50258515a0|2df9226a5487985b|1827622905||t19751.9114556258s|b9df5b0bdaebf8f4|2178|rds|local|vector|||0.07|| -mofa_trained|stem|f523901c69cc8163|ec971dccb1086e60|dec5748f700e63fc|1854191013||t19746.8912693121s|b341cd3de1b49e2f|1004645|rds|local|vector|||116.597|No output filename provided. Using tmpRtmpaM7XWKmofa_20240125102128.hdf5 to store the trained model.. Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.| -mofa_unsupervised_input|stem|0a98089dfc907e05|1e3b7d3a004de239|ac3a834977ed6c4c|1599690320||t19752.0880774623s|0ebbdb36aed1ab69|1862241|rds|local|vector|||0.377|Dataset snps is to be modelled with a poisson likelihood, but is not integer. Transforming to integer.. Some views have a lot of features, it is recommended to perform a more stringent feature selection before creating the MOFA object....| -mofa_unsupervised_output|stem|263b6a873e1194a4|ac7643002dc78394|5d9397e54d59a2ff|-1183302440||t19752.0887987343s|0f63368c8e1c580a|3341559|rds|local|vector|||0.552|| -mofa_unsupervised_trained|stem|423f9880f08a7437|738e097555904346|ba546a349afa5a2a|-100222010||t19752.0887865648s|ef8edaa43b7a4126|2866074|rds|local|vector|||60.337|No output filename provided. Using tmpRtmpQAfSIqmofa_20240130150649.hdf5 to store the trained model.. Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.| -omicspls_input|stem|488cc165105ef587|5103f8e1eb31dfb4|3fe933389d7e1821|1468063698||t19746.0144579806s|8dac9e868840a7ff|957717|rds|local|vector|||0.009|| -output_list|stem|4a1015dc0956fb48|7dfe1dad22716f50|50d53cde1679035e|1051331949||t19752.0891342382s|f1fc0566a26ef70a|718723|rds|local|vector|||0.001|| -output_list_mofa|stem|5211b4817442846b|b3dd9f735a60c26a|74a746a8e356ffa7|-162484418||t19752.0888057577s|18a087dd760dc5f0|3871242|rds|local|vector|||0.001|| +mo_presel_supervised|stem|8b875da2b4ccefe8|ad2976ef3ac5c859|b5f9643988c4d793|853638321||t19760.912012458s|c8f6dac29fb6dfde|64173732|rds|local|vector|||0.064|| +mo_presel_unsupervised|stem|bdab4c7113254bc5|e5ed7b9ba6a9375c|4d3a0f38bb8b31a6|912108120||t19760.9118005069s|247f47ce1e11a6ad|65504942|rds|local|vector|||0.088|| +mo_set|stem|4af4caf2029afc65|3230a4751cf4b45d|ae36701bccbefb3a|-1876565291||t19760.9103262217s|11af84f3bb84b257|36740447|rds|local|vector|||0.151|| +mo_set_complete|stem|ef49fedec6c2a6ee|d76a85ef218e0cef|7a23c14ec1380e61|1739868812||t19760.9115062799s|0fe0565a78b432a0|65454774|rds|local|vector|||1.285|| +mo_set_de|stem|50a16a083d9e1583|50f81c565a9dc6aa|59b27fe5699505cd|1698094396||t19760.9104758811s|c8c295ab8638ca27|37519429|rds|local|vector|||0.248|| +mo_set_transformed|stem|322fb64587b275fd|1a49152e06c5222d|b073975aedab211e|385723480||t19760.911233169s|df7a4660c8f4b0b4|57371488|rds|local|vector|||0.322|| +mo_set_with_names|stem|9ba6c3d68f30b760|b88cddcfa5d2a267|5a4d4660e143860a|-1640374052||t19760.9101850219s|5b036bf7c0ec24c0|36742890|rds|local|vector|||0.109|| +mofa_enrichment_results|stem|c30cfb639b70ea41|ef7cc36ac210afd1|595b61df14fdd2f6|-518223786||t19760.9133911577s|72b3d4834a95f43c|518039|rds|local|vector|||25.136|| +mofa_input|stem|1e230b468f72f1dc|3d5db0316055019b|8cc660f94be2d3c0|1284502458||t19760.9120570073s|c081e1451c717fc9|877186|rds|local|vector|||0.183|Dataset snps is to be modelled with a poisson likelihood, but is not integer. Transforming to integer.| +mofa_output|stem|832991eafaf5e2b8|0d8c9707690b395c|22865685f5985822|-1474909642||t19760.9130925397s|12b786fd3304177d|523964|rds|local|vector|||0.181|| +mofa_silhouette|stem|42be4e75631b7ba3|b3993a50258515a0|61d2b841058949ce|1827622905||t19760.9130977988s|3263f05a43d601fa|2171|rds|local|vector|||0.331|| +mofa_trained|stem|d42d9b1fe0c5b714|ec971dccb1086e60|e09b842c9958ed5b|1854191013||t19760.9130578127s|eab845adeca5ce35|1004237|rds|local|vector|||5.995|No output filename provided. Using tmpRtmpXFuTOemofa_20240208105441.hdf5 to store the trained model.. Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.| +mofa_unsupervised_input|stem|dd9f4a92794d2b40|1e3b7d3a004de239|ea8efee1e5e6b51c|1599690320||t19760.9120442137s|365ab1683d49c10d|1863094|rds|local|vector|||1.397|Dataset snps is to be modelled with a poisson likelihood, but is not integer. Transforming to integer.. Some views have a lot of features, it is recommended to perform a more stringent feature selection before creating the MOFA object....| +mofa_unsupervised_output|stem|d94bca90cdb4ad4e|ac7643002dc78394|d139ddefe70aec2d|-1183302440||t19760.9130879317s|42f43c3905742086|3341737|rds|local|vector|||1.795|| +mofa_unsupervised_trained|stem|3df12eba9ea6bf35|738e097555904346|e33076f4f3f49a07|-100222010||t19760.9129840522s|9f7a1239d2f6dacc|2867122|rds|local|vector|||78.881|No output filename provided. Using tmpRtmpXFuTOemofa_20240208105321.hdf5 to store the trained model.. Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.| +omicspls_input|stem|488cc165105ef587|5103f8e1eb31dfb4|7b97f60ab0fe03b0|1468063698||t19760.9120467713s|8dac9e868840a7ff|957717|rds|local|vector|||0.008|| +output_list|stem|c7a3e3c14900a5ab|7dfe1dad22716f50|edb4856bd89681aa|1051331949||t19760.8171251591s|ce4e8d1e45c7f38c|718611|rds|local|vector|||0|| +output_list_mofa|stem|548c1ad8cf923c8c|b3dd9f735a60c26a|960e8522407d7750|-162484418||t19760.8168319398s|7174064e9e187a05|3871404|rds|local|vector|||0.001|| pca_mats_list|pattern|c831051151e4add2|72b302a65c0920ed||1078442447||||12164806|rds|local|list||pca_mats_list_302d7473*pca_mats_list_84d36937*pca_mats_list_64d37e6c|0.09|| -pca_mats_list_302d7473|branch|e839c68784be56c5|72b302a65c0920ed|0f98021e133aac1d|-46563577||t19739.9581108254s|1b793e6da03f6fbf|1616638|rds|local|list|pca_mats_list||0.072|| -pca_mats_list_64d37e6c|branch|ee5587d92df571f6|72b302a65c0920ed|515ffe317be4aadd|31292255||t19739.9581241653s|73622126bd00a83a|30830|rds|local|list|pca_mats_list||0.001|| -pca_mats_list_84d36937|branch|bd51023c181a45d9|72b302a65c0920ed|e27f6ba6c7a2844e|427986228||t19739.9581229363s|473ba920375be136|10517338|rds|local|list|pca_mats_list||0.017|| +pca_mats_list_302d7473|branch|e839c68784be56c5|72b302a65c0920ed|36d25fb386b57c86|-46563577||t19760.9112518596s|1b793e6da03f6fbf|1616638|rds|local|list|pca_mats_list||0.015|| +pca_mats_list_64d37e6c|branch|ee5587d92df571f6|72b302a65c0920ed|bd3427499db985c1|31292255||t19760.9112670563s|73622126bd00a83a|30830|rds|local|list|pca_mats_list||0.001|| +pca_mats_list_84d36937|branch|bd51023c181a45d9|72b302a65c0920ed|5755ba948e236dd2|427986228||t19760.9112650514s|473ba920375be136|10517338|rds|local|list|pca_mats_list||0.006|| pca_runs_list|pattern|1a2e2f85dc6ad23b|54876449cf65c389||823147665||||51897|rds|local|list||pca_runs_list_74d71ae8*pca_runs_list_71fd94b4*pca_runs_list_559272f0|0.949|| pca_runs_list_559272f0|branch|34ed84837089d5b3|54876449cf65c389|97c3be9a932c6998|543096987||t19739.9581361475s|1a6f14b0ab9eae14|51897|rds|local|list|pca_runs_list||0.949|| pca_runs_list_71fd94b4|branch|cebdffa9f5582b5a|54876449cf65c389|a0a7b01d4aec147f|2040141543||t19739.0658292644s|a331ada14cb628e2|19878383|rds|local|list|pca_runs_list||1.406|| pca_runs_list_74d71ae8|branch|120c796514a127df|54876449cf65c389|8bad1210ebde9da0|1379536384||t19739.0657990151s|67033f5f3480d9ec|3746254|rds|local|list|pca_runs_list||193.805|| -rnaseq_de_res_df|stem|ce4a697cd33652ca|518ea4983babaf6b|2842dca2da1c0ff8|-2101569842||t19739.0032623849s|ede16ea5ac2dbdca|754990|rds|local|vector|||4.685|| -rnaseq_de_res_file|stem|200c15aa31f72486|c4cb79c8aa9f6731|0fce92a88a7882f5|2074595899|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/a0cb1ab1c9bfde027266aa5d81f33617/moiraine/extdata/transcriptomics_de_results.csv|t19737.0751439619s|1bac4f09e291f89f|2468491|file|local|vector|||0.057|| +rnaseq_de_res_df|stem|4b9d0d74f4be0eb1|518ea4983babaf6b|da2a628b885490e0|-2101569842||t19760.9099928214s|4218e4ac289eaf50|761485|rds|local|vector|||0.514|| +rnaseq_de_res_file|stem|02151c0e67f0ec93|c4cb79c8aa9f6731|0fce92a88a7882f5|2074595899|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/transcriptomics_de_results.csv|t19760.810189284s|94ce911f55c943c2|2531122|file|local|vector|||0.018|| rnaseq_go_df|stem|24af4f9441f38297|6f6bcef47e41e0c8|c05fd6c9e17f9bb0|-1266498262||t19751.910390816s|318949ab3b22ee5c|943165|rds|local|vector|||1.685|| rnaseq_go_terms_file|stem|c0341c2d582dc5df|9a90238124a851b5|0fce92a88a7882f5|929094615|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/7e39d6614134fc474e6b85ec2516a5b6/moiraine/extdata/transcriptomics_go_annotation.csv|t19747.8725059398s|a457916072655f7b|14795612|file|local|vector|||0.004|| -set_geno|stem|b9a63471a2bae355|6d0f65ce2b5dfcc3|53cc5826dcb4a6d2|1285324786||t19738.0475523002s|19e8c5270d1eb961|2173155|rds|local|vector|||1.075|5 samples in samples metadata not in dataset, will be removed from metadata.| -set_metabo|stem|0d94569ea56d374d|c474bc703c42933a|608f12a275630935|1932753424||t19738.0474809317s|ed98fcecc594d702|29765|rds|local|vector|||0.06|5 samples in samples metadata not in dataset, will be removed from metadata.| -set_transcripto|stem|a34ee2565470dabc|ab4282af2718b58e|4a163e482e11d826|1396440415||t19738.0475239992s|5602925ca953b1da|7190802|rds|local|vector|||0.972|7272 features in feature metadata not in dataset, will be removed from metadata.. 1 samples in samples metadata not in dataset, will be removed from metadata.| -sets_single_omics|stem|6c9d7b9ce5692904|f6ad7105f54099d1|1f67dbd346185358|-1183795778||t19751.910540475s|e8277a3f81b8307a|151813|rds|local|vector|||0.109|| -sets_single_omics_merged|stem|b86357759a164f38|302296f4fb29a59b|1f67dbd346185358|-1233894373||t19751.91053864s|da3ba92b97994370|151530|rds|local|vector|||0.06|| -smetadata_all|stem|ab53a5d6797cc718|6b4aea71b616cb74|a19772ceb5ec11de|-937728991||t19737.9793081304s|f1652d5360365c83|4520|rds|local|vector|||0.784|| -smetadata_file_all|stem|334b548c7e00bff1|36b6e66ff33bcdb8|ef46db3751d8e999|1816987930|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/374510e4d81eb0e4c39d632b2b65ad28/moiraine/extdata/samples_info.csv|t19755.0560164018s|70b525cc81b75a3d|7970|file|local|vector|||0|| +set_geno|stem|1c5e2e32e046fa05|6d0f65ce2b5dfcc3|398cbd8161dd2584|1285324786||t19760.910027823s|0a2ac61851821322|2174735|rds|local|vector|||0.742|5 samples in samples metadata not in dataset, will be removed from metadata.| +set_metabo|stem|0d94569ea56d374d|c474bc703c42933a|b8f2b77ffe971256|1932753424||t19760.8133196047s|ed98fcecc594d702|29765|rds|local|vector|||0.072|5 samples in samples metadata not in dataset, will be removed from metadata.| +set_transcripto|stem|eff105e2bc2ed1af|ab4282af2718b58e|ef42e38ef7b96a2f|1396440415||t19760.8133633043s|647f77abcb7e52df|7190799|rds|local|vector|||0.067|7272 features in feature metadata not in dataset, will be removed from metadata.. 1 samples in samples metadata not in dataset, will be removed from metadata.| +sets_single_omics|stem|aa2717544717bc25|f6ad7105f54099d1|59d155d021f79e4e|-1183795778||t19760.9115663861s|ffa22187a12eb2d6|150741|rds|local|vector|||1.289|| +sets_single_omics_merged|stem|4930cd9ca4e789ff|302296f4fb29a59b|59d155d021f79e4e|-1233894373||t19760.9115693456s|c4e46b53c2403add|150687|rds|local|vector|||0.097|| +smetadata_all|stem|74e26063c5a54133|6b4aea71b616cb74|514e9844c1f15272|-937728991||t19760.8132782248s|de1050be8c5f2839|4519|rds|local|vector|||3.157|| +smetadata_file_all|stem|73ff2a067875b30c|ab2f33a5d0cd266e|ef46db3751d8e999|1816987930|/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/samples_info.csv|t19760.8101883293s|37af6ec94ad72ffc|7968|file|local|vector|||0|| so2pls_cv|stem|01c3e0f6ea779863|21e77ca6aee4664c|2fe8bf94339f8db8|1111841932||t19746.0262490569s|58772b208bb3c33b|420|rds|local|vector|||341.124|| so2pls_cv_adj|stem|462835eb42a1a462|fd93850ca6adee40|0f6ca247cd6a95ea|710052968||t19746.0222975888s|71e695e858e0833c|250|rds|local|vector|||474.616|| so2pls_cv_adj_plot|stem|048bba2eb50ed68a|9e2bdae32bcd502a|60b2a8e2ed9491fe|-2142098915||t19746.026251263s|4a215a353ab56115|130449|rds|local|vector|||0.109|| @@ -102,7 +102,7 @@ so2pls_final_run|stem|1b5fda3f0c9ef4de|16cefdd61090d51e|2dad9253d5d29425|-173173 so2pls_output|stem|a5eca781575f961d|c5a60834f955fae6|71196bf0103fc69c|236025425||t19746.9923031487s|c7ea9b7f646d2838|130837|rds|local|vector|||0.225|| so2pls_output_no_average|stem|d5a8f2b14dec6fb7|b225132f8f3d4451|71196bf0103fc69c|-886261613||t19747.0777562921s|d3f8ef5c8e7df8b4|131975|rds|local|vector|||0.242|| spls_final_run|stem|aa85c5b6a3d8ec0c|bd201898ff611d8b|ae125251e89a9069|-1455060732||t19745.8622943744s|87decae32b6cb84a|1828750|rds|local|vector|||0.024|| -spls_input|stem|822f9a95396547da|3096087fd4d5c989|cb02bfd15d457e4a|70678725||t19745.8585853016s|8f898ab1f7e895d8|838523|rds|local|vector|||0.029|| +spls_input|stem|822f9a95396547da|3096087fd4d5c989|521c2f143a3ba49c|70678725||t19760.9120525951s|8f898ab1f7e895d8|838523|rds|local|vector|||0.053|| spls_multilevel1|stem|21cb78d9bdf5ef8f|740ca0497728ae2d|15eb1ccc2d3995df|-1820918706||t19745.8585170022s|bbe0e43529942e5e|163|rds|local|vector|||0.25|| spls_multilevel2|stem|27547dc59b1b797d|de611361e6a5ff7d|1cd1f9a9228aec67|-2126981166||t19745.8585179626s|c8c79f11dd07570f|276|rds|local|vector|||0.064|| spls_novarsel|stem|2073bd192ac0dfda|30372f335fc03181|d6f3e150a3c8976b|-1501000619||t19745.8585960049s|fdd5d4e3f6846793|1911012|rds|local|vector|||0.782|| @@ -118,6 +118,6 @@ spls_tune_res|stem|1a10b4c5302f3a02|53cb577fb9de7eff|bee4d2217b99a114|-584594170 splsda_spec|stem|7afcf563c24fd03b|33174bbcb4aaf133|6f5c7957329b075c|-1585633399||t19740.1248351517s|4a62745a16bcf9e1|179|rds|local|group||splsda_spec_3e93005d*splsda_spec_5f804ca7|0.066|| test_multilevel|function|501089a14b77d076||||||||||||||| transformations_runs_list|pattern|a17a7d845523fd40|c8afd5249d4f8349||1365652552||||21828273|rds|local|list||transformations_runs_list_7a466037*transformations_runs_list_a1c8db41|24.685|| -transformations_runs_list_7a466037|branch|068ba2dd9c545230|c8afd5249d4f8349|04a5ef380e25f762|-111181846||t19739.9576385053s|a4873a9be45be919|91816|rds|local|list|transformations_runs_list||0.962|| -transformations_runs_list_a1c8db41|branch|b202e3c15c9d3f9b|c8afd5249d4f8349|8bd44408b81f482d|-1681741006||t19739.9579365109s|265e230816f68f72|21736457|rds|local|list|transformations_runs_list||23.723|| +transformations_runs_list_7a466037|branch|068ba2dd9c545230|c8afd5249d4f8349|14c62e5ef2d500a5|-111181846||t19760.9105794105s|a4873a9be45be919|91816|rds|local|list|transformations_runs_list||8.551|| +transformations_runs_list_a1c8db41|branch|b202e3c15c9d3f9b|c8afd5249d4f8349|8543dc4c393f18fd|-1681741006||t19760.9110565952s|265e230816f68f72|21736457|rds|local|list|transformations_runs_list||38.931|| transformations_spec|stem|996fe3b7903fddf9|63e38e995f234268|c92d2a596f72fe8f|-773680173||t19739.0592335968s|d3c04794784e4c77|239|rds|local|group||transformations_spec_706d138f*transformations_spec_2e2c442e|6.724|| diff --git a/docs/comparison_files/figure-html/plot-features-weight-average-1.png b/docs/comparison_files/figure-html/plot-features-weight-average-1.png index fd7d93d..ba70dfb 100644 Binary files a/docs/comparison_files/figure-html/plot-features-weight-average-1.png and b/docs/comparison_files/figure-html/plot-features-weight-average-1.png differ diff --git a/docs/comparison_files/figure-html/plot-features-weight-pair-1.png b/docs/comparison_files/figure-html/plot-features-weight-pair-1.png index 1a180b4..3b72bd2 100644 Binary files a/docs/comparison_files/figure-html/plot-features-weight-pair-1.png and b/docs/comparison_files/figure-html/plot-features-weight-pair-1.png differ diff --git a/docs/comparison_files/figure-html/plot-features-weight-raw-1.png b/docs/comparison_files/figure-html/plot-features-weight-raw-1.png index ed13229..bed365b 100644 Binary files a/docs/comparison_files/figure-html/plot-features-weight-raw-1.png and b/docs/comparison_files/figure-html/plot-features-weight-raw-1.png differ diff --git a/docs/comparison_files/figure-html/plot-features_weight-pair-mofa-1.png b/docs/comparison_files/figure-html/plot-features_weight-pair-mofa-1.png index b62cf04..cf57203 100644 Binary files a/docs/comparison_files/figure-html/plot-features_weight-pair-mofa-1.png and b/docs/comparison_files/figure-html/plot-features_weight-pair-mofa-1.png differ diff --git a/docs/comparison_files/figure-html/plot-samples-score-pair-1.png b/docs/comparison_files/figure-html/plot-samples-score-pair-1.png index 9d5cd27..b643345 100644 Binary files a/docs/comparison_files/figure-html/plot-samples-score-pair-1.png and b/docs/comparison_files/figure-html/plot-samples-score-pair-1.png differ diff --git a/docs/data_import.html b/docs/data_import.html index e40df9a..407197c 100644 --- a/docs/data_import.html +++ b/docs/data_import.html @@ -394,7 +394,7 @@

tar_read(dataset_file_geno)
-#> [1] "/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/7e39d6614134fc474e6b85ec2516a5b6/moiraine/extdata/genomics_dataset.csv"
+#> [1] "/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/genomics_dataset.csv"

The next step is to import this dataset in R. We use the import_dataset_csv() function for that, rather than the readr::read_csv() or similar functions, as it ensures that the data is imported with the correct format for further use with the moiraine package. When importing a dataset, we need to specify the path to the file, as well as the name of the column in the csv file that contains the row names (through the col_id argument). In addition, we need to specify whether the features are represented in rows in the csv file, or in columns. This is done through the argument features_as_rows. For example, we can load the genomics dataset through:

@@ -496,13 +496,13 @@

#> 10-49904259-G-A-rs471723345 0.7970 A G TOP #> 1-109550832-G-A-rs209732846 0.8909 T C BOT #> 11-104555023-A-G-rs109353933 0.8673 T C BOT -#> customer_strand norm_id qtl_type qtl_effect -#> 1_41768691 BOT 2 <NA> NA -#> 10-27008241-A-C-rs42918694 TOP 1 <NA> NA -#> 10-37505419-T-C-rs136559242 BOT 1 <NA> NA -#> 10-49904259-G-A-rs471723345 TOP 2 <NA> NA -#> 1-109550832-G-A-rs209732846 TOP 3 <NA> NA -#> 11-104555023-A-G-rs109353933 TOP 1 <NA> NA +#> customer_strand norm_id qtl_type qtl_effect +#> 1_41768691 BOT 2 non signif. NA +#> 10-27008241-A-C-rs42918694 TOP 1 non signif. NA +#> 10-37505419-T-C-rs136559242 BOT 1 non signif. NA +#> 10-49904259-G-A-rs471723345 TOP 2 non signif. NA +#> 1-109550832-G-A-rs209732846 TOP 3 non signif. NA +#> 11-104555023-A-G-rs109353933 TOP 1 non signif. NA #> p_value fdr #> 1_41768691 NA NA #> 10-27008241-A-C-rs42918694 NA NA @@ -762,13 +762,13 @@

#> 10-49904259-G-A-rs471723345 0.7970 A G TOP #> 1-109550832-G-A-rs209732846 0.8909 T C BOT #> 11-104555023-A-G-rs109353933 0.8673 T C BOT -#> customer_strand norm_id qtl_type qtl_effect -#> 1_41768691 BOT 2 <NA> NA -#> 10-27008241-A-C-rs42918694 TOP 1 <NA> NA -#> 10-37505419-T-C-rs136559242 BOT 1 <NA> NA -#> 10-49904259-G-A-rs471723345 TOP 2 <NA> NA -#> 1-109550832-G-A-rs209732846 TOP 3 <NA> NA -#> 11-104555023-A-G-rs109353933 TOP 1 <NA> NA +#> customer_strand norm_id qtl_type qtl_effect +#> 1_41768691 BOT 2 non signif. NA +#> 10-27008241-A-C-rs42918694 TOP 1 non signif. NA +#> 10-37505419-T-C-rs136559242 BOT 1 non signif. NA +#> 10-49904259-G-A-rs471723345 TOP 2 non signif. NA +#> 1-109550832-G-A-rs209732846 TOP 3 non signif. NA +#> 11-104555023-A-G-rs109353933 TOP 1 non signif. NA #> p_value fdr #> 1_41768691 NA NA #> 10-27008241-A-C-rs42918694 NA NA diff --git a/docs/evaluation.html b/docs/evaluation.html index 1a75f83..514cd9e 100644 --- a/docs/evaluation.html +++ b/docs/evaluation.html @@ -364,7 +364,7 @@

get_features_metadata(mo_set_complete)[["snps"]] |> 
   pull(qtl_type) |> 
   unique()
-#> [1] NA           "cis eQTL"   "trans eQTL" "QTL"

+#> [1] "non signif." "cis eQTL" "trans eQTL" "QTL"

For the transcriptomics and metabolomics dataset, a differential expression (DE) analysis was performed on each of them to compare control and BRD animals. The resulting adjusted p-value, log2-fold change or t-value, status (upregulated, downregulated or not differentially expressed) and significance (differentially expressed or not) of each gene or compound are recorded in each dataset’s features metadata:

@@ -420,33 +420,31 @@

diablo_evaluation_counts_table |> filter(latent_dimension == "Component 1") -#> # A tibble: 9 × 6 +#> # A tibble: 8 × 6 #> method latent_dimension dataset feature_label selected not_selected #> <chr> <fct> <fct> <chr> <int> <int> #> 1 DIABLO Component 1 snps cis eQTL 1 2 -#> 2 DIABLO Component 1 snps QTL 1 0 -#> 3 DIABLO Component 1 snps trans eQTL 1 3 -#> 4 DIABLO Component 1 snps <NA> 22 970 +#> 2 DIABLO Component 1 snps non signif. 22 970 +#> 3 DIABLO Component 1 snps QTL 1 0 +#> 4 DIABLO Component 1 snps trans eQTL 1 3 #> 5 DIABLO Component 1 rnaseq DE 20 55 -#> 6 DIABLO Component 1 rnaseq Not DE 10 782 -#> 7 DIABLO Component 1 rnaseq <NA> 0 127 -#> 8 DIABLO Component 1 metabolome DE 10 20 -#> 9 DIABLO Component 1 metabolome Not DE 0 25 +#> 6 DIABLO Component 1 rnaseq Not DE 10 909 +#> 7 DIABLO Component 1 metabolome DE 10 20 +#> 8 DIABLO Component 1 metabolome Not DE 0 25 diablo_evaluation_counts_table |> filter(latent_dimension == "Component 2") -#> # A tibble: 9 × 6 +#> # A tibble: 8 × 6 #> method latent_dimension dataset feature_label selected not_selected #> <chr> <fct> <fct> <chr> <int> <int> #> 1 DIABLO Component 2 snps cis eQTL 0 3 -#> 2 DIABLO Component 2 snps QTL 0 1 -#> 3 DIABLO Component 2 snps trans eQTL 0 4 -#> 4 DIABLO Component 2 snps <NA> 25 967 +#> 2 DIABLO Component 2 snps non signif. 25 967 +#> 3 DIABLO Component 2 snps QTL 0 1 +#> 4 DIABLO Component 2 snps trans eQTL 0 4 #> 5 DIABLO Component 2 rnaseq DE 0 75 -#> 6 DIABLO Component 2 rnaseq Not DE 30 762 -#> 7 DIABLO Component 2 rnaseq <NA> 0 127 -#> 8 DIABLO Component 2 metabolome DE 3 27 -#> 9 DIABLO Component 2 metabolome Not DE 2 23

+#> 6 DIABLO Component 2 rnaseq Not DE 30 889 +#> 7 DIABLO Component 2 metabolome DE 3 27 +#> 8 DIABLO Component 2 metabolome Not DE 2 23

We can see that for the first latent component, only three out of the eight (e)QTLs were selected 1; two-third of the genes selected were found differentially expressed; and all ten of the selected compounds were found differentially expressed. Conversely, for the second latent component, none of the selected markers were QTLs, and none of the selected genes were differentially expressed. This makes sense, as the DIABLO analysis was run with the goal of separating the control and infected animals; therefore it makes sense that the features selected for the first latent component, which is the one best able to separate the groups, are the features detected as differentially expressed. On the contrary, the second latent component is constructed to be orthogonal to the first one, therefore the features selected will likely not be differentially expressed.

With this function, we can focus on only some datasets, by changing which datasets are present in the list passed to col_names. Similarly, we can select specific latent dimensions through the latent_dimensions parameter. For example, let us count the number of DE genes selected with the first latent component:

@@ -457,12 +455,11 @@

= list("rnaseq" = "de_signif"), latent_dimensions = "Component 1" ) -#> # A tibble: 3 × 6 +#> # A tibble: 2 × 6 #> method latent_dimension dataset feature_label selected not_selected #> <chr> <fct> <fct> <chr> <int> <int> #> 1 DIABLO Component 1 rnaseq DE 20 55 -#> 2 DIABLO Component 1 rnaseq Not DE 10 782 -#> 3 DIABLO Component 1 rnaseq <NA> NA 127 +#> 2 DIABLO Component 1 rnaseq Not DE 10 909

Note that this function is useful for integration methods that perform feature selection, such as DIABLO or sO2PLS, but will be irrelevant for methods that do not perform feature selection (for example MOFA tends to assign a non-null weight to most features).

@@ -573,13 +570,12 @@

tar_read(sets_single_omics) |> 
   str()
-#> List of 11
-#>  $ NA - snps                 : chr [1:23000] "1_41768691" "10-27008241-A-C-rs42918694" "10-37505419-T-C-rs136559242" "10-49904259-G-A-rs471723345" ...
+#> List of 10
+#>  $ non signif.               : chr [1:23000] "1_41768691" "10-27008241-A-C-rs42918694" "10-37505419-T-C-rs136559242" "10-49904259-G-A-rs471723345" ...
 #>  $ cis eQTL                  : chr [1:31] "ARS-BFGL-BAC-13210" "ARS-BFGL-NGS-113310" "ARS-BFGL-NGS-5022" "ARS-BFGL-NGS-59463" ...
 #>  $ trans eQTL                : chr [1:4] "ARS-BFGL-NGS-80280" "BovineHD0100032240" "BovineHD2300010006" "Hapmap55381-rs29025399"
 #>  $ QTL                       : chr "BovineHD1800016801"
-#>  $ Not DE - rnaseq           : chr [1:18630] "ENSBTAG00000000005" "ENSBTAG00000000008" "ENSBTAG00000000009" "ENSBTAG00000000010" ...
-#>  $ NA - rnaseq               : chr [1:1594] "ENSBTAG00000000029" "ENSBTAG00000000071" "ENSBTAG00000000102" "ENSBTAG00000000106" ...
+#>  $ Not DE - rnaseq           : chr [1:20224] "ENSBTAG00000000005" "ENSBTAG00000000008" "ENSBTAG00000000009" "ENSBTAG00000000010" ...
 #>  $ upregulated - rnaseq      : chr [1:102] "ENSBTAG00000000377" "ENSBTAG00000000783" "ENSBTAG00000001051" "ENSBTAG00000001785" ...
 #>  $ downregulated - rnaseq    : chr [1:9] "ENSBTAG00000001032" "ENSBTAG00000004824" "ENSBTAG00000011990" "ENSBTAG00000012403" ...
 #>  $ Not DE - metabolome       : chr [1:25] "HMDB00001" "HMDB00008" "HMDB00060" "HMDB00097" ...
@@ -605,11 +601,11 @@ 

tar_read(sets_single_omics_merged) |> 
   str()
 #> List of 7
-#>  $ NA           : chr [1:24594] "1_41768691" "10-27008241-A-C-rs42918694" "10-37505419-T-C-rs136559242" "10-49904259-G-A-rs471723345" ...
+#>  $ non signif.  : chr [1:23000] "1_41768691" "10-27008241-A-C-rs42918694" "10-37505419-T-C-rs136559242" "10-49904259-G-A-rs471723345" ...
 #>  $ cis eQTL     : chr [1:31] "ARS-BFGL-BAC-13210" "ARS-BFGL-NGS-113310" "ARS-BFGL-NGS-5022" "ARS-BFGL-NGS-59463" ...
 #>  $ trans eQTL   : chr [1:4] "ARS-BFGL-NGS-80280" "BovineHD0100032240" "BovineHD2300010006" "Hapmap55381-rs29025399"
 #>  $ QTL          : chr "BovineHD1800016801"
-#>  $ Not DE       : chr [1:18655] "ENSBTAG00000000005" "ENSBTAG00000000008" "ENSBTAG00000000009" "ENSBTAG00000000010" ...
+#>  $ Not DE       : chr [1:20249] "ENSBTAG00000000005" "ENSBTAG00000000008" "ENSBTAG00000000009" "ENSBTAG00000000010" ...
 #>  $ upregulated  : chr [1:112] "ENSBTAG00000000377" "ENSBTAG00000000783" "ENSBTAG00000001051" "ENSBTAG00000001785" ...
 #>  $ downregulated: chr [1:29] "ENSBTAG00000001032" "ENSBTAG00000004824" "ENSBTAG00000011990" "ENSBTAG00000012403" ...

diff --git a/docs/evaluation_files/figure-html/plot-features-weight-covariate-all-1.png b/docs/evaluation_files/figure-html/plot-features-weight-covariate-all-1.png index a6df433..e07ea29 100644 Binary files a/docs/evaluation_files/figure-html/plot-features-weight-covariate-all-1.png and b/docs/evaluation_files/figure-html/plot-features-weight-covariate-all-1.png differ diff --git a/docs/evaluation_files/figure-html/plot-features-weight-covariate-nonnull-1.png b/docs/evaluation_files/figure-html/plot-features-weight-covariate-nonnull-1.png index 1724388..dd9dc1a 100644 Binary files a/docs/evaluation_files/figure-html/plot-features-weight-covariate-nonnull-1.png and b/docs/evaluation_files/figure-html/plot-features-weight-covariate-nonnull-1.png differ diff --git a/docs/evaluation_files/figure-html/plot-features-weight-set-1.png b/docs/evaluation_files/figure-html/plot-features-weight-set-1.png index 3f218da..a5feb1d 100644 Binary files a/docs/evaluation_files/figure-html/plot-features-weight-set-1.png and b/docs/evaluation_files/figure-html/plot-features-weight-set-1.png differ diff --git a/docs/evaluation_files/figure-html/plot-features-weight-set-with-missing-1.png b/docs/evaluation_files/figure-html/plot-features-weight-set-with-missing-1.png index b9bad66..d5f1190 100644 Binary files a/docs/evaluation_files/figure-html/plot-features-weight-set-with-missing-1.png and b/docs/evaluation_files/figure-html/plot-features-weight-set-with-missing-1.png differ diff --git a/docs/index.html b/docs/index.html index dd91f1f..2c38f79 100644 --- a/docs/index.html +++ b/docs/index.html @@ -301,7 +301,7 @@

The moiraine R package user manual

Preface

The moiraine package

Omics datasets provide an overview of the content of cells for a specific molecular layer (e.g. transcriptome, proteome, metabolome). By integrating different omics datasets obtained on the same biological samples, we can gain a deeper understanding of the interactions between these molecular layers, and shed light on the regulations occurring both within and between layers. A number of statistical methods have been developed to extract such information from multi-omics datasets, and many have been implemented in software such as R packages. However, these tools differ conceptually, in terms of the input data they require, the assumptions they make, the statistical approaches they use or even the questions they answers. They also differ at a practical level in terms of the format required for data input, the parameters to tune or select, and the format in which the results are returned. These differences render the application of several integration tools to a multi-omics dataset and the comparison of their results complex and time-consuming.

-

The moiraine package aims at alleviating these issues, by providing a framework to easily and consistently apply different integration tools to a same multi-omics dataset. It implements numerous visualisation and reporting functions to facilitate the interpretation of the integration results, and facilitates the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, moiraine heavily relies on the targets package for the construction of reproducible analysis pipelines.

+

The moiraine package aims at alleviating these issues, by providing a framework to easily and consistently apply different integration tools to a same multi-omics dataset. It implements numerous visualisation and reporting functions to facilitate the interpretation of the integration results as well as the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, moiraine heavily relies on the targets package for the construction of reproducible analysis pipelines.

About this manual

In this manual, we are showcasing the functionalities of the moiraine package by presenting an in-depth walk-through example of a multi-omics integration analysis. This will not only talk about the how in terms of R functions etc, but also talk about the integration methods and how to use them.

Here, say that we heavily recommend to be familiar with targets (teaching targets it out of the scope of this manual, and we refer to the excellent targets manual).

diff --git a/docs/inspecting_multidataset.html b/docs/inspecting_multidataset.html index eb66c7d..b01ada4 100644 --- a/docs/inspecting_multidataset.html +++ b/docs/inspecting_multidataset.html @@ -427,7 +427,7 @@

#> ..$ ilmn_strand : chr [1:23036] "BOT" "TOP" "TOP" "TOP" ... #> ..$ customer_strand: chr [1:23036] "BOT" "TOP" "BOT" "TOP" ... #> ..$ norm_id : num [1:23036] 2 1 1 2 3 1 3 3 0 0 ... -#> ..$ qtl_type : chr [1:23036] NA NA NA NA ... +#> ..$ qtl_type : chr [1:23036] "non signif." "non signif." "non signif." "non signif." ... #> ..$ qtl_effect : num [1:23036] NA NA NA NA NA NA NA NA NA NA ... #> ..$ p_value : num [1:23036] NA NA NA NA NA NA NA NA NA NA ... #> ..$ fdr : num [1:23036] NA NA NA NA NA NA NA NA NA NA ... diff --git a/docs/interpretation.html b/docs/interpretation.html index be9dac2..80d007a 100644 --- a/docs/interpretation.html +++ b/docs/interpretation.html @@ -918,7 +918,13 @@

= "geno_comp_cluster", scale_colour_lower = palette_geno_comp ) + - theme(legend.box = "vertical") + theme(legend.box = "vertical") +#> Warning: Removed 2 rows containing missing values (`geom_point()`). +#> Removed 2 rows containing missing values (`geom_point()`). +#> Removed 2 rows containing missing values (`geom_point()`). +#> Removed 2 rows containing missing values (`geom_point()`). +#> Removed 2 rows containing missing values (`geom_point()`). +#> Removed 2 rows containing missing values (`geom_point()`).

@@ -998,7 +1004,8 @@

= "status", shape_by = "geno_comp_cluster" ) + - palette_status + palette_status +#> Warning: Removed 2 rows containing missing values (`geom_point()`).

@@ -1076,7 +1083,8 @@

= "geno_comp_cluster", latent_dimensions = paste("Factor", 1:2) ) + - palette_status_fill + palette_status_fill +#> Warning: Removed 4 rows containing missing values (`geom_point()`).

diff --git a/docs/interpretation_files/figure-html/diablo-features-weight-pair-1.png b/docs/interpretation_files/figure-html/diablo-features-weight-pair-1.png index 55349d4..489e674 100644 Binary files a/docs/interpretation_files/figure-html/diablo-features-weight-pair-1.png and b/docs/interpretation_files/figure-html/diablo-features-weight-pair-1.png differ diff --git a/docs/interpretation_files/figure-html/diablo-plot-top-features-heatmap-1.png b/docs/interpretation_files/figure-html/diablo-plot-top-features-heatmap-1.png index 3d755a3..8b09620 100644 Binary files a/docs/interpretation_files/figure-html/diablo-plot-top-features-heatmap-1.png and b/docs/interpretation_files/figure-html/diablo-plot-top-features-heatmap-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-features-weight-pair-1.png b/docs/interpretation_files/figure-html/mofa-features-weight-pair-1.png index e7dd75a..1e43bda 100644 Binary files a/docs/interpretation_files/figure-html/mofa-features-weight-pair-1.png and b/docs/interpretation_files/figure-html/mofa-features-weight-pair-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-features-weight-distr-1.png b/docs/interpretation_files/figure-html/mofa-plot-features-weight-distr-1.png index c826bb5..1795215 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-features-weight-distr-1.png and b/docs/interpretation_files/figure-html/mofa-plot-features-weight-distr-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cat-1.png b/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cat-1.png index 28bc854..1712846 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cat-1.png and b/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cat-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cont-1.png b/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cont-1.png index 3d6985f..48c5a0e 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cont-1.png and b/docs/interpretation_files/figure-html/mofa-plot-samples-score-covariate-cont-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-samples-score-pair-1.png b/docs/interpretation_files/figure-html/mofa-plot-samples-score-pair-1.png index 2389038..7802d7d 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-samples-score-pair-1.png and b/docs/interpretation_files/figure-html/mofa-plot-samples-score-pair-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-samples-scores-1.png b/docs/interpretation_files/figure-html/mofa-plot-samples-scores-1.png index f92579d..bb1d236 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-samples-scores-1.png and b/docs/interpretation_files/figure-html/mofa-plot-samples-scores-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-top-features-1.png b/docs/interpretation_files/figure-html/mofa-plot-top-features-1.png index f2c8189..e5459ec 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-top-features-1.png and b/docs/interpretation_files/figure-html/mofa-plot-top-features-1.png differ diff --git a/docs/interpretation_files/figure-html/mofa-plot-top-features-heatmap-1.png b/docs/interpretation_files/figure-html/mofa-plot-top-features-heatmap-1.png index 470f89d..e8f2812 100644 Binary files a/docs/interpretation_files/figure-html/mofa-plot-top-features-heatmap-1.png and b/docs/interpretation_files/figure-html/mofa-plot-top-features-heatmap-1.png differ diff --git a/docs/interpretation_files/figure-html/so2pls-features-weight-pair-1.png b/docs/interpretation_files/figure-html/so2pls-features-weight-pair-1.png index 2c5f3e9..7c6b668 100644 Binary files a/docs/interpretation_files/figure-html/so2pls-features-weight-pair-1.png and b/docs/interpretation_files/figure-html/so2pls-features-weight-pair-1.png differ diff --git a/docs/interpretation_files/figure-html/so2pls-plot-top-features-heatmap-1.png b/docs/interpretation_files/figure-html/so2pls-plot-top-features-heatmap-1.png index 8a18c6a..f2c1e79 100644 Binary files a/docs/interpretation_files/figure-html/so2pls-plot-top-features-heatmap-1.png and b/docs/interpretation_files/figure-html/so2pls-plot-top-features-heatmap-1.png differ diff --git a/docs/interpretation_files/figure-html/spls-features-weight-pair-1.png b/docs/interpretation_files/figure-html/spls-features-weight-pair-1.png index 2d74845..54994d2 100644 Binary files a/docs/interpretation_files/figure-html/spls-features-weight-pair-1.png and b/docs/interpretation_files/figure-html/spls-features-weight-pair-1.png differ diff --git a/docs/interpretation_files/figure-html/spls-plot-top-features-heatmap-1.png b/docs/interpretation_files/figure-html/spls-plot-top-features-heatmap-1.png index a8900e0..0846e5e 100644 Binary files a/docs/interpretation_files/figure-html/spls-plot-top-features-heatmap-1.png and b/docs/interpretation_files/figure-html/spls-plot-top-features-heatmap-1.png differ diff --git a/docs/modifying_multidataset.html b/docs/modifying_multidataset.html index 957d801..9db84b2 100644 --- a/docs/modifying_multidataset.html +++ b/docs/modifying_multidataset.html @@ -513,11 +513,11 @@

#> # A tibble: 6 × 2 #> id new_group #> <chr> <chr> -#> 1 R21 c -#> 2 Y3660 a -#> 3 Y3243 a -#> 4 R5764 b -#> 5 P4669 c +#> 1 R21 a +#> 2 Y3660 c +#> 3 Y3243 b +#> 4 R5764 c +#> 5 P4669 a #> 6 R5452 b

Note that the sample IDs must be stored in a column named id. We will use the add_samples_metadata() function to add this new data-frame to the samples metadata in our MultiDataSet object. There are several options for which samples metadata tables should be modified; this is controlled through the datasets argument of the function. By default, the information is added to the samples metadata table of all omics datasets (case when datasets = NULL):

@@ -542,11 +542,11 @@

#> P4669 P4669 F3 male BRD 35 B2 0.389393 #> R5452 R5452 F2 male Control 49 B1 0.265998 #> geno_comp_2 geno_comp_3 geno_comp_cluster new_group -#> R21 0.820691 0.171456 K3 c -#> Y3660 0.093585 0.054195 K2 a -#> Y3243 0.190262 0.765567 K1 a -#> R5764 0.676299 0.110607 K3 b -#> P4669 0.503471 0.107136 K3 c +#> R21 0.820691 0.171456 K3 a +#> Y3660 0.093585 0.054195 K2 c +#> Y3243 0.190262 0.765567 K1 b +#> R5764 0.676299 0.110607 K3 c +#> P4669 0.503471 0.107136 K3 a #> R5452 0.733992 0.000010 K3 b #> #> $rnaseq @@ -558,12 +558,12 @@

#> R9504 R9504 F2 male BRD 31 B1 0.000010 #> R5994 R5994 F2 male BRD 24 B1 0.129271 #> geno_comp_2 geno_comp_3 geno_comp_cluster new_group -#> R9497 0.744505 0.101779 K3 c -#> R5969 0.625823 0.263514 K3 c +#> R9497 0.744505 0.101779 K3 a +#> R5969 0.625823 0.263514 K3 a #> R5327 0.809396 0.049874 K3 b #> R5979 0.107794 0.605473 K1 c #> R9504 0.998913 0.001077 K3 b -#> R5994 0.034351 0.836377 K1 b +#> R5994 0.034351 0.836377 K1 a #> #> $metabolome #> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1 @@ -574,11 +574,11 @@

#> P4669 P4669 F3 male BRD 35 B2 0.389393 #> R5452 R5452 F2 male Control 49 B1 0.265998 #> geno_comp_2 geno_comp_3 geno_comp_cluster new_group -#> R21 0.820691 0.171456 K3 c -#> Y3660 0.093585 0.054195 K2 a -#> Y3243 0.190262 0.765567 K1 a -#> R5764 0.676299 0.110607 K3 b -#> P4669 0.503471 0.107136 K3 c +#> R21 0.820691 0.171456 K3 a +#> Y3660 0.093585 0.054195 K2 c +#> Y3243 0.190262 0.765567 K1 b +#> R5764 0.676299 0.110607 K3 c +#> P4669 0.503471 0.107136 K3 a #> R5452 0.733992 0.000010 K3 b

However, it is also possible to specify for which dataset(s) the changes should be made, by passing their name to the datasets argument.

@@ -621,12 +621,12 @@

#> R9504 R9504 F2 male BRD 31 B1 0.000010 #> R5994 R5994 F2 male BRD 24 B1 0.129271 #> geno_comp_2 geno_comp_3 geno_comp_cluster new_group -#> R9497 0.744505 0.101779 K3 c -#> R5969 0.625823 0.263514 K3 c +#> R9497 0.744505 0.101779 K3 a +#> R5969 0.625823 0.263514 K3 a #> R5327 0.809396 0.049874 K3 b #> R5979 0.107794 0.605473 K1 c #> R9504 0.998913 0.001077 K3 b -#> R5994 0.034351 0.836377 K1 b +#> R5994 0.034351 0.836377 K1 a #> #> $metabolome #> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1 @@ -637,11 +637,11 @@

#> P4669 P4669 F3 male BRD 35 B2 0.389393 #> R5452 R5452 F2 male Control 49 B1 0.265998 #> geno_comp_2 geno_comp_3 geno_comp_cluster new_group -#> R21 0.820691 0.171456 K3 c -#> Y3660 0.093585 0.054195 K2 a -#> Y3243 0.190262 0.765567 K1 a -#> R5764 0.676299 0.110607 K3 b -#> P4669 0.503471 0.107136 K3 c +#> R21 0.820691 0.171456 K3 a +#> Y3660 0.093585 0.054195 K2 c +#> Y3243 0.190262 0.765567 K1 b +#> R5764 0.676299 0.110607 K3 c +#> P4669 0.503471 0.107136 K3 a #> R5452 0.733992 0.000010 K3 b

In both cases, the function throws some warnings to alert about samples missing from this new table, or samples that are not present in the original samples metadata table. These warnings should be checked to avoid issues due to typos, etc.

diff --git a/docs/mofa.html b/docs/mofa.html index 7626341..c81d81e 100644 --- a/docs/mofa.html +++ b/docs/mofa.html @@ -489,7 +489,7 @@

-
#> Warning: No output filename provided. Using tmpRtmpaM7XWKmofa_20240125102128.hdf5 to store the trained model.
+
#> Warning: No output filename provided. Using tmpRtmpXFuTOemofa_20240208105441.hdf5 to store the trained model.
 #> 
 #> Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.
diff --git a/docs/mofa_files/figure-html/mofa-plot-cor-covariates-1.png b/docs/mofa_files/figure-html/mofa-plot-cor-covariates-1.png index 722dfa2..f02e336 100644 Binary files a/docs/mofa_files/figure-html/mofa-plot-cor-covariates-1.png and b/docs/mofa_files/figure-html/mofa-plot-cor-covariates-1.png differ diff --git a/docs/mofa_files/figure-html/plot-data-scatter-1.png b/docs/mofa_files/figure-html/plot-data-scatter-1.png index 467a215..614de9f 100644 Binary files a/docs/mofa_files/figure-html/plot-data-scatter-1.png and b/docs/mofa_files/figure-html/plot-data-scatter-1.png differ diff --git a/docs/mofa_files/figure-html/plot-factors-correlation-1.png b/docs/mofa_files/figure-html/plot-factors-correlation-1.png index ecce413..0f4a6e2 100644 Binary files a/docs/mofa_files/figure-html/plot-factors-correlation-1.png and b/docs/mofa_files/figure-html/plot-factors-correlation-1.png differ diff --git a/docs/preprocessing_files/figure-html/plot-samples-coordinates-pca-colours-1.png b/docs/preprocessing_files/figure-html/plot-samples-coordinates-pca-colours-1.png index 470b637..7ca01a4 100644 Binary files a/docs/preprocessing_files/figure-html/plot-samples-coordinates-pca-colours-1.png and b/docs/preprocessing_files/figure-html/plot-samples-coordinates-pca-colours-1.png differ diff --git a/docs/search.json b/docs/search.json index 5f9723a..c7e4313 100644 --- a/docs/search.json +++ b/docs/search.json @@ -11,7 +11,7 @@ "href": "index.html#the-moiraine-package", "title": "The moiraine R package user manual", "section": "The moiraine package", - "text": "The moiraine package\nOmics datasets provide an overview of the content of cells for a specific molecular layer (e.g. transcriptome, proteome, metabolome). By integrating different omics datasets obtained on the same biological samples, we can gain a deeper understanding of the interactions between these molecular layers, and shed light on the regulations occurring both within and between layers. A number of statistical methods have been developed to extract such information from multi-omics datasets, and many have been implemented in software such as R packages. However, these tools differ conceptually, in terms of the input data they require, the assumptions they make, the statistical approaches they use or even the questions they answers. They also differ at a practical level in terms of the format required for data input, the parameters to tune or select, and the format in which the results are returned. These differences render the application of several integration tools to a multi-omics dataset and the comparison of their results complex and time-consuming.\nThe moiraine package aims at alleviating these issues, by providing a framework to easily and consistently apply different integration tools to a same multi-omics dataset. It implements numerous visualisation and reporting functions to facilitate the interpretation of the integration results, and facilitates the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, moiraine heavily relies on the targets package for the construction of reproducible analysis pipelines." + "text": "The moiraine package\nOmics datasets provide an overview of the content of cells for a specific molecular layer (e.g. transcriptome, proteome, metabolome). By integrating different omics datasets obtained on the same biological samples, we can gain a deeper understanding of the interactions between these molecular layers, and shed light on the regulations occurring both within and between layers. A number of statistical methods have been developed to extract such information from multi-omics datasets, and many have been implemented in software such as R packages. However, these tools differ conceptually, in terms of the input data they require, the assumptions they make, the statistical approaches they use or even the questions they answers. They also differ at a practical level in terms of the format required for data input, the parameters to tune or select, and the format in which the results are returned. These differences render the application of several integration tools to a multi-omics dataset and the comparison of their results complex and time-consuming.\nThe moiraine package aims at alleviating these issues, by providing a framework to easily and consistently apply different integration tools to a same multi-omics dataset. It implements numerous visualisation and reporting functions to facilitate the interpretation of the integration results as well as the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, moiraine heavily relies on the targets package for the construction of reproducible analysis pipelines." }, { "objectID": "index.html#about-this-manual", @@ -46,14 +46,14 @@ "href": "data_import.html#importing-the-datasets", "title": "3  Importing data", "section": "\n3.2 Importing the datasets", - "text": "3.2 Importing the datasets\nWe will show how to import the datasets, first manually, and then in an automated way (using a target factory function).\n\n3.2.1 Manually\nWe can start by creating targets that track the different data files. This ensures that when a data file changes, the target is considered outdated and any analysis relying on this data file will be re-run (see here for more information). For example, for the genomics dataset, we write:\n\ntar_target(\n dataset_file_geno,\n system.file(\"extdata/genomics_dataset.csv\", package = \"moiraine\"),\n format = \"file\"\n)\n\nThe created target, called dataset_file_geno, takes as value the path to the file:\n\ntar_read(dataset_file_geno)\n#> [1] \"/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/7e39d6614134fc474e6b85ec2516a5b6/moiraine/extdata/genomics_dataset.csv\"\n\nThe next step is to import this dataset in R. We use the import_dataset_csv() function for that, rather than the readr::read_csv() or similar functions, as it ensures that the data is imported with the correct format for further use with the moiraine package. When importing a dataset, we need to specify the path to the file, as well as the name of the column in the csv file that contains the row names (through the col_id argument). In addition, we need to specify whether the features are represented in rows in the csv file, or in columns. This is done through the argument features_as_rows. For example, we can load the genomics dataset through:\n\ntar_target(\n data_geno,\n import_dataset_csv(\n dataset_file_geno, \n col_id = \"marker\", \n features_as_rows = TRUE)\n)\n\nThe function returns a matrix in which the rows correspond to the features measured, and the columns correspond to the samples:\n\ntar_read(data_geno) |> dim()\n#> [1] 23036 139\ntar_read(data_geno)[1:5, 1:3]\n#> R21 Y3660 Y3243\n#> 1_41768691 1 0 2\n#> 10-27008241-A-C-rs42918694 2 2 2\n#> 10-37505419-T-C-rs136559242 0 1 0\n#> 10-49904259-G-A-rs471723345 1 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1\n\nNote that import_dataset_csv() uses readr::read_csv() to read in the data. It accepts arguments that will be passed on to read_csv(), which can be useful to control how the data file must be read, e.g. by specifying the columns’ type, or which characters must be considered as missing values.\n\n3.2.2 Using a target factory function\nCreating a target to track the raw file and using the import_dataset_csv() function to read it can be a bit cumbersome if we want to import several datasets. Luckily, this process can be automated with the import_dataset_csv_factory() function. It takes as an input a vector of files path, and for each file creates:\n\na target named dataset_file_XX (XX explained below), which tracks the raw data file;\na target named data_XX, which corresponds to the data matrix that has been imported through the import_dataset_csv function.\n\nFor each file, we need to specify the name of the column giving the row names (argument col_ids), and whether the features are stored as rows or as columns (argument features_as_rowss). Note that these arguments are the same as in the primary function import_dataset_csv(), except that they have an additional ‘s’ at the end of their name. This will be the case for most of the target factory functions from the package.\nIn addition, we have to provide a unique suffix which will be appended to the name of the targets created (i.e. the XX mentioned above) through the target_name_suffixes argument. This allows us to track which target corresponds to which dataset.\nSo the following code (note that it is not within a tar_target() call):\n\nimport_dataset_csv_factory(\n files = c(\n system.file(\"extdata/genomics_dataset.csv\", package = \"moiraine\"),\n system.file(\"extdata/transcriptomics_dataset.csv\", package = \"moiraine\"),\n system.file(\"extdata/metabolomics_dataset.csv\", package = \"moiraine\")\n ),\n col_ids = c(\"marker\", \"gene_id\", \"sample_id\"),\n features_as_rowss = c(TRUE, TRUE, FALSE),\n target_name_suffixes = c(\"geno\", \"transcripto\", \"metabo\")\n)\n\nwill create the following targets:\n\ndataset_file_geno, dataset_file_transcripto, dataset_file_metabo\ndata_geno, data_metabo, data_transcripto\n\n\ntar_read(data_geno) |> dim()\n#> [1] 23036 139\ntar_read(data_transcripto) |> dim()\n#> [1] 20335 143\ntar_read(data_metabo) |> dim()\n#> [1] 55 139\n\nWith this factory function, it is not possible to pass arguments to read_csv(). If you want to control how the files are read, please use the import_dataset_csv() function directly instead, as shown in Section 3.2.1." + "text": "3.2 Importing the datasets\nWe will show how to import the datasets, first manually, and then in an automated way (using a target factory function).\n\n3.2.1 Manually\nWe can start by creating targets that track the different data files. This ensures that when a data file changes, the target is considered outdated and any analysis relying on this data file will be re-run (see here for more information). For example, for the genomics dataset, we write:\n\ntar_target(\n dataset_file_geno,\n system.file(\"extdata/genomics_dataset.csv\", package = \"moiraine\"),\n format = \"file\"\n)\n\nThe created target, called dataset_file_geno, takes as value the path to the file:\n\ntar_read(dataset_file_geno)\n#> [1] \"/powerplant/workspace/hrpoab/RENV_CACHE/v5/R-4.2/x86_64-pc-linux-gnu/moiraine/0.0.0.9000/fb476bd1efef272b4f6140013017b2d2/moiraine/extdata/genomics_dataset.csv\"\n\nThe next step is to import this dataset in R. We use the import_dataset_csv() function for that, rather than the readr::read_csv() or similar functions, as it ensures that the data is imported with the correct format for further use with the moiraine package. When importing a dataset, we need to specify the path to the file, as well as the name of the column in the csv file that contains the row names (through the col_id argument). In addition, we need to specify whether the features are represented in rows in the csv file, or in columns. This is done through the argument features_as_rows. For example, we can load the genomics dataset through:\n\ntar_target(\n data_geno,\n import_dataset_csv(\n dataset_file_geno, \n col_id = \"marker\", \n features_as_rows = TRUE)\n)\n\nThe function returns a matrix in which the rows correspond to the features measured, and the columns correspond to the samples:\n\ntar_read(data_geno) |> dim()\n#> [1] 23036 139\ntar_read(data_geno)[1:5, 1:3]\n#> R21 Y3660 Y3243\n#> 1_41768691 1 0 2\n#> 10-27008241-A-C-rs42918694 2 2 2\n#> 10-37505419-T-C-rs136559242 0 1 0\n#> 10-49904259-G-A-rs471723345 1 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1\n\nNote that import_dataset_csv() uses readr::read_csv() to read in the data. It accepts arguments that will be passed on to read_csv(), which can be useful to control how the data file must be read, e.g. by specifying the columns’ type, or which characters must be considered as missing values.\n\n3.2.2 Using a target factory function\nCreating a target to track the raw file and using the import_dataset_csv() function to read it can be a bit cumbersome if we want to import several datasets. Luckily, this process can be automated with the import_dataset_csv_factory() function. It takes as an input a vector of files path, and for each file creates:\n\na target named dataset_file_XX (XX explained below), which tracks the raw data file;\na target named data_XX, which corresponds to the data matrix that has been imported through the import_dataset_csv function.\n\nFor each file, we need to specify the name of the column giving the row names (argument col_ids), and whether the features are stored as rows or as columns (argument features_as_rowss). Note that these arguments are the same as in the primary function import_dataset_csv(), except that they have an additional ‘s’ at the end of their name. This will be the case for most of the target factory functions from the package.\nIn addition, we have to provide a unique suffix which will be appended to the name of the targets created (i.e. the XX mentioned above) through the target_name_suffixes argument. This allows us to track which target corresponds to which dataset.\nSo the following code (note that it is not within a tar_target() call):\n\nimport_dataset_csv_factory(\n files = c(\n system.file(\"extdata/genomics_dataset.csv\", package = \"moiraine\"),\n system.file(\"extdata/transcriptomics_dataset.csv\", package = \"moiraine\"),\n system.file(\"extdata/metabolomics_dataset.csv\", package = \"moiraine\")\n ),\n col_ids = c(\"marker\", \"gene_id\", \"sample_id\"),\n features_as_rowss = c(TRUE, TRUE, FALSE),\n target_name_suffixes = c(\"geno\", \"transcripto\", \"metabo\")\n)\n\nwill create the following targets:\n\ndataset_file_geno, dataset_file_transcripto, dataset_file_metabo\ndata_geno, data_metabo, data_transcripto\n\n\ntar_read(data_geno) |> dim()\n#> [1] 23036 139\ntar_read(data_transcripto) |> dim()\n#> [1] 20335 143\ntar_read(data_metabo) |> dim()\n#> [1] 55 139\n\nWith this factory function, it is not possible to pass arguments to read_csv(). If you want to control how the files are read, please use the import_dataset_csv() function directly instead, as shown in Section 3.2.1." }, { "objectID": "data_import.html#importing-the-features-metadata", "href": "data_import.html#importing-the-features-metadata", "title": "3  Importing data", "section": "\n3.3 Importing the features metadata", - "text": "3.3 Importing the features metadata\nSimilarly to how we imported the datasets, there are two ways of importing features metadata: either manually, or using a target factory function. The two options are illustrated below.\n\n3.3.1 Manually\nAs shown in the previous section, we can start by creating a target that tracks the raw features metadata file, then read the file into R using the import_fmetadata_csv() function. It has the similar arguments as the import_dataset_csv() function, but returns a data-frame (rather than a matrix); and does not have the options to read a csv where the features are columns (they must be in rows):\n\nlist(\n tar_target(\n fmetadata_file_geno,\n system.file(\"extdata/genomics_features_info.csv\", package = \"moiraine\"),\n format = \"file\"\n ),\n \n tar_target(\n fmetadata_geno,\n import_fmetadata_csv(\n fmetadata_file_geno,\n col_id = \"marker\",\n col_types = c(\"chromosome\" = \"c\")\n )\n )\n)\n\nNotice that in the import_fmetadata_csv() call, we’ve added an argument (col_types) which will be passed on to read_csv(). This is to ensure that the chromosome column will be read as character (even though the chromosomes are denoted with integers).\n\ntar_read(fmetadata_geno) |> head()\n#> feature_id chromosome position\n#> 1_41768691 1_41768691 1 42139849\n#> 10-27008241-A-C-rs42918694 10-27008241-A-C-rs42918694 10 26971270\n#> 10-37505419-T-C-rs136559242 10-37505419-T-C-rs136559242 10 37388728\n#> 10-49904259-G-A-rs471723345 10-49904259-G-A-rs471723345 0 0\n#> 1-109550832-G-A-rs209732846 1-109550832-G-A-rs209732846 1 108696486\n#> 11-104555023-A-G-rs109353933 11-104555023-A-G-rs109353933 11 104498929\n#> gen_train_score ref alt ilmn_strand\n#> 1_41768691 0.6786 T G BOT\n#> 10-27008241-A-C-rs42918694 0.8050 A C TOP\n#> 10-37505419-T-C-rs136559242 0.7890 A G TOP\n#> 10-49904259-G-A-rs471723345 0.7970 A G TOP\n#> 1-109550832-G-A-rs209732846 0.8909 T C BOT\n#> 11-104555023-A-G-rs109353933 0.8673 T C BOT\n#> customer_strand norm_id qtl_type qtl_effect\n#> 1_41768691 BOT 2 NA\n#> 10-27008241-A-C-rs42918694 TOP 1 NA\n#> 10-37505419-T-C-rs136559242 BOT 1 NA\n#> 10-49904259-G-A-rs471723345 TOP 2 NA\n#> 1-109550832-G-A-rs209732846 TOP 3 NA\n#> 11-104555023-A-G-rs109353933 TOP 1 NA\n#> p_value fdr\n#> 1_41768691 NA NA\n#> 10-27008241-A-C-rs42918694 NA NA\n#> 10-37505419-T-C-rs136559242 NA NA\n#> 10-49904259-G-A-rs471723345 NA NA\n#> 1-109550832-G-A-rs209732846 NA NA\n#> 11-104555023-A-G-rs109353933 NA NA\n\nYou can see that in the data-frame of features metadata, the feature IDs are present both as row names and in the feature_id column. This makes it easier to subset the datasets later on.\n\n3.3.2 Using a target factory function\nAlternatively, we can use a target factory function that automates the process when we have to read in several features metadata files. In our case, we have to do it for the genomics and metabolomics datasets only, as the transcriptomics dataset has a different features metadata format. However because we need to specify the column types for the genomics dataset, we will use the targets factory function to read in the metabolomics features metadata only. The arguments are almost the same as for import_dataset_csv_factory() (except for features_as_rowss):\n\nimport_fmetadata_csv_factory(\n files = c(\n system.file(\"extdata/metabolomics_features_info.csv\", package = \"moiraine\")\n ),\n col_ids = c(\"feature_id\"),\n target_name_suffixes = c(\"metabo\")\n)\n\nThe targets created are:\n\nfmetadata_file_metabo\nfmetadata_metabo\n\n\ntar_read(fmetadata_metabo) |> head()\n#> feature_id hmdb_id name chemical_formula\n#> HMDB00001 HMDB00001 HMDB0000001 1-Methylhistidine C7H11N3O2\n#> HMDB00008 HMDB00008 HMDB0000008 2-Hydroxybutyric acid C4H8O3\n#> HMDB00357 HMDB00357 HMDB0000011 3-Hydroxybutyric acid C4H8O3\n#> HMDB00042 HMDB00042 HMDB0000042 Acetic acid C2H4O2\n#> HMDB00043 HMDB00043 HMDB0000043 Betaine C5H12NO2\n#> HMDB00060 HMDB00060 HMDB0000060 Acetoacetic acid C4H6O3\n#> monisotopic_molecular_weight cas_registry_number\n#> HMDB00001 169.08513 332-80-9\n#> HMDB00008 104.04734 3347-90-8\n#> HMDB00357 104.04734 625-72-9\n#> HMDB00042 60.02113 64-19-7\n#> HMDB00043 118.08680 6915-17-9\n#> HMDB00060 102.03169 541-50-4\n#> smiles inchikey kegg_id\n#> HMDB00001 CN1C=NC(C[C@H](N)C(O)=O)=C1 BRMWTNUJHUMWMS-LURJTMIESA-N C01152\n#> HMDB00008 CC[C@H](O)C(O)=O AFENDNXGAFYKQO-VKHMYHEASA-N C05984\n#> HMDB00357 C[C@@H](O)CC(O)=O WHBMMWSBFZVSSR-GSVOUGTGSA-N C01089\n#> HMDB00042 CC(O)=O QTBSBXVTEAMEQO-UHFFFAOYSA-N C00033\n#> HMDB00043 C[N+](C)(C)CC(O)=O KWIUHFFTVRNATP-UHFFFAOYSA-O \n#> HMDB00060 CC(=O)CC(O)=O WDJHALXBUFZDSR-UHFFFAOYSA-N C00164\n#> direct_parent super_class\n#> HMDB00001 Histidine and derivatives Organic acids and derivatives\n#> HMDB00008 Alpha hydroxy acids and derivatives Organic acids and derivatives\n#> HMDB00357 Beta hydroxy acids and derivatives Organic acids and derivatives\n#> HMDB00042 Carboxylic acids Organic acids and derivatives\n#> HMDB00043 Alpha amino acids Organic acids and derivatives\n#> HMDB00060 Short-chain keto acids and derivatives Organic acids and derivatives\n#> t_value p_value padj de_signif de_status\n#> HMDB00001 -0.5557020 5.797635e-01 6.784466e-01 Not DE Not DE\n#> HMDB00008 0.2181562 8.276321e-01 8.925444e-01 Not DE Not DE\n#> HMDB00357 -9.7388879 2.353250e-17 2.157146e-16 DE downregulated\n#> HMDB00042 -12.5323491 1.753101e-24 4.821028e-23 DE downregulated\n#> HMDB00043 -7.9073179 7.827088e-13 3.913544e-12 DE downregulated\n#> HMDB00060 -0.4369834 6.628164e-01 7.439776e-01 Not DE Not DE\n\nAgain, the targets factory function does not allow to pass arguments to read_csv() (if you need them, please use import_fmetadata_csv() directly as we have done in Section 3.3.1).\n\n3.3.3 Importing features metadata from a GTF/GFF file\nThe moiraine package can also extract features metadata from a genome annotation file (.gtf or .gff). We’ll demonstrate that for the transcriptomics dataset, for which information about the position and name of the transcripts can be found in the genome annotation used to map the reads. The function is called import_fmetadata_gff() (it is also the function you would use to read in information from a .gtf file). The type of information to extract from the annotation file is specified through the feature_type argument, which can be either 'genes' or 'transcripts'. In addition, if the function does not extract certain fields from the annotation file, these can be explicitly called using the add_fields parameter.\nIn this example, we want to extract information about the genes from the gtf file. We also want to make sure that the Name and descriptionfield are imported, as they give the name and description of the genes. To read in this information “manually”, we create the following targets:\n\nlist(\n tar_target(\n fmetadata_file_transcripto,\n system.file(\"extdata/bos_taurus_gene_model.gff3\", package = \"moiraine\"),\n format = \"file\"\n ),\n \n tar_target(\n fmetadata_transcripto,\n import_fmetadata_gff(\n fmetadata_file_transcripto,\n feature_type = \"genes\",\n add_fields = c(\"Name\", \"description\")\n )\n )\n)\n\nAs for the other import functions, there exists a more succinct target factory version, called import_fmetadata_gff_factory():\n\nimport_fmetadata_gff_factory(\n files = system.file(\"extdata/bos_taurus_gene_model.gff3\", package = \"moiraine\"),\n feature_types = \"genes\",\n add_fieldss = c(\"Name\", \"description\"),\n target_name_suffixes = \"transcripto\"\n)\n\nThis will create two targets: fmetadata_file_transcripto and fmetadata_transcripto.\nAs with import_fmetadata, the function returns a data-frame of features information:\n\ntar_read(fmetadata_transcripto) |> head()\n#> feature_id chromosome start end width\n#> ENSBTAG00000000005 ENSBTAG00000000005 17 65389743 65505336 115594\n#> ENSBTAG00000000008 ENSBTAG00000000008 29 32214439 32244810 30372\n#> ENSBTAG00000000009 ENSBTAG00000000009 18 12338037 12342272 4236\n#> ENSBTAG00000000010 ENSBTAG00000000010 21 34209956 34223394 13439\n#> ENSBTAG00000000011 ENSBTAG00000000011 8 7950815 7971600 20786\n#> ENSBTAG00000000012 ENSBTAG00000000012 20 33708626 33732944 24319\n#> strand Name\n#> ENSBTAG00000000005 + GRK3\n#> ENSBTAG00000000008 - KCNJ1\n#> ENSBTAG00000000009 + FOXF1\n#> ENSBTAG00000000010 + UBL7\n#> ENSBTAG00000000011 - TDH\n#> ENSBTAG00000000012 + TTC33\n#> description\n#> ENSBTAG00000000005 G protein-coupled receptor kinase 3 [Source:VGNC Symbol;Acc:VGNC:53904]\n#> ENSBTAG00000000008 potassium inwardly rectifying channel subfamily J member 1 [Source:VGNC Symbol;Acc:VGNC:30453]\n#> ENSBTAG00000000009 forkhead box F1 [Source:VGNC Symbol;Acc:VGNC:29084]\n#> ENSBTAG00000000010 ubiquitin like 7 [Source:VGNC Symbol;Acc:VGNC:50128]\n#> ENSBTAG00000000011 L-threonine dehydrogenase [Source:VGNC Symbol;Acc:VGNC:108945]\n#> ENSBTAG00000000012 tetratricopeptide repeat domain 33 [Source:VGNC Symbol;Acc:VGNC:36471]" + "text": "3.3 Importing the features metadata\nSimilarly to how we imported the datasets, there are two ways of importing features metadata: either manually, or using a target factory function. The two options are illustrated below.\n\n3.3.1 Manually\nAs shown in the previous section, we can start by creating a target that tracks the raw features metadata file, then read the file into R using the import_fmetadata_csv() function. It has the similar arguments as the import_dataset_csv() function, but returns a data-frame (rather than a matrix); and does not have the options to read a csv where the features are columns (they must be in rows):\n\nlist(\n tar_target(\n fmetadata_file_geno,\n system.file(\"extdata/genomics_features_info.csv\", package = \"moiraine\"),\n format = \"file\"\n ),\n \n tar_target(\n fmetadata_geno,\n import_fmetadata_csv(\n fmetadata_file_geno,\n col_id = \"marker\",\n col_types = c(\"chromosome\" = \"c\")\n )\n )\n)\n\nNotice that in the import_fmetadata_csv() call, we’ve added an argument (col_types) which will be passed on to read_csv(). This is to ensure that the chromosome column will be read as character (even though the chromosomes are denoted with integers).\n\ntar_read(fmetadata_geno) |> head()\n#> feature_id chromosome position\n#> 1_41768691 1_41768691 1 42139849\n#> 10-27008241-A-C-rs42918694 10-27008241-A-C-rs42918694 10 26971270\n#> 10-37505419-T-C-rs136559242 10-37505419-T-C-rs136559242 10 37388728\n#> 10-49904259-G-A-rs471723345 10-49904259-G-A-rs471723345 0 0\n#> 1-109550832-G-A-rs209732846 1-109550832-G-A-rs209732846 1 108696486\n#> 11-104555023-A-G-rs109353933 11-104555023-A-G-rs109353933 11 104498929\n#> gen_train_score ref alt ilmn_strand\n#> 1_41768691 0.6786 T G BOT\n#> 10-27008241-A-C-rs42918694 0.8050 A C TOP\n#> 10-37505419-T-C-rs136559242 0.7890 A G TOP\n#> 10-49904259-G-A-rs471723345 0.7970 A G TOP\n#> 1-109550832-G-A-rs209732846 0.8909 T C BOT\n#> 11-104555023-A-G-rs109353933 0.8673 T C BOT\n#> customer_strand norm_id qtl_type qtl_effect\n#> 1_41768691 BOT 2 non signif. NA\n#> 10-27008241-A-C-rs42918694 TOP 1 non signif. NA\n#> 10-37505419-T-C-rs136559242 BOT 1 non signif. NA\n#> 10-49904259-G-A-rs471723345 TOP 2 non signif. NA\n#> 1-109550832-G-A-rs209732846 TOP 3 non signif. NA\n#> 11-104555023-A-G-rs109353933 TOP 1 non signif. NA\n#> p_value fdr\n#> 1_41768691 NA NA\n#> 10-27008241-A-C-rs42918694 NA NA\n#> 10-37505419-T-C-rs136559242 NA NA\n#> 10-49904259-G-A-rs471723345 NA NA\n#> 1-109550832-G-A-rs209732846 NA NA\n#> 11-104555023-A-G-rs109353933 NA NA\n\nYou can see that in the data-frame of features metadata, the feature IDs are present both as row names and in the feature_id column. This makes it easier to subset the datasets later on.\n\n3.3.2 Using a target factory function\nAlternatively, we can use a target factory function that automates the process when we have to read in several features metadata files. In our case, we have to do it for the genomics and metabolomics datasets only, as the transcriptomics dataset has a different features metadata format. However because we need to specify the column types for the genomics dataset, we will use the targets factory function to read in the metabolomics features metadata only. The arguments are almost the same as for import_dataset_csv_factory() (except for features_as_rowss):\n\nimport_fmetadata_csv_factory(\n files = c(\n system.file(\"extdata/metabolomics_features_info.csv\", package = \"moiraine\")\n ),\n col_ids = c(\"feature_id\"),\n target_name_suffixes = c(\"metabo\")\n)\n\nThe targets created are:\n\nfmetadata_file_metabo\nfmetadata_metabo\n\n\ntar_read(fmetadata_metabo) |> head()\n#> feature_id hmdb_id name chemical_formula\n#> HMDB00001 HMDB00001 HMDB0000001 1-Methylhistidine C7H11N3O2\n#> HMDB00008 HMDB00008 HMDB0000008 2-Hydroxybutyric acid C4H8O3\n#> HMDB00357 HMDB00357 HMDB0000011 3-Hydroxybutyric acid C4H8O3\n#> HMDB00042 HMDB00042 HMDB0000042 Acetic acid C2H4O2\n#> HMDB00043 HMDB00043 HMDB0000043 Betaine C5H12NO2\n#> HMDB00060 HMDB00060 HMDB0000060 Acetoacetic acid C4H6O3\n#> monisotopic_molecular_weight cas_registry_number\n#> HMDB00001 169.08513 332-80-9\n#> HMDB00008 104.04734 3347-90-8\n#> HMDB00357 104.04734 625-72-9\n#> HMDB00042 60.02113 64-19-7\n#> HMDB00043 118.08680 6915-17-9\n#> HMDB00060 102.03169 541-50-4\n#> smiles inchikey kegg_id\n#> HMDB00001 CN1C=NC(C[C@H](N)C(O)=O)=C1 BRMWTNUJHUMWMS-LURJTMIESA-N C01152\n#> HMDB00008 CC[C@H](O)C(O)=O AFENDNXGAFYKQO-VKHMYHEASA-N C05984\n#> HMDB00357 C[C@@H](O)CC(O)=O WHBMMWSBFZVSSR-GSVOUGTGSA-N C01089\n#> HMDB00042 CC(O)=O QTBSBXVTEAMEQO-UHFFFAOYSA-N C00033\n#> HMDB00043 C[N+](C)(C)CC(O)=O KWIUHFFTVRNATP-UHFFFAOYSA-O \n#> HMDB00060 CC(=O)CC(O)=O WDJHALXBUFZDSR-UHFFFAOYSA-N C00164\n#> direct_parent super_class\n#> HMDB00001 Histidine and derivatives Organic acids and derivatives\n#> HMDB00008 Alpha hydroxy acids and derivatives Organic acids and derivatives\n#> HMDB00357 Beta hydroxy acids and derivatives Organic acids and derivatives\n#> HMDB00042 Carboxylic acids Organic acids and derivatives\n#> HMDB00043 Alpha amino acids Organic acids and derivatives\n#> HMDB00060 Short-chain keto acids and derivatives Organic acids and derivatives\n#> t_value p_value padj de_signif de_status\n#> HMDB00001 -0.5557020 5.797635e-01 6.784466e-01 Not DE Not DE\n#> HMDB00008 0.2181562 8.276321e-01 8.925444e-01 Not DE Not DE\n#> HMDB00357 -9.7388879 2.353250e-17 2.157146e-16 DE downregulated\n#> HMDB00042 -12.5323491 1.753101e-24 4.821028e-23 DE downregulated\n#> HMDB00043 -7.9073179 7.827088e-13 3.913544e-12 DE downregulated\n#> HMDB00060 -0.4369834 6.628164e-01 7.439776e-01 Not DE Not DE\n\nAgain, the targets factory function does not allow to pass arguments to read_csv() (if you need them, please use import_fmetadata_csv() directly as we have done in Section 3.3.1).\n\n3.3.3 Importing features metadata from a GTF/GFF file\nThe moiraine package can also extract features metadata from a genome annotation file (.gtf or .gff). We’ll demonstrate that for the transcriptomics dataset, for which information about the position and name of the transcripts can be found in the genome annotation used to map the reads. The function is called import_fmetadata_gff() (it is also the function you would use to read in information from a .gtf file). The type of information to extract from the annotation file is specified through the feature_type argument, which can be either 'genes' or 'transcripts'. In addition, if the function does not extract certain fields from the annotation file, these can be explicitly called using the add_fields parameter.\nIn this example, we want to extract information about the genes from the gtf file. We also want to make sure that the Name and descriptionfield are imported, as they give the name and description of the genes. To read in this information “manually”, we create the following targets:\n\nlist(\n tar_target(\n fmetadata_file_transcripto,\n system.file(\"extdata/bos_taurus_gene_model.gff3\", package = \"moiraine\"),\n format = \"file\"\n ),\n \n tar_target(\n fmetadata_transcripto,\n import_fmetadata_gff(\n fmetadata_file_transcripto,\n feature_type = \"genes\",\n add_fields = c(\"Name\", \"description\")\n )\n )\n)\n\nAs for the other import functions, there exists a more succinct target factory version, called import_fmetadata_gff_factory():\n\nimport_fmetadata_gff_factory(\n files = system.file(\"extdata/bos_taurus_gene_model.gff3\", package = \"moiraine\"),\n feature_types = \"genes\",\n add_fieldss = c(\"Name\", \"description\"),\n target_name_suffixes = \"transcripto\"\n)\n\nThis will create two targets: fmetadata_file_transcripto and fmetadata_transcripto.\nAs with import_fmetadata, the function returns a data-frame of features information:\n\ntar_read(fmetadata_transcripto) |> head()\n#> feature_id chromosome start end width\n#> ENSBTAG00000000005 ENSBTAG00000000005 17 65389743 65505336 115594\n#> ENSBTAG00000000008 ENSBTAG00000000008 29 32214439 32244810 30372\n#> ENSBTAG00000000009 ENSBTAG00000000009 18 12338037 12342272 4236\n#> ENSBTAG00000000010 ENSBTAG00000000010 21 34209956 34223394 13439\n#> ENSBTAG00000000011 ENSBTAG00000000011 8 7950815 7971600 20786\n#> ENSBTAG00000000012 ENSBTAG00000000012 20 33708626 33732944 24319\n#> strand Name\n#> ENSBTAG00000000005 + GRK3\n#> ENSBTAG00000000008 - KCNJ1\n#> ENSBTAG00000000009 + FOXF1\n#> ENSBTAG00000000010 + UBL7\n#> ENSBTAG00000000011 - TDH\n#> ENSBTAG00000000012 + TTC33\n#> description\n#> ENSBTAG00000000005 G protein-coupled receptor kinase 3 [Source:VGNC Symbol;Acc:VGNC:53904]\n#> ENSBTAG00000000008 potassium inwardly rectifying channel subfamily J member 1 [Source:VGNC Symbol;Acc:VGNC:30453]\n#> ENSBTAG00000000009 forkhead box F1 [Source:VGNC Symbol;Acc:VGNC:29084]\n#> ENSBTAG00000000010 ubiquitin like 7 [Source:VGNC Symbol;Acc:VGNC:50128]\n#> ENSBTAG00000000011 L-threonine dehydrogenase [Source:VGNC Symbol;Acc:VGNC:108945]\n#> ENSBTAG00000000012 tetratricopeptide repeat domain 33 [Source:VGNC Symbol;Acc:VGNC:36471]" }, { "objectID": "data_import.html#importing-the-samples-metadata", @@ -67,7 +67,7 @@ "href": "data_import.html#creating-the-omics-sets", "title": "3  Importing data", "section": "\n3.5 Creating the omics sets", - "text": "3.5 Creating the omics sets\nOnce each dataset and associated features and samples metadata have been imported, we need to combine them into omics sets. In practice, this means that for each omics dataset, we will create an R object that stores the actual dataset alongside its relevant metadata. moiraine relies on the Biobase containers derived from Biobase::eSet to store the different omics datasets; for example, Biobase::ExpressionSet objects are used to store transcriptomics measurements. Currently, moiraine support four types of omics containers:\n\ngenomics containers, which are Biobase::SnpSet objects. The particularity of this data type is that the features metadata data-frame must contain a column named chromosome and a column named position, which store the chromosome and genomic position within the chromosome (in base pairs) of a given genomic marker or variant.\ntranscriptomics containers, which are Biobase::ExpressionSet objects. The particularity of this data type is that the features metadata data-frame must contain the following columns: chromosome, start, end, giving the chromosome, start and end positions (in base pairs) of the genes or transcripts. Moreover, the values in start and end must be integers, and for each row the value in end must be higher than the value in start.\nmetabolomics containers, which are MetabolomeSet objects (implemented within moiraine). There are no restrictions on the features metadata table for this type of containers.\nphenotype containers, which are PhenotypeSet objects (implemented within moiraine). There are no restrictions on the features metadata table for this type of containers.\n\nIn practice, the nuances between these different containers are not very important, and the type of container used to store a particular dataset will have no impact on the downstream analysis apart from the name that will be given to the omics dataset. So in order to create a container for a transcriptomics dataset in the absence of features metadata, we have to create a dummy data-frame with the columns chromosome, start and end containing the values ch1, 1, and 10 (for example) and use that as features metadata. Alternately, or for other omics data (e.g. proteomics), it is possible to use a PhenotypeSet object instead.\n\n3.5.1 Creating a single omics set\nThe function create_omics_set() provides a convenient wrapper to create such container objects from the imported datasets and metadata. It has two mandatory arguments: the dataset, which should be in the form of a matrix where the rows correspond to features and the columns to samples; and the type of omics data that the dataset represents ('genomics', 'transcriptomics', 'metabolomics' or 'phenomics'). The latter determines which type of container will be generated. Optionally, a features metadata and/or a samples metadata data-frame can be passed on via the features_metadata and samples_metadata arguments, respectively. For example, let’s create a set for the genomics data:\n\ntar_target(\n set_geno,\n create_omics_set(\n data_geno,\n omics_type = \"genomics\",\n features_metadata = fmetadata_geno,\n samples_metadata = smetadata_all\n )\n)\n\nIf executed, this command will return the following warning:\n\n#> Warning: 5 samples in samples metadata not in dataset, will be removed from\n#> metadata.\n\nThis is because, when providing features and samples metadata information, the function makes sure that the feature or sample IDs present in the metadata tables match those used in the dataset. In our case, 5 sample IDs from the metadata data-frame are not present in the dataset. We can confirm that by comparing the column names of the genomics dataset to the row names of the samples metadata:\n\nsetdiff(\n tar_read(smetadata_all) |> rownames(),\n tar_read(data_geno) |> colnames()\n)\n#> [1] \"P4744\" \"P4772\" \"R8953\" \"U5416\" \"R9909\"\n\nRather than throwing an error, the function will add a row for each missing sample ID to the metadata data-frame, with a NA in every column, and will remove from the metadata data-frame any sample not present in the dataset. The same applies for features metadata.\nThe resulting object is a SnpSet:\n\ntar_read(set_geno)\n#> SnpSet (storageMode: lockedEnvironment)\n#> assayData: 23036 features, 139 samples \n#> element names: call, callProbability \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... O5108 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: 1_41768691 10-27008241-A-C-rs42918694 ... STAT5_13516_2\n#> (23036 total)\n#> fvarLabels: feature_id chromosome ... fdr (13 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\nwhich can be queried using specific methods from the Biobase package, e.g.:\n\ntar_load(set_geno)\n\ndim(set_geno)\n#> Features Samples \n#> 23036 139\n\nfeatureNames(set_geno) |> head()\n#> [1] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \n#> [3] \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" \n#> [5] \"1-109550832-G-A-rs209732846\" \"11-104555023-A-G-rs109353933\"\n\nsampleNames(set_geno) |> head()\n#> [1] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" \"P4669\" \"R5452\"\n\nfData(set_geno) |> head() ## extracts features metadata\n#> feature_id chromosome position\n#> 1_41768691 1_41768691 1 42139849\n#> 10-27008241-A-C-rs42918694 10-27008241-A-C-rs42918694 10 26971270\n#> 10-37505419-T-C-rs136559242 10-37505419-T-C-rs136559242 10 37388728\n#> 10-49904259-G-A-rs471723345 10-49904259-G-A-rs471723345 0 0\n#> 1-109550832-G-A-rs209732846 1-109550832-G-A-rs209732846 1 108696486\n#> 11-104555023-A-G-rs109353933 11-104555023-A-G-rs109353933 11 104498929\n#> gen_train_score ref alt ilmn_strand\n#> 1_41768691 0.6786 T G BOT\n#> 10-27008241-A-C-rs42918694 0.8050 A C TOP\n#> 10-37505419-T-C-rs136559242 0.7890 A G TOP\n#> 10-49904259-G-A-rs471723345 0.7970 A G TOP\n#> 1-109550832-G-A-rs209732846 0.8909 T C BOT\n#> 11-104555023-A-G-rs109353933 0.8673 T C BOT\n#> customer_strand norm_id qtl_type qtl_effect\n#> 1_41768691 BOT 2 NA\n#> 10-27008241-A-C-rs42918694 TOP 1 NA\n#> 10-37505419-T-C-rs136559242 BOT 1 NA\n#> 10-49904259-G-A-rs471723345 TOP 2 NA\n#> 1-109550832-G-A-rs209732846 TOP 3 NA\n#> 11-104555023-A-G-rs109353933 TOP 1 NA\n#> p_value fdr\n#> 1_41768691 NA NA\n#> 10-27008241-A-C-rs42918694 NA NA\n#> 10-37505419-T-C-rs136559242 NA NA\n#> 10-49904259-G-A-rs471723345 NA NA\n#> 1-109550832-G-A-rs209732846 NA NA\n#> 11-104555023-A-G-rs109353933 NA NA\n\npData(set_geno) |> head() ## extracts samples metadata\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3\n\nNote that these methods can also be applied to the other types of containers.\n\n3.5.2 Using a target factory for creating omics sets\nThe function create_omics_set_factory() allows us to create several omics sets at once. It returns a list of targets, each storing one of the created omics set container. It takes as input arguments vectors that give for each omics set the arguments required by create_omics_set().\n\ncreate_omics_set_factory(\n datasets = c(data_geno, data_transcripto, data_metabo),\n omics_types = c(\"genomics\", \"transcriptomics\", \"metabolomics\"),\n features_metadatas = c(fmetadata_geno, fmetadata_transcripto, fmetadata_metabo),\n samples_metadatas = c(smetadata_all, smetadata_all, smetadata_all)\n)\n\nAgain, the warnings raised by the function originate from discrepancies between the datasets and associated metadata. It is always good practice to double-check manually to make sure that it is not due to a typo in the IDs or similar error.\nIf one of the datasets has no associated features or samples metadata, use NULL in the corresponding input arguments, e.g.:\n\ncreate_omics_set_factory(\n datasets = c(data_geno, data_transcripto, data_metabo),\n omics_types = c(\"genomics\", \"transcriptomics\", \"metabolomics\"),\n features_metadatas = c(NULL, fmetadata_transcripto, fmetadata_metabo),\n samples_metadatas = c(smetadata_all, NULL, smetadata_all)\n)\n\nThe create_omics_set_factory() function has a target_name_suffixes argument to customise the name of the created targets. However, if this argument is not provided, the function will attempt to read the suffixes to use from the name of the dataset targets. So in this case, it knows that the suffixes to use are 'geno', 'transcripto' and 'metabo'. Consequently, the function creates the following targets: set_geno, set_transcripto, set_metabo.\n\ntar_read(set_geno)\n#> SnpSet (storageMode: lockedEnvironment)\n#> assayData: 23036 features, 139 samples \n#> element names: call, callProbability \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... O5108 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: 1_41768691 10-27008241-A-C-rs42918694 ... STAT5_13516_2\n#> (23036 total)\n#> fvarLabels: feature_id chromosome ... fdr (13 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\n\ntar_read(set_transcripto)\n#> ExpressionSet (storageMode: lockedEnvironment)\n#> assayData: 20335 features, 143 samples \n#> element names: exprs \n#> protocolData: none\n#> phenoData\n#> rowNames: R9497 R5969 ... Y9816 (143 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: ENSBTAG00000000005 ENSBTAG00000000008 ...\n#> ENSBTAG00000055314 (20335 total)\n#> fvarLabels: feature_id chromosome ... description (8 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\n\ntar_read(set_metabo)\n#> MetabolomeSet (storageMode: lockedEnvironment)\n#> assayData: 55 features, 139 samples \n#> element names: call \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... U5416 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: HMDB00001 HMDB00008 ... HMDB01881 (55 total)\n#> fvarLabels: feature_id hmdb_id ... de_status (16 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:" + "text": "3.5 Creating the omics sets\nOnce each dataset and associated features and samples metadata have been imported, we need to combine them into omics sets. In practice, this means that for each omics dataset, we will create an R object that stores the actual dataset alongside its relevant metadata. moiraine relies on the Biobase containers derived from Biobase::eSet to store the different omics datasets; for example, Biobase::ExpressionSet objects are used to store transcriptomics measurements. Currently, moiraine support four types of omics containers:\n\ngenomics containers, which are Biobase::SnpSet objects. The particularity of this data type is that the features metadata data-frame must contain a column named chromosome and a column named position, which store the chromosome and genomic position within the chromosome (in base pairs) of a given genomic marker or variant.\ntranscriptomics containers, which are Biobase::ExpressionSet objects. The particularity of this data type is that the features metadata data-frame must contain the following columns: chromosome, start, end, giving the chromosome, start and end positions (in base pairs) of the genes or transcripts. Moreover, the values in start and end must be integers, and for each row the value in end must be higher than the value in start.\nmetabolomics containers, which are MetabolomeSet objects (implemented within moiraine). There are no restrictions on the features metadata table for this type of containers.\nphenotype containers, which are PhenotypeSet objects (implemented within moiraine). There are no restrictions on the features metadata table for this type of containers.\n\nIn practice, the nuances between these different containers are not very important, and the type of container used to store a particular dataset will have no impact on the downstream analysis apart from the name that will be given to the omics dataset. So in order to create a container for a transcriptomics dataset in the absence of features metadata, we have to create a dummy data-frame with the columns chromosome, start and end containing the values ch1, 1, and 10 (for example) and use that as features metadata. Alternately, or for other omics data (e.g. proteomics), it is possible to use a PhenotypeSet object instead.\n\n3.5.1 Creating a single omics set\nThe function create_omics_set() provides a convenient wrapper to create such container objects from the imported datasets and metadata. It has two mandatory arguments: the dataset, which should be in the form of a matrix where the rows correspond to features and the columns to samples; and the type of omics data that the dataset represents ('genomics', 'transcriptomics', 'metabolomics' or 'phenomics'). The latter determines which type of container will be generated. Optionally, a features metadata and/or a samples metadata data-frame can be passed on via the features_metadata and samples_metadata arguments, respectively. For example, let’s create a set for the genomics data:\n\ntar_target(\n set_geno,\n create_omics_set(\n data_geno,\n omics_type = \"genomics\",\n features_metadata = fmetadata_geno,\n samples_metadata = smetadata_all\n )\n)\n\nIf executed, this command will return the following warning:\n\n#> Warning: 5 samples in samples metadata not in dataset, will be removed from\n#> metadata.\n\nThis is because, when providing features and samples metadata information, the function makes sure that the feature or sample IDs present in the metadata tables match those used in the dataset. In our case, 5 sample IDs from the metadata data-frame are not present in the dataset. We can confirm that by comparing the column names of the genomics dataset to the row names of the samples metadata:\n\nsetdiff(\n tar_read(smetadata_all) |> rownames(),\n tar_read(data_geno) |> colnames()\n)\n#> [1] \"P4744\" \"P4772\" \"R8953\" \"U5416\" \"R9909\"\n\nRather than throwing an error, the function will add a row for each missing sample ID to the metadata data-frame, with a NA in every column, and will remove from the metadata data-frame any sample not present in the dataset. The same applies for features metadata.\nThe resulting object is a SnpSet:\n\ntar_read(set_geno)\n#> SnpSet (storageMode: lockedEnvironment)\n#> assayData: 23036 features, 139 samples \n#> element names: call, callProbability \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... O5108 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: 1_41768691 10-27008241-A-C-rs42918694 ... STAT5_13516_2\n#> (23036 total)\n#> fvarLabels: feature_id chromosome ... fdr (13 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\nwhich can be queried using specific methods from the Biobase package, e.g.:\n\ntar_load(set_geno)\n\ndim(set_geno)\n#> Features Samples \n#> 23036 139\n\nfeatureNames(set_geno) |> head()\n#> [1] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \n#> [3] \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" \n#> [5] \"1-109550832-G-A-rs209732846\" \"11-104555023-A-G-rs109353933\"\n\nsampleNames(set_geno) |> head()\n#> [1] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" \"P4669\" \"R5452\"\n\nfData(set_geno) |> head() ## extracts features metadata\n#> feature_id chromosome position\n#> 1_41768691 1_41768691 1 42139849\n#> 10-27008241-A-C-rs42918694 10-27008241-A-C-rs42918694 10 26971270\n#> 10-37505419-T-C-rs136559242 10-37505419-T-C-rs136559242 10 37388728\n#> 10-49904259-G-A-rs471723345 10-49904259-G-A-rs471723345 0 0\n#> 1-109550832-G-A-rs209732846 1-109550832-G-A-rs209732846 1 108696486\n#> 11-104555023-A-G-rs109353933 11-104555023-A-G-rs109353933 11 104498929\n#> gen_train_score ref alt ilmn_strand\n#> 1_41768691 0.6786 T G BOT\n#> 10-27008241-A-C-rs42918694 0.8050 A C TOP\n#> 10-37505419-T-C-rs136559242 0.7890 A G TOP\n#> 10-49904259-G-A-rs471723345 0.7970 A G TOP\n#> 1-109550832-G-A-rs209732846 0.8909 T C BOT\n#> 11-104555023-A-G-rs109353933 0.8673 T C BOT\n#> customer_strand norm_id qtl_type qtl_effect\n#> 1_41768691 BOT 2 non signif. NA\n#> 10-27008241-A-C-rs42918694 TOP 1 non signif. NA\n#> 10-37505419-T-C-rs136559242 BOT 1 non signif. NA\n#> 10-49904259-G-A-rs471723345 TOP 2 non signif. NA\n#> 1-109550832-G-A-rs209732846 TOP 3 non signif. NA\n#> 11-104555023-A-G-rs109353933 TOP 1 non signif. NA\n#> p_value fdr\n#> 1_41768691 NA NA\n#> 10-27008241-A-C-rs42918694 NA NA\n#> 10-37505419-T-C-rs136559242 NA NA\n#> 10-49904259-G-A-rs471723345 NA NA\n#> 1-109550832-G-A-rs209732846 NA NA\n#> 11-104555023-A-G-rs109353933 NA NA\n\npData(set_geno) |> head() ## extracts samples metadata\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3\n\nNote that these methods can also be applied to the other types of containers.\n\n3.5.2 Using a target factory for creating omics sets\nThe function create_omics_set_factory() allows us to create several omics sets at once. It returns a list of targets, each storing one of the created omics set container. It takes as input arguments vectors that give for each omics set the arguments required by create_omics_set().\n\ncreate_omics_set_factory(\n datasets = c(data_geno, data_transcripto, data_metabo),\n omics_types = c(\"genomics\", \"transcriptomics\", \"metabolomics\"),\n features_metadatas = c(fmetadata_geno, fmetadata_transcripto, fmetadata_metabo),\n samples_metadatas = c(smetadata_all, smetadata_all, smetadata_all)\n)\n\nAgain, the warnings raised by the function originate from discrepancies between the datasets and associated metadata. It is always good practice to double-check manually to make sure that it is not due to a typo in the IDs or similar error.\nIf one of the datasets has no associated features or samples metadata, use NULL in the corresponding input arguments, e.g.:\n\ncreate_omics_set_factory(\n datasets = c(data_geno, data_transcripto, data_metabo),\n omics_types = c(\"genomics\", \"transcriptomics\", \"metabolomics\"),\n features_metadatas = c(NULL, fmetadata_transcripto, fmetadata_metabo),\n samples_metadatas = c(smetadata_all, NULL, smetadata_all)\n)\n\nThe create_omics_set_factory() function has a target_name_suffixes argument to customise the name of the created targets. However, if this argument is not provided, the function will attempt to read the suffixes to use from the name of the dataset targets. So in this case, it knows that the suffixes to use are 'geno', 'transcripto' and 'metabo'. Consequently, the function creates the following targets: set_geno, set_transcripto, set_metabo.\n\ntar_read(set_geno)\n#> SnpSet (storageMode: lockedEnvironment)\n#> assayData: 23036 features, 139 samples \n#> element names: call, callProbability \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... O5108 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: 1_41768691 10-27008241-A-C-rs42918694 ... STAT5_13516_2\n#> (23036 total)\n#> fvarLabels: feature_id chromosome ... fdr (13 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\n\ntar_read(set_transcripto)\n#> ExpressionSet (storageMode: lockedEnvironment)\n#> assayData: 20335 features, 143 samples \n#> element names: exprs \n#> protocolData: none\n#> phenoData\n#> rowNames: R9497 R5969 ... Y9816 (143 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: ENSBTAG00000000005 ENSBTAG00000000008 ...\n#> ENSBTAG00000055314 (20335 total)\n#> fvarLabels: feature_id chromosome ... description (8 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:\n\n\ntar_read(set_metabo)\n#> MetabolomeSet (storageMode: lockedEnvironment)\n#> assayData: 55 features, 139 samples \n#> element names: call \n#> protocolData: none\n#> phenoData\n#> rowNames: R21 Y3660 ... U5416 (139 total)\n#> varLabels: id feedlot ... geno_comp_cluster (10 total)\n#> varMetadata: labelDescription\n#> featureData\n#> featureNames: HMDB00001 HMDB00008 ... HMDB01881 (55 total)\n#> fvarLabels: feature_id hmdb_id ... de_status (16 total)\n#> fvarMetadata: labelDescription\n#> experimentData: use 'experimentData(object)'\n#> Annotation:" }, { "objectID": "data_import.html#creating-the-multi-omics-set", @@ -95,7 +95,7 @@ "href": "inspecting_multidataset.html#extracting-datasets-and-metadata", "title": "4  Inspecting the MultiDataSet object", "section": "\n4.2 Extracting datasets and metadata", - "text": "4.2 Extracting datasets and metadata\nWe can extract the dataset matrices from a MultiDataSet object with the get_datasets() function, which returns a named list of matrices, each with features as rows and samples as columns:\n\nget_datasets(mo_set) |> str()\n#> List of 3\n#> $ snps : num [1:23036, 1:139] 1 2 0 1 2 0 1 2 1 1 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:23036] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> .. ..$ : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> $ rnaseq : num [1:20335, 1:143] 733 6 0 2693 0 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:20335] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> .. ..$ : chr [1:143] \"R9497\" \"R5969\" \"R5327\" \"R5979\" ...\n#> $ metabolome: num [1:55, 1:139] 9.1 58.2 403 172.6 0.7 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:55] \"HMDB00001\" \"HMDB00008\" \"HMDB00042\" \"HMDB00043\" ...\n#> .. ..$ : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n\n\nget_datasets(mo_set)[[\"snps\"]][1:5, 1:5]\n#> R21 Y3660 Y3243 R5764 P4669\n#> 1_41768691 1 0 2 2 1\n#> 10-27008241-A-C-rs42918694 2 2 2 1 2\n#> 10-37505419-T-C-rs136559242 0 1 0 2 0\n#> 10-49904259-G-A-rs471723345 1 2 2 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1 2 2\n\nTo obtain the matrix for a single dataset from the MultiDataSet object, the get_dataset_matrix() function can be used instead:\n\nget_dataset_matrix(mo_set, \"snps\")[1:5, 1:5]\n#> R21 Y3660 Y3243 R5764 P4669\n#> 1_41768691 1 0 2 2 1\n#> 10-27008241-A-C-rs42918694 2 2 2 1 2\n#> 10-37505419-T-C-rs136559242 0 1 0 2 0\n#> 10-49904259-G-A-rs471723345 1 2 2 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1 2 2\n\nSimilarly, the functions get_features_metadata() and get_samples_metadata() each return a named list of feature or sample metadata data-frames, one per omics dataset:\n\nget_features_metadata(mo_set) |> str()\n#> List of 3\n#> $ snps :'data.frame': 23036 obs. of 13 variables:\n#> ..$ feature_id : chr [1:23036] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> ..$ chromosome : chr [1:23036] \"1\" \"10\" \"10\" \"0\" ...\n#> ..$ position : num [1:23036] 4.21e+07 2.70e+07 3.74e+07 0.00 1.09e+08 ...\n#> ..$ gen_train_score: num [1:23036] 0.679 0.805 0.789 0.797 0.891 ...\n#> ..$ ref : chr [1:23036] \"T\" \"A\" \"A\" \"A\" ...\n#> ..$ alt : chr [1:23036] \"G\" \"C\" \"G\" \"G\" ...\n#> ..$ ilmn_strand : chr [1:23036] \"BOT\" \"TOP\" \"TOP\" \"TOP\" ...\n#> ..$ customer_strand: chr [1:23036] \"BOT\" \"TOP\" \"BOT\" \"TOP\" ...\n#> ..$ norm_id : num [1:23036] 2 1 1 2 3 1 3 3 0 0 ...\n#> ..$ qtl_type : chr [1:23036] NA NA NA NA ...\n#> ..$ qtl_effect : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> ..$ p_value : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> ..$ fdr : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> $ rnaseq :'data.frame': 20335 obs. of 8 variables:\n#> ..$ feature_id : chr [1:20335] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> ..$ chromosome : Factor w/ 178 levels \"1\",\"2\",\"3\",\"4\",..: 17 29 18 21 8 20 20 5 5 23 ...\n#> ..$ start : int [1:20335] 65389743 32214439 12338037 34209956 7950815 33708626 33674806 74883636 74905031 27720176 ...\n#> ..$ end : int [1:20335] 65505336 32244810 12342272 34223394 7971600 33732944 33703223 74893752 74919112 27721739 ...\n#> ..$ width : int [1:20335] 115594 30372 4236 13439 20786 24319 28418 10117 14082 1564 ...\n#> ..$ strand : Factor w/ 3 levels \"+\",\"-\",\"*\": 1 2 1 1 2 1 1 2 2 2 ...\n#> ..$ Name : chr [1:20335] \"GRK3\" \"KCNJ1\" \"FOXF1\" \"UBL7\" ...\n#> ..$ description: chr [1:20335] \"G protein-coupled receptor kinase 3 [Source:VGNC Symbol;Acc:VGNC:53904]\" \"potassium inwardly rectifying channel subfamily J member 1 [Source:VGNC Symbol;Acc:VGNC:30453]\" \"forkhead box F1 [Source:VGNC Symbol;Acc:VGNC:29084]\" \"ubiquitin like 7 [Source:VGNC Symbol;Acc:VGNC:50128]\" ...\n#> $ metabolome:'data.frame': 55 obs. of 16 variables:\n#> ..$ feature_id : chr [1:55] \"HMDB00001\" \"HMDB00008\" \"HMDB00042\" \"HMDB00043\" ...\n#> ..$ hmdb_id : chr [1:55] \"HMDB0000001\" \"HMDB0000008\" \"HMDB0000042\" \"HMDB0000043\" ...\n#> ..$ name : chr [1:55] \"1-Methylhistidine\" \"2-Hydroxybutyric acid\" \"Acetic acid\" \"Betaine\" ...\n#> ..$ chemical_formula : chr [1:55] \"C7H11N3O2\" \"C4H8O3\" \"C2H4O2\" \"C5H12NO2\" ...\n#> ..$ monisotopic_molecular_weight: num [1:55] 169 104 60 118 102 ...\n#> ..$ cas_registry_number : chr [1:55] \"332-80-9\" \"3347-90-8\" \"64-19-7\" \"6915-17-9\" ...\n#> ..$ smiles : chr [1:55] \"CN1C=NC(C[C@H](N)C(O)=O)=C1\" \"CC[C@H](O)C(O)=O\" \"CC(O)=O\" \"C[N+](C)(C)CC(O)=O\" ...\n#> ..$ inchikey : chr [1:55] \"BRMWTNUJHUMWMS-LURJTMIESA-N\" \"AFENDNXGAFYKQO-VKHMYHEASA-N\" \"QTBSBXVTEAMEQO-UHFFFAOYSA-N\" \"KWIUHFFTVRNATP-UHFFFAOYSA-O\" ...\n#> ..$ kegg_id : chr [1:55] \"C01152\" \"C05984\" \"C00033\" NA ...\n#> ..$ direct_parent : chr [1:55] \"Histidine and derivatives\" \"Alpha hydroxy acids and derivatives\" \"Carboxylic acids\" \"Alpha amino acids\" ...\n#> ..$ super_class : chr [1:55] \"Organic acids and derivatives\" \"Organic acids and derivatives\" \"Organic acids and derivatives\" \"Organic acids and derivatives\" ...\n#> ..$ t_value : num [1:55] -0.556 0.218 -12.532 -7.907 -0.437 ...\n#> ..$ p_value : num [1:55] 5.80e-01 8.28e-01 1.75e-24 7.83e-13 6.63e-01 ...\n#> ..$ padj : num [1:55] 6.78e-01 8.93e-01 4.82e-23 3.91e-12 7.44e-01 ...\n#> ..$ de_signif : chr [1:55] \"Not DE\" \"Not DE\" \"DE\" \"DE\" ...\n#> ..$ de_status : chr [1:55] \"Not DE\" \"Not DE\" \"downregulated\" \"downregulated\" ...\n\n\nget_samples_metadata(mo_set) |> str()\n#> List of 3\n#> $ snps :'data.frame': 139 obs. of 10 variables:\n#> ..$ id : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> ..$ feedlot : chr [1:139] \"F1\" \"F1\" \"F1\" \"F2\" ...\n#> ..$ gender : chr [1:139] \"female\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:139] \"Control\" \"Control\" \"Control\" \"Control\" ...\n#> ..$ day_on_feed : num [1:139] 31 19 16 46 35 49 21 16 37 37 ...\n#> ..$ rnaseq_batch : chr [1:139] \"B2\" \"B2\" \"B2\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:139] 0.00785 0.85222 0.04417 0.21309 0.38939 ...\n#> ..$ geno_comp_2 : num [1:139] 0.8207 0.0936 0.1903 0.6763 0.5035 ...\n#> ..$ geno_comp_3 : num [1:139] 0.1715 0.0542 0.7656 0.1106 0.1071 ...\n#> ..$ geno_comp_cluster: chr [1:139] \"K3\" \"K2\" \"K1\" \"K3\" ...\n#> $ rnaseq :'data.frame': 143 obs. of 10 variables:\n#> ..$ id : chr [1:143] \"R9497\" \"R5969\" \"R5327\" \"R5979\" ...\n#> ..$ feedlot : chr [1:143] \"F2\" \"F2\" \"F2\" \"F2\" ...\n#> ..$ gender : chr [1:143] \"male\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:143] \"BRD\" \"BRD\" \"BRD\" \"BRD\" ...\n#> ..$ day_on_feed : num [1:143] 35 24 38 30 31 24 26 18 13 32 ...\n#> ..$ rnaseq_batch : chr [1:143] \"B1\" \"B1\" \"B1\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:143] 0.15372 0.11066 0.14073 0.28673 0.00001 ...\n#> ..$ geno_comp_2 : num [1:143] 0.745 0.626 0.809 0.108 0.999 ...\n#> ..$ geno_comp_3 : num [1:143] 0.10178 0.26351 0.04987 0.60547 0.00108 ...\n#> ..$ geno_comp_cluster: chr [1:143] \"K3\" \"K3\" \"K3\" \"K1\" ...\n#> $ metabolome:'data.frame': 139 obs. of 10 variables:\n#> ..$ id : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> ..$ feedlot : chr [1:139] \"F1\" \"F1\" \"F1\" \"F2\" ...\n#> ..$ gender : chr [1:139] \"female\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:139] \"Control\" \"Control\" \"Control\" \"Control\" ...\n#> ..$ day_on_feed : num [1:139] 31 19 16 46 35 49 21 16 37 37 ...\n#> ..$ rnaseq_batch : chr [1:139] \"B2\" \"B2\" \"B2\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:139] 0.00785 0.85222 0.04417 0.21309 0.38939 ...\n#> ..$ geno_comp_2 : num [1:139] 0.8207 0.0936 0.1903 0.6763 0.5035 ...\n#> ..$ geno_comp_3 : num [1:139] 0.1715 0.0542 0.7656 0.1106 0.1071 ...\n#> ..$ geno_comp_cluster: chr [1:139] \"K3\" \"K2\" \"K1\" \"K3\" ...\n\nFor the samples metadata, it is possible to extract a single data-frame that combines the metadata from the different datasets with the function get_samples_metadata_combined(). The only_common_cols argument controls whether only the columns that are common to the samples metadata of the different omics datasets should be returned. For this example, as the samples metadata is identical across the datasets, it makes no difference:\n\nget_samples_metadata_combined(mo_set) |> head()\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3" + "text": "4.2 Extracting datasets and metadata\nWe can extract the dataset matrices from a MultiDataSet object with the get_datasets() function, which returns a named list of matrices, each with features as rows and samples as columns:\n\nget_datasets(mo_set) |> str()\n#> List of 3\n#> $ snps : num [1:23036, 1:139] 1 2 0 1 2 0 1 2 1 1 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:23036] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> .. ..$ : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> $ rnaseq : num [1:20335, 1:143] 733 6 0 2693 0 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:20335] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> .. ..$ : chr [1:143] \"R9497\" \"R5969\" \"R5327\" \"R5979\" ...\n#> $ metabolome: num [1:55, 1:139] 9.1 58.2 403 172.6 0.7 ...\n#> ..- attr(*, \"dimnames\")=List of 2\n#> .. ..$ : chr [1:55] \"HMDB00001\" \"HMDB00008\" \"HMDB00042\" \"HMDB00043\" ...\n#> .. ..$ : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n\n\nget_datasets(mo_set)[[\"snps\"]][1:5, 1:5]\n#> R21 Y3660 Y3243 R5764 P4669\n#> 1_41768691 1 0 2 2 1\n#> 10-27008241-A-C-rs42918694 2 2 2 1 2\n#> 10-37505419-T-C-rs136559242 0 1 0 2 0\n#> 10-49904259-G-A-rs471723345 1 2 2 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1 2 2\n\nTo obtain the matrix for a single dataset from the MultiDataSet object, the get_dataset_matrix() function can be used instead:\n\nget_dataset_matrix(mo_set, \"snps\")[1:5, 1:5]\n#> R21 Y3660 Y3243 R5764 P4669\n#> 1_41768691 1 0 2 2 1\n#> 10-27008241-A-C-rs42918694 2 2 2 1 2\n#> 10-37505419-T-C-rs136559242 0 1 0 2 0\n#> 10-49904259-G-A-rs471723345 1 2 2 2 2\n#> 1-109550832-G-A-rs209732846 2 2 1 2 2\n\nSimilarly, the functions get_features_metadata() and get_samples_metadata() each return a named list of feature or sample metadata data-frames, one per omics dataset:\n\nget_features_metadata(mo_set) |> str()\n#> List of 3\n#> $ snps :'data.frame': 23036 obs. of 13 variables:\n#> ..$ feature_id : chr [1:23036] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> ..$ chromosome : chr [1:23036] \"1\" \"10\" \"10\" \"0\" ...\n#> ..$ position : num [1:23036] 4.21e+07 2.70e+07 3.74e+07 0.00 1.09e+08 ...\n#> ..$ gen_train_score: num [1:23036] 0.679 0.805 0.789 0.797 0.891 ...\n#> ..$ ref : chr [1:23036] \"T\" \"A\" \"A\" \"A\" ...\n#> ..$ alt : chr [1:23036] \"G\" \"C\" \"G\" \"G\" ...\n#> ..$ ilmn_strand : chr [1:23036] \"BOT\" \"TOP\" \"TOP\" \"TOP\" ...\n#> ..$ customer_strand: chr [1:23036] \"BOT\" \"TOP\" \"BOT\" \"TOP\" ...\n#> ..$ norm_id : num [1:23036] 2 1 1 2 3 1 3 3 0 0 ...\n#> ..$ qtl_type : chr [1:23036] \"non signif.\" \"non signif.\" \"non signif.\" \"non signif.\" ...\n#> ..$ qtl_effect : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> ..$ p_value : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> ..$ fdr : num [1:23036] NA NA NA NA NA NA NA NA NA NA ...\n#> $ rnaseq :'data.frame': 20335 obs. of 8 variables:\n#> ..$ feature_id : chr [1:20335] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> ..$ chromosome : Factor w/ 178 levels \"1\",\"2\",\"3\",\"4\",..: 17 29 18 21 8 20 20 5 5 23 ...\n#> ..$ start : int [1:20335] 65389743 32214439 12338037 34209956 7950815 33708626 33674806 74883636 74905031 27720176 ...\n#> ..$ end : int [1:20335] 65505336 32244810 12342272 34223394 7971600 33732944 33703223 74893752 74919112 27721739 ...\n#> ..$ width : int [1:20335] 115594 30372 4236 13439 20786 24319 28418 10117 14082 1564 ...\n#> ..$ strand : Factor w/ 3 levels \"+\",\"-\",\"*\": 1 2 1 1 2 1 1 2 2 2 ...\n#> ..$ Name : chr [1:20335] \"GRK3\" \"KCNJ1\" \"FOXF1\" \"UBL7\" ...\n#> ..$ description: chr [1:20335] \"G protein-coupled receptor kinase 3 [Source:VGNC Symbol;Acc:VGNC:53904]\" \"potassium inwardly rectifying channel subfamily J member 1 [Source:VGNC Symbol;Acc:VGNC:30453]\" \"forkhead box F1 [Source:VGNC Symbol;Acc:VGNC:29084]\" \"ubiquitin like 7 [Source:VGNC Symbol;Acc:VGNC:50128]\" ...\n#> $ metabolome:'data.frame': 55 obs. of 16 variables:\n#> ..$ feature_id : chr [1:55] \"HMDB00001\" \"HMDB00008\" \"HMDB00042\" \"HMDB00043\" ...\n#> ..$ hmdb_id : chr [1:55] \"HMDB0000001\" \"HMDB0000008\" \"HMDB0000042\" \"HMDB0000043\" ...\n#> ..$ name : chr [1:55] \"1-Methylhistidine\" \"2-Hydroxybutyric acid\" \"Acetic acid\" \"Betaine\" ...\n#> ..$ chemical_formula : chr [1:55] \"C7H11N3O2\" \"C4H8O3\" \"C2H4O2\" \"C5H12NO2\" ...\n#> ..$ monisotopic_molecular_weight: num [1:55] 169 104 60 118 102 ...\n#> ..$ cas_registry_number : chr [1:55] \"332-80-9\" \"3347-90-8\" \"64-19-7\" \"6915-17-9\" ...\n#> ..$ smiles : chr [1:55] \"CN1C=NC(C[C@H](N)C(O)=O)=C1\" \"CC[C@H](O)C(O)=O\" \"CC(O)=O\" \"C[N+](C)(C)CC(O)=O\" ...\n#> ..$ inchikey : chr [1:55] \"BRMWTNUJHUMWMS-LURJTMIESA-N\" \"AFENDNXGAFYKQO-VKHMYHEASA-N\" \"QTBSBXVTEAMEQO-UHFFFAOYSA-N\" \"KWIUHFFTVRNATP-UHFFFAOYSA-O\" ...\n#> ..$ kegg_id : chr [1:55] \"C01152\" \"C05984\" \"C00033\" NA ...\n#> ..$ direct_parent : chr [1:55] \"Histidine and derivatives\" \"Alpha hydroxy acids and derivatives\" \"Carboxylic acids\" \"Alpha amino acids\" ...\n#> ..$ super_class : chr [1:55] \"Organic acids and derivatives\" \"Organic acids and derivatives\" \"Organic acids and derivatives\" \"Organic acids and derivatives\" ...\n#> ..$ t_value : num [1:55] -0.556 0.218 -12.532 -7.907 -0.437 ...\n#> ..$ p_value : num [1:55] 5.80e-01 8.28e-01 1.75e-24 7.83e-13 6.63e-01 ...\n#> ..$ padj : num [1:55] 6.78e-01 8.93e-01 4.82e-23 3.91e-12 7.44e-01 ...\n#> ..$ de_signif : chr [1:55] \"Not DE\" \"Not DE\" \"DE\" \"DE\" ...\n#> ..$ de_status : chr [1:55] \"Not DE\" \"Not DE\" \"downregulated\" \"downregulated\" ...\n\n\nget_samples_metadata(mo_set) |> str()\n#> List of 3\n#> $ snps :'data.frame': 139 obs. of 10 variables:\n#> ..$ id : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> ..$ feedlot : chr [1:139] \"F1\" \"F1\" \"F1\" \"F2\" ...\n#> ..$ gender : chr [1:139] \"female\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:139] \"Control\" \"Control\" \"Control\" \"Control\" ...\n#> ..$ day_on_feed : num [1:139] 31 19 16 46 35 49 21 16 37 37 ...\n#> ..$ rnaseq_batch : chr [1:139] \"B2\" \"B2\" \"B2\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:139] 0.00785 0.85222 0.04417 0.21309 0.38939 ...\n#> ..$ geno_comp_2 : num [1:139] 0.8207 0.0936 0.1903 0.6763 0.5035 ...\n#> ..$ geno_comp_3 : num [1:139] 0.1715 0.0542 0.7656 0.1106 0.1071 ...\n#> ..$ geno_comp_cluster: chr [1:139] \"K3\" \"K2\" \"K1\" \"K3\" ...\n#> $ rnaseq :'data.frame': 143 obs. of 10 variables:\n#> ..$ id : chr [1:143] \"R9497\" \"R5969\" \"R5327\" \"R5979\" ...\n#> ..$ feedlot : chr [1:143] \"F2\" \"F2\" \"F2\" \"F2\" ...\n#> ..$ gender : chr [1:143] \"male\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:143] \"BRD\" \"BRD\" \"BRD\" \"BRD\" ...\n#> ..$ day_on_feed : num [1:143] 35 24 38 30 31 24 26 18 13 32 ...\n#> ..$ rnaseq_batch : chr [1:143] \"B1\" \"B1\" \"B1\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:143] 0.15372 0.11066 0.14073 0.28673 0.00001 ...\n#> ..$ geno_comp_2 : num [1:143] 0.745 0.626 0.809 0.108 0.999 ...\n#> ..$ geno_comp_3 : num [1:143] 0.10178 0.26351 0.04987 0.60547 0.00108 ...\n#> ..$ geno_comp_cluster: chr [1:143] \"K3\" \"K3\" \"K3\" \"K1\" ...\n#> $ metabolome:'data.frame': 139 obs. of 10 variables:\n#> ..$ id : chr [1:139] \"R21\" \"Y3660\" \"Y3243\" \"R5764\" ...\n#> ..$ feedlot : chr [1:139] \"F1\" \"F1\" \"F1\" \"F2\" ...\n#> ..$ gender : chr [1:139] \"female\" \"male\" \"male\" \"male\" ...\n#> ..$ status : chr [1:139] \"Control\" \"Control\" \"Control\" \"Control\" ...\n#> ..$ day_on_feed : num [1:139] 31 19 16 46 35 49 21 16 37 37 ...\n#> ..$ rnaseq_batch : chr [1:139] \"B2\" \"B2\" \"B2\" \"B1\" ...\n#> ..$ geno_comp_1 : num [1:139] 0.00785 0.85222 0.04417 0.21309 0.38939 ...\n#> ..$ geno_comp_2 : num [1:139] 0.8207 0.0936 0.1903 0.6763 0.5035 ...\n#> ..$ geno_comp_3 : num [1:139] 0.1715 0.0542 0.7656 0.1106 0.1071 ...\n#> ..$ geno_comp_cluster: chr [1:139] \"K3\" \"K2\" \"K1\" \"K3\" ...\n\nFor the samples metadata, it is possible to extract a single data-frame that combines the metadata from the different datasets with the function get_samples_metadata_combined(). The only_common_cols argument controls whether only the columns that are common to the samples metadata of the different omics datasets should be returned. For this example, as the samples metadata is identical across the datasets, it makes no difference:\n\nget_samples_metadata_combined(mo_set) |> head()\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3" }, { "objectID": "inspecting_multidataset.html#sec-inspecting-multidataset-summary-plots", @@ -144,7 +144,7 @@ "href": "modifying_multidataset.html#adding-information-to-samples-metadata", "title": "5  Modifying the MultiDataSet object", "section": "\n5.3 Adding information to samples metadata", - "text": "5.3 Adding information to samples metadata\nSimilarly, we can add a data-frame of information to the samples metadata. Here, we will create a table that contains “new” simulated information about the samples that we want to incorporate in our MultiDataSet object.\n\n## Getting the list of samples ID across the datasets\nsamples_list <- get_samples(mo_set) |>\n unlist() |>\n unname() |>\n unique()\n\n## Simulating new information table, with new samples grouping\nnew_samples_df <- tibble(id = samples_list) |>\n mutate(new_group = sample(letters[1:3], n(), replace = TRUE))\n\nhead(new_samples_df)\n#> # A tibble: 6 × 2\n#> id new_group\n#> \n#> 1 R21 c \n#> 2 Y3660 a \n#> 3 Y3243 a \n#> 4 R5764 b \n#> 5 P4669 c \n#> 6 R5452 b\n\nNote that the sample IDs must be stored in a column named id. We will use the add_samples_metadata() function to add this new data-frame to the samples metadata in our MultiDataSet object. There are several options for which samples metadata tables should be modified; this is controlled through the datasets argument of the function. By default, the information is added to the samples metadata table of all omics datasets (case when datasets = NULL):\n\nmo_set_new_samples_info <- add_samples_metadata(mo_set, new_samples_df)\n#> Warning: snps dataset: 5 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: rnaseq dataset: 1 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: metabolome dataset: 5 sample IDs not in 'mo_data', will be removed\n#> from samples metadata.\n\nmo_set_new_samples_info |>\n get_samples_metadata() |>\n map(head)\n#> $snps\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 c\n#> Y3660 0.093585 0.054195 K2 a\n#> Y3243 0.190262 0.765567 K1 a\n#> R5764 0.676299 0.110607 K3 b\n#> P4669 0.503471 0.107136 K3 c\n#> R5452 0.733992 0.000010 K3 b\n#> \n#> $rnaseq\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R9497 R9497 F2 male BRD 35 B1 0.153716\n#> R5969 R5969 F2 male BRD 24 B1 0.110663\n#> R5327 R5327 F2 male BRD 38 B1 0.140730\n#> R5979 R5979 F2 male BRD 30 B1 0.286733\n#> R9504 R9504 F2 male BRD 31 B1 0.000010\n#> R5994 R5994 F2 male BRD 24 B1 0.129271\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R9497 0.744505 0.101779 K3 c\n#> R5969 0.625823 0.263514 K3 c\n#> R5327 0.809396 0.049874 K3 b\n#> R5979 0.107794 0.605473 K1 c\n#> R9504 0.998913 0.001077 K3 b\n#> R5994 0.034351 0.836377 K1 b\n#> \n#> $metabolome\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 c\n#> Y3660 0.093585 0.054195 K2 a\n#> Y3243 0.190262 0.765567 K1 a\n#> R5764 0.676299 0.110607 K3 b\n#> P4669 0.503471 0.107136 K3 c\n#> R5452 0.733992 0.000010 K3 b\n\nHowever, it is also possible to specify for which dataset(s) the changes should be made, by passing their name to the datasets argument.\n\nmo_set_new_samples_info <- add_samples_metadata(\n mo_set, \n new_samples_df, \n datasets = c(\"rnaseq\", \"metabolome\")\n)\n#> Warning: rnaseq dataset: 1 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: metabolome dataset: 5 sample IDs not in 'mo_data', will be removed\n#> from samples metadata.\n\nmo_set_new_samples_info |>\n get_samples_metadata() |>\n map(head)\n#> $snps\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3\n#> \n#> $rnaseq\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R9497 R9497 F2 male BRD 35 B1 0.153716\n#> R5969 R5969 F2 male BRD 24 B1 0.110663\n#> R5327 R5327 F2 male BRD 38 B1 0.140730\n#> R5979 R5979 F2 male BRD 30 B1 0.286733\n#> R9504 R9504 F2 male BRD 31 B1 0.000010\n#> R5994 R5994 F2 male BRD 24 B1 0.129271\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R9497 0.744505 0.101779 K3 c\n#> R5969 0.625823 0.263514 K3 c\n#> R5327 0.809396 0.049874 K3 b\n#> R5979 0.107794 0.605473 K1 c\n#> R9504 0.998913 0.001077 K3 b\n#> R5994 0.034351 0.836377 K1 b\n#> \n#> $metabolome\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 c\n#> Y3660 0.093585 0.054195 K2 a\n#> Y3243 0.190262 0.765567 K1 a\n#> R5764 0.676299 0.110607 K3 b\n#> P4669 0.503471 0.107136 K3 c\n#> R5452 0.733992 0.000010 K3 b\n\nIn both cases, the function throws some warnings to alert about samples missing from this new table, or samples that are not present in the original samples metadata table. These warnings should be checked to avoid issues due to typos, etc.\nAs with the add_features_metadata() function, it is possible to add information about only a subset of the samples; however the columns in the new data-frame must not already be present in the features metadata tables to which it will be added." + "text": "5.3 Adding information to samples metadata\nSimilarly, we can add a data-frame of information to the samples metadata. Here, we will create a table that contains “new” simulated information about the samples that we want to incorporate in our MultiDataSet object.\n\n## Getting the list of samples ID across the datasets\nsamples_list <- get_samples(mo_set) |>\n unlist() |>\n unname() |>\n unique()\n\n## Simulating new information table, with new samples grouping\nnew_samples_df <- tibble(id = samples_list) |>\n mutate(new_group = sample(letters[1:3], n(), replace = TRUE))\n\nhead(new_samples_df)\n#> # A tibble: 6 × 2\n#> id new_group\n#> \n#> 1 R21 a \n#> 2 Y3660 c \n#> 3 Y3243 b \n#> 4 R5764 c \n#> 5 P4669 a \n#> 6 R5452 b\n\nNote that the sample IDs must be stored in a column named id. We will use the add_samples_metadata() function to add this new data-frame to the samples metadata in our MultiDataSet object. There are several options for which samples metadata tables should be modified; this is controlled through the datasets argument of the function. By default, the information is added to the samples metadata table of all omics datasets (case when datasets = NULL):\n\nmo_set_new_samples_info <- add_samples_metadata(mo_set, new_samples_df)\n#> Warning: snps dataset: 5 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: rnaseq dataset: 1 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: metabolome dataset: 5 sample IDs not in 'mo_data', will be removed\n#> from samples metadata.\n\nmo_set_new_samples_info |>\n get_samples_metadata() |>\n map(head)\n#> $snps\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 a\n#> Y3660 0.093585 0.054195 K2 c\n#> Y3243 0.190262 0.765567 K1 b\n#> R5764 0.676299 0.110607 K3 c\n#> P4669 0.503471 0.107136 K3 a\n#> R5452 0.733992 0.000010 K3 b\n#> \n#> $rnaseq\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R9497 R9497 F2 male BRD 35 B1 0.153716\n#> R5969 R5969 F2 male BRD 24 B1 0.110663\n#> R5327 R5327 F2 male BRD 38 B1 0.140730\n#> R5979 R5979 F2 male BRD 30 B1 0.286733\n#> R9504 R9504 F2 male BRD 31 B1 0.000010\n#> R5994 R5994 F2 male BRD 24 B1 0.129271\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R9497 0.744505 0.101779 K3 a\n#> R5969 0.625823 0.263514 K3 a\n#> R5327 0.809396 0.049874 K3 b\n#> R5979 0.107794 0.605473 K1 c\n#> R9504 0.998913 0.001077 K3 b\n#> R5994 0.034351 0.836377 K1 a\n#> \n#> $metabolome\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 a\n#> Y3660 0.093585 0.054195 K2 c\n#> Y3243 0.190262 0.765567 K1 b\n#> R5764 0.676299 0.110607 K3 c\n#> P4669 0.503471 0.107136 K3 a\n#> R5452 0.733992 0.000010 K3 b\n\nHowever, it is also possible to specify for which dataset(s) the changes should be made, by passing their name to the datasets argument.\n\nmo_set_new_samples_info <- add_samples_metadata(\n mo_set, \n new_samples_df, \n datasets = c(\"rnaseq\", \"metabolome\")\n)\n#> Warning: rnaseq dataset: 1 sample IDs not in 'mo_data', will be removed from\n#> samples metadata.\n#> Warning: metabolome dataset: 5 sample IDs not in 'mo_data', will be removed\n#> from samples metadata.\n\nmo_set_new_samples_info |>\n get_samples_metadata() |>\n map(head)\n#> $snps\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster\n#> R21 0.820691 0.171456 K3\n#> Y3660 0.093585 0.054195 K2\n#> Y3243 0.190262 0.765567 K1\n#> R5764 0.676299 0.110607 K3\n#> P4669 0.503471 0.107136 K3\n#> R5452 0.733992 0.000010 K3\n#> \n#> $rnaseq\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R9497 R9497 F2 male BRD 35 B1 0.153716\n#> R5969 R5969 F2 male BRD 24 B1 0.110663\n#> R5327 R5327 F2 male BRD 38 B1 0.140730\n#> R5979 R5979 F2 male BRD 30 B1 0.286733\n#> R9504 R9504 F2 male BRD 31 B1 0.000010\n#> R5994 R5994 F2 male BRD 24 B1 0.129271\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R9497 0.744505 0.101779 K3 a\n#> R5969 0.625823 0.263514 K3 a\n#> R5327 0.809396 0.049874 K3 b\n#> R5979 0.107794 0.605473 K1 c\n#> R9504 0.998913 0.001077 K3 b\n#> R5994 0.034351 0.836377 K1 a\n#> \n#> $metabolome\n#> id feedlot gender status day_on_feed rnaseq_batch geno_comp_1\n#> R21 R21 F1 female Control 31 B2 0.007853\n#> Y3660 Y3660 F1 male Control 19 B2 0.852220\n#> Y3243 Y3243 F1 male Control 16 B2 0.044171\n#> R5764 R5764 F2 male Control 46 B1 0.213094\n#> P4669 P4669 F3 male BRD 35 B2 0.389393\n#> R5452 R5452 F2 male Control 49 B1 0.265998\n#> geno_comp_2 geno_comp_3 geno_comp_cluster new_group\n#> R21 0.820691 0.171456 K3 a\n#> Y3660 0.093585 0.054195 K2 c\n#> Y3243 0.190262 0.765567 K1 b\n#> R5764 0.676299 0.110607 K3 c\n#> P4669 0.503471 0.107136 K3 a\n#> R5452 0.733992 0.000010 K3 b\n\nIn both cases, the function throws some warnings to alert about samples missing from this new table, or samples that are not present in the original samples metadata table. These warnings should be checked to avoid issues due to typos, etc.\nAs with the add_features_metadata() function, it is possible to add information about only a subset of the samples; however the columns in the new data-frame must not already be present in the features metadata tables to which it will be added." }, { "objectID": "modifying_multidataset.html#recap-targets-list", @@ -326,7 +326,7 @@ "href": "mofa.html#training-the-model", "title": "10  Integration with MOFA", "section": "\n10.4 Training the model", - "text": "10.4 Training the model\nOnce we have prepared our MOFA input, we can train the model with the run_mofa() function (from the MOFA2 package). This is done through Python, so there might be some issues when trying to run the function for the first time after installing MOFA2 if the configuration is not correct. If that is the case, see the MOFA2 tutorial (e.g. their troubleshooting section) for tips on how to solve this.\nBy default, the function will save the resulting trained model in a temporary file, with the .hdf5 format. It can be preferable to save the result into the output folder of your project; here as we are using targets to save the results of each step of the analysis, we do not need to do so. In addition, is it strongly recommended to set the save_data parameter to TRUE, as otherwise without the data, some of the visualisation options might not be available. Lastly, the use_basilisk parameter might have to be switched to FALSE if there are any issues with calling the Python module:\n\ntar_target(\n mofa_trained,\n run_mofa(\n mofa_input,\n save_data = TRUE,\n use_basilisk = TRUE\n )\n)\n\nIn our case, the following warnings are returned:\n\n#> Warning: No output filename provided. Using tmpRtmpaM7XWKmofa_20240125102128.hdf5 to store the trained model.\n#> \n#> Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.\n\nThe first one has to do with saving the model into a temporary file. We will explain the others in more detail when analysing the resulting model.\nThe output of the function is a trained MOFA model, with 15 latent factors:\n\ntar_load(mofa_trained)\nmofa_trained\n#> Trained MOFA with the following characteristics: \n#> Number of views: 3 \n#> Views names: snps rnaseq metabolome \n#> Number of features (per view): 1000 994 55 \n#> Number of groups: 1 \n#> Groups names: group1 \n#> Number of samples (per group): 144 \n#> Number of factors: 15" + "text": "10.4 Training the model\nOnce we have prepared our MOFA input, we can train the model with the run_mofa() function (from the MOFA2 package). This is done through Python, so there might be some issues when trying to run the function for the first time after installing MOFA2 if the configuration is not correct. If that is the case, see the MOFA2 tutorial (e.g. their troubleshooting section) for tips on how to solve this.\nBy default, the function will save the resulting trained model in a temporary file, with the .hdf5 format. It can be preferable to save the result into the output folder of your project; here as we are using targets to save the results of each step of the analysis, we do not need to do so. In addition, is it strongly recommended to set the save_data parameter to TRUE, as otherwise without the data, some of the visualisation options might not be available. Lastly, the use_basilisk parameter might have to be switched to FALSE if there are any issues with calling the Python module:\n\ntar_target(\n mofa_trained,\n run_mofa(\n mofa_input,\n save_data = TRUE,\n use_basilisk = TRUE\n )\n)\n\nIn our case, the following warnings are returned:\n\n#> Warning: No output filename provided. Using tmpRtmpXFuTOemofa_20240208105441.hdf5 to store the trained model.\n#> \n#> Factors 1 are strongly correlated with the total number of expressed features for at least one of your omics. Such factors appear when there are differences in the total levels between your samples, sometimes because of poor normalisation in the preprocessing steps.\n\nThe first one has to do with saving the model into a temporary file. We will explain the others in more detail when analysing the resulting model.\nThe output of the function is a trained MOFA model, with 15 latent factors:\n\ntar_load(mofa_trained)\nmofa_trained\n#> Trained MOFA with the following characteristics: \n#> Number of views: 3 \n#> Views names: snps rnaseq metabolome \n#> Number of features (per view): 1000 994 55 \n#> Number of groups: 1 \n#> Groups names: group1 \n#> Number of samples (per group): 144 \n#> Number of factors: 15" }, { "objectID": "mofa.html#results-interpretation", @@ -424,7 +424,7 @@ "href": "interpretation.html#sec-interpretation-samples-scores", "title": "12  Interpreting the integration results", "section": "\n12.4 Samples plot", - "text": "12.4 Samples plot\nTo understand the phenomenon driving the variation represented by the different latent components, we can investigate the coordinates of the samples in the space spanned by these latent components, in combination with information that we have about the samples.\nWe will start by loading the MultiDataSet object and generating some custom colour palettes for different samples covariates of interest, that we will use in the rest of the section.\n\ntar_load(mo_set_complete)\n\n## Choosing colour palettes for the samples covariates\npalette_status <- scale_colour_brewer(palette = \"Set1\")\npalette_feedlot <- scale_colour_brewer(palette = \"Set2\")\npalette_geno_comp <- scale_colour_brewer(palette = \"Dark2\")\npalette_rnaseq_batch <- scale_colour_brewer(palette = \"Paired\")\n\n## For some plots will need both colour and fill\npalette_status_fill <- scale_colour_brewer(\n palette = \"Set1\", \n aesthetics = c(\"colour\", \"fill\")\n)\n\n\n12.4.1 Matrix of scatter plots\nThe plot_samples_score() function shows the samples score in a matrix of scatter plots that represent all possible two-by-two combinations of the latent dimensions. The plots in the resulting matrix are redundant: the lower plots (below the diagonal) are just a rotated version of the upper plots (above the diagonal). The function takes as input an output_dimension_reduction object. In addition, it accepts a MultiDataSet object to extract information about the samples that can then be used to customise the plot. Since the plots are redundant, different properties of the samples can be shown in the upper and lower plots. For example, we will colour the samples according to disease status in the upper plots, while representing some other covariate in the lower plots. We will use the shape of the points to illustrate gender in both upper and lower plots. By default, all latent dimensions are included in the plots, but it is possible to select some of them by passing their names to the latent_dimensions argument. There are more options to further customise the plot, which are shown in the function’s help.\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score(\n spls_output,\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"feedlot\",\n scale_colour_lower = palette_feedlot\n) +\n theme(legend.box = \"vertical\")\n\n\n\n\nComponent 1 clearly splits the control and BRD animals, while component 2 seems to separate two samples from the rest. There is no clear separation of the samples by feedlot or gender.\n\n\nHere we will focus on the joint components. Since there is only one, instead of a matrix of scatterplot, the function will display the samples score with a violin plot, and the properties selected for the upper plots will be used to customise the points:\n\nplot_samples_score(\n so2pls_output,\n latent_dimensions = \"joint component 1\",\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"feedlot\",\n scale_colour_lower = palette_feedlot\n)\n#> Warning in plot_samples_score(so2pls_output, latent_dimensions = \"joint\n#> component 1\", : Only one latent dimension to plot; 'colour_diag',\n#> 'colour_lower' and 'shape_lower' argument will be ignored.\n\n\n\n\nJoint component 1 separates the BRD and control animals, although some of them overlap.\n\n\nFor clarity we will focus here on the first four factors:\n\nplot_samples_score(\n mofa_output,\n latent_dimensions = paste(\"Factor\", 1:4),\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"geno_comp_cluster\",\n scale_colour_lower = palette_geno_comp\n) +\n theme(legend.box = \"vertical\")\n\n\n\n\nFactor 1 clearly separates the control and BRD animals. Factor 2 separates samples from the genomics composition cluster K1 from the other two clusters. None of the factors are separating the animals by gender, indicating that this covariate does not have a strong effect in the omics measurements.\n\n\n\nplot_samples_score(\n diablo_output,\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"rnaseq_batch\",\n scale_colour_lower = palette_rnaseq_batch\n) +\n theme(legend.box = \"vertical\")\n\n\n\n\nAs DIABLO is a supervised method, it is no surprise that the first component clearly separates the two disease status groups. The second latent component separates samples according to the RNAseq batch. From this plot it is not clear what components 3 and 4 represent.\n\n\n\n\n12.4.2 Scatter plot for pair of latent dimensions\nWe can also focus on a specific pair of latent dimensions and represent the samples in the space spanned by these two dimensions, with the plot_samples_score_pair() function. The two latent dimensions to plot are selected by passing their names to the function. This function also accepts a MultiDataSet object, whose samples metadata will be used to customise the plot.\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_pair(\n spls_output,\n paste(\"Component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"gender\"\n) +\n palette_status\n\n\n\n\nThe two disease status groups are well separated in this space.\n\n\nTo showcase this function, we will look at the first two RNAseq-specific latent components:\n\nplot_samples_score_pair(\n so2pls_output,\n paste(\"rnaseq specific component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"gender\"\n) +\n palette_status\n\n\n\n\nThese two specific components are not related to disease status or gender.\n\n\n\nplot_samples_score_pair(\n mofa_output,\n paste(\"Factor\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\"\n) +\n palette_status\n\n\n\n\nWe see that these first two factors discriminate the disease status groups and the genomics composition clusters.\n\n\n\nplot_samples_score_pair(\n diablo_output,\n paste(\"Component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\"\n) +\n palette_status\n\n\n\n\nWe see that these first two components discriminate the disease status groups and the RNAseq batches.\n\n\n\n\n12.4.3 Samples score vs covariate\nLastly, we can plot the samples score for each latent dimension against a samples covariate of interest, with the plot_samples_score_covariate() function. This is useful to focus on one dimension at a time rather than pairs of them. By default, the function displays all latent dimensions, but we can focus on a subset of them through the latent_dimensions arguments. The function needs a MultiDataSet object to extract information about the samples. The plot generated will depend on whether the covariate of interest is categorical or continuous. We will show both options below. In addition to the main covariate of interest that will be displayed on the x-axis, the colour and shape of the points can be further customised according to other samples properties.\nFirst, with a categorical covariate:\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_covariate(\n spls_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first joint component only.\n\nplot_samples_score_covariate(\n so2pls_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n latent_dimensions = \"joint component 1\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first two factors only.\n\nplot_samples_score_covariate(\n mofa_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\",\n latent_dimensions = paste(\"Factor\", 1:2)\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first two components only.\n\nplot_samples_score_covariate(\n diablo_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\",\n latent_dimensions = paste(\"Component\", 1:2)\n) +\n palette_status_fill\n\n\n\n\n\n\n\nNow, with a continuous covariate:\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_covariate(\n spls_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first joint component only.\n\nplot_samples_score_covariate(\n so2pls_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n latent_dimensions = \"joint component 1\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first two factors only.\n\nplot_samples_score_covariate(\n mofa_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\",\n latent_dimensions = paste(\"Factor\", 1:2)\n) +\n palette_status_fill\n#> Warning: Removed 4 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 4 rows containing missing values (`geom_point()`).\n\n\n\n\n\n\nFor clarity we will focus on the first two components only.\n\nplot_samples_score_covariate(\n diablo_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\",\n latent_dimensions = paste(\"Component\", 1:2)\n) +\n palette_status_fill" + "text": "12.4 Samples plot\nTo understand the phenomenon driving the variation represented by the different latent components, we can investigate the coordinates of the samples in the space spanned by these latent components, in combination with information that we have about the samples.\nWe will start by loading the MultiDataSet object and generating some custom colour palettes for different samples covariates of interest, that we will use in the rest of the section.\n\ntar_load(mo_set_complete)\n\n## Choosing colour palettes for the samples covariates\npalette_status <- scale_colour_brewer(palette = \"Set1\")\npalette_feedlot <- scale_colour_brewer(palette = \"Set2\")\npalette_geno_comp <- scale_colour_brewer(palette = \"Dark2\")\npalette_rnaseq_batch <- scale_colour_brewer(palette = \"Paired\")\n\n## For some plots will need both colour and fill\npalette_status_fill <- scale_colour_brewer(\n palette = \"Set1\", \n aesthetics = c(\"colour\", \"fill\")\n)\n\n\n12.4.1 Matrix of scatter plots\nThe plot_samples_score() function shows the samples score in a matrix of scatter plots that represent all possible two-by-two combinations of the latent dimensions. The plots in the resulting matrix are redundant: the lower plots (below the diagonal) are just a rotated version of the upper plots (above the diagonal). The function takes as input an output_dimension_reduction object. In addition, it accepts a MultiDataSet object to extract information about the samples that can then be used to customise the plot. Since the plots are redundant, different properties of the samples can be shown in the upper and lower plots. For example, we will colour the samples according to disease status in the upper plots, while representing some other covariate in the lower plots. We will use the shape of the points to illustrate gender in both upper and lower plots. By default, all latent dimensions are included in the plots, but it is possible to select some of them by passing their names to the latent_dimensions argument. There are more options to further customise the plot, which are shown in the function’s help.\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score(\n spls_output,\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"feedlot\",\n scale_colour_lower = palette_feedlot\n) +\n theme(legend.box = \"vertical\")\n\n\n\n\nComponent 1 clearly splits the control and BRD animals, while component 2 seems to separate two samples from the rest. There is no clear separation of the samples by feedlot or gender.\n\n\nHere we will focus on the joint components. Since there is only one, instead of a matrix of scatterplot, the function will display the samples score with a violin plot, and the properties selected for the upper plots will be used to customise the points:\n\nplot_samples_score(\n so2pls_output,\n latent_dimensions = \"joint component 1\",\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"feedlot\",\n scale_colour_lower = palette_feedlot\n)\n#> Warning in plot_samples_score(so2pls_output, latent_dimensions = \"joint\n#> component 1\", : Only one latent dimension to plot; 'colour_diag',\n#> 'colour_lower' and 'shape_lower' argument will be ignored.\n\n\n\n\nJoint component 1 separates the BRD and control animals, although some of them overlap.\n\n\nFor clarity we will focus here on the first four factors:\n\nplot_samples_score(\n mofa_output,\n latent_dimensions = paste(\"Factor\", 1:4),\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"geno_comp_cluster\",\n scale_colour_lower = palette_geno_comp\n) +\n theme(legend.box = \"vertical\")\n#> Warning: Removed 2 rows containing missing values (`geom_point()`).\n#> Removed 2 rows containing missing values (`geom_point()`).\n#> Removed 2 rows containing missing values (`geom_point()`).\n#> Removed 2 rows containing missing values (`geom_point()`).\n#> Removed 2 rows containing missing values (`geom_point()`).\n#> Removed 2 rows containing missing values (`geom_point()`).\n\n\n\n\nFactor 1 clearly separates the control and BRD animals. Factor 2 separates samples from the genomics composition cluster K1 from the other two clusters. None of the factors are separating the animals by gender, indicating that this covariate does not have a strong effect in the omics measurements.\n\n\n\nplot_samples_score(\n diablo_output,\n mo_data = mo_set_complete,\n colour_upper = \"status\",\n scale_colour_upper = palette_status,\n shape_upper = \"gender\",\n colour_lower = \"rnaseq_batch\",\n scale_colour_lower = palette_rnaseq_batch\n) +\n theme(legend.box = \"vertical\")\n\n\n\n\nAs DIABLO is a supervised method, it is no surprise that the first component clearly separates the two disease status groups. The second latent component separates samples according to the RNAseq batch. From this plot it is not clear what components 3 and 4 represent.\n\n\n\n\n12.4.2 Scatter plot for pair of latent dimensions\nWe can also focus on a specific pair of latent dimensions and represent the samples in the space spanned by these two dimensions, with the plot_samples_score_pair() function. The two latent dimensions to plot are selected by passing their names to the function. This function also accepts a MultiDataSet object, whose samples metadata will be used to customise the plot.\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_pair(\n spls_output,\n paste(\"Component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"gender\"\n) +\n palette_status\n\n\n\n\nThe two disease status groups are well separated in this space.\n\n\nTo showcase this function, we will look at the first two RNAseq-specific latent components:\n\nplot_samples_score_pair(\n so2pls_output,\n paste(\"rnaseq specific component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"gender\"\n) +\n palette_status\n\n\n\n\nThese two specific components are not related to disease status or gender.\n\n\n\nplot_samples_score_pair(\n mofa_output,\n paste(\"Factor\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\"\n) +\n palette_status\n#> Warning: Removed 2 rows containing missing values (`geom_point()`).\n\n\n\n\nWe see that these first two factors discriminate the disease status groups and the genomics composition clusters.\n\n\n\nplot_samples_score_pair(\n diablo_output,\n paste(\"Component\", 1:2),\n mo_data = mo_set_complete,\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\"\n) +\n palette_status\n\n\n\n\nWe see that these first two components discriminate the disease status groups and the RNAseq batches.\n\n\n\n\n12.4.3 Samples score vs covariate\nLastly, we can plot the samples score for each latent dimension against a samples covariate of interest, with the plot_samples_score_covariate() function. This is useful to focus on one dimension at a time rather than pairs of them. By default, the function displays all latent dimensions, but we can focus on a subset of them through the latent_dimensions arguments. The function needs a MultiDataSet object to extract information about the samples. The plot generated will depend on whether the covariate of interest is categorical or continuous. We will show both options below. In addition to the main covariate of interest that will be displayed on the x-axis, the colour and shape of the points can be further customised according to other samples properties.\nFirst, with a categorical covariate:\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_covariate(\n spls_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first joint component only.\n\nplot_samples_score_covariate(\n so2pls_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n latent_dimensions = \"joint component 1\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first two factors only.\n\nplot_samples_score_covariate(\n mofa_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\",\n latent_dimensions = paste(\"Factor\", 1:2)\n) +\n palette_status_fill\n#> Warning: Removed 4 rows containing missing values (`geom_point()`).\n\n\n\n\n\n\nFor clarity we will focus on the first two components only.\n\nplot_samples_score_covariate(\n diablo_output,\n mo_set_complete,\n \"status\",\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\",\n latent_dimensions = paste(\"Component\", 1:2)\n) +\n palette_status_fill\n\n\n\n\n\n\n\nNow, with a continuous covariate:\n\n\nsPLS\nsO2PLS\nMOFA\nDIABLO\n\n\n\n\nplot_samples_score_covariate(\n spls_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first joint component only.\n\nplot_samples_score_covariate(\n so2pls_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n latent_dimensions = \"joint component 1\"\n) +\n palette_status_fill\n\n\n\n\n\n\nFor clarity we will focus on the first two factors only.\n\nplot_samples_score_covariate(\n mofa_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n shape_by = \"geno_comp_cluster\",\n latent_dimensions = paste(\"Factor\", 1:2)\n) +\n palette_status_fill\n#> Warning: Removed 4 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 4 rows containing missing values (`geom_point()`).\n\n\n\n\n\n\nFor clarity we will focus on the first two components only.\n\nplot_samples_score_covariate(\n diablo_output,\n mo_set_complete,\n \"day_on_feed\",\n colour_by = \"status\",\n shape_by = \"rnaseq_batch\",\n latent_dimensions = paste(\"Component\", 1:2)\n) +\n palette_status_fill" }, { "objectID": "interpretation.html#feature-plots", @@ -459,14 +459,14 @@ "href": "evaluation.html#evaluating-features-prioritisation", "title": "13  Evaluating the integration results", "section": "\n13.2 Evaluating features prioritisation", - "text": "13.2 Evaluating features prioritisation\nFirst, we can evaluate the integration results in terms of the features prioritisation, i.e. the ranking of the features for each latent dimension in terms of their importance score. We can for example assess whether the features that were given the highest scores for some latent components were also highlighted through single-omics analyses, or compare the importance score of groups of features, for example compounds from different chemical classes or genes from different gene families.\nHere, we will compare the DIABLO results to the results of traditional single-omics analyses. In our case, a GWAS and eQTL analysis were performed to detect genomic variants associated with the disease status of the samples. The mode of action of significant markers (i.e. QTL, cis-eQTL or trans-eQTL). The GWAS status (high-scoring or not) of each marker was recorded in the genomics features metadata table:\n\nget_features_metadata(mo_set_complete)[[\"snps\"]] |> \n pull(qtl_type) |> \n unique()\n#> [1] NA \"cis eQTL\" \"trans eQTL\" \"QTL\"\n\nFor the transcriptomics and metabolomics dataset, a differential expression (DE) analysis was performed on each of them to compare control and BRD animals. The resulting adjusted p-value, log2-fold change or t-value, status (upregulated, downregulated or not differentially expressed) and significance (differentially expressed or not) of each gene or compound are recorded in each dataset’s features metadata:\n\nget_features_metadata(mo_set_complete)[[\"rnaseq\"]] |> \n select(feature_id, log_fc:de_status) |> \n head()\n#> feature_id log_fc log_cpm f\n#> ENSBTAG00000000005 ENSBTAG00000000005 0.13603041 5.9051177 4.1626465\n#> ENSBTAG00000000008 ENSBTAG00000000008 -0.12965356 -0.7437052 1.0676845\n#> ENSBTAG00000000009 ENSBTAG00000000009 1.27141158 -2.5627934 23.9562951\n#> ENSBTAG00000000010 ENSBTAG00000000010 0.39567729 6.2563594 60.5303416\n#> ENSBTAG00000000011 ENSBTAG00000000011 0.07766873 -2.7608361 0.1418457\n#> ENSBTAG00000000012 ENSBTAG00000000012 0.15756169 3.6628775 11.0448775\n#> p_value fdr de_signif de_status\n#> ENSBTAG00000000005 4.324808e-02 7.170137e-02 Not DE Not DE\n#> ENSBTAG00000000008 3.032916e-01 3.938643e-01 Not DE Not DE\n#> ENSBTAG00000000009 2.731328e-06 9.665375e-06 Not DE Not DE\n#> ENSBTAG00000000010 1.581955e-12 1.521160e-11 Not DE Not DE\n#> ENSBTAG00000000011 7.070363e-01 7.773874e-01 Not DE Not DE\n#> ENSBTAG00000000012 1.141125e-03 2.623062e-03 Not DE Not DE\n\nget_features_metadata(mo_set_complete)[[\"metabolome\"]] |> \n select(feature_id, t_value:de_status) |>\n head()\n#> feature_id t_value p_value padj de_signif\n#> HMDB00001 HMDB00001 -0.5557020 5.797635e-01 6.784466e-01 Not DE\n#> HMDB00008 HMDB00008 0.2181562 8.276321e-01 8.925444e-01 Not DE\n#> HMDB00042 HMDB00042 -12.5323491 1.753101e-24 4.821028e-23 DE\n#> HMDB00043 HMDB00043 -7.9073179 7.827088e-13 3.913544e-12 DE\n#> HMDB00060 HMDB00060 -0.4369834 6.628164e-01 7.439776e-01 Not DE\n#> HMDB00062 HMDB00062 8.2347595 1.271549e-13 6.993518e-13 DE\n#> de_status\n#> HMDB00001 Not DE\n#> HMDB00008 Not DE\n#> HMDB00042 downregulated\n#> HMDB00043 downregulated\n#> HMDB00060 Not DE\n#> HMDB00062 upregulated\n\n\n13.2.1 Table of counts of selected genes against a grouping\nAs DIABLO performs feature selection, it is of interest to assess how many (e)QTLs and DE genes and compounds were retained for each latent component. We can use the evaluate_feature_selection_table() function to generate a table of counts comparing the features selected for each latent component to a features grouping (in our case, the results of the single-omics analyses). The features grouping is obtained from the features metadata stored in the MultiDataSet object. The function takes as input the integration result object, the MultiDataSet object and a named list giving for each dataset the name of the column from their features metadata table containing the features grouping:\n\ndiablo_evaluation_counts_table <- evaluate_feature_selection_table(\n diablo_output,\n mo_data = mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\",\n \"rnaseq\" = \"de_signif\",\n \"metabolome\" = \"de_signif\"\n )\n)\n\ndiablo_evaluation_counts_table |> \n filter(latent_dimension == \"Component 1\")\n#> # A tibble: 9 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 1 snps cis eQTL 1 2\n#> 2 DIABLO Component 1 snps QTL 1 0\n#> 3 DIABLO Component 1 snps trans eQTL 1 3\n#> 4 DIABLO Component 1 snps 22 970\n#> 5 DIABLO Component 1 rnaseq DE 20 55\n#> 6 DIABLO Component 1 rnaseq Not DE 10 782\n#> 7 DIABLO Component 1 rnaseq 0 127\n#> 8 DIABLO Component 1 metabolome DE 10 20\n#> 9 DIABLO Component 1 metabolome Not DE 0 25\n\ndiablo_evaluation_counts_table |> \n filter(latent_dimension == \"Component 2\")\n#> # A tibble: 9 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 2 snps cis eQTL 0 3\n#> 2 DIABLO Component 2 snps QTL 0 1\n#> 3 DIABLO Component 2 snps trans eQTL 0 4\n#> 4 DIABLO Component 2 snps 25 967\n#> 5 DIABLO Component 2 rnaseq DE 0 75\n#> 6 DIABLO Component 2 rnaseq Not DE 30 762\n#> 7 DIABLO Component 2 rnaseq 0 127\n#> 8 DIABLO Component 2 metabolome DE 3 27\n#> 9 DIABLO Component 2 metabolome Not DE 2 23\n\nWe can see that for the first latent component, only three out of the eight (e)QTLs were selected 1; two-third of the genes selected were found differentially expressed; and all ten of the selected compounds were found differentially expressed. Conversely, for the second latent component, none of the selected markers were QTLs, and none of the selected genes were differentially expressed. This makes sense, as the DIABLO analysis was run with the goal of separating the control and infected animals; therefore it makes sense that the features selected for the first latent component, which is the one best able to separate the groups, are the features detected as differentially expressed. On the contrary, the second latent component is constructed to be orthogonal to the first one, therefore the features selected will likely not be differentially expressed.\nWith this function, we can focus on only some datasets, by changing which datasets are present in the list passed to col_names. Similarly, we can select specific latent dimensions through the latent_dimensions parameter. For example, let us count the number of DE genes selected with the first latent component:\n\nevaluate_feature_selection_table(\n diablo_output,\n mo_data = mo_set_complete,\n col_names = list(\"rnaseq\" = \"de_signif\"),\n latent_dimensions = \"Component 1\"\n)\n#> # A tibble: 3 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 1 rnaseq DE 20 55\n#> 2 DIABLO Component 1 rnaseq Not DE 10 782\n#> 3 DIABLO Component 1 rnaseq NA 127\n\nNote that this function is useful for integration methods that perform feature selection, such as DIABLO or sO2PLS, but will be irrelevant for methods that do not perform feature selection (for example MOFA tends to assign a non-null weight to most features).\n\n13.2.2 Plotting features weight against a covariate\nWe can go further and compare the weights or importance scores given to the features for each latent component to the outcome of the single-omics results. This can be done with the plot_features_weight_covariate() function. As its name suggests, this function displays the features weight for each latent dimension against some covariate obtained from the features metadata tables. Again, we will look at the results of the GWAS/QTL and DE analyses and see whether (e)QTLs, DE genes and compounds were assigned higher weights is some of the latent components constructed with DIABLO. The input parameters for this function are similar to those for the evaluate_feature_selection_table() function: we need to pass the results of the integration method, the MultiDataSet object, and the named list giving the column in each features metadata table containing information about the features grouping. The latter is passed to the covariate argument of the function. If some datasets are not present in this list, they won’t be present in the plot.\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n )\n)\n#> Warning: Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n\n\n\n\nBy default, the function plots on the y-axis the signed importance score of the features, that is, their importance score to which the sign of their weight was added. This can be controlled via the features_metric argument. We see that most of the points have an importance score of 0, because most of the features were not selected. We can focus on only those features with a non-null weight with the remove_null_weight argument:\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n ),\n remove_null_weight = TRUE\n)\n#> Warning: Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n\n\n\n\nHere, we see that for the first latent component, selected genes that were also found up-regulated were assigned on average a higher importance score that selected genes that were found non DE. Also, for the metabolomics dataset, selected compounds that were found up-regulated were assigned a positive weight while those found down-regulated were assigned a negative weight.\nNote that with the plot_features_weight_covariate() function, we can also plot the features against a continuous covariate, e.g. the log2-fold change obtained with the differential expressions:\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"rnaseq\" = \"log_fc\", \n \"metabolome\" = \"t_value\"\n )\n)\n#> Warning: Removed 508 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 508 rows containing missing values (`geom_point()`).\n\n\n\n\nWe can see a nice trend between compounds’ t-value and their signed importance score in the differential expression analysis for the first latent component.\nWe can further change the colour or shape of the points according to some information from the features metadata (information must be passed as a named list as for the covariate).\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"rnaseq\" = \"log_fc\", \n \"metabolome\" = \"t_value\"\n ),\n colour_by = list(\n \"rnaseq\" = \"fdr\",\n \"metabolome\" = \"padj\"\n )\n) +\n scale_colour_viridis_c(aesthetics = c(\"colour\", \"fill\"))\n#> Warning: Removed 508 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 508 rows containing missing values (`geom_point()`).\n\n\n\n\nNote that for continuous covariates, as with the function plot_samples_score_covariate(), a loess curve is fit to summarise the trend between the covariates and the features weight. If colour_by is used, and the corresponding variables are categorical, a different loess curve is fitted for each category. If instead the colour_by variables are numeric, a single loess curve will be plotted for each latent dimension and dataset." + "text": "13.2 Evaluating features prioritisation\nFirst, we can evaluate the integration results in terms of the features prioritisation, i.e. the ranking of the features for each latent dimension in terms of their importance score. We can for example assess whether the features that were given the highest scores for some latent components were also highlighted through single-omics analyses, or compare the importance score of groups of features, for example compounds from different chemical classes or genes from different gene families.\nHere, we will compare the DIABLO results to the results of traditional single-omics analyses. In our case, a GWAS and eQTL analysis were performed to detect genomic variants associated with the disease status of the samples. The mode of action of significant markers (i.e. QTL, cis-eQTL or trans-eQTL). The GWAS status (high-scoring or not) of each marker was recorded in the genomics features metadata table:\n\nget_features_metadata(mo_set_complete)[[\"snps\"]] |> \n pull(qtl_type) |> \n unique()\n#> [1] \"non signif.\" \"cis eQTL\" \"trans eQTL\" \"QTL\"\n\nFor the transcriptomics and metabolomics dataset, a differential expression (DE) analysis was performed on each of them to compare control and BRD animals. The resulting adjusted p-value, log2-fold change or t-value, status (upregulated, downregulated or not differentially expressed) and significance (differentially expressed or not) of each gene or compound are recorded in each dataset’s features metadata:\n\nget_features_metadata(mo_set_complete)[[\"rnaseq\"]] |> \n select(feature_id, log_fc:de_status) |> \n head()\n#> feature_id log_fc log_cpm f\n#> ENSBTAG00000000005 ENSBTAG00000000005 0.13603041 5.9051177 4.1626465\n#> ENSBTAG00000000008 ENSBTAG00000000008 -0.12965356 -0.7437052 1.0676845\n#> ENSBTAG00000000009 ENSBTAG00000000009 1.27141158 -2.5627934 23.9562951\n#> ENSBTAG00000000010 ENSBTAG00000000010 0.39567729 6.2563594 60.5303416\n#> ENSBTAG00000000011 ENSBTAG00000000011 0.07766873 -2.7608361 0.1418457\n#> ENSBTAG00000000012 ENSBTAG00000000012 0.15756169 3.6628775 11.0448775\n#> p_value fdr de_signif de_status\n#> ENSBTAG00000000005 4.324808e-02 7.170137e-02 Not DE Not DE\n#> ENSBTAG00000000008 3.032916e-01 3.938643e-01 Not DE Not DE\n#> ENSBTAG00000000009 2.731328e-06 9.665375e-06 Not DE Not DE\n#> ENSBTAG00000000010 1.581955e-12 1.521160e-11 Not DE Not DE\n#> ENSBTAG00000000011 7.070363e-01 7.773874e-01 Not DE Not DE\n#> ENSBTAG00000000012 1.141125e-03 2.623062e-03 Not DE Not DE\n\nget_features_metadata(mo_set_complete)[[\"metabolome\"]] |> \n select(feature_id, t_value:de_status) |>\n head()\n#> feature_id t_value p_value padj de_signif\n#> HMDB00001 HMDB00001 -0.5557020 5.797635e-01 6.784466e-01 Not DE\n#> HMDB00008 HMDB00008 0.2181562 8.276321e-01 8.925444e-01 Not DE\n#> HMDB00042 HMDB00042 -12.5323491 1.753101e-24 4.821028e-23 DE\n#> HMDB00043 HMDB00043 -7.9073179 7.827088e-13 3.913544e-12 DE\n#> HMDB00060 HMDB00060 -0.4369834 6.628164e-01 7.439776e-01 Not DE\n#> HMDB00062 HMDB00062 8.2347595 1.271549e-13 6.993518e-13 DE\n#> de_status\n#> HMDB00001 Not DE\n#> HMDB00008 Not DE\n#> HMDB00042 downregulated\n#> HMDB00043 downregulated\n#> HMDB00060 Not DE\n#> HMDB00062 upregulated\n\n\n13.2.1 Table of counts of selected genes against a grouping\nAs DIABLO performs feature selection, it is of interest to assess how many (e)QTLs and DE genes and compounds were retained for each latent component. We can use the evaluate_feature_selection_table() function to generate a table of counts comparing the features selected for each latent component to a features grouping (in our case, the results of the single-omics analyses). The features grouping is obtained from the features metadata stored in the MultiDataSet object. The function takes as input the integration result object, the MultiDataSet object and a named list giving for each dataset the name of the column from their features metadata table containing the features grouping:\n\ndiablo_evaluation_counts_table <- evaluate_feature_selection_table(\n diablo_output,\n mo_data = mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\",\n \"rnaseq\" = \"de_signif\",\n \"metabolome\" = \"de_signif\"\n )\n)\n\ndiablo_evaluation_counts_table |> \n filter(latent_dimension == \"Component 1\")\n#> # A tibble: 8 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 1 snps cis eQTL 1 2\n#> 2 DIABLO Component 1 snps non signif. 22 970\n#> 3 DIABLO Component 1 snps QTL 1 0\n#> 4 DIABLO Component 1 snps trans eQTL 1 3\n#> 5 DIABLO Component 1 rnaseq DE 20 55\n#> 6 DIABLO Component 1 rnaseq Not DE 10 909\n#> 7 DIABLO Component 1 metabolome DE 10 20\n#> 8 DIABLO Component 1 metabolome Not DE 0 25\n\ndiablo_evaluation_counts_table |> \n filter(latent_dimension == \"Component 2\")\n#> # A tibble: 8 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 2 snps cis eQTL 0 3\n#> 2 DIABLO Component 2 snps non signif. 25 967\n#> 3 DIABLO Component 2 snps QTL 0 1\n#> 4 DIABLO Component 2 snps trans eQTL 0 4\n#> 5 DIABLO Component 2 rnaseq DE 0 75\n#> 6 DIABLO Component 2 rnaseq Not DE 30 889\n#> 7 DIABLO Component 2 metabolome DE 3 27\n#> 8 DIABLO Component 2 metabolome Not DE 2 23\n\nWe can see that for the first latent component, only three out of the eight (e)QTLs were selected 1; two-third of the genes selected were found differentially expressed; and all ten of the selected compounds were found differentially expressed. Conversely, for the second latent component, none of the selected markers were QTLs, and none of the selected genes were differentially expressed. This makes sense, as the DIABLO analysis was run with the goal of separating the control and infected animals; therefore it makes sense that the features selected for the first latent component, which is the one best able to separate the groups, are the features detected as differentially expressed. On the contrary, the second latent component is constructed to be orthogonal to the first one, therefore the features selected will likely not be differentially expressed.\nWith this function, we can focus on only some datasets, by changing which datasets are present in the list passed to col_names. Similarly, we can select specific latent dimensions through the latent_dimensions parameter. For example, let us count the number of DE genes selected with the first latent component:\n\nevaluate_feature_selection_table(\n diablo_output,\n mo_data = mo_set_complete,\n col_names = list(\"rnaseq\" = \"de_signif\"),\n latent_dimensions = \"Component 1\"\n)\n#> # A tibble: 2 × 6\n#> method latent_dimension dataset feature_label selected not_selected\n#> \n#> 1 DIABLO Component 1 rnaseq DE 20 55\n#> 2 DIABLO Component 1 rnaseq Not DE 10 909\n\nNote that this function is useful for integration methods that perform feature selection, such as DIABLO or sO2PLS, but will be irrelevant for methods that do not perform feature selection (for example MOFA tends to assign a non-null weight to most features).\n\n13.2.2 Plotting features weight against a covariate\nWe can go further and compare the weights or importance scores given to the features for each latent component to the outcome of the single-omics results. This can be done with the plot_features_weight_covariate() function. As its name suggests, this function displays the features weight for each latent dimension against some covariate obtained from the features metadata tables. Again, we will look at the results of the GWAS/QTL and DE analyses and see whether (e)QTLs, DE genes and compounds were assigned higher weights is some of the latent components constructed with DIABLO. The input parameters for this function are similar to those for the evaluate_feature_selection_table() function: we need to pass the results of the integration method, the MultiDataSet object, and the named list giving the column in each features metadata table containing information about the features grouping. The latter is passed to the covariate argument of the function. If some datasets are not present in this list, they won’t be present in the plot.\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n )\n)\n#> Warning: Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n\n\n\n\nBy default, the function plots on the y-axis the signed importance score of the features, that is, their importance score to which the sign of their weight was added. This can be controlled via the features_metric argument. We see that most of the points have an importance score of 0, because most of the features were not selected. We can focus on only those features with a non-null weight with the remove_null_weight argument:\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n ),\n remove_null_weight = TRUE\n)\n#> Warning: Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n#> Groups with fewer than two data points have been dropped.\n\n\n\n\nHere, we see that for the first latent component, selected genes that were also found up-regulated were assigned on average a higher importance score that selected genes that were found non DE. Also, for the metabolomics dataset, selected compounds that were found up-regulated were assigned a positive weight while those found down-regulated were assigned a negative weight.\nNote that with the plot_features_weight_covariate() function, we can also plot the features against a continuous covariate, e.g. the log2-fold change obtained with the differential expressions:\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"rnaseq\" = \"log_fc\", \n \"metabolome\" = \"t_value\"\n )\n)\n#> Warning: Removed 508 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 508 rows containing missing values (`geom_point()`).\n\n\n\n\nWe can see a nice trend between compounds’ t-value and their signed importance score in the differential expression analysis for the first latent component.\nWe can further change the colour or shape of the points according to some information from the features metadata (information must be passed as a named list as for the covariate).\n\nplot_features_weight_covariate(\n diablo_output, \n mo_data = mo_set_complete, \n covariate = list(\n \"rnaseq\" = \"log_fc\", \n \"metabolome\" = \"t_value\"\n ),\n colour_by = list(\n \"rnaseq\" = \"fdr\",\n \"metabolome\" = \"padj\"\n )\n) +\n scale_colour_viridis_c(aesthetics = c(\"colour\", \"fill\"))\n#> Warning: Removed 508 rows containing non-finite values (`stat_smooth()`).\n#> Warning: Removed 508 rows containing missing values (`geom_point()`).\n\n\n\n\nNote that for continuous covariates, as with the function plot_samples_score_covariate(), a loess curve is fit to summarise the trend between the covariates and the features weight. If colour_by is used, and the corresponding variables are categorical, a different loess curve is fitted for each category. If instead the colour_by variables are numeric, a single loess curve will be plotted for each latent dimension and dataset." }, { "objectID": "evaluation.html#features-set-enrichment", "href": "evaluation.html#features-set-enrichment", "title": "13  Evaluating the integration results", "section": "\n13.3 Features set enrichment", - "text": "13.3 Features set enrichment\nIn addition to looking at the distribution of features importance score or counting the number of selected features, we can also perform an enrichment to assess whether each of the latent dimensions constructed is enriched for some features set of interest. Features sets are groups of features that belong in a similar category: e.g. all features involved in a same biological pathway, or with the same GO term annotation, or even all up- or down-regulated features. They are built using prior knowledge, for example information extracted from databases, or constructed from the results of previous analyses. Importantly, a feature can belong to more than one set (for example a compound can be involved in several biological pathways).\n\n13.3.1 Constructing feature sets\nWith the moiraine package, there are two ways to obtain feature sets to perform enrichment or for plots. The first one is to extract information from the features metadata tables stored in our MultiDataSet object; which is done with the make_feature_sets_from_fm() function. Note that if some features grouping is stored in the features metadata, it means that features can only belong to one set. For example, we will use the results of the single-omics analyses to group the features into sets: QTLs, cis-eQTLs, trans-eQTLs and non significant genomics markers, and up-regulated, down-regulated or non DE genes and compounds. Again, the function accepts a named list giving for each dataset the name of the column in the corresponding features metadata table to use to generate the groups, passed to the col_names argument of the function. It returns a named list where each element is a feature set, and contains the ID of the features in the set:\n\ntar_target(\n sets_single_omics,\n make_feature_sets_from_fm(\n mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n )\n )\n)\n\n\ntar_read(sets_single_omics) |> \n str()\n#> List of 11\n#> $ NA - snps : chr [1:23000] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> $ cis eQTL : chr [1:31] \"ARS-BFGL-BAC-13210\" \"ARS-BFGL-NGS-113310\" \"ARS-BFGL-NGS-5022\" \"ARS-BFGL-NGS-59463\" ...\n#> $ trans eQTL : chr [1:4] \"ARS-BFGL-NGS-80280\" \"BovineHD0100032240\" \"BovineHD2300010006\" \"Hapmap55381-rs29025399\"\n#> $ QTL : chr \"BovineHD1800016801\"\n#> $ Not DE - rnaseq : chr [1:18630] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> $ NA - rnaseq : chr [1:1594] \"ENSBTAG00000000029\" \"ENSBTAG00000000071\" \"ENSBTAG00000000102\" \"ENSBTAG00000000106\" ...\n#> $ upregulated - rnaseq : chr [1:102] \"ENSBTAG00000000377\" \"ENSBTAG00000000783\" \"ENSBTAG00000001051\" \"ENSBTAG00000001785\" ...\n#> $ downregulated - rnaseq : chr [1:9] \"ENSBTAG00000001032\" \"ENSBTAG00000004824\" \"ENSBTAG00000011990\" \"ENSBTAG00000012403\" ...\n#> $ Not DE - metabolome : chr [1:25] \"HMDB00001\" \"HMDB00008\" \"HMDB00060\" \"HMDB00097\" ...\n#> $ downregulated - metabolome: chr [1:20] \"HMDB00042\" \"HMDB00043\" \"HMDB00064\" \"HMDB00094\" ...\n#> $ upregulated - metabolome : chr [1:10] \"HMDB00062\" \"HMDB00092\" \"HMDB00159\" \"HMDB00169\" ...\n\nBy default, the function keeps the different omics features separate: here for example, there is a “Not DE” set for the transcriptomics dataset, and a “Not DE” set for the metabolomics dataset. When there is no ambiguity as to which omics dataset they represent, the name of the dataset is not included in the set’s name. It is possible to merge feature sets with the same name between the omics datasets, by setting the combine_omics_sets argument to TRUE:\n\ntar_target(\n sets_single_omics_merged,\n make_feature_sets_from_fm(\n mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n ),\n combine_omics_sets = TRUE\n )\n)\n\n\ntar_read(sets_single_omics_merged) |> \n str()\n#> List of 7\n#> $ NA : chr [1:24594] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> $ cis eQTL : chr [1:31] \"ARS-BFGL-BAC-13210\" \"ARS-BFGL-NGS-113310\" \"ARS-BFGL-NGS-5022\" \"ARS-BFGL-NGS-59463\" ...\n#> $ trans eQTL : chr [1:4] \"ARS-BFGL-NGS-80280\" \"BovineHD0100032240\" \"BovineHD2300010006\" \"Hapmap55381-rs29025399\"\n#> $ QTL : chr \"BovineHD1800016801\"\n#> $ Not DE : chr [1:18655] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> $ upregulated : chr [1:112] \"ENSBTAG00000000377\" \"ENSBTAG00000000783\" \"ENSBTAG00000001051\" \"ENSBTAG00000001785\" ...\n#> $ downregulated: chr [1:29] \"ENSBTAG00000001032\" \"ENSBTAG00000004824\" \"ENSBTAG00000011990\" \"ENSBTAG00000012403\" ...\n\nNow the not DE set contains all genes and compounds ID that have not been found differentially expressed.\nAlternatively, feature sets can be constructed from an input data-frame. This is useful when looking at pathways or GO annotations, for which features can belong to several sets at once, as this information cannot be stored in a features metadata table. Here, we will use the GO terms assigned to the genes. Note that in this example, the feature sets will contain features from only one omics dataset, but it doesn’t have to be; instead the sets could contain features from different omics datasets.\nWe start by reading in the data-frame of GO terms. We will focus on GO terms relating to biological processes for this example:\n\nlist(\n tar_target(\n rnaseq_go_terms_file,\n system.file(\n \"extdata/transcriptomics_go_annotation.csv\", \n package = \"moiraine\"\n ),\n format = \"file\"\n ),\n \n tar_target(\n rnaseq_go_df,\n read_csv(rnaseq_go_terms_file) |> \n filter(go_domain == \"Biological process\")\n )\n)\n\n\ntar_load(rnaseq_go_df)\n\ndim(rnaseq_go_df)\n#> [1] 89226 4\nhead(rnaseq_go_df)\n#> # A tibble: 6 × 4\n#> gene_id go_id go_name go_domain\n#> \n#> 1 ENSBTAG00000000005 GO:0006468 protein phosphorylation Biologic…\n#> 2 ENSBTAG00000000005 GO:0007165 signal transduction Biologic…\n#> 3 ENSBTAG00000000005 GO:0031623 receptor internalization Biologic…\n#> 4 ENSBTAG00000000008 GO:0006813 potassium ion transport Biologic…\n#> 5 ENSBTAG00000000009 GO:0006355 regulation of DNA-templated transcrip… Biologic…\n#> 6 ENSBTAG00000000009 GO:0006357 regulation of transcription by RNA po… Biologic…\n\nThe data-frame contains one row per gene (gene_id) / GO term (go_id) pair. In addition, the name of each GO term and the category (biological process, molecular function or cellular component) are indicated in the go_name and go_domain columns, respectively. When reading in the file, we’ve restricted the GO terms to only those that correspond to biological processes.\nWe can turn this data-frame into a list of feature sets with the make_feature_sets_from_df() function. The function takes as input the data-frame, as well as the name of the column in the data-frame that contains the features ID (col_id argument) and the name of the column in the data-frame that contains the feature sets ID or name (col_set argument):\n\ntar_target(\n go_sets,\n make_feature_sets_from_df(\n rnaseq_go_df,\n col_id = \"gene_id\",\n col_set = \"go_id\"\n )\n)\n\n\ntar_load(go_sets)\n\nlength(go_sets)\n#> [1] 10745\nhead(go_sets) |> \n str()\n#> List of 6\n#> $ GO:0006468: chr [1:580] \"ENSBTAG00000000005\" \"ENSBTAG00000000013\" \"ENSBTAG00000000056\" \"ENSBTAG00000000184\" ...\n#> $ GO:0007165: chr [1:737] \"ENSBTAG00000000005\" \"ENSBTAG00000000073\" \"ENSBTAG00000000081\" \"ENSBTAG00000000105\" ...\n#> $ GO:0031623: chr [1:31] \"ENSBTAG00000000005\" \"ENSBTAG00000000308\" \"ENSBTAG00000001050\" \"ENSBTAG00000001139\" ...\n#> $ GO:0006813: chr [1:96] \"ENSBTAG00000000008\" \"ENSBTAG00000000082\" \"ENSBTAG00000000745\" \"ENSBTAG00000000973\" ...\n#> $ GO:0006355: chr [1:915] \"ENSBTAG00000000009\" \"ENSBTAG00000000040\" \"ENSBTAG00000000052\" \"ENSBTAG00000000074\" ...\n#> $ GO:0006357: chr [1:627] \"ENSBTAG00000000009\" \"ENSBTAG00000000039\" \"ENSBTAG00000000052\" \"ENSBTAG00000000154\" ...\n\n\n13.3.2 Filtering feature sets against the datasets\nBefore performing any enrichment, we want to make sure that the only features in the sets are the ones that were measured in the datasets. This is part of ensuring that an appropriate background or reference features set is used when performing enrichment (see for example Timmons, Szkop, and Gallagher (2015)). To this end, the reduce_feature_sets_data() function filters a list of feature sets so that only features present in a given MultiDataSet object are kept in the sets; it then removes empty feature sets. Note that for this filtering, we are using the MultiDataSet object that contains the full omics datasets, before pre-filtering:\n\ntar_target(\n go_sets_filtered,\n reduce_feature_sets_data(go_sets, mo_set_complete)\n)\n\nThe function yields the following message:\n\n#> All features in sets are in the multi-omics dataset.\n\n\ntar_load(go_sets_filtered)\n\n\n13.3.3 Checking the number of features assigned to sets\nWe can then check the number of features that are assigned to at least one set with the check_feature_sets() function, to get an idea of the coverage of our annotation. We will restrict the check to the transcriptomics dataset, since the GO annotation only covers genes:\n\nsets_check <- check_feature_sets(\n go_sets_filtered, \n mo_set_complete,\n datasets = \"rnaseq\"\n)\n#> rnaseq dataset: 14,364 of 20,335 (70.6%) features assigned to at least one set.\n\nsets_check\n#> # A tibble: 1 × 5\n#> dataset n_annotated n frac_annotated message \n#> \n#> 1 rnaseq 14364 20335 0.706 rnaseq dataset: 14,364 of 20,335 (70…\n\nThe function returns a tibble giving the name of the datasets, the number and fraction of features from the dataset that are present in at least one feature set (n_annotated and frac_annotated columns), the total number of features in the corresponding dataset (n column), as well as sentence summarising this information (message column) that is useful for reporting. In this example, 70.6% of the genes from the transcriptomics dataset are assigned to at least one GO term. This is important to check as the annotation coverage will impact the quality of the enrichment results that we get.\n\n13.3.4 Enrichment of latent dimensions\nWe are now ready to perform an enrichment of the latent dimensions. There are many ways to perform functional enrichment (e.g. see Zhao and Rhee (2023)): based on over-representation, feature ranking, or even topology when the feature sets are representing biological pathways. Here, we are not trying to provide an exhaustive list of options; however it is relatively straightforward to extract from an integration method output the features importance or list of selected features for a specific latent dimension, and use it for enrichment with the package of your choice.\nIn moiraine, we use the gage package (Luo et al. 2009) to perform the enrichment of each latent dimension against a list of feature sets. It uses a two-sample t-test to assess whether features in a set have higher importance scores than features not in the set. The evaluate_method_enrichment() function takes as input the results from an integration method in a standardised format (here our diablo_output object), and performs an enrichment for each latent dimension using the features sets provided as a list. We can focus on specific datasets or latent dimensions by passing their name to the datasets or latent_dimensions arguments, respectively. There are a number of parameters that need to be set:\n\nuse_abs: by default, the function uses the absolute value of the importance score to perform the enrichment, which allows it to detect features sets in which features are given strong weights that are both positive and negative. If we instead want to search for features sets in which the weight of the features are coordinated (i.e. either all positive or negative), we can set the use_abs argument to FALSE.\nmin_set_size: the minimum number of features in a set needed for the set to be considered for enrichment. The default value is 5, i.e. sets with less than 5 features will not be tested for enrichment.\nadd_missing_features and mo_data: when performing multi-omics integration, it is highly likely that the omics datasets have been pre-filtered prior to the analysis, which means that some features will not have received a weight in the results of the integration analysis. This can bias the enrichment results, as these are based on only features that have a weight. So if a features set contains 50 features, but 40 of these were discarded during the pre-filtering step, only the remaining 10 features will be considered when performing an enrichment. This might lead to finding a latent dimension enriched for this set, even though the set might not be biologically relevant since 80% of its features did not even pass the pre-filtering step. To account for that, it is possible to add to the integration results all of the features in a MultiDataSet object that are not present in the results. These features will be assigned a weight of 0 to emphasise that they were not found to play any role for the latent dimensions. This is done by setting add_missing_features to TRUE, and passing to mo_data a MultiDataSet object that contains the omics datasets that have not been filtered. This way, the background set used in the enrichment will be all features measured in the omics datasets, and not only the ones that passed the pre-filtering step.\nsets_info_df and col_set: the feature sets are passed as a named list, therefore the only information that we have about these sets are their names as found in the list. To facilitate the interpretation of the enrichment results, it is possible to pass a data-frame giving information about the sets, through the sets_info_df argument. This information will be added to the enrichment results table. In that case, the col_set argument must also be specified: it takes the name of the column in the data-frame passed to sets_info_df that contains the sets ID or named as seen in the list. Here we will create this data-frame as follows:\n\n\ntar_target(\n go_sets_info,\n rnaseq_go_df |>\n dplyr::select(go_id, go_name) |>\n dplyr::distinct()\n)\n\n\ntar_read(go_sets_info) |> \n head()\n#> # A tibble: 6 × 2\n#> go_id go_name \n#> \n#> 1 GO:0006468 protein phosphorylation \n#> 2 GO:0007165 signal transduction \n#> 3 GO:0031623 receptor internalization \n#> 4 GO:0006813 potassium ion transport \n#> 5 GO:0006355 regulation of DNA-templated transcription \n#> 6 GO:0006357 regulation of transcription by RNA polymerase II\n\nWe can run the enrichment analysis:\n\ntar_target(\n diablo_enrichment_results,\n evaluate_method_enrichment(\n diablo_output,\n go_sets_filtered,\n datasets = \"rnaseq\",\n use_abs = TRUE,\n min_set_size = 10,\n add_missing_features = TRUE,\n mo_data = mo_set_complete,\n sets_info_df = go_sets_info,\n col_set = \"go_id\"\n )\n)\n\nThe function returns a table giving for each latent component (latent_dimension) and feature set (set_id) the enrichment statistics (stat_mean), p-value (pvalue), adjusted p-value (adj_pvalue) as well as the number of features in the set that are present in the integration results (set_size). The table is arranged by increasing adjusted p-value, such that the significant results are at the top of the table. It is important to note that the multiple testing correction applied to the p-values occurs independently for each latent dimension, but there is no multiple testing correction performed across the latent dimensions. This can easily be done by the user, and should be considered when reporting the results.\n\ntar_read(diablo_enrichment_results) |> \n head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Component 3 GO:0035249 1.23 0.114 0.608 24 synaptic tra…\n#> 2 Component 3 GO:0007157 0.993 0.165 0.608 24 heterophilic…\n#> 3 Component 3 GO:0016311 0.969 0.168 0.608 100 dephosphoryl…\n#> 4 Component 3 GO:0045930 0.984 0.169 0.608 20 negative reg…\n#> 5 Component 3 GO:0045666 0.968 0.169 0.608 40 positive reg…\n#> 6 Component 3 GO:0006470 0.957 0.170 0.608 138 protein deph…\n\nIn that case, unsurprisingly, neither of the latent components were enriched for any GO term. This makes sense since DIABLO performed a strong feature selection, so very few genes had non-null weights. We can repeat the enrichment with the MOFA integration results to show more interesting results. We will run the enrichment only for the first three factors for conciseness:\n\ntar_target(\n mofa_enrichment_results,\n evaluate_method_enrichment(\n mofa_output,\n go_sets_filtered,\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", 1:3),\n use_abs = TRUE,\n min_set_size = 10,\n add_missing_features = TRUE,\n mo_data = mo_set_complete,\n sets_info_df = go_sets_info,\n col_set = \"go_id\"\n )\n)\n\nThis time, there are a couple of small p-values (even though the adjusted p-values are all quite large):\n\ntar_load(mofa_enrichment_results)\n\nmofa_enrichment_results |> head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Factor 3 GO:0031424 4.13 0.000275 0.548 20 keratiniza…\n#> 2 Factor 3 GO:0045109 3.59 0.000713 0.711 25 intermedia…\n#> 3 Factor 3 GO:0030855 2.56 0.00648 0.767 56 epithelial…\n#> 4 Factor 3 GO:0031069 2.07 0.0246 0.767 25 hair folli…\n#> 5 Factor 3 GO:0030216 1.89 0.0320 0.767 49 keratinocy…\n#> 6 Factor 3 GO:0098609 1.82 0.0350 0.767 120 cell-cell …\n\nWe can see for example that MOFA factor 3 seems enriched in genes associated with the keratinization GO term (GO:0031424). For factor 1 (the factor separating the healthy and infected animals), the keratinization term also yields the smallest p-value, together with several GO terms related to inflammation (even though after correction for multiple testing these p-values are no longer significant):\n\nmofa_enrichment_results |>\n filter(latent_dimension == \"Factor 1\") |> \n head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Factor 1 GO:0031424 2.75 0.00461 0.786 20 keratinizat…\n#> 2 Factor 1 GO:0045109 2.47 0.00867 0.786 25 intermediat…\n#> 3 Factor 1 GO:0010951 2.15 0.0208 0.786 25 negative re…\n#> 4 Factor 1 GO:0006954 1.86 0.0317 0.786 165 inflammator…\n#> 5 Factor 1 GO:0050727 1.75 0.0424 0.786 56 regulation …\n#> 6 Factor 1 GO:0007166 1.62 0.0534 0.786 138 cell surfac…\n\n\n13.3.5 Plotting features weight for feature sets\nWe can dig into the results of the enrichment by visualising the distribution of features weight or importance score between features that are in a specific features set vs features that are not in the set. For example, to continue with the MOFA example, let’s look at the importance score of genes associated with the GO term GO:0031424. We’ll only look at factors 1 and 3 for this example:\n\nplot_features_weight_set(\n mofa_output,\n go_sets_filtered[[\"GO:0031424\"]],\n set_name = \"GO:0031424 (keratinization)\",\n features_metric = \"importance\",\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", c(1, 3)),\n point_alpha = 0.2\n)\n\n\n\n\nIn the resulting plot, we can see for each dataset (in this case, we’re only looking at the transcriptomics dataset since we have gene sets) and latent dimensions (rows of the plot) the distribution of features importance for genes in the set vs not in the set. We can see that the GO term investigated contains 20 genes, and in total, 994 genes have been assigned a weight with MOFA (because we have performed some pre-filtering on the transcriptomics dataset prior to running MOFA). Therefore, out of all the genes in the set, 9 of them have no weight (they did not pass the pre-filtering step). We can add these features that did not make it into the MOFA input data in the same way as we did for the enrichment function, namely by setting the add_missing_features argument to TRUE and passing the non-filtering MultiDataSet object through mo_data:\n\nplot_features_weight_set(\n mofa_output,\n go_sets_filtered[[\"GO:0031424\"]],\n set_name = \"GO:0031424 (keratinization)\",\n features_metric = \"importance\",\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", c(1, 3)),\n point_alpha = 0.2,\n add_missing_features = TRUE,\n mo_data = mo_set_complete\n)\n\n\n\n\nThis is the distribution of values that were used for the enrichment test, but it’s not very useful to look at since the vast majority of the genes have a weight of zero." + "text": "13.3 Features set enrichment\nIn addition to looking at the distribution of features importance score or counting the number of selected features, we can also perform an enrichment to assess whether each of the latent dimensions constructed is enriched for some features set of interest. Features sets are groups of features that belong in a similar category: e.g. all features involved in a same biological pathway, or with the same GO term annotation, or even all up- or down-regulated features. They are built using prior knowledge, for example information extracted from databases, or constructed from the results of previous analyses. Importantly, a feature can belong to more than one set (for example a compound can be involved in several biological pathways).\n\n13.3.1 Constructing feature sets\nWith the moiraine package, there are two ways to obtain feature sets to perform enrichment or for plots. The first one is to extract information from the features metadata tables stored in our MultiDataSet object; which is done with the make_feature_sets_from_fm() function. Note that if some features grouping is stored in the features metadata, it means that features can only belong to one set. For example, we will use the results of the single-omics analyses to group the features into sets: QTLs, cis-eQTLs, trans-eQTLs and non significant genomics markers, and up-regulated, down-regulated or non DE genes and compounds. Again, the function accepts a named list giving for each dataset the name of the column in the corresponding features metadata table to use to generate the groups, passed to the col_names argument of the function. It returns a named list where each element is a feature set, and contains the ID of the features in the set:\n\ntar_target(\n sets_single_omics,\n make_feature_sets_from_fm(\n mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n )\n )\n)\n\n\ntar_read(sets_single_omics) |> \n str()\n#> List of 10\n#> $ non signif. : chr [1:23000] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> $ cis eQTL : chr [1:31] \"ARS-BFGL-BAC-13210\" \"ARS-BFGL-NGS-113310\" \"ARS-BFGL-NGS-5022\" \"ARS-BFGL-NGS-59463\" ...\n#> $ trans eQTL : chr [1:4] \"ARS-BFGL-NGS-80280\" \"BovineHD0100032240\" \"BovineHD2300010006\" \"Hapmap55381-rs29025399\"\n#> $ QTL : chr \"BovineHD1800016801\"\n#> $ Not DE - rnaseq : chr [1:20224] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> $ upregulated - rnaseq : chr [1:102] \"ENSBTAG00000000377\" \"ENSBTAG00000000783\" \"ENSBTAG00000001051\" \"ENSBTAG00000001785\" ...\n#> $ downregulated - rnaseq : chr [1:9] \"ENSBTAG00000001032\" \"ENSBTAG00000004824\" \"ENSBTAG00000011990\" \"ENSBTAG00000012403\" ...\n#> $ Not DE - metabolome : chr [1:25] \"HMDB00001\" \"HMDB00008\" \"HMDB00060\" \"HMDB00097\" ...\n#> $ downregulated - metabolome: chr [1:20] \"HMDB00042\" \"HMDB00043\" \"HMDB00064\" \"HMDB00094\" ...\n#> $ upregulated - metabolome : chr [1:10] \"HMDB00062\" \"HMDB00092\" \"HMDB00159\" \"HMDB00169\" ...\n\nBy default, the function keeps the different omics features separate: here for example, there is a “Not DE” set for the transcriptomics dataset, and a “Not DE” set for the metabolomics dataset. When there is no ambiguity as to which omics dataset they represent, the name of the dataset is not included in the set’s name. It is possible to merge feature sets with the same name between the omics datasets, by setting the combine_omics_sets argument to TRUE:\n\ntar_target(\n sets_single_omics_merged,\n make_feature_sets_from_fm(\n mo_set_complete,\n col_names = list(\n \"snps\" = \"qtl_type\", \n \"rnaseq\" = \"de_status\", \n \"metabolome\" = \"de_status\"\n ),\n combine_omics_sets = TRUE\n )\n)\n\n\ntar_read(sets_single_omics_merged) |> \n str()\n#> List of 7\n#> $ non signif. : chr [1:23000] \"1_41768691\" \"10-27008241-A-C-rs42918694\" \"10-37505419-T-C-rs136559242\" \"10-49904259-G-A-rs471723345\" ...\n#> $ cis eQTL : chr [1:31] \"ARS-BFGL-BAC-13210\" \"ARS-BFGL-NGS-113310\" \"ARS-BFGL-NGS-5022\" \"ARS-BFGL-NGS-59463\" ...\n#> $ trans eQTL : chr [1:4] \"ARS-BFGL-NGS-80280\" \"BovineHD0100032240\" \"BovineHD2300010006\" \"Hapmap55381-rs29025399\"\n#> $ QTL : chr \"BovineHD1800016801\"\n#> $ Not DE : chr [1:20249] \"ENSBTAG00000000005\" \"ENSBTAG00000000008\" \"ENSBTAG00000000009\" \"ENSBTAG00000000010\" ...\n#> $ upregulated : chr [1:112] \"ENSBTAG00000000377\" \"ENSBTAG00000000783\" \"ENSBTAG00000001051\" \"ENSBTAG00000001785\" ...\n#> $ downregulated: chr [1:29] \"ENSBTAG00000001032\" \"ENSBTAG00000004824\" \"ENSBTAG00000011990\" \"ENSBTAG00000012403\" ...\n\nNow the not DE set contains all genes and compounds ID that have not been found differentially expressed.\nAlternatively, feature sets can be constructed from an input data-frame. This is useful when looking at pathways or GO annotations, for which features can belong to several sets at once, as this information cannot be stored in a features metadata table. Here, we will use the GO terms assigned to the genes. Note that in this example, the feature sets will contain features from only one omics dataset, but it doesn’t have to be; instead the sets could contain features from different omics datasets.\nWe start by reading in the data-frame of GO terms. We will focus on GO terms relating to biological processes for this example:\n\nlist(\n tar_target(\n rnaseq_go_terms_file,\n system.file(\n \"extdata/transcriptomics_go_annotation.csv\", \n package = \"moiraine\"\n ),\n format = \"file\"\n ),\n \n tar_target(\n rnaseq_go_df,\n read_csv(rnaseq_go_terms_file) |> \n filter(go_domain == \"Biological process\")\n )\n)\n\n\ntar_load(rnaseq_go_df)\n\ndim(rnaseq_go_df)\n#> [1] 89226 4\nhead(rnaseq_go_df)\n#> # A tibble: 6 × 4\n#> gene_id go_id go_name go_domain\n#> \n#> 1 ENSBTAG00000000005 GO:0006468 protein phosphorylation Biologic…\n#> 2 ENSBTAG00000000005 GO:0007165 signal transduction Biologic…\n#> 3 ENSBTAG00000000005 GO:0031623 receptor internalization Biologic…\n#> 4 ENSBTAG00000000008 GO:0006813 potassium ion transport Biologic…\n#> 5 ENSBTAG00000000009 GO:0006355 regulation of DNA-templated transcrip… Biologic…\n#> 6 ENSBTAG00000000009 GO:0006357 regulation of transcription by RNA po… Biologic…\n\nThe data-frame contains one row per gene (gene_id) / GO term (go_id) pair. In addition, the name of each GO term and the category (biological process, molecular function or cellular component) are indicated in the go_name and go_domain columns, respectively. When reading in the file, we’ve restricted the GO terms to only those that correspond to biological processes.\nWe can turn this data-frame into a list of feature sets with the make_feature_sets_from_df() function. The function takes as input the data-frame, as well as the name of the column in the data-frame that contains the features ID (col_id argument) and the name of the column in the data-frame that contains the feature sets ID or name (col_set argument):\n\ntar_target(\n go_sets,\n make_feature_sets_from_df(\n rnaseq_go_df,\n col_id = \"gene_id\",\n col_set = \"go_id\"\n )\n)\n\n\ntar_load(go_sets)\n\nlength(go_sets)\n#> [1] 10745\nhead(go_sets) |> \n str()\n#> List of 6\n#> $ GO:0006468: chr [1:580] \"ENSBTAG00000000005\" \"ENSBTAG00000000013\" \"ENSBTAG00000000056\" \"ENSBTAG00000000184\" ...\n#> $ GO:0007165: chr [1:737] \"ENSBTAG00000000005\" \"ENSBTAG00000000073\" \"ENSBTAG00000000081\" \"ENSBTAG00000000105\" ...\n#> $ GO:0031623: chr [1:31] \"ENSBTAG00000000005\" \"ENSBTAG00000000308\" \"ENSBTAG00000001050\" \"ENSBTAG00000001139\" ...\n#> $ GO:0006813: chr [1:96] \"ENSBTAG00000000008\" \"ENSBTAG00000000082\" \"ENSBTAG00000000745\" \"ENSBTAG00000000973\" ...\n#> $ GO:0006355: chr [1:915] \"ENSBTAG00000000009\" \"ENSBTAG00000000040\" \"ENSBTAG00000000052\" \"ENSBTAG00000000074\" ...\n#> $ GO:0006357: chr [1:627] \"ENSBTAG00000000009\" \"ENSBTAG00000000039\" \"ENSBTAG00000000052\" \"ENSBTAG00000000154\" ...\n\n\n13.3.2 Filtering feature sets against the datasets\nBefore performing any enrichment, we want to make sure that the only features in the sets are the ones that were measured in the datasets. This is part of ensuring that an appropriate background or reference features set is used when performing enrichment (see for example Timmons, Szkop, and Gallagher (2015)). To this end, the reduce_feature_sets_data() function filters a list of feature sets so that only features present in a given MultiDataSet object are kept in the sets; it then removes empty feature sets. Note that for this filtering, we are using the MultiDataSet object that contains the full omics datasets, before pre-filtering:\n\ntar_target(\n go_sets_filtered,\n reduce_feature_sets_data(go_sets, mo_set_complete)\n)\n\nThe function yields the following message:\n\n#> All features in sets are in the multi-omics dataset.\n\n\ntar_load(go_sets_filtered)\n\n\n13.3.3 Checking the number of features assigned to sets\nWe can then check the number of features that are assigned to at least one set with the check_feature_sets() function, to get an idea of the coverage of our annotation. We will restrict the check to the transcriptomics dataset, since the GO annotation only covers genes:\n\nsets_check <- check_feature_sets(\n go_sets_filtered, \n mo_set_complete,\n datasets = \"rnaseq\"\n)\n#> rnaseq dataset: 14,364 of 20,335 (70.6%) features assigned to at least one set.\n\nsets_check\n#> # A tibble: 1 × 5\n#> dataset n_annotated n frac_annotated message \n#> \n#> 1 rnaseq 14364 20335 0.706 rnaseq dataset: 14,364 of 20,335 (70…\n\nThe function returns a tibble giving the name of the datasets, the number and fraction of features from the dataset that are present in at least one feature set (n_annotated and frac_annotated columns), the total number of features in the corresponding dataset (n column), as well as sentence summarising this information (message column) that is useful for reporting. In this example, 70.6% of the genes from the transcriptomics dataset are assigned to at least one GO term. This is important to check as the annotation coverage will impact the quality of the enrichment results that we get.\n\n13.3.4 Enrichment of latent dimensions\nWe are now ready to perform an enrichment of the latent dimensions. There are many ways to perform functional enrichment (e.g. see Zhao and Rhee (2023)): based on over-representation, feature ranking, or even topology when the feature sets are representing biological pathways. Here, we are not trying to provide an exhaustive list of options; however it is relatively straightforward to extract from an integration method output the features importance or list of selected features for a specific latent dimension, and use it for enrichment with the package of your choice.\nIn moiraine, we use the gage package (Luo et al. 2009) to perform the enrichment of each latent dimension against a list of feature sets. It uses a two-sample t-test to assess whether features in a set have higher importance scores than features not in the set. The evaluate_method_enrichment() function takes as input the results from an integration method in a standardised format (here our diablo_output object), and performs an enrichment for each latent dimension using the features sets provided as a list. We can focus on specific datasets or latent dimensions by passing their name to the datasets or latent_dimensions arguments, respectively. There are a number of parameters that need to be set:\n\nuse_abs: by default, the function uses the absolute value of the importance score to perform the enrichment, which allows it to detect features sets in which features are given strong weights that are both positive and negative. If we instead want to search for features sets in which the weight of the features are coordinated (i.e. either all positive or negative), we can set the use_abs argument to FALSE.\nmin_set_size: the minimum number of features in a set needed for the set to be considered for enrichment. The default value is 5, i.e. sets with less than 5 features will not be tested for enrichment.\nadd_missing_features and mo_data: when performing multi-omics integration, it is highly likely that the omics datasets have been pre-filtered prior to the analysis, which means that some features will not have received a weight in the results of the integration analysis. This can bias the enrichment results, as these are based on only features that have a weight. So if a features set contains 50 features, but 40 of these were discarded during the pre-filtering step, only the remaining 10 features will be considered when performing an enrichment. This might lead to finding a latent dimension enriched for this set, even though the set might not be biologically relevant since 80% of its features did not even pass the pre-filtering step. To account for that, it is possible to add to the integration results all of the features in a MultiDataSet object that are not present in the results. These features will be assigned a weight of 0 to emphasise that they were not found to play any role for the latent dimensions. This is done by setting add_missing_features to TRUE, and passing to mo_data a MultiDataSet object that contains the omics datasets that have not been filtered. This way, the background set used in the enrichment will be all features measured in the omics datasets, and not only the ones that passed the pre-filtering step.\nsets_info_df and col_set: the feature sets are passed as a named list, therefore the only information that we have about these sets are their names as found in the list. To facilitate the interpretation of the enrichment results, it is possible to pass a data-frame giving information about the sets, through the sets_info_df argument. This information will be added to the enrichment results table. In that case, the col_set argument must also be specified: it takes the name of the column in the data-frame passed to sets_info_df that contains the sets ID or named as seen in the list. Here we will create this data-frame as follows:\n\n\ntar_target(\n go_sets_info,\n rnaseq_go_df |>\n dplyr::select(go_id, go_name) |>\n dplyr::distinct()\n)\n\n\ntar_read(go_sets_info) |> \n head()\n#> # A tibble: 6 × 2\n#> go_id go_name \n#> \n#> 1 GO:0006468 protein phosphorylation \n#> 2 GO:0007165 signal transduction \n#> 3 GO:0031623 receptor internalization \n#> 4 GO:0006813 potassium ion transport \n#> 5 GO:0006355 regulation of DNA-templated transcription \n#> 6 GO:0006357 regulation of transcription by RNA polymerase II\n\nWe can run the enrichment analysis:\n\ntar_target(\n diablo_enrichment_results,\n evaluate_method_enrichment(\n diablo_output,\n go_sets_filtered,\n datasets = \"rnaseq\",\n use_abs = TRUE,\n min_set_size = 10,\n add_missing_features = TRUE,\n mo_data = mo_set_complete,\n sets_info_df = go_sets_info,\n col_set = \"go_id\"\n )\n)\n\nThe function returns a table giving for each latent component (latent_dimension) and feature set (set_id) the enrichment statistics (stat_mean), p-value (pvalue), adjusted p-value (adj_pvalue) as well as the number of features in the set that are present in the integration results (set_size). The table is arranged by increasing adjusted p-value, such that the significant results are at the top of the table. It is important to note that the multiple testing correction applied to the p-values occurs independently for each latent dimension, but there is no multiple testing correction performed across the latent dimensions. This can easily be done by the user, and should be considered when reporting the results.\n\ntar_read(diablo_enrichment_results) |> \n head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Component 3 GO:0035249 1.23 0.114 0.608 24 synaptic tra…\n#> 2 Component 3 GO:0007157 0.993 0.165 0.608 24 heterophilic…\n#> 3 Component 3 GO:0016311 0.969 0.168 0.608 100 dephosphoryl…\n#> 4 Component 3 GO:0045930 0.984 0.169 0.608 20 negative reg…\n#> 5 Component 3 GO:0045666 0.968 0.169 0.608 40 positive reg…\n#> 6 Component 3 GO:0006470 0.957 0.170 0.608 138 protein deph…\n\nIn that case, unsurprisingly, neither of the latent components were enriched for any GO term. This makes sense since DIABLO performed a strong feature selection, so very few genes had non-null weights. We can repeat the enrichment with the MOFA integration results to show more interesting results. We will run the enrichment only for the first three factors for conciseness:\n\ntar_target(\n mofa_enrichment_results,\n evaluate_method_enrichment(\n mofa_output,\n go_sets_filtered,\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", 1:3),\n use_abs = TRUE,\n min_set_size = 10,\n add_missing_features = TRUE,\n mo_data = mo_set_complete,\n sets_info_df = go_sets_info,\n col_set = \"go_id\"\n )\n)\n\nThis time, there are a couple of small p-values (even though the adjusted p-values are all quite large):\n\ntar_load(mofa_enrichment_results)\n\nmofa_enrichment_results |> head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Factor 3 GO:0031424 4.13 0.000275 0.548 20 keratiniza…\n#> 2 Factor 3 GO:0045109 3.59 0.000713 0.711 25 intermedia…\n#> 3 Factor 3 GO:0030855 2.56 0.00648 0.767 56 epithelial…\n#> 4 Factor 3 GO:0031069 2.07 0.0246 0.767 25 hair folli…\n#> 5 Factor 3 GO:0030216 1.89 0.0320 0.767 49 keratinocy…\n#> 6 Factor 3 GO:0098609 1.82 0.0350 0.767 120 cell-cell …\n\nWe can see for example that MOFA factor 3 seems enriched in genes associated with the keratinization GO term (GO:0031424). For factor 1 (the factor separating the healthy and infected animals), the keratinization term also yields the smallest p-value, together with several GO terms related to inflammation (even though after correction for multiple testing these p-values are no longer significant):\n\nmofa_enrichment_results |>\n filter(latent_dimension == \"Factor 1\") |> \n head()\n#> # A tibble: 6 × 7\n#> latent_dimension set_id stat_mean pvalue adj_pvalue set_size go_name \n#> \n#> 1 Factor 1 GO:0031424 2.75 0.00461 0.786 20 keratinizat…\n#> 2 Factor 1 GO:0045109 2.47 0.00867 0.786 25 intermediat…\n#> 3 Factor 1 GO:0010951 2.15 0.0208 0.786 25 negative re…\n#> 4 Factor 1 GO:0006954 1.86 0.0317 0.786 165 inflammator…\n#> 5 Factor 1 GO:0050727 1.75 0.0424 0.786 56 regulation …\n#> 6 Factor 1 GO:0007166 1.62 0.0534 0.786 138 cell surfac…\n\n\n13.3.5 Plotting features weight for feature sets\nWe can dig into the results of the enrichment by visualising the distribution of features weight or importance score between features that are in a specific features set vs features that are not in the set. For example, to continue with the MOFA example, let’s look at the importance score of genes associated with the GO term GO:0031424. We’ll only look at factors 1 and 3 for this example:\n\nplot_features_weight_set(\n mofa_output,\n go_sets_filtered[[\"GO:0031424\"]],\n set_name = \"GO:0031424 (keratinization)\",\n features_metric = \"importance\",\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", c(1, 3)),\n point_alpha = 0.2\n)\n\n\n\n\nIn the resulting plot, we can see for each dataset (in this case, we’re only looking at the transcriptomics dataset since we have gene sets) and latent dimensions (rows of the plot) the distribution of features importance for genes in the set vs not in the set. We can see that the GO term investigated contains 20 genes, and in total, 994 genes have been assigned a weight with MOFA (because we have performed some pre-filtering on the transcriptomics dataset prior to running MOFA). Therefore, out of all the genes in the set, 9 of them have no weight (they did not pass the pre-filtering step). We can add these features that did not make it into the MOFA input data in the same way as we did for the enrichment function, namely by setting the add_missing_features argument to TRUE and passing the non-filtering MultiDataSet object through mo_data:\n\nplot_features_weight_set(\n mofa_output,\n go_sets_filtered[[\"GO:0031424\"]],\n set_name = \"GO:0031424 (keratinization)\",\n features_metric = \"importance\",\n datasets = \"rnaseq\",\n latent_dimensions = paste(\"Factor\", c(1, 3)),\n point_alpha = 0.2,\n add_missing_features = TRUE,\n mo_data = mo_set_complete\n)\n\n\n\n\nThis is the distribution of values that were used for the enrichment test, but it’s not very useful to look at since the vast majority of the genes have a weight of zero." }, { "objectID": "evaluation.html#assessing-samples-clustering", diff --git a/docs/site_libs/bootstrap/bootstrap.min.css b/docs/site_libs/bootstrap/bootstrap.min.css index 06aaf2d..221e3fe 100644 --- a/docs/site_libs/bootstrap/bootstrap.min.css +++ b/docs/site_libs/bootstrap/bootstrap.min.css @@ -7,4 +7,4 @@ * * ansi colors from IPython notebook's * -*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-fg{color:#282c36}.ansi-black-intense-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-fg{color:#b22b31}.ansi-red-intense-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-fg{color:#007427}.ansi-green-intense-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-fg{color:#b27d12}.ansi-yellow-intense-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-fg{color:#0065ca}.ansi-blue-intense-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-fg{color:#a03196}.ansi-magenta-intense-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-fg{color:#258f8f}.ansi-cyan-intense-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-fg{color:#a1a6b2}.ansi-white-intense-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #373a3c;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:transparent;border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:transparent;border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:transparent}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:transparent}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] 50px [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}.zindex-content{z-index:998;transform:translate3d(0, 0, 0)}.zindex-modal{z-index:1055;transform:translate3d(0, 0, 0)}.zindex-over-content{z-index:999;transform:translate3d(0, 0, 0)}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside,.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{margin-top:2rem;margin-bottom:1rem}h1.title,.title.h1{margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3,h4,.h4{margin-top:1.5rem}.header-section-number{color:#747a7f}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,caption,.figure-caption{font-size:1rem}.panel-caption,.figure-caption,figcaption{color:#747a7f}.table-caption,caption{color:#373a3c}.quarto-layout-cell[data-ref-parent] caption{color:#747a7f}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#747a7f;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:1em}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:transparent}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#747a7f}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code:not(.sourceCode),li code:not(.sourceCode){background-color:#f7f7f7;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode){background-color:transparent;padding:0}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:transparent;transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.toc-left>*,.sidebar.margin-sidebar>*{padding-top:.5em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem;font-weight:400;margin-bottom:.5rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar nav[role=doc-toc] ul{padding-left:0;list-style:none;font-size:.875rem;font-weight:300}.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}.sidebar nav[role=doc-toc] ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}kbd,.kbd{color:#373a3c;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}div.hanging-indent{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.table a{word-break:break-word}.table>:not(:first-child){border-top-width:1px;border-top-color:#dee2e6}.table>thead{border-bottom:1px solid currentColor}.table>tbody{border-top:1px solid #dee2e6}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout.callout-captioned .callout-body{margin-top:.2em}.callout:not(.no-icon).callout-captioned.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-captioned>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body>:first-child{margin-top:.5em}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-captioned .callout-body>:last-child:not(.sourceCode),.callout.callout-captioned .callout-body>div>:last-child:not(.sourceCode){margin-bottom:.5rem}.callout:not(.callout-captioned) .callout-body>:first-child,.callout:not(.callout-captioned) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-captioned) .callout-body>:last-child,.callout:not(.callout-captioned) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-caption-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default>.callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default>.callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default>.callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default>.callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default>.callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}@media(min-width: 992px){.navbar .quarto-color-scheme-toggle{padding-left:.5rem;padding-right:.5rem}}@media(max-width: 767.98px){.navbar .quarto-color-scheme-toggle{padding-left:0;padding-right:0;padding-bottom:.5em}}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.navbar-collapse .quarto-color-scheme-toggle{padding-left:.6rem;padding-right:0;margin-top:-12px}.sidebar-navigation{padding-left:20px}.sidebar-navigation .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.sidebar-tools-main .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.navbar .quarto-color-scheme-toggle .bi::before{padding-top:7px;margin-bottom:-7px;padding-left:2px;margin-right:2px}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#373a3c}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{color:#cbcccc;background-color:#373a3c;border-color:#373a3c}.btn.btn-quarto:hover,div.cell-output-display .btn-quarto:hover{color:#cbcccc;background-color:#555859;border-color:#4b4e50}.btn-check:focus+.btn.btn-quarto,.btn.btn-quarto:focus,.btn-check:focus+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:focus{color:#cbcccc;background-color:#555859;border-color:#4b4e50;box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn-check:checked+.btn.btn-quarto,.btn-check:active+.btn.btn-quarto,.btn.btn-quarto:active,.btn.btn-quarto.active,.show>.btn.btn-quarto.dropdown-toggle,.btn-check:checked+div.cell-output-display .btn-quarto,.btn-check:active+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:active,div.cell-output-display .btn-quarto.active,.show>div.cell-output-display .btn-quarto.dropdown-toggle{color:#fff;background-color:#5f6163;border-color:#4b4e50}.btn-check:checked+.btn.btn-quarto:focus,.btn-check:active+.btn.btn-quarto:focus,.btn.btn-quarto:active:focus,.btn.btn-quarto.active:focus,.show>.btn.btn-quarto.dropdown-toggle:focus,.btn-check:checked+div.cell-output-display .btn-quarto:focus,.btn-check:active+div.cell-output-display .btn-quarto:focus,div.cell-output-display .btn-quarto:active:focus,div.cell-output-display .btn-quarto.active:focus,.show>div.cell-output-display .btn-quarto.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn.btn-quarto:disabled,.btn.btn-quarto.disabled,div.cell-output-display .btn-quarto:disabled,div.cell-output-display .btn-quarto.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}nav.quarto-secondary-nav.color-navbar{background-color:#2780e3;color:#fdfeff}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfeff}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner,body.nav-sidebar .quarto-title-banner{display:none}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}}.quarto-video{margin-bottom:1em}a.external:after{display:inline-block;height:.75rem;width:.75rem;margin-bottom:.15em;margin-left:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file,.code-with-filename .code-with-filename-file pre{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file,.quarto-dark .code-with-filename .code-with-filename-file pre{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfeff;background:#2780e3}.quarto-title-banner .code-tools-button{color:#97cbff}.quarto-title-banner .code-tools-button:hover{color:#fdfeff}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}main.quarto-banner-title-block section:first-of-type h2:first-of-type,main.quarto-banner-title-block section:first-of-type .h2:first-of-type,main.quarto-banner-title-block section:first-of-type h3:first-of-type,main.quarto-banner-title-block section:first-of-type .h3:first-of-type,main.quarto-banner-title-block section:first-of-type h4:first-of-type,main.quarto-banner-title-block section:first-of-type .h4:first-of-type{margin-top:0}.quarto-title .quarto-categories{display:flex;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr)}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-5px}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents a{color:#373a3c}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.7em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .description .abstract-title,#title-block-header.quarto-title-block.default .abstract .abstract-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:1fr 1fr}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#373a3c}.progress .progress-bar{font-size:8px;line-height:8px}.targets-chunk{background-color:#e4eaff !important}.file-chunk{background-color:#fff8e6 !important}/*# sourceMappingURL=5752e79b73c3fc43a4dc99ba1d45f305.css.map */ +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-fg{color:#282c36}.ansi-black-intense-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-fg{color:#b22b31}.ansi-red-intense-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-fg{color:#007427}.ansi-green-intense-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-fg{color:#b27d12}.ansi-yellow-intense-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-fg{color:#0065ca}.ansi-blue-intense-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-fg{color:#a03196}.ansi-magenta-intense-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-fg{color:#258f8f}.ansi-cyan-intense-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-fg{color:#a1a6b2}.ansi-white-intense-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #373a3c;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:transparent;border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:transparent;border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:transparent}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:transparent}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] 50px [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1200px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}.zindex-content{z-index:998;transform:translate3d(0, 0, 0)}.zindex-modal{z-index:1055;transform:translate3d(0, 0, 0)}.zindex-over-content{z-index:999;transform:translate3d(0, 0, 0)}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside,.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{margin-top:2rem;margin-bottom:1rem}h1.title,.title.h1{margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3,h4,.h4{margin-top:1.5rem}.header-section-number{color:#747a7f}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,caption,.figure-caption{font-size:1rem}.panel-caption,.figure-caption,figcaption{color:#747a7f}.table-caption,caption{color:#373a3c}.quarto-layout-cell[data-ref-parent] caption{color:#747a7f}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#747a7f;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:1em}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:transparent}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#747a7f}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code:not(.sourceCode),li code:not(.sourceCode){background-color:#f7f7f7;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode){background-color:transparent;padding:0}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:transparent;transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.toc-left>*,.sidebar.margin-sidebar>*{padding-top:.5em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem;font-weight:400;margin-bottom:.5rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar nav[role=doc-toc] ul{padding-left:0;list-style:none;font-size:.875rem;font-weight:300}.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}.sidebar nav[role=doc-toc] ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}kbd,.kbd{color:#373a3c;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}div.hanging-indent{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.table a{word-break:break-word}.table>:not(:first-child){border-top-width:1px;border-top-color:#dee2e6}.table>thead{border-bottom:1px solid currentColor}.table>tbody{border-top:1px solid #dee2e6}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout.callout-captioned .callout-body{margin-top:.2em}.callout:not(.no-icon).callout-captioned.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-captioned>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body>:first-child{margin-top:.5em}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-captioned .callout-body>:last-child:not(.sourceCode),.callout.callout-captioned .callout-body>div>:last-child:not(.sourceCode){margin-bottom:.5rem}.callout:not(.callout-captioned) .callout-body>:first-child,.callout:not(.callout-captioned) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-captioned) .callout-body>:last-child,.callout:not(.callout-captioned) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-caption-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default>.callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default>.callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default>.callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default>.callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default>.callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-captioned) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-captioned .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}@media(min-width: 992px){.navbar .quarto-color-scheme-toggle{padding-left:.5rem;padding-right:.5rem}}@media(max-width: 767.98px){.navbar .quarto-color-scheme-toggle{padding-left:0;padding-right:0;padding-bottom:.5em}}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.navbar-collapse .quarto-color-scheme-toggle{padding-left:.6rem;padding-right:0;margin-top:-12px}.sidebar-navigation{padding-left:20px}.sidebar-navigation .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.sidebar-tools-main .quarto-color-scheme-toggle .bi::before{padding-top:.2rem;margin-bottom:-0.2rem}.navbar .quarto-color-scheme-toggle .bi::before{padding-top:7px;margin-bottom:-7px;padding-left:2px;margin-right:2px}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#373a3c}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{color:#cbcccc;background-color:#373a3c;border-color:#373a3c}.btn.btn-quarto:hover,div.cell-output-display .btn-quarto:hover{color:#cbcccc;background-color:#555859;border-color:#4b4e50}.btn-check:focus+.btn.btn-quarto,.btn.btn-quarto:focus,.btn-check:focus+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:focus{color:#cbcccc;background-color:#555859;border-color:#4b4e50;box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn-check:checked+.btn.btn-quarto,.btn-check:active+.btn.btn-quarto,.btn.btn-quarto:active,.btn.btn-quarto.active,.show>.btn.btn-quarto.dropdown-toggle,.btn-check:checked+div.cell-output-display .btn-quarto,.btn-check:active+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:active,div.cell-output-display .btn-quarto.active,.show>div.cell-output-display .btn-quarto.dropdown-toggle{color:#fff;background-color:#5f6163;border-color:#4b4e50}.btn-check:checked+.btn.btn-quarto:focus,.btn-check:active+.btn.btn-quarto:focus,.btn.btn-quarto:active:focus,.btn.btn-quarto.active:focus,.show>.btn.btn-quarto.dropdown-toggle:focus,.btn-check:checked+div.cell-output-display .btn-quarto:focus,.btn-check:active+div.cell-output-display .btn-quarto:focus,div.cell-output-display .btn-quarto:active:focus,div.cell-output-display .btn-quarto.active:focus,.show>div.cell-output-display .btn-quarto.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn.btn-quarto:disabled,.btn.btn-quarto.disabled,div.cell-output-display .btn-quarto:disabled,div.cell-output-display .btn-quarto.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}nav.quarto-secondary-nav.color-navbar{background-color:#2780e3;color:#fdfeff}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfeff}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner,body.nav-sidebar .quarto-title-banner{display:none}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}}.quarto-video{margin-bottom:1em}a.external:after{display:inline-block;height:.75rem;width:.75rem;margin-bottom:.15em;margin-left:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file,.code-with-filename .code-with-filename-file pre{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file,.quarto-dark .code-with-filename .code-with-filename-file pre{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfeff;background:#2780e3}.quarto-title-banner .code-tools-button{color:#97cbff}.quarto-title-banner .code-tools-button:hover{color:#fdfeff}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}main.quarto-banner-title-block section:first-of-type h2:first-of-type,main.quarto-banner-title-block section:first-of-type .h2:first-of-type,main.quarto-banner-title-block section:first-of-type h3:first-of-type,main.quarto-banner-title-block section:first-of-type .h3:first-of-type,main.quarto-banner-title-block section:first-of-type h4:first-of-type,main.quarto-banner-title-block section:first-of-type .h4:first-of-type{margin-top:0}.quarto-title .quarto-categories{display:flex;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr)}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-5px}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents a{color:#373a3c}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.7em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .description .abstract-title,#title-block-header.quarto-title-block.default .abstract .abstract-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:1fr 1fr}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#373a3c}.progress .progress-bar{font-size:8px;line-height:8px}.targets-chunk{background-color:#e4eaff !important}.file-chunk{background-color:#fff8e6 !important}/*# sourceMappingURL=9f0365fa8b8a031ef629aa50765eb887.css.map */ diff --git a/docs/so2pls_files/figure-html/plot-cv-adj-1.png b/docs/so2pls_files/figure-html/plot-cv-adj-1.png index 90d8426..782db74 100644 Binary files a/docs/so2pls_files/figure-html/plot-cv-adj-1.png and b/docs/so2pls_files/figure-html/plot-cv-adj-1.png differ diff --git a/index.qmd b/index.qmd index 242c11a..d6450cf 100644 --- a/index.qmd +++ b/index.qmd @@ -5,7 +5,7 @@ Omics datasets provide an overview of the content of cells for a specific molecular layer (e.g. transcriptome, proteome, metabolome). By integrating different omics datasets obtained on the same biological samples, we can gain a deeper understanding of the interactions between these molecular layers, and shed light on the regulations occurring both within and between layers. A number of statistical methods have been developed to extract such information from multi-omics datasets, and many have been implemented in software such as R packages. However, these tools differ conceptually, in terms of the input data they require, the assumptions they make, the statistical approaches they use or even the questions they answers. They also differ at a practical level in terms of the format required for data input, the parameters to tune or select, and the format in which the results are returned. These differences render the **application of several integration tools to a multi-omics dataset** and the **comparison of their results** complex and time-consuming. -The `moiraine` package aims at alleviating these issues, by providing **a framework to easily and consistently apply different integration tools to a same multi-omics dataset**. It implements numerous visualisation and reporting functions to **facilitate the interpretation of the integration results** as well as the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, `moiraine` heavily relies on the [`targets` package](https://books.ropensci.org/targets/) for the **construction of reproducible analysis pipelines**. +The `moiraine` package aims at alleviating these issues, by providing a framework to easily and consistently apply different integration tools to a same multi-omics dataset. It implements numerous visualisation and reporting functions to facilitate the interpretation of the integration results as well as the comparison of these results across integration methods. In addition, in an effort to make these computations reproducible, `moiraine` heavily relies on the [`targets` package](https://books.ropensci.org/targets/) for the construction of reproducible analysis pipelines. ## About this manual diff --git a/renv.lock b/renv.lock index f35fee2..75474b5 100644 --- a/renv.lock +++ b/renv.lock @@ -2108,7 +2108,7 @@ "RemoteUsername": "PlantandFoodResearch", "RemoteRepo": "moiraine", "RemoteRef": "main", - "RemoteSha": "e419657211bee543eb747f23a012d6360c202374", + "RemoteSha": "a7dc1abdd789040eb814e90ac11a8ab3bbda1ba9", "Requirements": [ "Biobase", "ComplexHeatmap", @@ -2146,7 +2146,7 @@ "tidyselect", "utils" ], - "Hash": "374510e4d81eb0e4c39d632b2b65ad28" + "Hash": "fb476bd1efef272b4f6140013017b2d2" }, "munsell": { "Package": "munsell",