Exposome Scores

Load Data and Libraries

# Load Libraries
library(tidyverse)
library(tidyexposomics)

We will start off with our example dataset pulled from the ISGlobal Exposome Data Challenge 2021 (Maitre et al., 2022).

# Load example data
data("tidyexposomics_example")

# Create exposomic set object
expom <- create_exposomicset(
    codebook = tidyexposomics_example$annotated_cb,
    exposure = tidyexposomics_example$meta,
    omics = list(
        "Gene Expression" = tidyexposomics_example$exp_filt,
        "Methylation" = tidyexposomics_example$methyl_filt
    ),
    row_data = list(
        "Gene Expression" = tidyexposomics_example$exp_fdata,
        "Methylation" = tidyexposomics_example$methyl_fdata
    )
)
## Ensuring all omics datasets are matrices with column names.
## Creating SummarizedExperiment objects.
## Creating MultiAssayExperiment object.
## MultiAssayExperiment created successfully.

We will focus on a few exposure variable categories.

# Grab exposure variables
exp_vars <- tidyexposomics_example$annotated_cb |>
    filter(category %in% c(
        "aerosol",
        "main group molecular entity",
        "polyatomic entity"
    )) |>
    pull(variable) |>
    as.character()

Quality Control


As in the main vignette, we will impute exposure data using missforest.

# Impute missing values
expom <- run_impute_missing(
    exposomicset = expom,
    exposure_impute_method = "missforest",
    exposure_cols = exp_vars
)
## Imputing exposure data using method: missforest

And we will transform our exposure data to ensure it is more normally distributed using the boxcox_best method.

# Transform variables
expom <- transform_exposure(
    exposomicset = expom,
    transform_method = "boxcox_best",
    exposure_cols = exp_vars
)
## Applying the boxcox_best transformation.

Exposome Scores


We can calculate exposome scores, which are a summary measure of exposure. The run_exposome_score function is used to calculate the exposome score. The exposure_cols argument is used to set the columns to use for the exposome score. The score_type argument is used to set the type of score to calculate. Here we could use:

  • median: Calculates the median of the exposure variables.

  • mean: Calculates the mean of the exposure variables.

  • sum: Calculates the sum of the exposure variables.

  • pca: Calculates the first principal component of the exposure variables.

  • irt: Uses Item Response Theory to calculate the exposome score.

  • quantile: Calculates the quantile of the exposure variables.

  • var: Calculates the variance of the exposure variables.

The score_column_name argument is used to set the name of the column to store the exposome score in. Here we will define a score for aerosols using a variety of different methods and demonstrate their use in association with asthma status.

# determine which aerosol variables to use
aerosols <- c("h_pm25_ratio_preg_None", "h_pm10_ratio_preg_None")

# Create exposome scores
expom <- expom |>
    run_exposome_score(
        exposure_cols = aerosols,
        score_type = "median",
        score_column_name = "exposome_median_score"
    ) |>
    run_exposome_score(
        exposure_cols = aerosols,
        score_type = "pca",
        score_column_name = "exposome_pca_score"
    ) |>
    run_exposome_score(
        exposure_cols = aerosols,
        score_type = "irt",
        score_column_name = "exposome_irt_score"
    ) |>
    run_exposome_score(
        exposure_cols = aerosols,
        score_type = "quantile",
        score_column_name = "exposome_quantile_score"
    ) |>
    run_exposome_score(
        exposure_cols = aerosols,
        score_type = "var",
        score_column_name = "exposome_var_score"
    )
## Extracting exposure data...
## Extracting exposure data...
## Extracting exposure data...
## Extracting exposure data...
## Extracting exposure data...
## Calculating median exposure scores...
## Calculating PCA exposure scores...
## Calculating IRT exposure scores...
## Warning: EM cycles terminated after 500 iterations.
## Calculating quantile exposure scores...
## Calculating variance exposure scores...

We can then associate these exposome scores with asthma status using the run_association function, just like we did before. However, this time we specify our feature_set to be the exposome scores we just calculated.

# Associate exposome scores with outcome
expom <- run_association(
    exposomicset = expom,
    outcome = "hs_asthma",
    source = "exposures",
    feature_set = c(
        "exposome_median_score",
        "exposome_pca_score",
        "exposome_irt_score",
        "exposome_quantile_score",
        "exposome_var_score"
    ),
    action = "add",
    family = "binomial"
)
## Running GLMs.
# Plot the association forest plot
plot_association(
    exposomicset = expom,
    source = "exposures",
    terms = c(
        "exposome_median_score",
        "exposome_pca_score",
        "exposome_irt_score",
        "exposome_quantile_score",
        "exposome_var_score"
    ),
    filter_col = "p.value",
    filter_thresh = 0.05,
    r2_col = "r2"
)
Associations of aerosol exposome scores with asthma status. The variance-based score has the strongest association with asthma status.

Associations of aerosol exposome scores with asthma status. The variance-based score has the strongest association with asthma status.

Session Info

sessionInfo()
## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 26.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [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: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] tidyexposomics_1.0.0        MultiAssayExperiment_1.38.0
##  [3] SummarizedExperiment_1.42.0 Biobase_2.72.0             
##  [5] GenomicRanges_1.64.0        Seqinfo_1.2.0              
##  [7] IRanges_2.46.0              S4Vectors_0.50.3           
##  [9] BiocGenerics_0.58.1         generics_0.1.4             
## [11] MatrixGenerics_1.24.0       matrixStats_1.5.0          
## [13] lubridate_1.9.5             forcats_1.0.1              
## [15] stringr_1.6.0               dplyr_1.2.1                
## [17] purrr_1.2.2                 readr_2.2.0                
## [19] tidyr_1.3.2                 tibble_3.3.1               
## [21] ggplot2_4.0.3               tidyverse_2.0.0            
## [23] BiocStyle_2.40.0           
## 
## loaded via a namespace (and not attached):
##   [1] naniar_1.1.0         httr_1.4.9           RColorBrewer_1.1-3  
##   [4] ggsci_5.2.0          tools_4.6.1          doRNG_1.8.6.3       
##   [7] backports_1.5.1      utf8_1.2.6           R6_2.6.1            
##  [10] DT_0.34.0            vegan_2.7-6          mgcv_1.9-4          
##  [13] permute_0.9-10       withr_3.0.3          gridExtra_2.3.1     
##  [16] progressr_1.0.0      cli_3.6.6            factoextra_2.2.0    
##  [19] RGCCA_3.0.3          labeling_0.4.3       sass_0.4.10         
##  [22] S7_0.2.2             randomForest_4.7-1.2 proxy_0.4-29        
##  [25] pbapply_1.7-5        foreign_0.8-91       R.utils_2.13.0      
##  [28] parallelly_1.48.0    sessioninfo_1.2.4    itertools_0.1-3     
##  [31] limma_3.68.5         rstudioapi_0.19.0    RSQLite_3.53.3      
##  [34] car_3.1-5            Matrix_1.7-6         clipr_0.8.1         
##  [37] abind_1.4-8          R.methodsS3_1.8.2    lifecycle_1.0.5     
##  [40] yaml_2.3.12          carData_3.0-6        recipes_1.4.0       
##  [43] SparseArray_1.12.3   BiocFileCache_3.2.0  grid_4.6.1          
##  [46] blob_1.3.0           promises_1.5.0       crayon_1.5.3        
##  [49] lattice_0.23-1       sys_3.4.3            maketools_1.3.2     
##  [52] pillar_1.11.1        knitr_1.52           corpcor_1.6.10      
##  [55] future.apply_1.20.2  mixOmics_6.36.0      codetools_0.2-20    
##  [58] glue_1.8.1           beepr_2.0            data.table_1.18.6.1 
##  [61] vctrs_0.7.3          Rdpack_2.6.6         testthat_3.3.2      
##  [64] gtable_0.3.6         assertthat_0.2.1     cachem_1.1.0        
##  [67] gower_1.0.2          xfun_0.61            rbibutils_2.4.1     
##  [70] S4Arrays_1.12.1      mime_0.13            prodlim_2026.03.11  
##  [73] survival_3.8-12      timeDate_4052.112    audio_0.1-12        
##  [76] iterators_1.0.14     hardhat_1.4.3        lava_1.9.3          
##  [79] statmod_1.5.2        ipred_0.9-16         nlme_3.1-171        
##  [82] fenr_1.10.3          bit64_4.8.6          filelock_1.0.3      
##  [85] splines2_0.5.4       bslib_0.12.0         Deriv_4.3.5         
##  [88] otel_0.2.0           rpart_4.1.27         colorspace_2.1-3    
##  [91] DBI_1.3.0            Hmisc_5.3-0          nnet_7.3-21         
##  [94] tidyselect_1.2.1     bit_4.6.0            compiler_4.6.1      
##  [97] curl_8.0.0           httr2_1.3.0          htmlTable_2.5.0     
## [100] DelayedArray_0.38.2  stringfish_0.19.2    checkmate_2.3.4     
## [103] scales_1.4.0         digest_0.6.39        rmarkdown_2.32      
## [106] XVector_0.52.0       htmltools_0.5.9      pkgconfig_2.0.3     
## [109] base64enc_0.1-6      SimDesign_2.27       dbplyr_2.6.0        
## [112] fastmap_1.2.0        rlang_1.3.0          htmlwidgets_1.6.4   
## [115] shiny_1.14.0         farver_2.1.2         jquerylib_0.1.4     
## [118] jsonlite_2.0.0       BiocParallel_1.46.0  dcurver_0.9.3       
## [121] ModelMetrics_1.2.2.2 R.oo_1.27.1          magrittr_2.0.5      
## [124] Formula_1.2-6        patchwork_1.3.2      Rcpp_1.1.2          
## [127] visdat_0.6.1         stringi_1.8.9        pROC_1.19.1         
## [130] brio_1.1.5           MASS_7.3-66          plyr_1.8.9          
## [133] parallel_4.6.1       listenv_1.0.0        ggrepel_0.9.8       
## [136] splines_4.6.1        hms_1.1.4            igraph_2.3.4        
## [139] ggpubr_1.0.0         ranger_0.18.0        ggsignif_0.6.4      
## [142] rngtools_1.5.2       buildtools_1.0.0     reshape2_1.4.5      
## [145] qs2_0.3.1            GPArotation_2026.8-2 tidybulk_2.2.0      
## [148] evaluate_1.0.5       RcppParallel_6.2.1   BiocManager_1.30.27 
## [151] tzdb_0.5.0           foreach_1.5.2        missForest_1.6.1    
## [154] httpuv_1.6.17        future_1.76.0        mirt_1.47           
## [157] BiocBaseUtils_1.14.2 broom_1.0.13         xtable_1.8-8        
## [160] e1071_1.7-17         RSpectra_0.16-2      rstatix_1.1.0       
## [163] later_1.4.8          class_7.3-24         rARPACK_0.11-0      
## [166] memoise_2.0.1        ellipse_0.5.0        cluster_2.1.8.3     
## [169] timechange_0.4.0     globals_0.19.1       caret_7.0-1