GeoTcgaData


Authors

Erqiang Hu

Department of Bioinformatics, School of Basic Medical Sciences, Southern Medical University.

Introduction

GEO and TCGA provide us with a wealth of data, such as RNA-seq, DNA Methylation, single nucleotide Variation and Copy number variation data. It’s easy to download data from TCGA using the  gdc tool or TCGAbiolinks, and some software provides organized TCGA data, such as UCSC Xena , UCSCXenaTools, and sangerbox, but processing these data into a format suitable for bioinformatics  analysis requires more work. This R package was developed to handle these data.

library(GeoTcgaData)

Example

This is a basic example which shows you how to solve a common problem:

RNA-seq data differential expression analysis

It is convenient to use TCGAbiolinks  or GDCRNATools to download and analysis Gene expression data.  TCGAbiolinks use edgeR package to do differential expression analysis, while GDCRNATools can implement three most commonly used methods: limma, edgeR , and DESeq2 to identify differentially expressed  genes (DEGs).

Alicia Oshlack  et al. claimed that unlike the chip data, the RNA-seq data had one bias[1]: the larger the transcript length / mean read count , the more likely it was to be  identified as a differential gene, while there was no such trend in the chip data[2].

 However, when we use their chip data for difference analysis  (using the limma package), we find that chip data has the same trend as  RNA-seq data. And we also found this trend in the difference analysis results  given by the data  authors[3].

 

 It is worse noting that only technical replicate data, which has small gene  dispersions, shows this bias[4].  This is because in technical replicate RNA-seq data a long gene has more  reads mapping to it compared to a short gene of similar expression,  and most of the statistical methods used to detect differential expression  have stronger detection ability for genes with more reads. However, we have  not deduced why there is such a bias in the current difference  analysis algorithms.

Some software, such as CQN , present a normalization algorithm [5] to correct systematic biases(gene length bias and GC-content bias[6]. But they did not provide sufficient evidence to prove that the correction is effective. We use the Marioni dataset[2] to verify the correction effect of CQN and find that there is still a deviation after correction:

GOseq [1]based on Wallenius’ noncentral hypergeometric distribution can effectively correct the gene length deviation in enrichment analysis. However, the current RNA-seq data often have no gene length bias, but only the expression amount(read count) bias, GOseq may overcorrect these data, correcting originally unbiased data into reverse bias.

GOseq also fails to correct for expression bias, therefore, read count bias correction is still a challenge for us.

# use user-defined data
df <- matrix(rnbinom(400, mu = 4, size = 10), 25, 16)
df <- as.data.frame(df)
rownames(df) <- paste0("gene", 1:25)
colnames(df) <- paste0("sample", 1:16)
group <- sample(c("group1", "group2"), 16, replace = TRUE)
result <- differential_RNA(counts = df, group = group,
    filte = FALSE, method = "Wilcoxon")
# use SummarizedExperiment object input
df <- matrix(rnbinom(400, mu = 4, size = 10), 25, 16)
rownames(df) <- paste0("gene", 1:25)
colnames(df) <- paste0("sample", 1:16)
group <- sample(c("group1", "group2"), 16, replace = TRUE)

nrows <- 200; ncols <- 20
counts <- matrix(
    runif(nrows * ncols, 1, 1e4), nrows,
    dimnames = list(paste0("cg",1:200),paste0("S",1:20))
)

colData <- S4Vectors::DataFrame(
  row.names = paste0("sample", 1:16),
  group = group
)
data <- SummarizedExperiment::SummarizedExperiment(
         assays=S4Vectors::SimpleList(counts=df),
         colData = colData)

result <- differential_RNA(counts = data, groupCol = "group",
    filte = FALSE, method = "Wilcoxon") 

DNA Methylation data integration

use TCGAbiolinks data.

The codes may need to be modified if TCGAbiolinks updates. So please read its documents.

# use user defined data
library(ChAMP)
cpgData <- matrix(runif(2000), nrow = 200, ncol = 10)
rownames(cpgData) <- paste0("cpg", seq_len(200))
colnames(cpgData) <- paste0("sample", seq_len(10))
sampleGroup <- c(rep("group1", 5), rep("group2", 5))
names(sampleGroup) <- colnames(cpgData)
cpg2gene <- data.frame(cpg = rownames(cpgData), 
    gene = rep(paste0("gene", seq_len(20)), 10))
result <- differential_methy(cpgData, sampleGroup, 
    cpg2gene = cpg2gene, normMethod = NULL)
# use SummarizedExperiment object input
library(ChAMP)
cpgData <- matrix(runif(2000), nrow = 200, ncol = 10)
rownames(cpgData) <- paste0("cpg", seq_len(200))
colnames(cpgData) <- paste0("sample", seq_len(10))
sampleGroup <- c(rep("group1", 5), rep("group2", 5))
names(sampleGroup) <- colnames(cpgData)
cpg2gene <- data.frame(cpg = rownames(cpgData), 
    gene = rep(paste0("gene", seq_len(20)), 10))
colData <- S4Vectors::DataFrame(
    row.names = colnames(cpgData),
    group = sampleGroup
)
data <- SummarizedExperiment::SummarizedExperiment(
         assays=S4Vectors::SimpleList(counts=cpgData),
         colData = colData)
result <- differential_methy(cpgData = data, 
    groupCol = "group", normMethod = NULL, 
    cpg2gene = cpg2gene)  

Note: ChAMPhas a large number of dependent packages. If you cannot install it successfully, you can download each dependent package separately(Source or Binary) and install it locally.

We provide two models to get methylation difference genes:

if model = “cpg”, step1: calculate difference cpgs; step2: calculate difference genes;

if model = “gene”, step1: calculate the methylation level of genes; step2: calculate difference genes.

We find that only model = “gene” has no deviation of CpG number.

Copy number variation data integration and differential gene extraction

use TCGAbiolinks to download TCGA data(Gene Level Copy Number Scores)

# use random data as example
aa <- matrix(sample(c(0, 1, -1), 200, replace = TRUE), 25, 8)
rownames(aa) <- paste0("gene", 1:25)
colnames(aa) <- paste0("sample", 1:8)
sampleGroup <- sample(c("A", "B"), ncol(aa), replace = TRUE)
diffCnv <- differential_CNV(aa, sampleGroup)

Difference analysis of single nucleotide Variation data

We provide SNP_QC function to do quality control of SNP data

snpDf <- matrix(sample(c("AA", "Aa", "aa"), 100, replace = TRUE), 10, 10)
snpDf <- as.data.frame(snpDf)
sampleGroup <- sample(c("A", "B"), 10, replace = TRUE)
result <- SNP_QC(snpDf)

Then use differential_SNP to do differential analysis.

#' snpDf <- matrix(sample(c("mutation", NA), 100, replace = TRUE), 10, 10)
#' snpDf <- as.data.frame(snpDf)
#' sampleGroup <- sample(c("A", "B"), 10, replace = TRUE)
#' result <- differential_SNP(snpDf, sampleGroup)

GEO chip data processing

The function gene_ave could average the expression data of different ids for the same gene in the GEO chip data. For example:

aa <- c("MARCH1","MARC1","MARCH1","MARCH1","MARCH1")
bb <- c(2.969058399,4.722410064,8.165514853,8.24243893,8.60815086)
cc <- c(3.969058399,5.722410064,7.165514853,6.24243893,7.60815086)
file_gene_ave <- data.frame(aa=aa,bb=bb,cc=cc)
colnames(file_gene_ave) <- c("Gene", "GSM1629982", "GSM1629983")
result <- gene_ave(file_gene_ave, 1)

Multiple genes symbols may correspond to a same chip id. The result of function repAssign is to assign the expression of this id to each gene, and function repRemove deletes the expression. For example:

aa <- c("MARCH1 /// MMA","MARC1","MARCH2 /// MARCH3",
        "MARCH3 /// MARCH4","MARCH1")
bb <- c("2.969058399","4.722410064","8.165514853","8.24243893","8.60815086")
cc <- c("3.969058399","5.722410064","7.165514853","6.24243893","7.60815086")
input_file <- data.frame(aa=aa,bb=bb,cc=cc)
repAssign_result <- repAssign(input_file," /// ")
repRemove_result <- repRemove(input_file," /// ")

Other downstream analyses

  1. The function id_conversion_TCGA could convert ENSEMBL gene id to gene Symbol in TCGA. For example:
data(profile)
result <- id_conversion_TCGA(profile)

The parameter profile is a data.frame or matrix of gene expression data in TCGA.

Note: In previous versions(< 1.0.0) the id_conversion and id_conversion_TCGA used HGNC data to convert human gene id.
In future versions, we will use clusterProfiler::bitr for ID conversion.

  1. The function countToFpkm and countToTpm could convert count data to FPKM or TPM data.
data(gene_cov)
lung_squ_count2 <- matrix(c(1,2,3,4,5,6,7,8,9),ncol=3)
rownames(lung_squ_count2) <- c("DISC1","TCOF1","SPPL3")
colnames(lung_squ_count2) <- c("sample1","sample2","sample3")
result <- countToFpkm(lung_squ_count2, keyType = "SYMBOL", 
    gene_cov = gene_cov)
#> 'select()' returned 1:1 mapping between keys and columns
#> Warning in clusterProfiler::bitr(rownames(gene_cov), fromType = "ENTREZID", :
#> 0.07% of input gene IDs are fail to map...
data(gene_cov)
lung_squ_count2 <- matrix(c(0.11,0.22,0.43,0.14,0.875,
    0.66,0.77,0.18,0.29),ncol=3)
rownames(lung_squ_count2) <- c("DISC1","TCOF1","SPPL3")
colnames(lung_squ_count2) <- c("sample1","sample2","sample3")
result <- countToTpm(lung_squ_count2, keyType = "SYMBOL", 
    gene_cov = gene_cov)
sessionInfo()
#> R version 4.4.1 (2024-06-14)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.20-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [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: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
#> [8] methods   base     
#> 
#> other attached packages:
#>  [1] ChAMP_2.36.0                              
#>  [2] RPMM_1.25                                 
#>  [3] cluster_2.1.6                             
#>  [4] DT_0.33                                   
#>  [5] IlluminaHumanMethylationEPICmanifest_0.3.0
#>  [6] Illumina450ProbeVariants.db_1.41.0        
#>  [7] DMRcate_3.2.0                             
#>  [8] ChAMPdata_2.37.0                          
#>  [9] minfi_1.52.0                              
#> [10] bumphunter_1.48.0                         
#> [11] locfit_1.5-9.10                           
#> [12] iterators_1.0.14                          
#> [13] foreach_1.5.2                             
#> [14] Biostrings_2.74.0                         
#> [15] XVector_0.46.0                            
#> [16] SummarizedExperiment_1.36.0               
#> [17] Biobase_2.66.0                            
#> [18] MatrixGenerics_1.18.0                     
#> [19] matrixStats_1.4.1                         
#> [20] GenomicRanges_1.58.0                      
#> [21] GenomeInfoDb_1.42.0                       
#> [22] IRanges_2.40.0                            
#> [23] S4Vectors_0.44.0                          
#> [24] BiocGenerics_0.52.0                       
#> [25] GeoTcgaData_2.6.0                         
#> 
#> loaded via a namespace (and not attached):
#>   [1] R.methodsS3_1.8.2                                  
#>   [2] dichromat_2.0-0.1                                  
#>   [3] cqn_1.52.0                                         
#>   [4] progress_1.2.3                                     
#>   [5] nnet_7.3-19                                        
#>   [6] shinythemes_1.2.0                                  
#>   [7] kpmt_0.1.0                                         
#>   [8] HDF5Array_1.34.0                                   
#>   [9] vctrs_0.6.5                                        
#>  [10] ggtangle_0.0.3                                     
#>  [11] digest_0.6.37                                      
#>  [12] png_0.1-8                                          
#>  [13] lumi_2.58.0                                        
#>  [14] ggrepel_0.9.6                                      
#>  [15] deldir_2.0-4                                       
#>  [16] combinat_0.0-8                                     
#>  [17] permute_0.9-7                                      
#>  [18] MASS_7.3-61                                        
#>  [19] reshape_0.8.9                                      
#>  [20] reshape2_1.4.4                                     
#>  [21] httpuv_1.6.15                                      
#>  [22] qvalue_2.38.0                                      
#>  [23] ggfun_0.1.7                                        
#>  [24] xfun_0.48                                          
#>  [25] survival_3.7-0                                     
#>  [26] doRNG_1.8.6                                        
#>  [27] memoise_2.0.1                                      
#>  [28] gson_0.1.0                                         
#>  [29] clusterProfiler_4.14.0                             
#>  [30] MatrixModels_0.5-3                                 
#>  [31] BiasedUrn_2.0.12                                   
#>  [32] tidytree_0.4.6                                     
#>  [33] gtools_3.9.5                                       
#>  [34] DNAcopy_1.80.0                                     
#>  [35] R.oo_1.26.0                                        
#>  [36] Formula_1.2-5                                      
#>  [37] prettyunits_1.2.0                                  
#>  [38] KEGGREST_1.46.0                                    
#>  [39] promises_1.3.0                                     
#>  [40] httr_1.4.7                                         
#>  [41] restfulr_0.0.15                                    
#>  [42] IlluminaHumanMethylation450kanno.ilmn12.hg19_0.6.1 
#>  [43] rhdf5filters_1.18.0                                
#>  [44] rhdf5_2.50.0                                       
#>  [45] rstudioapi_0.17.1                                  
#>  [46] UCSC.utils_1.2.0                                   
#>  [47] generics_0.1.3                                     
#>  [48] DOSE_4.0.0                                         
#>  [49] base64enc_0.1-3                                    
#>  [50] curl_5.2.3                                         
#>  [51] zlibbioc_1.52.0                                    
#>  [52] GenomeInfoDbData_1.2.13                            
#>  [53] quadprog_1.5-8                                     
#>  [54] ExperimentHub_2.14.0                               
#>  [55] SparseArray_1.6.0                                  
#>  [56] xtable_1.8-4                                       
#>  [57] stringr_1.5.1                                      
#>  [58] doParallel_1.0.17                                  
#>  [59] evaluate_1.0.1                                     
#>  [60] S4Arrays_1.6.0                                     
#>  [61] BiocFileCache_2.14.0                               
#>  [62] preprocessCore_1.68.0                              
#>  [63] hms_1.1.3                                          
#>  [64] colorspace_2.1-1                                   
#>  [65] filelock_1.0.3                                     
#>  [66] JADE_2.0-4                                         
#>  [67] IlluminaHumanMethylationEPICanno.ilm10b4.hg19_0.6.0
#>  [68] marray_1.84.0                                      
#>  [69] magrittr_2.0.3                                     
#>  [70] readr_2.1.5                                        
#>  [71] ggtree_3.14.0                                      
#>  [72] later_1.3.2                                        
#>  [73] viridis_0.6.5                                      
#>  [74] lattice_0.22-6                                     
#>  [75] genefilter_1.88.0                                  
#>  [76] SparseM_1.84-2                                     
#>  [77] cowplot_1.1.3                                      
#>  [78] XML_3.99-0.17                                      
#>  [79] Hmisc_5.2-0                                        
#>  [80] pillar_1.9.0                                       
#>  [81] nlme_3.1-166                                       
#>  [82] compiler_4.4.1                                     
#>  [83] stringi_1.8.4                                      
#>  [84] dendextend_1.18.1                                  
#>  [85] GenomicAlignments_1.42.0                           
#>  [86] plyr_1.8.9                                         
#>  [87] crayon_1.5.3                                       
#>  [88] abind_1.4-8                                        
#>  [89] BiocIO_1.16.0                                      
#>  [90] gridGraphics_0.5-1                                 
#>  [91] org.Hs.eg.db_3.20.0                                
#>  [92] bit_4.5.0                                          
#>  [93] dplyr_1.1.4                                        
#>  [94] fastmatch_1.1-4                                    
#>  [95] codetools_0.2-20                                   
#>  [96] openssl_2.2.2                                      
#>  [97] bslib_0.8.0                                        
#>  [98] biovizBase_1.54.0                                  
#>  [99] plotly_4.10.4                                      
#> [100] multtest_2.62.0                                    
#> [101] mime_0.12                                          
#> [102] wateRmelon_2.12.0                                  
#> [103] splines_4.4.1                                      
#> [104] Rcpp_1.0.13                                        
#> [105] quantreg_5.99                                      
#> [106] dbplyr_2.5.0                                       
#> [107] sparseMatrixStats_1.18.0                           
#> [108] IlluminaHumanMethylation450kmanifest_0.4.0         
#> [109] interp_1.1-6                                       
#> [110] knitr_1.48                                         
#> [111] blob_1.2.4                                         
#> [112] utf8_1.2.4                                         
#> [113] clue_0.3-65                                        
#> [114] BiocVersion_3.20.0                                 
#> [115] AnnotationFilter_1.30.0                            
#> [116] fs_1.6.4                                           
#> [117] checkmate_2.3.2                                    
#> [118] DelayedMatrixStats_1.28.0                          
#> [119] Gviz_1.50.0                                        
#> [120] ggplotify_0.1.2                                    
#> [121] tibble_3.2.1                                       
#> [122] Matrix_1.7-1                                       
#> [123] statmod_1.5.0                                      
#> [124] tzdb_0.4.0                                         
#> [125] pkgconfig_2.0.3                                    
#> [126] tools_4.4.1                                        
#> [127] cachem_1.1.0                                       
#> [128] RSQLite_2.3.7                                      
#> [129] viridisLite_0.4.2                                  
#> [130] globaltest_5.60.0                                  
#> [131] DBI_1.2.3                                          
#> [132] impute_1.80.0                                      
#> [133] fastmap_1.2.0                                      
#> [134] rmarkdown_2.28                                     
#> [135] scales_1.3.0                                       
#> [136] grid_4.4.1                                         
#> [137] Rsamtools_2.22.0                                   
#> [138] AnnotationHub_3.14.0                               
#> [139] sass_0.4.9                                         
#> [140] patchwork_1.3.0                                    
#> [141] BiocManager_1.30.25                                
#> [142] VariantAnnotation_1.52.0                           
#> [143] scrime_1.3.5                                       
#> [144] rpart_4.1.23                                       
#> [145] farver_2.1.2                                       
#> [146] mgcv_1.9-1                                         
#> [147] yaml_2.3.10                                        
#> [148] latticeExtra_0.6-30                                
#> [149] foreign_0.8-87                                     
#> [150] rtracklayer_1.66.0                                 
#> [151] illuminaio_0.48.0                                  
#> [152] cli_3.6.3                                          
#> [153] purrr_1.0.2                                        
#> [154] siggenes_1.80.0                                    
#> [155] GEOquery_2.74.0                                    
#> [156] txdbmaker_1.2.0                                    
#> [157] lifecycle_1.0.4                                    
#> [158] askpass_1.2.1                                      
#> [159] backports_1.5.0                                    
#> [160] BiocParallel_1.40.0                                
#> [161] annotate_1.84.0                                    
#> [162] methylumi_2.52.0                                   
#> [163] gtable_0.3.6                                       
#> [164] rjson_0.2.23                                       
#> [165] missMethyl_1.40.0                                  
#> [166] ape_5.8                                            
#> [167] limma_3.62.0                                       
#> [168] jsonlite_1.8.9                                     
#> [169] edgeR_4.4.0                                        
#> [170] isva_1.9                                           
#> [171] bitops_1.0-9                                       
#> [172] ggplot2_3.5.1                                      
#> [173] bit64_4.5.2                                        
#> [174] assertthat_0.2.1                                   
#> [175] yulab.utils_0.1.7                                  
#> [176] base64_2.0.2                                       
#> [177] geneLenDataBase_1.41.2                             
#> [178] jquerylib_0.1.4                                    
#> [179] GOSemSim_2.32.0                                    
#> [180] R.utils_2.12.3                                     
#> [181] lazyeval_0.2.2                                     
#> [182] shiny_1.9.1                                        
#> [183] enrichplot_1.26.0                                  
#> [184] htmltools_0.5.8.1                                  
#> [185] affy_1.84.0                                        
#> [186] GO.db_3.20.0                                       
#> [187] rappdirs_0.3.3                                     
#> [188] ensembldb_2.30.0                                   
#> [189] glue_1.8.0                                         
#> [190] ROC_1.82.0                                         
#> [191] httr2_1.0.5                                        
#> [192] RCurl_1.98-1.16                                    
#> [193] treeio_1.30.0                                      
#> [194] mclust_6.1.1                                       
#> [195] BSgenome_1.74.0                                    
#> [196] jpeg_0.1-10                                        
#> [197] gridExtra_2.3                                      
#> [198] igraph_2.1.1                                       
#> [199] R6_2.5.1                                           
#> [200] sva_3.54.0                                         
#> [201] tidyr_1.3.1                                        
#> [202] GenomicFeatures_1.58.0                             
#> [203] rngtools_1.5.2                                     
#> [204] Rhdf5lib_1.28.0                                    
#> [205] beanplot_1.3.1                                     
#> [206] aplot_0.2.3                                        
#> [207] bsseq_1.42.0                                       
#> [208] DelayedArray_0.32.0                                
#> [209] tidyselect_1.2.1                                   
#> [210] ProtGenerics_1.38.0                                
#> [211] nleqslv_3.3.5                                      
#> [212] htmlTable_2.4.3                                    
#> [213] xml2_1.3.6                                         
#> [214] AnnotationDbi_1.68.0                               
#> [215] fastICA_1.2-5.1                                    
#> [216] munsell_0.5.1                                      
#> [217] KernSmooth_2.23-24                                 
#> [218] goseq_1.58.0                                       
#> [219] affyio_1.76.0                                      
#> [220] nor1mix_1.3-3                                      
#> [221] data.table_1.16.2                                  
#> [222] fgsea_1.32.0                                       
#> [223] htmlwidgets_1.6.4                                  
#> [224] RColorBrewer_1.1-3                                 
#> [225] biomaRt_2.62.0                                     
#> [226] rlang_1.1.4                                        
#> [227] rentrez_1.2.3                                      
#> [228] topconfects_1.22.0                                 
#> [229] fansi_1.0.6

References

  1. Young MD, Wakefield MJ, Smyth GK, Oshlack A (2010) Gene ontology analysis for RNA-seq: accounting for selection bias. Genome Biol 11: R14.
  2. Oshlack A, Wakefield MJ (2009) Transcript length bias in RNA-seq data confounds systems biology. Biol Direct 4: 14.
  3. Marioni JC, Mason CE, Mane SM, Stephens M, Gilad Y (2008) RNA-seq: an assessment of technical reproducibility and comparison with gene expression arrays. Genome Res 18: 1509-1517.
  4. Yoon S, Nam D (2017) Gene dispersion is the key determinant of the read count bias in differential expression analysis of RNA-seq data. BMC Genomics 18: 408.
  5. Hansen KD, Irizarry RA, Wu Z (2012) Removing technical variability in RNA-seq data using conditional quantile normalization. Biostatistics 13: 204-216.
  6. Risso D, Schwartz K, Sherlock G, Dudoit S (2011) GC-content normalization for RNA-Seq data. BMC Bioinformatics 12: 480.