This vignette introduces the usage of MultiEFM for the analysis of high-dimensional multi-study multivariate data with heavy tail. In high-dimensional settings, computational efficiency and robustness are particularly crucial.
The package can be loaded with the command, and define some metric functions:
library(MultiEFM)
library(irlba)
trace_statistic_fun <- function(H, H0){
tr_fun <- function(x) sum(diag(x))
mat1 <- t(H0) %*% H %*% qr.solve(t(H) %*% H) %*% t(H) %*% H0
return(tr_fun(mat1) / tr_fun(t(H0) %*% H0))
}
trace_list_fun <- function(Hlist, H0list){
trvec <- sapply(seq_along(Hlist), function(i) trace_statistic_fun(Hlist[[i]], H0list[[i]]))
return(mean(trvec, na.rm = TRUE))
}First, we generate the simulated data with heavy tail, where the error term follows from a multivariate t-distribution with degree of freedom 2. To simulate a high-dimensional scenario while ensuring computational feasibility, we set the feature dimension to p = 300 and sample sizes to 80 and 100.
Fit the MultiEFM model using the function MultiEFM() in the R package MultiEFM. Users can use ?MultiEFM to see the details about this function. For two matrices \(\widehat D\) and \(D\), we use trace statistic to measure their similarity. The trace statistic ranges from 0 to 1, with higher values indicating better performance.
We summarized the estimation accuracy metrics for MultiEFM by calculating the trace statistics for loading and factor score matrices against the true parameters.
results <- data.frame(
Metric = c('Shared Loading (A)', 'Specific Loading (B)', 'Shared Factor (F)', 'Specific Factor (H)', 'Time (s)'),
Value = c(trace_statistic_fun(res$A, datList$A0),
trace_list_fun(res$B, datList$Blist0),
trace_list_fun(res$F, datList$Flist),
trace_list_fun(res$H, datList$Hlist),
time_use)
)
print(results)
#> Metric Value
#> 1 Shared Loading (A) 0.9979319
#> 2 Specific Loading (B) 0.9873779
#> 3 Shared Factor (F) 0.9980412
#> 4 Specific Factor (H) 0.9702950
#> 5 Time (s) 0.3900000We applied the proposed TSP method to select the number of factors. The results showed that the method has the potential to identify the true values.
hq_res <- selectFac.MultiEFM(XList, q_max=10, qs_max=5, verbose = FALSE)
message("Estimated shared q = ", hq_res$hq, " VS true q = ", q)sessionInfo()
#> R version 4.4.1 (2024-06-14 ucrt)
#> Platform: x86_64-w64-mingw32/x64
#> Running under: Windows 11 x64 (build 26200)
#>
#> Matrix products: default
#>
#>
#> locale:
#> [1] LC_COLLATE=C
#> [2] LC_CTYPE=Chinese (Simplified)_China.utf8
#> [3] LC_MONETARY=Chinese (Simplified)_China.utf8
#> [4] LC_NUMERIC=C
#> [5] LC_TIME=Chinese (Simplified)_China.utf8
#>
#> time zone: Asia/Shanghai
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] irlba_2.3.7 Matrix_1.7-0 MultiEFM_0.1.3
#>
#> loaded via a namespace (and not attached):
#> [1] digest_0.6.39 R6_2.6.1 fastmap_1.2.0 xfun_0.56
#> [5] lattice_0.22-6 cachem_1.1.0 knitr_1.51 htmltools_0.5.9
#> [9] rmarkdown_2.30 lifecycle_1.0.5 mvtnorm_1.4-1 cli_3.6.5
#> [13] grid_4.4.1 sass_0.4.10 jquerylib_0.1.4 compiler_4.4.1
#> [17] rstudioapi_0.18.0 tools_4.4.1 evaluate_1.0.5 bslib_0.10.0
#> [21] Rcpp_1.1.1-1.1 yaml_2.3.12 otel_0.2.0 jsonlite_2.0.0
#> [25] rlang_1.2.0 MASS_7.3-65