Y-h. Taguchi1*
1Department of Physics, Chuo University, Tokyo 112-8551, Japan
#library(TDbasedUFEadv)
Since TDbasedUFEadv is an advanced package from TDbasedUFE (Taguchi 2023), please master the contents in TDbasedUFE prior to the trial of this package.
Since the publication of the book (Taguchi 2020) describing the methodology, I have published numerous papers using this method. In spite of that, very limited number of researcher used this method, possibly because of unfamiliarity with the mathematical concepts used in this methodology, tensors. Thus I decided to develop the packages by which users can use the methods without detailed knowledge about the tensor.
The main purpose of this package is to select features (typically genes) based upon provided omics data sets. In this sense, apparently the functionality of this package is similar to DESeq2 or limma, which have functionality that can identify differentially expressed genes. In contrast to those supervised methods, the present method is unsupervised one, which provides users what kind of profiles are observed over samples, and users are advised to select one of favorite features by which features are selected. In addition to this, the present method is suitable to small number of samples associated with large number of features. Since this situation is very common in genomics, the present method is supposed to be suitable to be applied to genomics, although it does not look liked the methods very specific to genomics science. Actually, we have published the number of papers using the methods implemented in the present package. I hope that one can make use of this package for his/her own researches.
Suppose we have two omics profiles \[ x_{ij} \in \mathbb{R}^{N \times M} \\ x_{ik} \in \mathbb{R}^{N \times K} \] that represent values of \(i\)th feature of \(j\)th and \(k\)th objects, respectively (i.r., these two profiles share the features). In this case, we generate a tensor, \(x_{ijk}\), by the product of two profiles as \[ x_{ijk} = x_{ij}x_{ik} \in \mathbb{R}^{N \times M \times K} \]
and HOSVD was applied to \(x_{ijk}\) to get \[ x_{ijk} = \sum_{\ell_1} \sum_{\ell_2} \sum_{ell_3} G(\ell_1 \ell_2 \ell_3) u_{\ell_1 i} u_{\ell_2 j} u_{\ell_3 k} \] After that we can follow the standard procedure to select features \(i\)s associated with the desired properties represented by the selected singular value vectors, \(u_{\ell_2 j}\) and \(u_{\ell_3 k}\), attributed to objects, \(j\)s and \(k\)s.
In the above, we dealt with full tensor. It is often difficult to treat full tensor, since it is as large as \(N \times M times K\). In this case, we can take the alternative approach. In order that we define reduced matrix with taking partial summation \[ x_{jk} = \sum_i x_{ijk} \] and apply SVD to \(x_{jk}\) as \[ x_{jk} = \sum_\ell \lambda_\ell u_{\ell j} v_{\ell k} \] and singular value vectors attributed to samples as \[ u^{(j)}_{\ell i} = \sum_j u_{\ell j} x_{ij} \\ u^{(k)}_{\ell i} = \sum_k v_{\ell k} x_{ik} \] In this case, singular value vectors are attributed separately to features associated with objects \(j\) and \(k\), respectively.
The feature selection can be done using these singular value vectors associated with selected singular value vectors attributed to samples, \(j\) and \(k\).
In the case where not features but samples are shared between two omics data, we can do something similar. \[ x_{ij} \in \mathbb{R}^{N \times M} \\ x_{kj} \in \mathbb{R}^{K \times M} \]
In this case, we generate a tensor, \(x_{ijk}\), by the product of two profiles as \[ x_{ijk} = x_{ij}x_{kj} \in \mathbb{R}^{N \times M \times K} \]
and HOSVD was applied to \(x_{ijk}\) to get \[ x_{ijk} = \sum_{\ell_1} \sum_{\ell_2} \sum_{ell_3} G(\ell_1 \ell_2 \ell_3) u_{\ell_1 i} u_{\ell_2 j} u_{\ell_3 k} \] After that we can follow the standard procedure to select features \(i\)s and \(k\)s associated with the desired properties represented by the selected singular value vectors, \(u_{\ell_2 j}\), attributed to objects, \(j\)s.
In the above, we dealt with full tensor. It is often difficult to treat full tensor, since it is as large as \(N \times M times K\). In this case, we can take the alternative approach. In order that we define reduced matrix with taking partial summation \[ x_{ik} = \sum_j x_{ijk} \] and apply SVD to \(x_{jk}\) as \[ x_{ik} = \sum_\ell \lambda_\ell u_{\ell i} v_{\ell k} \] \(i\)s and \(k\)s are selected with \(u_{\ell i}\) and \(v_{\ell k}\), respectively. Singular value vectors attributed to samples can be computed as \[ u^{(i)}_{\ell j} = \sum_i u_{\ell i} x_{ij} \\ u^{(k)}_{\ell j} = \sum_k v_{\ell k} x_{kj} \]
Here we would like to propose an alternative strategy to integrate multiple tensors using projection with SVD.
Suppose we have multiomics data as \[ x_{ijk} \in \mathbb{R}^{N_k \times M \times K} \] for \(i\)th feature of \(j\)th sample at \(k\)th omics data.
In order to bundle them into a tensor, we applied SVD to them as \[ x_{ijk} = \sum_{\ell} \lambda^{(k)}_\ell u_{\ell i_k} v^{(k)}_{\ell j} \]
Then apply HOSVD to \(v^{(k)}_{\ell j}\) as \[ v^{(k)}_{\ell j} = \sum_{\ell_1} \sum_{\ell_2} \sum_{\ell_3} G(\ell_1 \ell_2 \ell_3) u_{\ell_1 \ell } u_{\ell_2 j} u_{\ell_3 k} \] After identifying the \(u_{\ell_2j}\) and \(u_{\ell_3 k}\) of interest, we can compute \(u_{\ell i_k}\) as \[ u_{\ell_2 i_k} = \sum_j u_{\ell_2 j} x_{i_k j k} \] Then \(i_k\) can be selected as usual.
Suppose we have multiple sets of samples as \[ x_{ij_k k} \in \mathbb{R}^{N \times M_k \times K} \]
In order to bundle them into a tensor, we apply SVD to \(x_{i j_k k}\) as \[ x_{i j_k k} = \sum_\ell \lambda^{(k)}_\ell u^{(k)}_{\ell i} u_{\ell j_k} \] HOSVD is applied to \(u^{(k)}_{\ell i}\) as \[ u^{(k)}_{\ell i} = \sum_{\ell_1} \sum_{\ell_2} \sum_{\ell_3} G(\ell_1 \ell_2 \ell_3) u_{\ell_1 \ell} u_{\ell_2 i} u_{\ell_3 k} \] \(u_{\ell_2 j_k}\) is generated as \[ u_{\ell_2 j_k} = \sum_i u_{\ell_2 i}x_{i j_k k} \]
After identifying \(u_{\ell_2 j_k}\)s of interest, we select \(i\)s using \(u_{\ell_2 i}\).
sessionInfo()
#> R Under development (unstable) (2024-10-21 r87258)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#>
#> Matrix products: default
#> BLAS: /home/biocbuild/bbs-3.21-bioc/R/lib/libRblas.so
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_GB LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: America/New_York
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] STRINGdb_2.19.0 enrichR_3.2
#> [3] RTCGA.clinical_20151101.35.0 RTCGA.rnaseq_20151101.35.0
#> [5] RTCGA_1.37.0 enrichplot_1.27.0
#> [7] DOSE_4.1.0 TDbasedUFEadv_1.7.0
#> [9] TDbasedUFE_1.7.0 BiocStyle_2.35.0
#>
#> loaded via a namespace (and not attached):
#> [1] rTensor_1.4.8 splines_4.5.0 later_1.3.2
#> [4] bitops_1.0-9 ggplotify_0.1.2 tibble_3.2.1
#> [7] R.oo_1.26.0 XML_3.99-0.17 lifecycle_1.0.4
#> [10] rstatix_0.7.2 processx_3.8.4 lattice_0.22-6
#> [13] backports_1.5.0 magrittr_2.0.3 sass_0.4.9
#> [16] rmarkdown_2.28 jquerylib_0.1.4 yaml_2.3.10
#> [19] plotrix_3.8-4 ggtangle_0.0.3 httpuv_1.6.15
#> [22] cowplot_1.1.3 chromote_0.3.1 DBI_1.2.3
#> [25] RColorBrewer_1.1-3 abind_1.4-8 MOFAdata_1.21.0
#> [28] zlibbioc_1.53.0 rvest_1.0.4 GenomicRanges_1.59.0
#> [31] purrr_1.0.2 R.utils_2.12.3 BiocGenerics_0.53.0
#> [34] RCurl_1.98-1.16 hash_2.2.6.3 yulab.utils_0.1.7
#> [37] WriteXLS_6.7.0 GenomeInfoDbData_1.2.13 IRanges_2.41.0
#> [40] KMsurv_0.1-5 S4Vectors_0.45.0 ggrepel_0.9.6
#> [43] tidytree_0.4.6 proto_1.0.0 codetools_0.2-20
#> [46] xml2_1.3.6 tximportData_1.33.0 tidyselect_1.2.1
#> [49] aplot_0.2.3 UCSC.utils_1.3.0 farver_2.1.2
#> [52] viridis_0.6.5 stats4_4.5.0 jsonlite_1.8.9
#> [55] Formula_1.2-5 survival_3.7-0 tools_4.5.0
#> [58] chron_2.3-61 treeio_1.31.0 Rcpp_1.0.13
#> [61] glue_1.8.0 gridExtra_2.3 xfun_0.48
#> [64] qvalue_2.39.0 ggthemes_5.1.0 GenomeInfoDb_1.43.0
#> [67] websocket_1.4.2 dplyr_1.1.4 withr_3.0.2
#> [70] BiocManager_1.30.25 fastmap_1.2.0 fansi_1.0.6
#> [73] caTools_1.18.3 digest_0.6.37 R6_2.5.1
#> [76] mime_0.12 gridGraphics_0.5-1 colorspace_2.1-1
#> [79] GO.db_3.20.0 gtools_3.9.5 RSQLite_2.3.7
#> [82] R.methodsS3_1.8.2 utf8_1.2.4 tidyr_1.3.1
#> [85] generics_0.1.3 data.table_1.16.2 httr_1.4.7
#> [88] sqldf_0.4-11 pkgconfig_2.0.3 gtable_0.3.6
#> [91] blob_1.2.4 XVector_0.47.0 survMisc_0.5.6
#> [94] htmltools_0.5.8.1 carData_3.0-5 bookdown_0.41
#> [97] fgsea_1.33.0 scales_1.3.0 Biobase_2.67.0
#> [100] png_0.1-8 ggfun_0.1.7 knitr_1.48
#> [103] km.ci_0.5-6 tzdb_0.4.0 reshape2_1.4.4
#> [106] rjson_0.2.23 nlme_3.1-166 curl_5.2.3
#> [109] cachem_1.1.0 zoo_1.8-12 stringr_1.5.1
#> [112] KernSmooth_2.23-24 parallel_4.5.0 AnnotationDbi_1.69.0
#> [115] pillar_1.9.0 grid_4.5.0 vctrs_0.6.5
#> [118] gplots_3.2.0 promises_1.3.0 ggpubr_0.6.0
#> [121] car_3.1-3 xtable_1.8-4 tximport_1.35.0
#> [124] evaluate_1.0.1 readr_2.1.5 gsubfn_0.7
#> [127] cli_3.6.3 compiler_4.5.0 rlang_1.1.4
#> [130] crayon_1.5.3 ggsignif_0.6.4 labeling_0.4.3
#> [133] survminer_0.4.9 ps_1.8.1 plyr_1.8.9
#> [136] fs_1.6.4 stringi_1.8.4 viridisLite_0.4.2
#> [139] BiocParallel_1.41.0 assertthat_0.2.1 munsell_0.5.1
#> [142] Biostrings_2.75.0 lazyeval_0.2.2 GOSemSim_2.33.0
#> [145] Matrix_1.7-1 hms_1.1.3 patchwork_1.3.0
#> [148] bit64_4.5.2 ggplot2_3.5.1 KEGGREST_1.47.0
#> [151] shiny_1.9.1 highr_0.11 igraph_2.1.1
#> [154] broom_1.0.7 memoise_2.0.1 bslib_0.8.0
#> [157] ggtree_3.15.0 fastmatch_1.1-4 bit_4.5.0
#> [160] ape_5.8