This script compares measured GOTO genotypes to those predicted from DNAm data to check for sample mixups.


Setup

Load packages

library(tidyverse)
library(snpStats)

Read in the GOTO genotyping files

lls_plink <- read.plink(
  bed = '../GOTO_Data/Processing/Genotypes/GOTO.bed', 
  bim = '../GOTO_Data/Processing/Genotypes/GOTO.bim', 
  fam = '../GOTO_Data/Processing/Genotypes/GOTO.fam')

OmicsPrint

Read in the results from omicsPrint (genotyping from DNA methylation values in each of the 3 tissues):

1230 SNPs from 200 fasted blood samples

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-blood.Rdata')
dnam_blood <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_blood)
## [1] 1230  200

1010 SNPs from 164 muscle samples

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-muscle.Rdata')
dnam_muscle <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_muscle)
## [1] 1010  164

1059 SNPs from 184 muscle samples

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-fat.Rdata')
dnam_fat <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_fat)
## [1] 1059  184

Key file

Read in key file sent from M.B.

key_id_gwas <- read_csv('../GOTO_Data/Processing/Genotypes/GOTO_Labnrs-EDTA_20210222.csv')
## Rows: 327 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): visit_id, type
## dbl (2): IOP2_ID, labnr
## lgl (2): intervention, fasted
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
key_id_gwas <- key_id_gwas %>% dplyr::select(IOP2_ID, labnr) %>% mutate(labnr = as.character(key_id_gwas$labnr))

Read in the targets file of the methylation data to link sample IDs to other IDs

load('../GOTO_Data/Processing/GOTO_targets-unfiltered.Rdata')
key_id_dnam <- targets
rm('targets')

Save a sample ID key for each set of samples

200 blood samples

key_blood <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
                                      IOP2_ID,
                                      HMU_ID, 
                                      DNA_labnr) %>% 
  filter(sample_ID %in% colnames(dnam_blood)) %>% 
  mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))

key_blood <- left_join(key_blood, key_id_gwas, by = 'IOP2_ID')

164 muscle samples

key_muscle <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
                                      IOP2_ID,
                                      HMU_ID, 
                                      DNA_labnr) %>% 
  filter(sample_ID %in% colnames(dnam_muscle)) %>% 
  mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))


key_muscle <- left_join(key_muscle, key_id_gwas, by = 'IOP2_ID')

184 fat samples

key_fat <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
                                      IOP2_ID,
                                      HMU_ID, 
                                      DNA_labnr) %>% 
  filter(sample_ID %in% colnames(dnam_fat)) %>% 
  mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))


key_fat <- left_join(key_fat, key_id_gwas, by = 'IOP2_ID')

Save

save(key_blood, key_muscle, key_fat, file = '../GOTO_Data/Processing/Genotypes/GOTO_keys-48.Rdata')

rm(list = c('key_id_gwas', 'key_id_dnam'))

Subsetting

Annotating CpGs to SNPs

Load in mapping file from Zhou - 667132 CpGs

cpg_snp <- read_tsv('../../../LLS/Shared_Data/Manifests/EPIC.hg38.commonsnp.tsv')
## Rows: 667132 Columns: 111
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr   (7): probeChrm, probeID, probeStrand, snpChrm, snpID, snpRef, snpAlt
## dbl (104): probeBeg, probeEnd, probeLast, snpBeg, snpEnd, GAN, GAC, GAF, AFR...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cpg_snp <- cpg_snp %>% dplyr::select(cpg=probeID, snpID)

Subset only CpGs that map to a single SNP

cpg_snp <- cpg_snp %>% group_by(cpg) %>% 
  mutate(n = n()) %>% ungroup() %>% 
  filter(n == 1) %>% dplyr::select(-n)

Merge with the beta2genotype data

600 / 1230 CpGs in blood data map to only 1 SNP

dnam_blood <- dnam_blood %>% rownames_to_column(var = 'cpg')
dnam_blood <- inner_join(cpg_snp, dnam_blood, by = 'cpg')

500 / 1010 CpGs in muscle data map to only 1 SNP

dnam_muscle <- dnam_muscle %>% rownames_to_column(var = 'cpg')
dnam_muscle <- inner_join(cpg_snp, dnam_muscle, by = 'cpg')

507 / 1059 CpGs in fat data map to only 1 SNP

dnam_fat <- dnam_fat %>% rownames_to_column(var = 'cpg')
dnam_fat <- inner_join(cpg_snp, dnam_fat, by = 'cpg')

Keep only samples with genotype data

48 individuals were not part of LLS but participated in GOTO. These individuals are the ones kept here in the beta2genotype data.

The rownames of the genotype data must be converted to labnr

rownames(lls_plink$genotypes) <- lls_plink$fam$member

First we subset the keys:

46 / 200 blood samples have genotypes in GOTO data

key_blood <- key_blood %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_blood)
## [1] 46  5

30 / 164 muscle samples have genotypes in GOTO data

key_muscle <- key_muscle %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_muscle)
## [1] 30  5

44 / 184 fat samples have genotypes in GOTO data

key_fat <- key_fat %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_fat)
## [1] 44  5

Now we can subset the beta2genotype data using these keys

Final blood data of 595 CpGs from 48 samples

dnam_blood <- dnam_blood %>% dplyr::select(cpg, snpID, key_blood$sample_ID)
dim(dnam_blood)
## [1] 595  48

Final muscle data of 488 CpGs from 32 samples

dnam_muscle <- dnam_muscle %>% dplyr::select(cpg, snpID, key_muscle$sample_ID)
dim(dnam_muscle)
## [1] 488  32

Final fat data of 508 CpGs from 46 samples

dnam_fat <- dnam_fat %>% dplyr::select(cpg, snpID, key_fat$sample_ID)
dim(dnam_fat)
## [1] 508  46

Subsetting the genotype data

Now we can use the finalized beta2genotype data to subset the genotype data, which contains data on 719665 SNPs from 48 individuals.

lls_plink <- as.data.frame(t(lls_plink$genotypes))
dim(lls_plink)
## [1] 719665     48

130 SNPs for blood found in the genotype data from 24 people

genotype_blood <- lls_plink %>% dplyr::select(key_blood$labnr) %>% 
  rownames_to_column(var = 'snpID') %>% 
  filter(snpID %in% dnam_blood$snpID) %>% arrange(snpID)
dim(genotype_blood)
## [1] 130  24

100 SNPs for muscle found in the genotype data from 16 people

genotype_muscle <- lls_plink %>% dplyr::select(key_muscle$labnr) %>% 
  rownames_to_column(var = 'snpID') %>% 
  filter(snpID %in% dnam_muscle$snpID) %>% arrange(snpID)
dim(genotype_muscle)
## [1] 100  16

108 SNPs for fat found in the genotype data from 23 people

genotype_fat <- lls_plink %>% dplyr::select(key_fat$labnr) %>% 
  rownames_to_column(var = 'snpID') %>% 
  filter(snpID %in% dnam_fat$snpID) %>% arrange(snpID)
dim(genotype_fat)
## [1] 108  23

Subsetting beta2genotype for SNPs

Finally we keep only the SNPs that overlap with genotype data

130 single SNP CpGs from 48 blood samples

dnam_blood <- dnam_blood %>% filter(snpID %in% genotype_blood$snpID) %>% arrange(snpID)
dim(dnam_blood)
## [1] 130  48

100 single SNP CpGs from 32 muscle samples

dnam_muscle <- dnam_muscle %>% filter(snpID %in% genotype_muscle$snpID) %>% arrange(snpID)
dim(dnam_muscle)
## [1] 100  32

108 single SNP CpGs from 46 fat samples

dnam_fat <- dnam_fat %>% filter(snpID %in% genotype_fat$snpID) %>% arrange(snpID)
dim(dnam_fat)
## [1] 108  46

Preprocessing

The genotype data needs to be converted to numeric

genotype_blood[, c(2:ncol(genotype_blood))] <- sapply(genotype_blood[, c(2:ncol(genotype_blood))], as.numeric)

genotype_muscle[, c(2:ncol(genotype_muscle))] <- sapply(genotype_muscle[, c(2:ncol(genotype_muscle))], as.numeric)

genotype_fat[, c(2:ncol(genotype_fat))] <- sapply(genotype_fat[, c(2:ncol(genotype_fat))], as.numeric)

Analysis

Blood

Create a data frame of assumed and actual matches for each sample

dnam <- dnam_blood
gwas <- genotype_blood
key <- key_blood

out_blood <- data.frame()

for(j in 3:ncol(dnam)){
  ind <- dnam[,j]
for(i in 2:ncol(gwas)){
  out_blood <- rbind(out_blood, 
      data.frame(sample_ID = (colnames(dnam)[j]),
    actual_match = colnames(gwas)[i], 
    assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
    n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}

out <- out_blood %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()

We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for blood.

out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
  geom_point(fill = ifelse(out$actual_match == out$assumed_match,
                           'yellow', 'grey60'),
             color = ifelse(out$n_snps == out$max, 
                            'red', 'grey60'), 
             shape = 21, size = 2) +
  theme_bw() + 
  ylab('Number of matching SNPs \n') + xlab('Sample ID') +
  ggtitle('Comparison of genotypes for all sample-person pairs') +
  theme(axis.text.x = element_text(angle = 90),
        panel.background = element_rect(fill = 'white'),
        axis.text.x.bottom = element_blank(),
        panel.grid = element_blank(),
        axis.title = element_text(size = 16),
        title = element_text(size = 14),
        axis.text.y = element_text(size = 14)) +
  scale_x_discrete(expand = c(-1.01,-1.01))

The smallest overlap is 111 SNPs and as shown above, no sample does not have the highest match with the assumed genotype

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 46 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548980012_R03C01 2185         2185             111   111
##  2 203548980012_R04C01 2185         2185             111   111
##  3 203548970015_R05C01 2261         2261             112   112
##  4 203548970015_R06C01 2261         2261             112   112
##  5 203548870105_R03C01 2272         2272             112   112
##  6 203548870105_R04C01 2272         2272             112   112
##  7 203548970098_R03C01 2266         2266             112   112
##  8 203548970098_R04C01 2266         2266             112   112
##  9 203548870020_R01C01 2191         2191             113   113
## 10 203548870020_R02C01 2191         2191             113   113
## # ℹ 36 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## #   n_snps <int>, max <int>

Save

save(out, key_blood, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-blood.Rdata')

Muscle

Create a data frame of assumed and actual matches for each sample

dnam <- dnam_muscle
gwas <- genotype_muscle
key <- key_muscle

out_muscle <- data.frame()

for(j in 3:ncol(dnam)){
  ind <- dnam[,j]
for(i in 2:ncol(gwas)){
  out_muscle <- rbind(out_muscle, 
  data.frame(sample_ID = (colnames(dnam)[j]),
  actual_match = colnames(gwas)[i], 
  assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
  n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}

out <- out_muscle %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()

We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for muscle.

out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
  geom_point(fill = ifelse(out$actual_match == out$assumed_match,
                           'yellow', 'grey60'),
             color = ifelse(out$n_snps == out$max, 
                            'red', 'grey60'), 
             shape = 21, size = 2) +
  theme_bw() + 
  ylab('Number of matching SNPs \n') + xlab('Sample ID') +
  ggtitle('Comparison of genotypes for all sample-person pairs') +
  theme(axis.text.x = element_text(angle = 90),
        panel.background = element_rect(fill = 'white'),
        axis.text.x.bottom = element_blank(),
        panel.grid = element_blank(),
        axis.title = element_text(size = 16),
        title = element_text(size = 14),
        axis.text.y = element_text(size = 14)) +
  scale_x_discrete(expand = c(-1.01,-1.01))

The smallest overlap is 85 SNPs and there are no mismatches.

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 30 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548970025_R01C01 2272         2272              85    85
##  2 203548970025_R02C01 2272         2272              85    85
##  3 203548970014_R03C01 2214         2214              86    86
##  4 203548970014_R04C01 2214         2214              86    86
##  5 203527980075_R03C01 2185         2185              87    87
##  6 203527980075_R04C01 2185         2185              87    87
##  7 203548970062_R05C01 2188         2188              87    87
##  8 203548970062_R06C01 2188         2188              87    87
##  9 203527980082_R06C01 2168         2168              88    88
## 10 203548970102_R02C01 2251         2251              88    88
## # ℹ 20 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## #   n_snps <int>, max <int>

Save

save(out, key_muscle, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-muscle.Rdata')

Fat

Create a data frame of assumed and actual matches for each sample

dnam <- dnam_fat
gwas <- genotype_fat
key <- key_fat

out_fat <- data.frame()

for(j in 3:ncol(dnam)){
  ind <- dnam[,j]
for(i in 2:ncol(gwas)){
  out_fat <- rbind(out_fat, 
  data.frame(sample_ID = (colnames(dnam)[j]),
  actual_match = colnames(gwas)[i], 
  assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
  n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}

out <- out_fat %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()

We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for fat

out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
  geom_point(fill = ifelse(out$actual_match == out$assumed_match,
                           'yellow', 'grey60'),
             color = ifelse(out$n_snps == out$max, 
                            'red', 'grey60'), 
             shape = 21, size = 2) +
  theme_bw() + 
  ylab('Number of matching SNPs \n') + xlab('Sample ID') +
  ggtitle('Comparison of genotypes for all sample-person pairs') +
  theme(axis.text.x = element_text(angle = 90),
        panel.background = element_rect(fill = 'white'),
        axis.text.x.bottom = element_blank(),
        panel.grid = element_blank(),
        axis.title = element_text(size = 16),
        title = element_text(size = 14),
        axis.text.y = element_text(size = 14)) +
  scale_x_discrete(expand = c(-1.01,-1.01))

The smallest overlap is 88 SNPs and there are no mismatches.

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 44 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548970042_R08C01 2141         2141              88    88
##  2 203527980024_R06C01 2272         2272              92    92
##  3 203548970042_R07C01 2141         2141              92    92
##  4 203548870042_R01C01 2185         2185              92    92
##  5 203548870042_R02C01 2185         2185              92    92
##  6 203548970029_R01C01 2202         2202              92    92
##  7 203548970029_R02C01 2202         2202              92    92
##  8 203548970079_R03C01 2261         2261              92    92
##  9 203548970079_R04C01 2261         2261              92    92
## 10 203527980024_R05C01 2272         2272              93    93
## # ℹ 34 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## #   n_snps <int>, max <int>

Save

save(out, key_fat, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-fat.Rdata')

Session Info

sessionInfo()
## R version 4.2.2 (2022-10-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Rocky Linux 8.10 (Green Obsidian)
## 
## Matrix products: default
## BLAS/LAPACK: /usr/lib64/libopenblas-r0.3.15.so
## 
## 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       
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] snpStats_1.44.0                           
##  [2] survival_3.5-5                            
##  [3] ggrepel_0.9.1                             
##  [4] ggfortify_0.4.14                          
##  [5] irlba_2.3.5.1                             
##  [6] Matrix_1.5-4.1                            
##  [7] omicsPrint_1.14.0                         
##  [8] MASS_7.3-60                               
##  [9] DNAmArray_2.0.0                           
## [10] pls_2.8-2                                 
## [11] FDb.InfiniumMethylation.hg19_2.2.0        
## [12] org.Hs.eg.db_3.14.0                       
## [13] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2   
## [14] GenomicFeatures_1.46.5                    
## [15] AnnotationDbi_1.56.2                      
## [16] IlluminaHumanMethylationEPICmanifest_0.3.0
## [17] minfi_1.40.0                              
## [18] bumphunter_1.36.0                         
## [19] locfit_1.5-9.8                            
## [20] iterators_1.0.14                          
## [21] foreach_1.5.2                             
## [22] Biostrings_2.62.0                         
## [23] XVector_0.34.0                            
## [24] SummarizedExperiment_1.24.0               
## [25] Biobase_2.58.0                            
## [26] MatrixGenerics_1.10.0                     
## [27] matrixStats_1.0.0                         
## [28] GenomicRanges_1.46.1                      
## [29] GenomeInfoDb_1.34.9                       
## [30] IRanges_2.32.0                            
## [31] S4Vectors_0.36.2                          
## [32] BiocGenerics_0.44.0                       
## [33] BiocParallel_1.32.6                       
## [34] MethylAid_1.28.0                          
## [35] forcats_0.5.2                             
## [36] stringr_1.5.0                             
## [37] dplyr_1.1.3                               
## [38] purrr_0.3.4                               
## [39] readr_2.1.2                               
## [40] tidyr_1.2.1                               
## [41] tibble_3.2.1                              
## [42] ggplot2_3.4.3                             
## [43] tidyverse_1.3.2                           
## [44] rmarkdown_2.16                            
## 
## loaded via a namespace (and not attached):
##   [1] utf8_1.2.3                  tidyselect_1.2.0           
##   [3] RSQLite_2.2.17              grid_4.2.2                 
##   [5] munsell_0.5.0               codetools_0.2-19           
##   [7] preprocessCore_1.60.2       withr_2.5.0                
##   [9] colorspace_2.1-0            filelock_1.0.2             
##  [11] highr_0.10                  knitr_1.43                 
##  [13] rstudioapi_0.14             labeling_0.4.2             
##  [15] GenomeInfoDbData_1.2.9      farver_2.1.1               
##  [17] bit64_4.0.5                 rhdf5_2.42.1               
##  [19] vctrs_0.6.3                 generics_0.1.3             
##  [21] xfun_0.39                   timechange_0.2.0           
##  [23] BiocFileCache_2.2.1         R6_2.5.1                   
##  [25] illuminaio_0.40.0           bitops_1.0-7               
##  [27] rhdf5filters_1.10.1         cachem_1.0.8               
##  [29] reshape_0.8.9               DelayedArray_0.24.0        
##  [31] assertthat_0.2.1            vroom_1.5.7                
##  [33] promises_1.2.0.1            BiocIO_1.8.0               
##  [35] scales_1.2.1                googlesheets4_1.0.1        
##  [37] gtable_0.3.3                rlang_1.1.1                
##  [39] genefilter_1.76.0           splines_4.2.2              
##  [41] rtracklayer_1.54.0          gargle_1.5.0               
##  [43] GEOquery_2.62.2             htm2txt_2.2.2              
##  [45] hexbin_1.28.3               broom_1.0.1                
##  [47] yaml_2.3.7                  reshape2_1.4.4             
##  [49] RaggedExperiment_1.18.0     modelr_0.1.9               
##  [51] backports_1.4.1             httpuv_1.6.11              
##  [53] tools_4.2.2                 gridBase_0.4-7             
##  [55] nor1mix_1.3-0               ellipsis_0.3.2             
##  [57] jquerylib_0.1.4             RColorBrewer_1.1-3         
##  [59] siggenes_1.68.0             MultiAssayExperiment_1.20.0
##  [61] Rcpp_1.0.10                 plyr_1.8.8                 
##  [63] sparseMatrixStats_1.10.0    progress_1.2.2             
##  [65] zlibbioc_1.44.0             RCurl_1.98-1.12            
##  [67] prettyunits_1.1.1           openssl_2.0.6              
##  [69] haven_2.5.1                 fs_1.6.2                   
##  [71] magrittr_2.0.3              data.table_1.14.8          
##  [73] reprex_2.0.2                googledrive_2.0.0          
##  [75] hms_1.1.2                   mime_0.12                  
##  [77] evaluate_0.21               xtable_1.8-4               
##  [79] XML_3.99-0.14               mclust_6.0.0               
##  [81] readxl_1.4.1                gridExtra_2.3              
##  [83] compiler_4.2.2              biomaRt_2.50.3             
##  [85] crayon_1.5.2                htmltools_0.5.5            
##  [87] later_1.3.1                 tzdb_0.4.0                 
##  [89] lubridate_1.9.2             DBI_1.1.3                  
##  [91] dbplyr_2.2.1                rappdirs_0.3.3             
##  [93] cli_3.6.1                   quadprog_1.5-8             
##  [95] pkgconfig_2.0.3             GenomicAlignments_1.30.0   
##  [97] xml2_1.3.4                  annotate_1.72.0            
##  [99] bslib_0.5.0                 rngtools_1.5.2             
## [101] multtest_2.50.0             beanplot_1.3.1             
## [103] rvest_1.0.3                 doRNG_1.8.6                
## [105] scrime_1.3.5                digest_0.6.31              
## [107] base64_2.0.1                cellranger_1.1.0           
## [109] DelayedMatrixStats_1.16.0   restfulr_0.0.15            
## [111] curl_5.0.1                  shiny_1.7.2                
## [113] Rsamtools_2.10.0            rjson_0.2.21               
## [115] lifecycle_1.0.3             nlme_3.1-162               
## [117] jsonlite_1.8.5              Rhdf5lib_1.20.0            
## [119] askpass_1.1                 limma_3.54.2               
## [121] fansi_1.0.4                 pillar_1.9.0               
## [123] lattice_0.21-8              KEGGREST_1.34.0            
## [125] fastmap_1.1.1               httr_1.4.6                 
## [127] glue_1.6.2                  png_0.1-8                  
## [129] bit_4.0.5                   stringi_1.7.12             
## [131] sass_0.4.6                  HDF5Array_1.22.1           
## [133] blob_1.2.4                  memoise_2.0.1

Clear

rm(list=ls())