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


Setup

Load packages

library(tidyverse)
library(snpStats)

Read in the LLS genotyping files

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

OmicsPrint

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

Blood

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-blood.Rdata')
dnam_blood <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))

print(paste0("We have data on ",
             nrow(dnam_blood), " SNPs from ",
             ncol(dnam_blood), " fasted blood samples"))
## [1] "We have data on 1230 SNPs from 200 fasted blood samples"

Muscle

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-muscle.Rdata')
dnam_muscle <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))

print(paste0("We have data on ",
             nrow(dnam_muscle), " SNPs from ",
             ncol(dnam_muscle), " skeletal muscle samples"))
## [1] "We have data on 1010 SNPs from 164 skeletal muscle samples"

Fat

load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-fat.Rdata')
dnam_fat <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))

print(paste0("We have data on ",
             nrow(dnam_fat), " SNPs from ",
             ncol(dnam_fat), " adipose tissue samples"))
## [1] "We have data on 1059 SNPs from 184 adipose tissue samples"

Key file

Read in key file sent from M.B.

key_id_gwas <- read_csv('../GOTO_Data/Processing/Genotypes/GOTO_GWASid-IOP2id_20210211.csv')
## Rows: 164 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): GWASnr
## dbl (2): GOT, IOP2_ID
## 
## ℹ 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.

GWASnr needs formatting as in the genotype data there is no LLS prefix and only a single underscore

key_id_gwas$GWASnr <- sub('LLS', '', sub('__', '_', key_id_gwas$GWASnr))

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_data-keys.Rdata')

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

Subsetting

Annotating CpGs to SNPs

Load in mapping file from Zhou

cpg_snp <- read_tsv(
  "/exports/molepi/users/ljsinke/LLS/Shared_Data/Manifests/EPIC.hg38.commonsnp.tsv")
dim(cpg_snp)
## [1] 667132    111

Save only CpGs that map to a single SNP

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

Merge with the beta2genotype data

595 CpGs in blood data map to only 1 SNP

dnam_blood <- dnam_blood %>% rownames_to_column(var = 'cpg')
dim(dnam_blood)
## [1] 1230  201
dnam_blood <- inner_join(cpg_snp, dnam_blood, by = 'cpg')
dim(dnam_blood)
## [1] 595 202

488 CpGs in muscle data map to only 1 SNP

dnam_muscle <- dnam_muscle %>% rownames_to_column(var = 'cpg')
dim(dnam_muscle)
## [1] 1010  165
dnam_muscle <- inner_join(cpg_snp, dnam_muscle, by = 'cpg')
dim(dnam_muscle)
## [1] 488 166

508 CpGs in fat data map to only 1 SNP

dnam_fat <- dnam_fat %>% rownames_to_column(var = 'cpg')
dim(dnam_fat)
## [1] 1059  185
dnam_fat <- inner_join(cpg_snp, dnam_fat, by = 'cpg')
dim(dnam_fat)
## [1] 508 186

Keep only samples with genotype data

48 individuals were not part of LLS but participated in GOTO. These individuals have genotypes in a different dataset. We remove their samples from the beta2genotype data, but keep them in the next script.

The rownames of the genotype data have a . where the GWASnr has an underscore.

rownames(lls_plink$genotypes) <- gsub('.', '_',
         rownames(lls_plink$genotypes), fixed=TRUE)

First we subset the keys

Blood

key_blood <- key_blood %>% filter(GWASnr %in% rownames(lls_plink$genotypes))

Muscle

key_muscle <- key_muscle %>% filter(GWASnr %in% rownames(lls_plink$genotypes))

Fat

key_fat <- key_fat %>% filter(GWASnr %in% rownames(lls_plink$genotypes))

Now we can subset the beta2genotype data using these keys

Final blood data of 595 CpGs from 156 samples

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

Final muscle data of 488 CpGs from 136 samples

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

Final fat data of 508 CpGs from 142 samples

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

Subsetting the genotype data

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

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

56 / 595 SNPs for blood found in the genotype data from 78 people

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

41 / 488 SNPs for muscle found in the genotype data from 68 people

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

50 / 508 SNPs for fat found in the genotype data from 71 people

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

Subsetting beta2genotype for SNPs

Finally we keep only the SNPs that overlap with genotype data

56 single SNP CpGs from 156 blood samples

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

41 single SNP CpGs from 136 muscle samples

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

50 single SNP CpGs from 142 fat samples

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

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],6],
          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 41 SNPs and as shown above, all samples have the highest match with the assumed match based on genotype.

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 154 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548970103_R01C01 43_1_1c4     43_1_1c4          41    41
##  2 203548970103_R02C01 43_1_1c4     43_1_1c4          43    43
##  3 203548970004_R01C01 218_1_1c2    218_1_1c2         44    44
##  4 203548970004_R02C01 218_1_1c2    218_1_1c2         44    44
##  5 203548970040_R01C01 397_1_2c6s   397_1_2c6s        45    45
##  6 203548970040_R02C01 397_1_2c6s   397_1_2c6s        45    45
##  7 203548870093_R03C01 15_1_2c7     15_1_2c7          45    45
##  8 203548870093_R04C01 15_1_2c7     15_1_2c7          45    45
##  9 203548980012_R01C01 200_1_5c3    200_1_5c3         45    45
## 10 203548980012_R02C01 200_1_5c3    200_1_5c3         45    45
## # ℹ 144 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-LLS-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],6],
         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.

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 29 SNPs and two samples have been switched. This confirms what we saw with omicsPrint.

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 134 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548970101_R08C01 38_1_1c6s    38_1_1c6s         29    29
##  2 203527980015_R01C01 349_1_7c16   349_1_7c16        32    32
##  3 203527980015_R02C01 349_1_7c16   349_1_7c16        32    32
##  4 203527980082_R03C01 15_1_2c7     15_1_2c7          33    33
##  5 203527980082_R04C01 15_1_2c7     15_1_2c7          33    33
##  6 203548870077_R02C01 138_1_3c4    138_1_3c4         33    33
##  7 203548870019_R08C01 246_1_2c6    246_1_2c6         33    33
##  8 203548970101_R07C01 38_1_1c6s    38_1_1c6s         34    34
##  9 203548970103_R05C01 14_1_1c6     14_1_1c6          34    34
## 10 203548970103_R06C01 14_1_1c6     14_1_1c6          34    34
## # ℹ 124 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 2 × 5
##   sample_ID           actual_match assumed_match n_snps   max
##   <chr>               <chr>        <chr>          <int> <int>
## 1 203548970088_R08C01 58_1_1c5     58_1_1c5s         35    35
## 2 203548980011_R03C01 58_1_1c5s    58_1_1c5          36    36

Save

save(out, key_muscle, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-LLS-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],6],
         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.

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 29 SNPs and one sample is not from the assumed individual. We will have to drop this sample and its pair.

out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 140 × 5
##    sample_ID           actual_match assumed_match n_snps   max
##    <chr>               <chr>        <chr>          <int> <int>
##  1 203548970042_R05C01 349_1_7c11   349_1_7c7s        29    29
##  2 203548970100_R08C01 159_1_3c22s  159_1_3c22s       35    35
##  3 203548970098_R07C01 397_1_2c6s   397_1_2c6s        39    39
##  4 203548970098_R08C01 397_1_2c6s   397_1_2c6s        39    39
##  5 203548970100_R01C01 218_1_1c2    218_1_1c2         40    40
##  6 203548970100_R02C01 218_1_1c2    218_1_1c2         40    40
##  7 203740910037_R05C01 461_1_2c4s   461_1_2c4s        40    40
##  8 203740910037_R06C01 461_1_2c4s   461_1_2c4s        40    40
##  9 203527980080_R03C01 138_1_3c4    138_1_3c4         41    41
## 10 203548980032_R03C01 43_1_1c4     43_1_1c4          41    41
## # ℹ 130 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 1 × 5
##   sample_ID           actual_match assumed_match n_snps   max
##   <chr>               <chr>        <chr>          <int> <int>
## 1 203548970042_R05C01 349_1_7c11   349_1_7c7s        29    29

Save

save(out, key_fat, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-LLS-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())