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 = "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...
## Calculating median exposure scores...
## Calculating PCA exposure scores...
## 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_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_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

See 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.1.2        MultiAssayExperiment_1.39.1
##  [3] SummarizedExperiment_1.43.0 Biobase_2.73.2             
##  [5] GenomicRanges_1.65.4        Seqinfo_1.3.2              
##  [7] IRanges_2.47.5              S4Vectors_0.51.10          
##  [9] BiocGenerics_0.59.12        generics_0.1.4             
## [11] MatrixGenerics_1.25.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.41.0           
## 
## loaded via a namespace (and not attached):
##   [1] splines_4.6.1        later_1.4.8          filelock_1.0.3      
##   [4] hardhat_1.4.3        pROC_1.19.1          rpart_4.1.27        
##   [7] factoextra_2.2.0     lifecycle_1.0.5      httr2_1.3.0         
##  [10] Rdpack_2.6.6         rstatix_1.1.0        globals_0.19.1      
##  [13] lattice_0.23-1       MASS_7.3-66          backports_1.5.1     
##  [16] magrittr_2.0.5       limma_3.99.0         Hmisc_5.3-0         
##  [19] sass_0.4.10          rmarkdown_2.32       jquerylib_0.1.4     
##  [22] yaml_2.3.12          httpuv_1.6.17        otel_0.2.0          
##  [25] doRNG_1.8.6.3        DBI_1.3.0            buildtools_1.0.0    
##  [28] RColorBrewer_1.1-3   abind_1.4-8          itertools_0.1-3     
##  [31] nnet_7.3-21          ipred_0.9-16         lava_1.9.3          
##  [34] ggrepel_0.9.8        listenv_1.1.0        fenr_1.11.3         
##  [37] maketools_1.3.2      ellipse_0.5.0        missForest_1.6.1    
##  [40] RSpectra_0.16-2      parallelly_1.48.0    codetools_0.2-20    
##  [43] DelayedArray_0.39.8  DT_0.34.0            tidyselect_1.2.1    
##  [46] farver_2.1.2         BiocFileCache_3.3.0  base64enc_0.1-6     
##  [49] jsonlite_2.0.0       caret_7.0-1          Formula_1.2-6       
##  [52] survival_3.8-12      iterators_1.0.14     foreach_1.5.2       
##  [55] tools_4.6.1          Rcpp_1.1.2           glue_1.8.1          
##  [58] rARPACK_0.11-0       BiocBaseUtils_1.15.1 prodlim_2026.03.11  
##  [61] gridExtra_2.3.1      SparseArray_1.13.4   ranger_0.18.0       
##  [64] xfun_0.61            mixOmics_6.37.0      withr_3.0.3         
##  [67] BiocManager_1.30.27  fastmap_1.2.0        digest_0.6.39       
##  [70] timechange_0.4.0     R6_2.6.1             mime_0.13           
##  [73] RGCCA_3.0.3          visdat_0.6.1         colorspace_2.1-4    
##  [76] RSQLite_3.53.3       utf8_1.2.6           ggsci_5.2.0         
##  [79] data.table_1.18.6.1  recipes_1.4.0        corpcor_1.6.10      
##  [82] class_7.3-24         httr_1.4.9           htmlwidgets_1.6.4   
##  [85] S4Arrays_1.13.2      ModelMetrics_1.2.2.2 pkgconfig_2.0.3     
##  [88] gtable_0.3.6         timeDate_4052.112    blob_1.3.0          
##  [91] S7_0.2.2             XVector_0.53.0       sys_3.4.3           
##  [94] htmltools_0.5.9      carData_3.0-6        naniar_1.1.0        
##  [97] scales_1.4.0         gower_1.0.2          knitr_1.52          
## [100] rstudioapi_0.19.0    tzdb_0.5.0           reshape2_1.4.5      
## [103] checkmate_2.3.4      nlme_3.1-171         curl_8.0.0          
## [106] cachem_1.1.0         parallel_4.6.1       foreign_0.8-91      
## [109] pillar_1.11.1        grid_4.6.1           vctrs_0.7.3         
## [112] randomForest_4.7-1.2 promises_1.5.0       ggpubr_1.0.0        
## [115] car_3.1-5            dbplyr_2.6.0         xtable_1.8-8        
## [118] Deriv_4.3.5          cluster_2.1.8.3      htmlTable_2.5.0     
## [121] evaluate_1.0.5       cli_3.6.6            compiler_4.6.1      
## [124] rngtools_1.5.2       rlang_1.3.0          crayon_1.5.3        
## [127] future.apply_1.20.2  ggsignif_0.6.4       labeling_0.4.3      
## [130] tidybulk_2.3.3       plyr_1.8.9           stringi_1.8.9       
## [133] BiocParallel_1.47.0  assertthat_0.2.1     Matrix_1.7-6        
## [136] patchwork_1.3.2      hms_1.1.4            bit64_4.8.6         
## [139] future_1.76.0        statmod_1.5.2        shiny_1.14.0        
## [142] rbibutils_2.4.1      igraph_2.3.4         broom_1.0.13        
## [145] memoise_2.0.1        bslib_0.12.0         bit_4.6.0