├── LICENSE ├── README.md ├── easyTCGA ├── 1行代码提取6种TCGA表达矩阵和临床信息.md ├── 1行代码提取表达矩阵2.0版本.md ├── 1行代码整理泛癌数据.md ├── easyTCGA1行代码下载基因表达数据.md ├── easyTCGA可视化函数.md └── 任意基因在泛癌的表达量展示.md ├── tcga ├── 000tcga合集链接.md ├── 1万个基因批量wilcox检验.md ├── 1行代码计算肿瘤突变负荷.md ├── DEseq2差异分析及vst探索.md ├── TCGA官网下载文件数量和tcgabiolinks下载的不一致.md ├── countstpmfpkmvstcpm表达量差异.md ├── ggplot2可视化CNV_gistic_score.md ├── ggplot绘制突变全景图.md ├── gistic2安装使用.md ├── tcga+gtex联合数据.md ├── tcgabiolinks00数据下载.md ├── tcgabiolinks01表达矩阵提取.md ├── tcgabiolinks02差异分析.md ├── tcgabiolinks03富集分析和生存分析.md ├── tcgabiolinks04手动整理表达矩阵.md ├── tcgabiolinks05下载和整理MAF.md ├── tcgabiolinks06不同癌种数据合并(上).md ├── tcgabiolinks07snp和临床信息制作.md ├── tcgabiolinks08:甲基化.md ├── tcgabiolinks10:可视化.md ├── tcgabiolinks11不同癌种数据合并(下).md ├── tcga又㕛叒叕更新了!.md ├── tcga批量差异分析可视化.md ├── 批量生存分析.md ├── 批量生存分析for循环.md └── 最适合初学者的tcga下载教程.md ├── 单细胞 ├── 单细胞入门之Seurat标准流程.md ├── 单细胞入门之多样本整合.md └── 单细胞入门之细胞类型鉴定.md ├── 常见分析 ├── 0001combat去批次.md ├── 0002免疫浸润一致性聚类.md ├── 0003ImmLnc和ImmReLnc识别免疫相关lncRNA.md ├── 0004wgcna识别免疫相关lncRNA.md ├── GSEA富集分析可视化.md ├── GSVA和ssGSEA.md ├── Goplot富集分析可视化.md ├── GseaVis富集分析可视化.md ├── IOBR.md ├── MOVICS.md ├── SIC图表学习01.md ├── WGCNA分类变量处理.md ├── WGCNA注意事项.md ├── enrichplot富集分析可视化.md ├── limma差异分析谁比谁很重要吗.md ├── simplifyEnrichment简化富集分析结果.md ├── tinyarray.md ├── 单基因富集分析.md ├── 单基因富集分析之火山图和热图.md ├── 富集分析常见类型.md ├── 常见镜像设置.md ├── 手动计算logFC.md ├── 生信初学者资源推荐.md └── 药物敏感性分析.md └── 甲基化 ├── champ_IDAT.md ├── champ_betaMatrix.md ├── champ_coread.md └── minfi.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 ayue 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # R_bioinformatics 2 | > 一个临床医生的生信学习之路。 3 | 4 | 这里是我在公众号**医学和生信笔记**中发表的和**生信数据挖掘**有关的推文合集,并且进行了简单的分类,所有文件都是`markdown`格式。 5 | 6 | 生信分析需要的数据量巨大,且多数都是可以直接下载的,所以这里并没有数据,个别的外部数据我都在推文中注明了获取方式。 7 | 8 | ## 上游分析 9 | 10 | 1. 常规转录组上游分析流程 11 | 2. 参考基因组注释文件下载 12 | 3. GISTIC2.0分析拷贝数变异数据 13 | 14 | ## 基础知识 15 | 16 | - [生信初学者基础知识资源推荐](https://mp.weixin.qq.com/s/T-C2xXbpyICC90TgLIJoSQ),注意,文中涉及的电子书网址已变为:http://bio-info-trainee.com/basic/ 17 | - [学生信必知的镜像设置(加快你的下载速度)](https://mp.weixin.qq.com/s/O5Ioy9jIoPyYLgIkvrfkEQ) 18 | 19 | ## 常见下游分析 20 | 21 | ### 生存分析 22 | 23 | **批量生存分析已通过easyTCGA实现,1行代码即可完成2种批量生存分析,支持最佳截点**,详情请参考:[GitHub - ayueme/easyTCGA: Speed up your TCGA analysis!](https://github.com/ayueme/easyTCGA) 24 | 25 | - [count、tpm、fpkm等表达量差异](https://mp.weixin.qq.com/s/aff-AX9aA2tSDa2zbB8ZRQ) 26 | - [批量生存分析(logrank和单因素COX)](https://mp.weixin.qq.com/s/o-gCc_1B9SQmNFrG-I6yAQ) 27 | - [解决TCGA批量生存分析报错:there is only 1 group](https://mp.weixin.qq.com/s/8AYsnJ9KiEigVPKI5NunCg) 28 | - 在[R语言医学统计合集](https://ayueme.github.io/)中还有其他关于生存分析基础知识的内容 29 | 30 | ### 差异分析 31 | 32 | **差异分析已通过easyTCGA实现,1行代码即可完成3种差异分析分析**,详情请参考:[GitHub - ayueme/easyTCGA: Speed up your TCGA analysis!](https://github.com/ayueme/easyTCGA) 33 | 34 | - [count、tpm、fpkm等表达量差异](https://mp.weixin.qq.com/s/aff-AX9aA2tSDa2zbB8ZRQ) 35 | - [DESeq2差异分析及VST变换的探索](https://mp.weixin.qq.com/s/CBznByKNGwPEKIKM5U0Oyw) 36 | - [limma差异分析,谁和谁比很重要吗?](https://mp.weixin.qq.com/s/vdkDcBzuoqCASts61efjBw) 37 | - [单基因差异分析并绘制火山图和热图](https://mp.weixin.qq.com/s/IZ7_46zJjXba7I73-Im9hw) 38 | - [手动计算logFC(wilcoxon差异分析)](https://mp.weixin.qq.com/s/xMOvyr-I9VVBw0-DJ5-hYQ) 39 | 40 | ### 富集分析 41 | 42 | - [富集分析常见类型](https://mp.weixin.qq.com/s/RtF7DPXYaObiDauIQTnkFg) 43 | - [enrichplot富集分析可视化](https://mp.weixin.qq.com/s/1mpoaZqdgymhSsMGFrCP_A) 44 | - [GSEA富集分析可视化](https://mp.weixin.qq.com/s/cusiasAAVPBq3uIHP0EKZw) 45 | - [Goplot富集分析可视化](https://mp.weixin.qq.com/s/DckdtQcPv48DDLyA6oZQew) 46 | - [GseaVis富集分析可视化](https://mp.weixin.qq.com/s/hdGkcemBdRuayA2ySMH3hw) 47 | - [simplifyEnrichment的使用示例](https://mp.weixin.qq.com/s/BmROSJCTEzHRj9yiM8rcmA) 48 | - [单基因富集分析](https://mp.weixin.qq.com/s/q6nkujgTYlbOQpkENjyyxA) 49 | - [GSVA和ssGSEA](https://mp.weixin.qq.com/s/aUEP6XnejtHohaPeeEOMOQ) 50 | 51 | ### 免疫浸润 52 | 53 | - [1行代码完成8种免疫浸润分析](https://mp.weixin.qq.com/s/JqO7rVBMGGmOXRA8w8nDSg) 54 | - [免疫浸润结果可视化](https://mp.weixin.qq.com/s/YcUVElp0BEj5TxEqfSEkIQ) 55 | - [免疫浸润结果分子分型(一致性聚类ConsensusClusterPlus)](https://mp.weixin.qq.com/s/96s_hfBH0HjLvvTfNgTIlQ) 56 | 57 | ### 批次效应 58 | 59 | - [批次效应去除之combat和removebatcheffect](https://mp.weixin.qq.com/s/yRUmVTimI9f9itoHWxyYrA) 60 | 61 | ### WGCNA 62 | 63 | - [WGCNA实战:识别免疫相关lncRNA](https://mp.weixin.qq.com/s/Pr33WscVtNQQaoryxTiJ-Q) 64 | - [WGCNA分类变量的处理](https://mp.weixin.qq.com/s/lariR2vam10Qbs0f0pD-VA) 65 | 66 | ### 分子分型 67 | 68 | - [免疫浸润结果分子分型(一致性聚类ConsensusClusterPlus)](https://mp.weixin.qq.com/s/96s_hfBH0HjLvvTfNgTIlQ) 69 | - [MOVICS:分子分型一站式R包(01)](https://mp.weixin.qq.com/s/nC9D0OZpy3qTKoejpWv5Mw) 70 | - [MOVICS:分子分型一站式R包(02)](https://mp.weixin.qq.com/s/DyLiI5qGLt_cJusveDUPRw) 71 | - [MOVICS:分子分型一站式R包(03)](https://mp.weixin.qq.com/s/B9R5Y-3Kx-BvLo1bOtLk5A) 72 | - CancerSubtypes 73 | 74 | ### 药物敏感性 75 | 76 | - [药物敏感性分析之pRRophetic](https://mp.weixin.qq.com/s/y7QNhAtpKFe3EgrgBq-zFQ) 77 | - [药物敏感性分析之oncoPredict](https://mp.weixin.qq.com/s/pZB-P3iAdX1AGCbtRkSz2w) 78 | 79 | ## TCGA 80 | 81 | - [新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g);注意:该方法已被easyTCGA替代 82 | - [新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ);注意:该方法已被easyTCGA替代 83 | - [手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ);注意:该方法已被easyTCGA替代 84 | - [可能是最适合初学者的TCGA官网下载和表达矩阵整理教程](https://mp.weixin.qq.com/s/rbnWvstRsfhbi9il-qSYpQ);注意:该方法可以配合easyTCGA一起用 85 | - [TCGA官网下载的文件数量竟然和TCGAbiolinks不一致!](https://mp.weixin.qq.com/s/EuEaaBFjK6n6rxmUo27UMw) 86 | - [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ);注意:该方法已被easyTCGA替代 87 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw);注意:该方法已被easyTCGA替代 88 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw);注意:该方法已被easyTCGA替代,b站有教程 89 | - [新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s/0hcQ1m_9l1TtvXgEG20F5Q);注意:该方法已被easyTCGA替代 90 | - [TCGA不同癌种数据合并问题](https://mp.weixin.qq.com/s/2umNgpBSI19gqeqcamOv4A);注意:该方法已被easyTCGA替代 91 | - [TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw);注意:该方法已被easyTCGA替代 92 | - [maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s/1cR3Cnfd5Co9U3jIoIWJBA) 93 | - [新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA);注意:该方法已被easyTCGA替代 94 | - [新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw);注意:生存分析已被easyTCGA替代 95 | - [新版TCGAbiolinks包学习:可视化](https://mp.weixin.qq.com/s/j0f1MDwlNmViqUeXU_Ikow) 96 | - [1行代码计算肿瘤突变负荷TMB](https://mp.weixin.qq.com/s/TPURe613FXKi1tMHzAcJFA) 97 | - [解决TCGA批量生存分析报错:there is only 1 group](https://mp.weixin.qq.com/s/8AYsnJ9KiEigVPKI5NunCg);注意:该方法已被easyTCGA替代 98 | 99 | ### easyTCGA 100 | 101 | 专为下载和整理TCGA数据而开发的R包,1行代码完成一个分析,详情请参考:[GitHub - ayueme/easyTCGA: Speed up your TCGA analysis!](https://github.com/ayueme/easyTCGA) 102 | 103 | - [easyTCGA:让初学者也能享受“征服”TCGA的喜悦](https://mp.weixin.qq.com/s/kvGYVCOSBgKqVaeQU01JcA) 104 | - [easyTCGA:1行代码搞定TCGA的6种表达矩阵和临床信息](https://mp.weixin.qq.com/s/z1fgyXLZXwmoaI39f2ftYw) 105 | - [easyTCGA:1行代码搞定TCGA突变maf文件下载和整理](https://mp.weixin.qq.com/s/GBkB8Hv45l06BVnyFNFzzw) 106 | - [easyTCGA生存分析支持最佳截点,任意基因在不同组中的表达量箱线图](https://mp.weixin.qq.com/s/Qc9m6hX-qKVJt5GzrXY9bA) 107 | - [TCGA、GTEx的泛癌数据也是1行代码整理](https://mp.weixin.qq.com/s/SzGB1wVH_DNBbXxvkBe5NA) 108 | - [任意基因在泛癌中的表达量展示](https://mp.weixin.qq.com/s/MIDRG57oRSMTyX6Gm99-3w) 109 | - [b站视频教程](https://space.bilibili.com/42460432);视频教程略旧,很多新特性没介绍 110 | 111 | ## 甲基化 112 | 113 | - [TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s/xbgQvGr0Q5DzBUqg8b__Zg) 114 | - [ChAMP分析甲基化数据:样本信息csv的制作和IDAT读取](https://mp.weixin.qq.com/s/O_W-P_HpziXtNMZXZm8b4w) 115 | - [ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s/1xpT1E4BaWG-ulrCzylwrA) 116 | - [ChAMP分析甲基化数据:从β值矩阵开始的流程](https://mp.weixin.qq.com/s/5x4oeJ6E0BPqtTjmEFPMcg) 117 | - [ChAMP分析TCGA结直肠癌的甲基化数据!](https://mp.weixin.qq.com/s/TB3LTaq55yqL-Z95wY-rQA) 118 | - [minfi包处理甲基化数据](https://mp.weixin.qq.com/s/E8j6KhEigcALgXA8fZIs9Q) 119 | 120 | ## 泛癌 121 | 122 | - [TCGA、GTEx的泛癌数据也是1行代码整理](https://mp.weixin.qq.com/s/SzGB1wVH_DNBbXxvkBe5NA) 123 | 124 | - [任意基因在泛癌中的表达量展示](https://mp.weixin.qq.com/s/MIDRG57oRSMTyX6Gm99-3w) 125 | 126 | - 泛癌的GSVA和GSEA等 127 | 128 | - 泛癌多组学 129 | 130 | ## 单细胞 131 | 132 | - [单细胞入门之Seurat标准流程](https://mp.weixin.qq.com/s/ymdhvgcqyek2wGsDgKChfg) 133 | - [单细胞入门之多样本整合](https://mp.weixin.qq.com/s/3w_-rYSdA31xxH83qaUy2Q) 134 | - [单细胞入门之细胞类型鉴定](https://mp.weixin.qq.com/s/Sdx9oLC9LII7iyYl0VLKlg) 135 | 136 | ## 单基因 137 | 138 | - [单基因富集分析](https://mp.weixin.qq.com/s/q6nkujgTYlbOQpkENjyyxA) 139 | 140 | - [单基因差异分析并绘制火山图和热图](https://mp.weixin.qq.com/s/IZ7_46zJjXba7I73-Im9hw) 141 | 142 | ## SIC图表学习 143 | 144 | ### [Exp Hematol Oncol Fig1 Fig2a/b](https://ehoonline.biomedcentral.com/articles/10.1186/s40164-021-00200-x) 145 | 146 | - [ggplot2绘制突变全景图](https://mp.weixin.qq.com/s/IOk1Lbi3sVIDjwMk5Jz-iA) 147 | 148 | ### [Nat.Commun Fig1](https://www.nature.com/articles/s41467-022-28421-6) 149 | 150 | - [批次效应去除之combat和removebatcheffect](https://mp.weixin.qq.com/s/yRUmVTimI9f9itoHWxyYrA) 151 | - [免疫浸润结果分子分型(一致性聚类ConsensusClusterPlus)](https://mp.weixin.qq.com/s/96s_hfBH0HjLvvTfNgTIlQ) 152 | - [免疫相关lncRNA的识别](https://mp.weixin.qq.com/s/jrgZ6brGyrh1cAnW6Ddp3w) 153 | - [WGCNA实战:识别免疫相关lncRNA](https://mp.weixin.qq.com/s/Pr33WscVtNQQaoryxTiJ-Q) 154 | - 汇总版:[SCI图表学习:1篇NC的Fig1](https://mp.weixin.qq.com/s/6-owPiL_hgVInXOsWOO9Fw) 155 | 156 | ### [Molecular Cancer Fig1E Fig2A](https://molecular-cancer.biomedcentral.com/articles/10.1186/s12943-020-01170-0) 157 | 158 | - [3D-PCA图](https://mp.weixin.qq.com/s/LTQIWYW86QCOEu7fctF8xQ) 159 | - [R语言生信图表学习之网络图](https://mp.weixin.qq.com/s/t8UrYMO5fDkFjB2GI8WuXQ) 160 | 161 | ## 其他 162 | 163 | - [免疫相关lncRNA的识别](https://mp.weixin.qq.com/s/jrgZ6brGyrh1cAnW6Ddp3w) 164 | 165 | -------------------------------------------------------------------------------- /easyTCGA/1行代码提取6种TCGA表达矩阵和临床信息.md: -------------------------------------------------------------------------------- 1 | 之前的2行代码提取表达矩阵由于大家的R语言水平参差不齐,导致很多新手会报错,于是我把前面的代码打包为一个脚本,1行代码就可以了! 2 | 3 | 脚本已上传到QQ群,需要的小伙伴加群下载即可~ 4 | 5 | **只需要1行代码就可以获取分别获取mRNA和lncRNA的counts/fpkm/tpm总计6种类型类型的表达矩阵以及临床信息,表达矩阵是标准形式,行是基因,列是样本,行名是gene symbol。** 6 | 7 | >**使用这种方法有4个前提条件:** 8 | > 9 | >- `TCGAbiolinks`包的版本必须要在2.25.1以上 10 | >- 需要使用`TCGAbiolinks`下载的数据或者按照这个教程下载的数据:可能是最适合初学者的TCGA下载教程 11 | >- 必须按照这篇教程构建正确的路径:手动下载的TCGA数据也可以用TCGAbiolinks包整理 12 | >- 脚本必须和`GDCdata`放在一个路径下 13 | 14 | ## 使用方法 15 | 16 | 加载需要的R包: 17 | 18 | ```{r,echo=FALSE} 19 | library(TCGAbiolinks) 20 | library(SummarizedExperiment) 21 | library(tidyverse) 22 | ``` 23 | 24 | 加载脚本"getTCGAexpr.r",这个脚本必须和**GDCdata**位于同一个位置。 25 | 26 | ![脚本位置必须对!](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929132733384.png) 27 | 28 | 加载这个脚本: 29 | 30 | ```{r} 31 | source("getTCGAexpr.r") 32 | ``` 33 | 34 | 使用函数,需要提供TCGA的癌症简称,比如:TCGA-LUSC。 35 | 36 | ```{r} 37 | getTCGAexpr(project = "TCGA-LUSC") 38 | 39 | ##-------------------------------------- 40 | ##o GDCquery: Searching in GDC database 41 | ##-------------------------------------- 42 | ##Genome of reference: hg38 43 | ##-------------------------------------------- 44 | ##oo Accessing GDC. This might take a while... 45 | ##-------------------------------------------- 46 | ##ooo Project: TCGA-LUSC 47 | ##-------------------- 48 | ##oo Filtering results 49 | ##-------------------- 50 | ##ooo By data.type 51 | ##ooo By workflow.type 52 | ##---------------- 53 | ##oo Checking data 54 | ##---------------- 55 | ##ooo Checking if there are duplicated cases 56 | ##ooo Checking if there are results for the query 57 | ##------------------- 58 | ##o Preparing output 59 | ##------------------- 60 | ##|=====================================================|100% ##Completed after 16 s 61 | ##Starting to add information to samples 62 | ## => Add clinical information to samples 63 | ## => Adding TCGA molecular information from marker papers 64 | ## => Information will have prefix 'paper_' 65 | ##lusc subtype information from:doi:10.1038/nature11404 66 | ##Available assays in SummarizedExperiment : 67 | ## => unstranded 68 | ## => stranded_first 69 | ## => stranded_second 70 | ## => tpm_unstrand 71 | ## => fpkm_unstrand 72 | ## => fpkm_uq_unstrand 73 | ##=> Saving file: output_expr/TCGA-LUSC_expr.rdata 74 | ##=> File saved 75 | ``` 76 | 77 | 全程不到一分钟即可! 78 | 79 | 完成后会在当前目录多出一个**output_expr**文件夹,里面就是6个表达矩阵和临床信息: 80 | 81 | ![完成后会多出一个文件夹](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929132755500.png) 82 | 83 | **output_expr**文件夹里面就是提取好的信息: 84 | 85 | ![提取好的表达矩阵和临床信息](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929133048502.png) 86 | 87 | - `TCGA-LUSC_expr.rdata`:原始的se对象,所有信息都是从这里面提取的; 88 | - `TCGA-LUSC_clinical.rdata`:TCGA-LUSC的临床信息; 89 | - `TCGA-LUSC_lncRNA_expr_counts.rdata`:lncRNA的counts矩阵; 90 | - `TCGA-LUSC_lncRNA_expr_fpkm.rdata`:lncRNA的fpkm矩阵; 91 | - `TCGA-LUSC_lncRNA_expr_tpm.rdata`:lncRNA的tpm矩阵; 92 | - `TCGA-LUSC_mRNA_expr_counts.rdata`:mRNA的counts矩阵; 93 | - `TCGA-LUSC_mRNA_expr_fpkm.rdata`:mRNA的fpkm矩阵; 94 | - `TCGA-LUSC_mRNA_expr_tpm.rdata`:mRNA的tpm矩阵; 95 | 96 | 97 | 98 | 表达矩阵示例: 99 | 100 | ![lncRNA的counts矩阵](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929133408560.png) 101 | 102 | ![mRNA的counts矩阵](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929133522374.png) 103 | 104 | 105 | 106 | ![mRNA的tpm矩阵](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929134624108.png) 107 | 108 | ![临床信息](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929133658274.png) -------------------------------------------------------------------------------- /easyTCGA/1行代码提取表达矩阵2.0版本.md: -------------------------------------------------------------------------------- 1 | 2 | 之前写了一个脚本,可以让大家1行代码提取6种类型的表达矩阵以及对应的临床信息。**但是很多人完全看不见注意事项或者根本看不懂,所以我决定改动一下。** 3 | 4 | 上一版的脚本主要报错是这个: 5 | 6 | 7 | ```r 8 | Error in GDCprepare(query, save = T, save.filename = "tcga_read.rdata") : 9 | I couldn't find all the files from the query. Please check if the directory parameter is right or `GDCdownload` downloaded the samples. 10 | ``` 11 | 12 | 原因无非就是3种可能: 13 | 14 | - `TCGAbiolinks`的版本不是2.25.1以上 15 | - 路径不对 16 | - 下载的方式不正确 17 | 18 | ## 首先解决R包版本的问题 19 | 20 | 你可以用以下代码检查自己的`TCGAbiolinks`包的版本: 21 | 22 | 23 | ```r 24 | packageVersion("TCGAbiolinks") 25 | ## [1] '2.25.2' 26 | ``` 27 | 28 | 如果是在2.25.1以下,需要安装开发版本的`TCGAbiolinks`包,安装方法如下: 29 | 30 | 31 | ```r 32 | if (!requireNamespace("BiocManager", quietly = TRUE)) 33 | install.packages("BiocManager") 34 | BiocManager::install("BioinformaticsFMRP/TCGAbiolinksGUI.data") 35 | BiocManager::install("BioinformaticsFMRP/TCGAbiolinks") 36 | ``` 37 | 38 | 安装完成后,重新使用`packageVersion("TCGAbiolinks")`查看版本。 39 | 40 | 如果你用上面的安装代码报错,那么你的R语言基础可能不过关,你需要参考以下教程:可能是最好用的R包安装教程! 41 | 42 | ## 然后是路径问题 43 | 44 | **路径必须要正确,你位置都搞错了,代码找不到你放文件的位置,那肯定是报错!**路径设置可以参考这篇推文:手动下载的TCGA也是可以用TCGAbiolinks整理的。 45 | 46 | 我在里面说的非常清楚,你的文件路径必须是在**GDCdata\TCGA-COAD\harmonized\Transcriptome_Profiling\Gene_Expression_Quantification**这个路径下,而且脚本`getTCGAexpr.r`必须和`GDCdata`在同一个文件夹下!!!! 47 | 48 | ![脚本位置必须对!](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929132733384.png) 49 | 50 | ## 下载方式问题 51 | 52 | 如果你是直接用`TCGAbiolinks`下载的数据,那么路径一般不会有大问题,只要你把脚本和GDCdata放在同一个文件夹下就行了。 53 | 54 | 如果你是在官网下载的,或者用gdc_clinet下载的,就必须按照这篇推文介绍的方法进行选择:可能是最适合初学者的TCGA数据下载教程,**命令行或者图形界面都可以,关键是选择的时候一定要选对!!**如果没选对,就会出现开头所示的报错!! 55 | 56 | --- 57 | 58 | 以上3个问题,我在脚本使用注意里都明确说明了,实在是不懂为什么还有那么多问题!!! 59 | 60 | ## 2.0版本 61 | 62 | 我觉得有一部分是我的原因,作为一个已经学会的人,我已经忘记了自己不会的时候是什么样子,现在也无法理解初学者为什么会遇到那么多报错。 63 | 64 | 所以我改了一下脚本,1行代码下载并整理6种类型的TCGA表达矩阵和临床信息!! 65 | 66 | **主要是以下改进:** 67 | 68 | - 在任何位置都可以运行,不需要构建路径! 69 | - 会自动下载数据,不需要手动下载 70 | 71 | 2.0版本的脚本我也放在了QQ群里,需要的加群下载即可。 72 | 73 | 使用方法和之前一模一样!! 74 | 75 | **但我还是建议你先看一下使用注意!!** 76 | 77 | - 需要良好的网络 78 | - `TCGAbiolinks`包的版本必须要在2.25.1以上 79 | 80 | **下面是使用方法:** 81 | 82 | 加载需要的R包: 83 | 84 | 85 | ```r 86 | library(TCGAbiolinks) 87 | library(SummarizedExperiment) 88 | library(tidyverse) 89 | ``` 90 | 91 | 加载脚本"getTCGAexpr.r": 92 | 93 | 94 | ```r 95 | source("getTCGAexpr.r") 96 | ``` 97 | 98 | 使用函数,需要提供TCGA的癌症简称,比如:TCGA-LUSC。 99 | 100 | 101 | ```r 102 | getTCGAexpr(project = "TCGA-LUSC") 103 | ``` 104 | 105 | 这个脚本会自动从GDC官网下载最新的数据,所以需要联网,如果你的网络不好,可以手动下载,按照这篇推文自己构建合适的路径:xxxxxxx,它也可以成功! 106 | 107 | 完成后会在当前目录多出一个**output_expr**文件夹,里面就是6个表达矩阵和临床信息 108 | 109 | ![提取好的表达矩阵和临床信息](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220929133048502.png) 110 | 111 | - TCGA-LUSC_expr.rdata:原始的se对象,所有信息都是从这里面提取的; 112 | - TCGA-LUSC_clinical.rdata:TCGA-LUSC的临床信息; 113 | - TCGA-LUSC_lncRNA_expr_counts.rdata:lncRNA的counts矩阵; 114 | - TCGA-LUSC_lncRNA_expr_fpkm.rdata:lncRNA的fpkm矩阵; 115 | - TCGA-LUSC_lncRNA_expr_tpm.rdata:lncRNA的tpm矩阵; 116 | - TCGA-LUSC_mRNA_expr_counts.rdata:mRNA的counts矩阵; 117 | - TCGA-LUSC_mRNA_expr_fpkm.rdata:mRNA的fpkm矩阵; 118 | - TCGA-LUSC_mRNA_expr_tpm.rdata:mRNA的tpm矩阵; 119 | 120 | -------------------------------------------------------------------------------- /easyTCGA/1行代码整理泛癌数据.md: -------------------------------------------------------------------------------- 1 | TCGA和GTEx的泛癌数据分析也是生信数据挖掘的必备技能,目前最好用的泛癌数据肯定是`XENA`网站上整理好的啦。我们直接下载用即可。而且`XENA`的数据估计短时间不会更新的,所以基本上是一次整理永久使用! 2 | 3 | 我把整理泛癌数据的代码也写成了一个函数`getpancancer_xena()`,并放到了`easyTCGA`包中,大家安装即可使用。 4 | 5 | ## 安装 6 | 7 | > 详细信息请参考:[ayueme/easyTCGA: Speed up your TCGA analysis! (github.com)](https://github.com/ayueme/easyTCGA) 8 | 9 | 首先安装依赖包: 10 | 11 | ```R 12 | # 安装bioconductor上面的R包 13 | options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor") 14 | if(!require("BiocManager")) install.packages("BiocManager") 15 | if(!require("TCGAbiolinks")) BiocManager::install("TCGAbiolinks") 16 | if(!require("SummarizedExperiment")) BiocManager::install("SummarizedExperiment") 17 | if(!require("DESeq2")) BiocManager::install("DESeq2") 18 | if(!require("edgeR")) BiocManager::install("edgeR") 19 | if(!require("limma")) BiocManager::install("limma") 20 | 21 | # 安装cran上面的R包 22 | if(!require("survival")) install.packages("survival") 23 | if(!require("broom")) install.packages("broom") 24 | if(!require("devtools")) install.packages("devtools") 25 | if(!require("cli")) install.packages("cli") 26 | if(!require("reshape2")) install.packages("reshape2") 27 | if(!require("data.table")) install.packages("data.table") 28 | if(!require("ggplot2")) install.packages("ggplot2") 29 | if(!require("ggpubr")) install.packages("ggpubr") 30 | ``` 31 | 32 | 再安装`easyTCGA`包: 33 | 34 | ```R 35 | devtools::install_github("ayueme/easyTCGA") 36 | ``` 37 | 38 | ## 主要功能 39 | 40 | ## 直接获取 41 | 42 | 如果不想自己跑一遍,或者电脑配置太低(需要至少16GB运行内存)总是失败,也可以在公众号后台回复**pancancer**,即可获取**整理好的rdata文件以及从XENA下载的4个文件**。 43 | 44 | 一共是14个文件,各个文件的详情请继续往下看: 45 | 46 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230526210659464.png) 47 | 48 | ## TCGA pan-cancer 49 | 50 | 如果只是单纯的想要`TCGA pan-cancer`,我们只要下载TCGA的表达矩阵即可,下载网址是: 51 | 52 | - https://toil-xena-hub.s3.us-east-1.amazonaws.com/download/tcga_RSEM_gene_tpm.gz 53 | 54 | 但通常我们可能还需要对应的临床信息,所以还需要下载临床信息文件,下载网址是: 55 | 56 | - https://tcga-pancan-atlas-hub.s3.us-east-1.amazonaws.com/download/Survival_SupplementalTable_S1_20171025_xena_sp 57 | 58 | 下载完成后,我们只要用`getpancancer_xena()`函数即可完成整理: 59 | 60 | ```R 61 | # 首先是指定下载的文件 62 | tcga_expr_file <- "download_from_xena/tcga_RSEM_gene_tpm.gz" 63 | tcga_clin_file <- "download_from_xena/Survival_SupplementalTable_S1_20171025_xena_sp.gz" 64 | 65 | # 然后1行代码即可 66 | getpancancer_xena(tcga_expr_file = tcga_expr_file, 67 | tcga_clin_file = tcga_clin_file, 68 | type = "tcga") 69 | ``` 70 | 71 | 大概5分钟左右即可整理好(根据电脑配置不同时间也会不一样),可以得到以下`4个rdata文件`,存放在当前工作目录下的`output_pancancer_xena`文件夹下: 72 | 73 | - `TCGA_pancancer_expr.rdata`:TCGA的表达矩阵,行是基因,列是样本 74 | - `TCGA_pancancer_clin.rdata`:TCGA样本的临床信息,样本数量和顺序和上面的表达矩阵的样本数量和顺序完全一致 75 | - `TCGA_pancancer_lncrna_clin.rdata`:lncRNA和样本信息整合到一起的数据,行是样本,列是基因,前34列是临床信息,包含生存数据 76 | - `TCGA_pancancer_mrna_clin.rdata`:mRNA和样本信息整合到一起的数据,行是样本,列是基因,前34列是临床信息,包含生存数据。 77 | 78 | 有了这个数据你就可以做各种泛癌的数据分析了! 79 | 80 | ## GTEx pan-cancer 81 | 82 | GTEx的泛癌数据也是一样整理,首先下载**表达矩阵文件和样本信息文件**: 83 | 84 | - https://toil-xena-hub.s3.us-east-1.amazonaws.com/download/gtex_RSEM_gene_tpm.gz 85 | - https://toil-xena-hub.s3.us-east-1.amazonaws.com/download/GTEX_phenotype.gz 86 | 87 | 然后也是一样的用法: 88 | 89 | ```R 90 | # 首先是指定下载的文件 91 | gtex_expr_file <- "download_from_xena/gtex_RSEM_gene_tpm.gz" 92 | gtex_pheno_file <- "download_from_xena/GTEX_phenotype.gz" 93 | 94 | # 然后1行代码即可 95 | getpancancer_xena(gtex_expr_file = gtex_expr_file, 96 | gtex_pheno_file = gtex_pheno_file, 97 | type = "gtex") 98 | ``` 99 | 100 | 整理结束后也会得到4个文件,存放在当前工作目录下的`output_pancancer_xena`下: 101 | 102 | - `GTEx_pancancer_expr.rdata`:GTEx的表达矩阵,行是基因,列是样本 103 | - `GTEx_pancancer_pheno.rdata`:GTEx的样本信息,样本数量和顺序和上面的表达矩阵的样本数量和顺序完全一致 104 | - `GTEx_pancancer_lncrna_pheno.rdata`:lncRNA和样本信息整合到一起的数据,行是样本,列是基因,前2列是sample_id和sample_type 105 | - `GTEx_pancancer_mrna_pheno.rdata`:mRNA和样本信息整合到一起的数据,行是样本,列是基因,前2列是sample_id和sample_type 106 | 107 | ## TCGA+GTEx pan-cancer 108 | 109 | **TCGA和GTEx并不是一对一的关系**,如下图所示(这个对应关系表可以在GEPIA网站免费下载),TCGA的很多project在GTEx里是没有对应的样本的,并且GTEx和TCGA是1对多的关系哦~ 110 | 111 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230526211021205.png) 112 | 113 | 如果是需要TCGA+GTEx的泛癌数据,那就**需要同时提供4个文件**,但是整理也是1行代码即可: 114 | 115 | ```R 116 | tcga_expr_file <- "download_from_xena/tcga_RSEM_gene_tpm.gz" 117 | tcga_clin_file <- "download_from_xena/Survival_SupplementalTable_S1_20171025_xena_sp.gz" 118 | gtex_expr_file <- "download_from_xena/gtex_RSEM_gene_tpm.gz" 119 | gtex_pheno_file <- "download_from_xena/GTEX_phenotype.gz" 120 | 121 | getpancancer_xena(tcga_expr_file = tcga_expr_file, 122 | tcga_clin_file = tcga_clin_file, 123 | gtex_expr_file = gtex_expr_file, 124 | gtex_pheno_file = gtex_pheno_file, 125 | type = "tcga+gtex") 126 | ``` 127 | 128 | 除了会得到以上的8个`rdata`文件外,还会得到另外**2个整合好的TCGA+GTEx数据**: 129 | 130 | - `TCGA_GTEx_pancancer_lncRNA_pheno.rdata`:TCGA和GTEx整合到一起的lncRNA表达矩阵和样本信息,注意:行是样本!前4列是样本信息,后面的列是lncRNA 131 | - `TCGA_GTEx_pancancer_mRNA_pheno.rdata`:TCGA和GTEx整合到一起的mRNA表达矩阵和样本信息,注意:行是样本!前4列是样本信息,后面的列是mRNA 132 | 133 | ## 后续分析 134 | 135 | 有了数据就可以在进行各种分析了,前提是你的R语言基础够好,比如可以试着学习果子老师这几篇推文里的图: 136 | 137 | - [跟Nature一起学习TCGA,GTEx和CCLE数据库的使用](https://mp.weixin.qq.com/s/_04Mx72q-jQigkCzfZ20Kw) 138 | - [高能推荐!批量在多个组织中找出跟你的分子最相关的基因](https://mp.weixin.qq.com/s/n9DtRBOodjRYy4l5o2lBaA) 139 | 140 | 又或者是这种各种花里胡哨的单基因泛癌的表达量展示: 141 | 142 | - [单基因泛癌Fig1](https://mp.weixin.qq.com/s/salE-C8UHS1qTfL6-Zl_8w) 143 | 144 | 如果你不会也没关系,上面这这些分析果子老师已经开发了专门的网站实现,点点点即可: 145 | 146 | - http://guotosky.vip:13838/GTBA/ 147 | - http://guotosky.vip:13838/GPSA/ 148 | 149 | 后续可能会把一些常用的分析和展示写成函数,加入到`easyTCGA`包里,但肯定没有鼠标点点点简单了~ -------------------------------------------------------------------------------- /easyTCGA/easyTCGA1行代码下载基因表达数据.md: -------------------------------------------------------------------------------- 1 | # `easyTCGA`:让初学者也能感受"征服"`TCGA`的喜悦 2 | 3 | ## 为什么要写这个R包 4 | 5 | 生信数据挖掘必不可少要学习`TCGA`数据库,但是对于新手,经常卡在第一步:**下载和整理数据**。第一步完成了,又会卡在第二步,第三步:差异分析,生存分析...... 6 | 7 | 对于R语言大神来说都不是问题,非常简单的R语言操作而已。但是对于初学者很难理解。 8 | 9 | 这几步操作又是必不可少的,我自己也经常需要重新下载整理数据。为了简化这几个流程,同时也是**让初学者也能感受到"征服"`TCGA`的喜悦**,我把自己常用的一些代码打包,写个R包玩玩。 10 | 11 | ## 安装 12 | 13 | 首先安装依赖包: 14 | 15 | ```R 16 | # 安装bioconductor上面的R包 17 | options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor") 18 | if(!require("BiocManager")) install.packages("BiocManager") 19 | if(!require("TCGAbiolinks")) BiocManager::install("TCGAbiolinks") 20 | if(!require("SummarizedExperiment")) BiocManager::install("SummarizedExperiment") 21 | if(!require("DESeq2")) BiocManager::install("DESeq2") 22 | if(!require("edgeR")) BiocManager::install("edgeR") 23 | if(!require("limma")) BiocManager::install("limma") 24 | 25 | # 安装cran上面的R包 26 | if(!require("survival")) install.packages("survival") 27 | if(!require("broom")) install.packages("broom") 28 | if(!require("devtools")) install.packages("devtools") 29 | if(!require("cli")) install.packages("cli") 30 | ``` 31 | 32 | 再安装`easyTCGA`包: 33 | 34 | ```R 35 | devtools::install_github("ayueme/easyTCGA") 36 | ``` 37 | 38 | ## 主要功能 39 | 40 | > 1行代码实现1个常见分析! 41 | 42 | - `getmrnaexpr` 43 | - 只需要提供正确的`TCGA project`名字即可; 44 | - 自动下载并整理`mRNA`和`lncRNA`的`counts,tpm,fpkm`共6种表达矩阵,以及对应的临床信息,临床信息样本顺序和表达矩阵样本顺序完全一致,无需再次整理; 45 | - 自动保存以上6种表达矩阵和临床信息到当前工作目录下的`output_mRNA_lncRNA_expr`文件夹下,并且同时保存`rdata`和`csv`两种文件格式; 46 | - 下载的数据为最新数据,和`GDC TCGA`[官网](https://portal.gdc.cancer.gov/)保持一致; 47 | - 支持通过手动下载的TCGA数据进行自动整理并完成以上过程 48 | - `getmrnaexpr_xena` 49 | - 用于`XENA`网站下载的基因表达数据和临床信息的整理(`gdchub`) 50 | - 直接提供文件名即可,比如:`TCGA-ACC.htseq_counts.tsv.gz`,`TCGA-ACC.GDC_phenotype.tsv.gz` 51 | - 自动保存`mRNA`、`lncRNA`表达矩阵和临床信息到当前工作目录下的`output_mRNA_expr_xena`文件夹下 52 | - (单独使用和GDC官方数据没有任何优势) 53 | 54 | - `getmirnaexpr` 55 | - 只需要提供正确的`TCGA project`名字即可; 56 | - 自动下载并整理`miRNA`的`counts,rpm`2种表达矩阵; 57 | - 自动保存以上2种表达矩阵和对应的临床信息到当前工作目录下的`output_miRNA_expr`文件夹下,并且同时保存`rdata`和`csv`两种文件格式; 58 | - 下载的数据为最新数据,和`GDC TCGA`[官网](https://portal.gdc.cancer.gov/)保持一致 59 | - `getsnvmaf` 60 | - 只需要提供正确的`TCGA project`名字即可; 61 | - 自动下载并整理`TCGA MAF`文件(masked somatic mutation)以及对应的临床信息,并自动保存到当前工作目录下的`output_snv`文件夹下; 62 | - 输出结果可以直接通过`maftools::read_maf()`函数读取,无需再次整理 63 | - `diff_analysis` 64 | - 与`getmrnaexpr`和`getmirnaexpr`函数无缝对接,直接使用其输出结果即可(只支持`counts`矩阵),无需任何整理; 65 | - 支持输入自己的表达矩阵和自定义分组; 66 | - 自动通过3个R包进行差异分析:`DESeq2, edgeR, limma`; 67 | - 输出结果默认为1个`list`,内含3种差异分析结果,支持保存`rdata`格式数据到本地 68 | - `batch_survival` 69 | - 自动对大约20000个基因进行`logrank`检验和单因素`cox`分析,默认基于**最佳截点(P值最小)**; 70 | - 与`getmrnaexpr`函数无缝对接,直接使用其输出结果即可,无需任何整理; 71 | - 支持`counts,tpm,fpkm`3种格式的数据,如果是`counts`,则通过`DESeq2::vst()`进行转换,如果是`tpm/fpkm`,则进行`log2(x + 0.1)`转换; 72 | - 支持打印基因序号到屏幕,方便定位有问题的基因 73 | 74 | ## 使用教程 75 | 76 | 文字版使用教程请关注公众号:**医学和生信笔记** 77 | 78 | 视频版教程请关注哔哩哔哩:[阿越就是我](https://space.bilibili.com/42460432) 79 | 80 | ## 问题反馈 81 | 82 | B站,公众号,Github,粉丝QQ群,都可以。 83 | 84 | ## 使用注意 85 | 86 | 需要自己解决网络问题,比如访问`github,TCGA官网, google`等,如果你无法解决网络问题,那么生信数据挖掘可能不适合你...... 87 | 88 | ## TO DO 89 | 90 | - [x] 支持`XENA`网站下载的`gene expression`和临床数据的整理 91 | - [ ] 支持`XENA`泛癌数据的整理 92 | - [x] 增加对`miRNA`的差异分析支持 93 | - [x] 增加对`miRNA`的批量生存分析支持 94 | - [x] 增加对自定义表达矩阵/自定义分组差异分析的支持 95 | - [ ] 增加对多分组差异分析的支持 96 | - [x] 增加对`lncRNA`的差异分析和批量生存分析支持 97 | - [ ] ...... 98 | 99 | -------------------------------------------------------------------------------- /easyTCGA/easyTCGA可视化函数.md: -------------------------------------------------------------------------------- 1 | 前几天看到了生信技能树的推文:[什么情况下我们可以修改基因名字](https://mp.weixin.qq.com/s/vPE1Mvj-GHgktwAU3NWwmg) 2 | 3 | 里面提到了2个函数很好用: 4 | 5 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230516152439283.png) 6 | 7 | 其实这个需求我知道在小洁老师的R包`tinyarray`里有函数可以实现:[宝藏R包tinyarray:常用图表一键收走](https://mp.weixin.qq.com/s/cdcuwqajMqp1t9Gs0-jEfA) 8 | 9 | 我还知道果子老师在2018年就介绍过这个技能了:[多个基因在多亚组疾病中的展示](https://mp.weixin.qq.com/s/DOvSutbqotCK5JDHFdjFaw) 10 | 11 | 感觉这个函数非常实用,于是我也想写一个。 12 | 13 | 写好之后我把它们加在`easyTCGA`包里了。 14 | 15 | 目前`easyTCGA`已经完美支持TCGA常见5种组学数据的下载和整理:**gene**、**miRNA**、**Copy Number Variation**、 16 | 17 | **simple nucleotide variation**、**DNA methylation** 18 | 19 | **批量生存分析也默认支持最佳截点了**。 20 | 21 | 大家可以去github了解详情:https://github.com/ayueme/easyTCGA 22 | 23 | 今天主要说下几个可视化小函数。 24 | 25 | ## 准备数据 26 | 27 | 以`TCGA-BRCA`为例。 28 | 29 | 30 | ```r 31 | library(easyTCGA) 32 | #getmrnaexpr("TCGA-BRCA") # 下载只要1行代码 33 | load(file = "G:/easyTCGA_test/output_mRNA_lncRNA_expr/TCGA-BRCA_mrna_expr_tpm.rdata") 34 | load(file = "G:/easyTCGA_test/output_mRNA_lncRNA_expr/TCGA-BRCA_clinical.rdata") 35 | ``` 36 | 37 | 准备表达数据,分子,和组别。 38 | 39 | 40 | ```r 41 | expr <- log2(mrna_expr_tpm+0.1) 42 | marker <- "CXCL1" 43 | markers <- c("CXCL1","TP53","BRAF","EGFR","CTLA4","VEGFB","NTRK2") 44 | sample_group <- ifelse(as.numeric(substr(colnames(expr),14,15))<10,"tumor","normal") 45 | table(sample_group) 46 | ## sample_group 47 | ## normal tumor 48 | ## 113 1118 49 | sample_groups <- clin_info$paper_BRCA_Subtype_PAM50 #临床信息非常丰富! 50 | table(sample_groups) 51 | ## sample_groups 52 | ## Basal Her2 LumA LumB Normal 53 | ## 197 82 571 209 40 54 | ``` 55 | 56 | ## plot_gene 57 | 58 | 首先是`plot_gene`。可以实现:*任意数量基因在任意癌种(TCGA33种其中之一都可以)的任意分组中的表达量箱线图* 59 | 60 | 1个基因在两个组的表达量: 61 | 62 | 63 | ```r 64 | res <- plot_gene(expr = expr,marker,sample_group) 65 | ``` 66 | 67 | ![plot of chunk unnamed-chunk-3](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-3-174794620.png) 68 | 69 | 多个基因在两个组的表达量: 70 | 71 | 72 | ```r 73 | res <- plot_gene(expr = expr,markers,sample_group) 74 | ``` 75 | 76 | ![plot of chunk unnamed-chunk-4](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-4-174794620.png) 77 | 78 | 1个基因在多个组的表达量: 79 | 80 | 81 | ```r 82 | res <- plot_gene(expr = expr,marker,sample_groups) 83 | ``` 84 | 85 | ![plot of chunk unnamed-chunk-5](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-5-174794620.png) 86 | 87 | 多个基因在多个组的表达量: 88 | 89 | 90 | ```r 91 | res <- plot_gene(expr = expr,markers,sample_groups) 92 | ``` 93 | 94 | ![plot of chunk unnamed-chunk-6](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-6-174794620.png) 95 | 96 | 当然大家对美的追求是无止境的,所以每个画图函数都可以返回画图数据,方便你DIY。 97 | 98 | 99 | ```r 100 | head(res) 101 | ## sample_id group markers expression 102 | ## 1 TCGA-B6-A0RH-01A-21R-A115-07 Her2 CXCL1 -2.9072513 103 | ## 2 TCGA-BH-A1FU-11A-23R-A14D-07 CXCL1 2.3879966 104 | ## 3 TCGA-BH-A1FU-01A-11R-A14D-07 Normal CXCL1 3.7425560 105 | ## 4 TCGA-AR-A0TX-01A-11R-A084-07 Her2 CXCL1 1.5995082 106 | ## 5 TCGA-A1-A0SE-01A-11R-A084-07 LumA CXCL1 -0.7147754 107 | ## 6 TCGA-BH-A1FC-11A-32R-A13Q-07 CXCL1 5.1622906 108 | ``` 109 | 110 | ## plot_gene_paired 111 | 112 | 任意基因在某一癌种配对样本中的表达量箱线图; 113 | 114 | 115 | ```r 116 | pair_sam <- plot_gene_paired(expr = expr,marker = markers) 117 | ``` 118 | 119 | ![plot of chunk unnamed-chunk-8](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-174794620.png) 120 | 121 | 122 | ```r 123 | pair_sam <- plot_gene_paired(expr = expr,marker = "CXCL1") 124 | ``` 125 | 126 | ![plot of chunk unnamed-chunk-9](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-9-174794620.png) 127 | 128 | 如果你不满意也可以自己用返回的数据画图。 129 | 130 | ## plot_km 131 | 132 | 根据任意基因的表达量分组,并画出K-M生存曲线(支持最佳截点) 133 | 134 | 需要先准备下临床数据,需要一个数据框,只含有两列,列名是`time`和`event`,event用1表示死亡,0表示存活。 135 | 136 | 137 | ```r 138 | # 准备临床数据 139 | clin <- clin_info[,c("days_to_last_follow_up","vital_status")] 140 | names(clin) <- c("time","event") 141 | clin$event <- ifelse(clin$event=="Dead",1,0) 142 | ``` 143 | 144 | 画图,默认根据最佳截点,否则根据中位数,支持返回数据 145 | 146 | 147 | ```r 148 | res <- plot_KM(exprset = expr, marker = marker, clin = clin,optimal_cut = T) 149 | ``` 150 | 151 | ![plot of chunk unnamed-chunk-11](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-11-174794620.png) 152 | 153 | 154 | ```r 155 | res <- plot_KM(exprset = expr, marker = marker, clin = clin,optimal_cut = F) 156 | ``` 157 | 158 | ![plot of chunk unnamed-chunk-12](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-12-174794620.png) 159 | 160 | 最佳截点效果还是很明的! 161 | 162 | 批量生存分析也是默认支持最佳截点的哦。 163 | -------------------------------------------------------------------------------- /easyTCGA/任意基因在泛癌的表达量展示.md: -------------------------------------------------------------------------------- 1 | 有了泛癌的数据之后就可以进行各种分析了,当然这些都是在R语言的基础上进行的。如果你不会R语言,也可以通过各种各样的网页工具实现。 2 | 3 | 我们今天就简单展示下任意基因在泛癌图谱中的表达量情况。 4 | 5 | `TCGA`,`GTEx`,`TCGA+GTEx`的泛癌数据都整理好了,大家可以自己通过`easyTCGA`包实现1行代码整理,也可以直接在公众号后台回复**pancancer**获取整理好的数据。详情请见:[任意基因在泛癌中的表达量展示](https://mp.weixin.qq.com/s/MIDRG57oRSMTyX6Gm99-3w) 6 | 7 | ## GTEx 8 | 9 | GTEx的展示比较简单,最常见的就是某个基因在所有组织中的表达量情况。 10 | 11 | 12 | ```r 13 | # 加载数据 14 | load(file="output_pancancer_xena/GTEx_pancancer_mrna_pheno.rdata") 15 | library(tidyverse) 16 | ## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ── 17 | ## ✔ ggplot2 3.4.1 ✔ purrr 1.0.1 18 | ## ✔ tibble 3.2.1 ✔ dplyr 1.1.1 19 | ## ✔ tidyr 1.3.0 ✔ stringr 1.5.0 20 | ## ✔ readr 2.1.4 ✔ forcats 1.0.0 21 | ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── 22 | ## ✖ dplyr::filter() masks stats::filter() 23 | ## ✖ dplyr::lag() masks stats::lag() 24 | 25 | # 简单看下,这几个泛癌数据的详细情况我都给大家有说明,看一下即可 26 | head(colnames(gtex_mrna_pheno)) 27 | ## [1] "sample_id" "primary_site" "MT-ATP8" "MT-ATP6" "MT-CO2" 28 | ## [6] "MT-CO3" 29 | #table(gtex_mrna_pheno$primary_site) 30 | length(table(gtex_mrna_pheno$primary_site)) 31 | ## [1] 31 32 | ``` 33 | 34 | 接下来以`CXCL1`这个基因为例进行展示。 35 | 36 | 37 | ```r 38 | gene <- "CXCL1" 39 | 40 | # 提取数据就是这么简单 41 | plot_df <- gtex_mrna_pheno %>% 42 | select(1:2,all_of(gene)) 43 | 44 | # 画图即可 45 | ggplot2::ggplot(plot_df, aes(fct_reorder(primary_site,CXCL1),CXCL1))+ 46 | ggplot2::geom_boxplot(aes(fill=primary_site))+ 47 | ggplot2::labs(x=NULL)+ 48 | ggplot2::theme_bw()+ 49 | ggplot2::theme(legend.position = "none",axis.text.x = ggplot2::element_text(angle = 45,hjust = 1)) 50 | ``` 51 | 52 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-2-175935478.png) 53 | 54 | ## TCGA 55 | 56 | 单独使用TCGA泛癌的数据进行展示是花样最多的,你在pubmed中以**pan cancer**为关键词进行检索,基本上其中的Fig1都是类似的箱线图。 57 | 58 | 59 | ```r 60 | # tcga pancancer,前34列是临床信息 61 | rm(list = ls()) 62 | load(file="output_pancancer_xena/TCGA_pancancer_mrna_clin.rdata") 63 | 64 | head(colnames(tcga_mrna_clin)) 65 | ## [1] "sample_id" "patient_id" 66 | ## [3] "project" "age_at_initial_pathologic_diagnosis" 67 | ## [5] "gender" "race" 68 | ``` 69 | 70 | 继续以`CXCL1`这个基因为例进行展示。 71 | 72 | 73 | ```r 74 | gene <- "CXCL1" 75 | 76 | plot_df <- tcga_mrna_clin %>% 77 | select(sample_id,project,all_of(gene)) %>% 78 | # 这个分组你可以任意指定,并不一定要tumor、normal 79 | mutate(sample_type=ifelse(as.numeric(substr(.$sample_id,14,15))<10,"tumor","normal")) 80 | 81 | #tcga pancancer中有很多癌种没有normal哦,要注意! 82 | ggplot2::ggplot(plot_df,aes(project,CXCL1))+ 83 | ggplot2::geom_boxplot(aes(fill=sample_type))+ 84 | ggplot2::labs(x=NULL,y="expression")+ 85 | ggplot2::theme_bw()+ 86 | ggplot2::theme(legend.position = "top", 87 | axis.text.x = ggplot2::element_text(angle = 45,hjust = 1))+ 88 | ggpubr::stat_compare_means(ggplot2::aes(group = sample_type,label = "p.format"), 89 | method = "kruskal.test") 90 | ``` 91 | 92 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-4-175935478.png) 93 | 94 | 或者你也可以展示只在tumor样本中的表达量。 95 | 96 | 97 | ```r 98 | plot_df <- plot_df %>% 99 | filter(sample_type=="tumor") 100 | 101 | ggplot2::ggplot(plot_df,aes(fct_reorder(project,CXCL1),CXCL1))+ 102 | ggplot2::geom_boxplot(aes(fill=project))+ 103 | ggplot2::labs(x=NULL,y="expression")+ 104 | ggplot2::theme_bw()+ 105 | ggplot2::theme(legend.position = "none", 106 | axis.text.x = ggplot2::element_text(angle = 45,hjust = 1)) 107 | ``` 108 | 109 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-5-175935478.png) 110 | 111 | 接下来是大家比较感兴趣的某个基因在泛癌配对样本中的表达。 112 | 113 | 首先我们把泛癌的表达矩阵(这里应该叫转置后的表达矩阵比较合适,一般我我们说表达矩阵就是指行是基因,列是样本的矩阵)按照`project`拆分,然后自定义一个可以提取配对样本的函数: 114 | 115 | 116 | ```r 117 | # 拆分 118 | cancer_list <- split(tcga_mrna_clin,tcga_mrna_clin$project) 119 | 120 | # 自定义函数 121 | get_paired_sample <- function(exprset){ 122 | # get paired samples 123 | sample_group <- ifelse(as.numeric(substr(exprset$sample_id,14,15))<10,"tumor","normal") 124 | tmp <- data.frame(sample_group = sample_group, sample_id=exprset$sample_id,project=exprset$project) 125 | tmp_nor <- tmp[tmp$sample_group=="normal",] 126 | tmp_tum <- tmp[tmp$sample_group=="tumor",] 127 | #每一个normal都有配对的tumor吗?并不是 128 | keep <- intersect(substr(tmp_tum$sample_id,1,12),substr(tmp_nor$sample_id,1,12)) 129 | tmp_tum <- tmp_tum[substr(tmp_tum$sample_id,1,12) %in% keep,] 130 | tmp_tum <- tmp_tum[!duplicated(substr(tmp_tum$sample_id,1,12)),] 131 | tmp_nor <- tmp_nor[substr(tmp_nor$sample_id,1,12) %in% keep,] 132 | tmp_nor <- tmp_nor[!duplicated(substr(tmp_nor$sample_id,1,12)),] 133 | tmp_pair <- rbind(tmp_tum,tmp_nor) 134 | } 135 | ``` 136 | 137 | 接下来就是把这个函数应用于33种癌症中,然后提取`CXCL1`这个基因的画图数据即可: 138 | 139 | 140 | ```r 141 | paired_samples <- do.call(rbind,lapply(cancer_list,get_paired_sample)) 142 | 143 | plot_df <- paired_samples %>% 144 | left_join(tcga_mrna_clin[,c(gene,"sample_id")]) %>% 145 | mutate(sample_id=substr(sample_id,1,12)) 146 | ## Joining with `by = join_by(sample_id)` 147 | ``` 148 | 149 | 接下来画图就是基本功了,`ggplot2`搞定一切,下面这个`interaction`的用法在《R数据可视化手册》中有讲过,我强烈呼吁大家赶紧买本书看看吧!别再天天问图怎么画了! 150 | 151 | 152 | ```r 153 | ggplot(plot_df, aes(interaction(sample_group,project),CXCL1,color=sample_group))+ 154 | ggplot2::geom_point(size=3,position = position_dodge(0.9))+ 155 | ggplot2::geom_line(aes(group=interaction(sample_id,project)),color="grey70")+ 156 | ggplot2::scale_color_manual(values = c("#028EA1","#F2AA9D"))+ 157 | ggplot2::scale_x_discrete(labels = rep(unique(plot_df$project),each=2))+ 158 | ggplot2::theme_bw()+ 159 | ggplot2::theme(legend.position = "top",axis.text.x = element_text(angle = 45,hjust = 1)) 160 | ``` 161 | 162 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-175935478.png) 163 | 164 | 当然还有分面的画法: 165 | 166 | 167 | ```r 168 | #下面是分面 169 | ggplot(plot_df, aes(interaction(sample_group,project),CXCL1,color=sample_group))+ 170 | ggplot2::geom_point(size=3)+ 171 | ggplot2::geom_line(aes(group=interaction(sample_id,project)),color="grey70")+ 172 | ggplot2::scale_color_manual(values = c("#028EA1","#F2AA9D"))+ 173 | ggplot2::scale_x_discrete(name = NULL)+ 174 | ggplot2::facet_grid(~project,scales="free_x",switch = "x")+ 175 | ggplot2::theme_bw()+ 176 | ggplot2::theme(legend.position = "top",axis.text.x = element_blank(), 177 | strip.background = element_blank(), 178 | axis.ticks.x = element_blank() 179 | ,panel.border = element_blank() 180 | ) 181 | ``` 182 | 183 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-9-175935478.png) 184 | 185 | 当然如果你看了书也搞不明白,也可以通过万能的网络解决一切,比如上面这种图,你可以通过关键词搜索:`ggplot2 paired line multi groups`, 实现方式非常多,任你选择。 186 | 187 | ## TCGA+GTEx 188 | 189 | TCGA+GTEx就没有配对展示了,除此之外都和TCGA的泛癌展示方式差不多。 190 | 191 | 192 | ```r 193 | rm(list = ls()) 194 | load(file="output_pancancer_xena/TCGA_GTEx_pancancer_mRNA_pheno.rdata") 195 | 196 | # 前4列是样本信息 197 | head(colnames(tcga_gtex_mrna_pheno)) 198 | ## [1] "sample_id" "sample_type" "project" "primary_site" "MT-ATP6" 199 | ## [6] "MT-CO2" 200 | table(tcga_gtex_mrna_pheno$sample_type) 201 | ## 202 | ## GTEx_normal TCGA_normal TCGA_tumor 203 | ## 7568 712 9784 204 | table(tcga_gtex_mrna_pheno$project) 205 | ## 206 | ## ACC BLCA BRCA CESC CHOL COAD DLBC ESCA GBM HNSC KICH KIRC KIRP LAML LGG LIHC 207 | ## 205 435 1390 319 45 637 491 848 1317 564 119 631 349 243 1674 531 208 | ## LUAD LUSC MESO OV PAAD PCPG PRAD READ SARC SKCM STAD TGCT THCA THYM UCEC UCS 209 | ## 862 836 87 515 350 185 648 410 264 1282 624 302 850 565 272 135 210 | ## UVM 211 | ## 79 212 | ``` 213 | 214 | 继续以`CXCL1`这个基因为例进行展示。 215 | 216 | 用的最多的肯定还是任意基因在不同组别中的表达: 217 | 218 | 219 | ```r 220 | gene <- "CXCL1" 221 | 222 | plot_df <- tcga_gtex_mrna_pheno %>% 223 | select(1:4,all_of(gene)) %>% 224 | filter(sample_type %in% c("GTEx_normal","TCGA_tumor")) 225 | 226 | ggplot(plot_df,aes(project,CXCL1))+ 227 | geom_boxplot(aes(fill=sample_type))+ 228 | theme(legend.position = "top")+ 229 | ggplot2::labs(x=NULL,y="expression")+ 230 | ggplot2::theme_bw()+ 231 | ggplot2::theme(legend.position = "top", 232 | axis.text.x = ggplot2::element_text(angle = 45,hjust = 1)) 233 | ``` 234 | 235 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-11-175935478.png) 236 | 237 | ## 扩展 238 | 239 | 其实任何类似于这个数据的格式都能像这样展示。 240 | 241 | 比如你可以通过`ssGSEA`对泛癌进行免疫浸润分析,这样每个样本都可以有一个得分,这样你就可以展示某个细胞在不同组别中的得分情况。 242 | 243 | 大家一定要多看文献,多积累不同的方法,以及一些好用的网站、图表等,说不定以后就用到了! 244 | 245 | 后面可能会安排几篇图表复现的推文,敬请期待。 246 | -------------------------------------------------------------------------------- /tcga/000tcga合集链接.md: -------------------------------------------------------------------------------- 1 | > 新版TCGA数据库系列推文 2 | 3 | [1.新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g) 4 | 5 | [2.新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ) 6 | 7 | [3.手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 8 | 9 | [4.新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA) 10 | 11 | [5.新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw) 12 | 13 | [6.TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw) 14 | 15 | [7.maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s/1cR3Cnfd5Co9U3jIoIWJBA) 16 | 17 | [8.TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s/xbgQvGr0Q5DzBUqg8b__Zg) 18 | 19 | [9.新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s/0hcQ1m_9l1TtvXgEG20F5Q) 20 | 21 | [10.TCGA官网下载的文件数量竟然和TCGAbiolinks不一致!](https://mp.weixin.qq.com/s/EuEaaBFjK6n6rxmUo27UMw) 22 | 23 | [11.可能是最适合初学者的TCGA官网下载和表达矩阵整理教程](https://mp.weixin.qq.com/s/rbnWvstRsfhbi9il-qSYpQ) 24 | 25 | [12.新版TCGAbiolinks包学习:可视化](https://mp.weixin.qq.com/s/j0f1MDwlNmViqUeXU_Ikow) 26 | 27 | [13.1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 28 | 29 | [14.1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 30 | 31 | [15.1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 32 | 33 | [16.ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s/1xpT1E4BaWG-ulrCzylwrA) 34 | 35 | [17.ChAMP分析甲基化数据:从β值矩阵开始的流程](https://mp.weixin.qq.com/s/5x4oeJ6E0BPqtTjmEFPMcg) 36 | 37 | [18.ChAMP分析TCGA结直肠癌的甲基化数据!](https://mp.weixin.qq.com/s/TB3LTaq55yqL-Z95wY-rQA) 38 | 39 | [19.minfi包处理甲基化数据](https://mp.weixin.qq.com/s/E8j6KhEigcALgXA8fZIs9Q) 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | --- 48 | 49 | 50 | 51 | 1. [新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492403&idx=1&sn=dcb748ca56e4e13181dedc310aaef5e2&scene=21#wechat_redirect) 52 | 2. [新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492462&idx=1&sn=0773b4ad0ecdd7e3cf206cd611249399&scene=21#wechat_redirect) 53 | 3. [手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492480&idx=1&sn=cf05a155c221bc6097db446b688d2ce2&scene=21#wechat_redirect) 54 | 4. [可能是最适合初学者的TCGA官网下载和表达矩阵整理教程](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494248&idx=1&sn=0dbc33000e51f99710a571bf8a7bd204&scene=21#wechat_redirect) 55 | 5. [TCGA官网下载的文件数量竟然和TCGAbiolinks不一致!](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494225&idx=1&sn=9f0de64a864a18248bd8e88568ce1185&scene=21#wechat_redirect) 56 | 6. [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494421&idx=1&sn=1447c6cd80189018e1f888262943f3e3&scene=21#wechat_redirect) 57 | 7. [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494531&idx=1&sn=1d7b8f0c4cfb50b38639a34f6828f126&scene=21#wechat_redirect) 58 | 8. [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247496030&idx=1&sn=103564f89aff76c6a5546e15e26ddef9&scene=21#wechat_redirect) 59 | 9. [新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493493&idx=1&sn=7d805d747aeee3de70cf5384457b5c59&scene=21#wechat_redirect) 60 | 10. [TCGA不同癌种数据合并问题](http://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247496802&idx=1&sn=42d4a1c54c105f3459d6455a51028c7f&chksm=facac4e5cdbd4df3e157812d62336ef2aee8dfd554b22e022048fcc613016f3775d651788f56&scene=21#wechat_redirect) 61 | 11. [TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493492&idx=1&sn=0e7a53ab9f60cdf9abcdf672ad36c834&scene=21#wechat_redirect) 62 | 12. [maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493730&idx=1&sn=05aa20687bf22f6b86aa97dd41fa46d5&scene=21#wechat_redirect) 63 | 13. [新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492794&idx=1&sn=ff9e4aa0c76b0d4adadf0d124f2d90a9&scene=21#wechat_redirect) 64 | 14. [新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492891&idx=1&sn=c7a91c381ef245141dcd09d1912079e5&scene=21#wechat_redirect) 65 | 15. [新版TCGAbiolinks包学习:可视化](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494397&idx=1&sn=2ca5c4e52e54c5cb0d48573c37fa6728&scene=21#wechat_redirect) 66 | 16. [TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493966&idx=1&sn=1990b80608e2bc0871ccc3cd990c8b97&scene=21#wechat_redirect) 67 | 17. [ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494055&idx=1&sn=311e15a0df97dcb12c10433204b19275&scene=21#wechat_redirect) 68 | 18. [ChAMP分析甲基化数据:从β值矩阵开始的流程](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494133&idx=1&sn=498e4bf79101cf22c5132e007283bbb1&scene=21#wechat_redirect) 69 | 19. [ChAMP分析TCGA结直肠癌的甲基化数据!](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494315&idx=1&sn=c8e4e43239883688d912493083d1dfd6&scene=21#wechat_redirect) 70 | 20. [minfi包处理甲基化数据](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247494577&idx=1&sn=581e1f8b7c3e166d40e01bf7e35fb1c3&scene=21#wechat_redirect) 71 | 72 | -------------------------------------------------------------------------------- /tcga/1万个基因批量wilcox检验.md: -------------------------------------------------------------------------------- 1 | 前几天有小伙伴问怎么能批量进行wilcoxon检验,我立马就想到了`rstatix`包。然后才是for循环。 2 | 3 | 接下来就演示下怎么批量进行检验。使用`tidyverse`系列和`base R` 两种方法。 4 | 5 | ## 加载R包和数据 6 | 7 | 既然要优雅,就必须少不了`tidyverse`系列! 8 | 9 | 这个`rstatix`之前介绍过很多次了,你如果想要优雅的做医学统计学,它很重要! 10 | 11 | 12 | ```r 13 | library(rstatix) 14 | ## 15 | ## 载入程辑包:'rstatix' 16 | ## The following object is masked from 'package:stats': 17 | ## 18 | ## filter 19 | library(tidyverse) 20 | ## -- Attaching packages ----------------------------- tidyverse 1.3.1 -- 21 | ## v ggplot2 3.3.5 v purrr 0.3.4 22 | ## v tibble 3.1.6 v dplyr 1.0.8 23 | ## v tidyr 1.2.0 v stringr 1.4.0 24 | ## v readr 2.1.1 v forcats 0.5.1 25 | ## -- Conflicts -------------------------------- tidyverse_conflicts() -- 26 | ## x dplyr::filter() masks rstatix::filter(), stats::filter() 27 | ## x dplyr::lag() masks stats::lag() 28 | 29 | # 加载数据 30 | expr <- readRDS(file = "../000files/20220409.rds") 31 | expr[1:3,1:3] 32 | ## GSM1026687 GSM1026688 GSM1026689 33 | ## PAX8 6.69199 7.10748 7.47710 34 | ## THRA 4.28230 5.71306 5.23010 35 | ## CCL5 8.47402 6.37751 6.02629 36 | ``` 37 | 38 | 39 | 优雅的第一步,把你的数据变成整洁的长数据!毕竟,优雅的数据才能配得上优雅的操作! 40 | 41 | 42 | ```r 43 | expr_long <- expr %>% 44 | rownames_to_column(var = 'genes') %>% 45 | pivot_longer(cols = - genes, names_to = 'samples',values_to = 'values') %>% # 变长变整洁 46 | mutate(groups = rep(c(rep('group1',3),rep('group2',3)),9025)) # 加组别 47 | 48 | head(expr_long) 49 | ## # A tibble: 6 x 4 50 | ## genes samples values groups 51 | ## 52 | ## 1 PAX8 GSM1026687 6.69 group1 53 | ## 2 PAX8 GSM1026688 7.11 group1 54 | ## 3 PAX8 GSM1026689 7.48 group1 55 | ## 4 PAX8 GSM1026693 7.69 group2 56 | ## 5 PAX8 GSM1026694 6.90 group2 57 | ## 6 PAX8 GSM1026696 7.49 group2 58 | ``` 59 | 60 | 接下来就是批量进行wilcoxon检验: 61 | 62 | 63 | ```r 64 | df <- expr_long %>% 65 | group_by(genes) %>% 66 | wilcox_test(values ~ groups, detailed = T) 67 | 68 | df[1:5,1:13] # 查看结果 69 | ## # A tibble: 5 x 13 70 | ## genes estimate .y. group1 group2 n1 n2 statistic p conf.low 71 | ## 72 | ## 1 A1BG -0.277 values group1 group2 3 3 3 0.7 -0.681 73 | ## 2 A1BG-AS1 -0.0408 values group1 group2 3 3 3 0.7 -0.312 74 | ## 3 A2M-AS1 -0.887 values group1 group2 3 3 1 0.2 -1.14 75 | ## 4 A4GALT -0.384 values group1 group2 3 3 2 0.4 -1.04 76 | ## 5 AAAS -0.469 values group1 group2 3 3 1 0.2 -1.59 77 | ## # ... with 3 more variables: conf.high , method , alternative 78 | ``` 79 | 80 | 81 | 是不是非常**优雅**?确实,非常的`tidy`,耗时大概2分钟,取决于你的电脑配置,如果你有10万个基因呢? 82 | 83 | 优雅的代价就是速度慢。当然我们也有更快的方法,可能就没有那么的优雅了! 84 | 85 | 下面简单说下不进行数据转换进行批量wilcoxon检验的思路。 86 | 87 | 以我的这个数据为例,前3列是一组,后3列是一组,这样我们也是可以进行检验的。 88 | 89 | 如果你的数据和我的不一样,也可以,这里只是提供一种思路,你可以采取各种方法解决你的问题。 90 | 91 | 92 | 93 | ```r 94 | # 用第一行试一下 95 | fit <- wilcox.test(as.numeric(expr[1,1:3]),as.numeric(expr[1,4:6])) 96 | fit 97 | ## 98 | ## Wilcoxon rank sum exact test 99 | ## 100 | ## data: as.numeric(expr[1, 1:3]) and as.numeric(expr[1, 4:6]) 101 | ## W = 2, p-value = 0.4 102 | ## alternative hypothesis: true location shift is not equal to 0 103 | ``` 104 | 105 | 结果很完美,就是我们想要的东西。 106 | 107 | 接下来就用base R,完成9025个基因的wilcoxon检验。 108 | 109 | 110 | ```r 111 | # 定义一个空列表 112 | res <- list() 113 | 114 | for( i in 1:9025){ 115 | 116 | fit <- wilcox.test(as.numeric(expr[i,1:3]),as.numeric(expr[i,4:6])) 117 | res[[i]] <- data.frame(pvalue = fit$p.value,stats = fit$statistic) 118 | } 119 | 120 | res_df <- do.call(rbind, res) 121 | res_df$gene <- rownames(expr) 122 | ``` 123 | 124 | 125 | 不错,虽然是for循环,但是速度比上面那个方法快很多! 126 | 127 | 128 | 后台回复*20220409*即可获得今日数据!配合代码复制粘贴即可运行!注意路径! 129 | -------------------------------------------------------------------------------- /tcga/1行代码计算肿瘤突变负荷.md: -------------------------------------------------------------------------------- 1 | 肿瘤突变负荷(TMB, tumor mutation burden)在生信数据挖掘领域是很古老的东西了,没想到还有人在用它进行各种分析... 2 | 3 | 而且还有人找到了一串巨长的代码计算TCGA的TMB...大可不必! 4 | 5 | 本文目录: 6 | 7 | [toc] 8 | 9 | ## 准备数据 10 | 11 | 肿瘤突变负荷(TMB, tumor mutation burden)的计算非常简单,你不用费心去找各种代码,找到了估计初学者也看不懂,换成自己的数据还会报错。 12 | 13 | **我们只要1行代码即可,即使是初学者也可以轻松搞定!** 14 | 15 | 下载和整理MAF数据的教程请参考:[TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw) 16 | 17 | 18 | ```r 19 | library(maftools) 20 | library(tidyverse) 21 | 22 | # 以结肠癌的突变数据为例 23 | load(file = "G:/tcga/TCGA-SNP/TCGA-COAD_SNP.Rdata") 24 | 25 | maf.coad <- data 26 | dim(maf.coad) 27 | ## [1] 252664 141 28 | maf.coad[1:4,1:4] 29 | ## X1 Hugo_Symbol Entrez_Gene_Id Center 30 | ## 1 1 AGRN 375790 BCM 31 | ## 2 1 ACAP3 116983 BCM 32 | ## 3 1 CALML6 163688 BCM 33 | ## 4 1 PRKCZ 5590 BCM 34 | ``` 35 | 36 | ## 使用maftools计算TMB 37 | 38 | 计算TMB,只要使用`maftools`这个包即可,做TCGA的突变分析肯定是离不开这个包的,不知道为什么大家总是喜欢舍近求远,搞一些很复杂的代码,明明只要调包就可以解决!如果你是生信类、计算机类的专业我能理解,你一个学临床的为什么总是喜欢自己重新造轮子呢?就一个TMB计算还要写几十行代码,真没必要! 39 | 40 | 41 | ```r 42 | # 读取maf文件 43 | maf <- read.maf(maf.coad) 44 | ## -Validating 45 | ## -Silent variants: 63597 46 | ## -Summarizing 47 | ## --Mutiple centers found 48 | ## BCM;WUGSC;BCM;WUGSC;BCM;BI--Possible FLAGS among top ten genes: 49 | ## TTN 50 | ## SYNE1 51 | ## MUC16 52 | ## -Processing clinical data 53 | ## --Missing clinical data 54 | ## -Finished in 6.300s elapsed (6.030s cpu) 55 | 56 | # 计算TMB,就这1行代码,简单快速解决问题 57 | coad.tmb <- tmb(maf, captureSize = 38, logScale = T) 58 | ## [1] -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 59 | ``` 60 | 61 | ![plot of chunk unnamed-chunk-2](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-2-162535785.png) 62 | 63 | 上面的1行代码中的`captureSize`默认是50,有用30的,38的,35的,五花八门,我就用38了。`logScale`选择是否进行log10转换。 64 | 65 | 结果也是非常的清楚,给出了每个样本的TMB: 66 | 67 | 68 | ```r 69 | dim(coad.tmb) 70 | ## [1] 454 4 71 | head(coad.tmb) 72 | ## Tumor_Sample_Barcode total total_perMB total_perMB_log 73 | ## 1: TCGA-AA-3517-01A-01D-1953-10 9 0.2368421 -0.6255411 74 | ## 2: TCGA-AA-3529-01A-02D-1953-10 9 0.2368421 -0.6255411 75 | ## 3: TCGA-AA-A00Z-01A-01D-A17O-10 10 0.2631579 -0.5797836 76 | ## 4: TCGA-A6-2674-01A-02D-1953-10 11 0.2894737 -0.5383909 77 | ## 5: TCGA-AA-3521-01A-01D-1953-10 13 0.3421053 -0.4658402 78 | ## 6: TCGA-AA-3524-01A-02D-1953-10 13 0.3421053 -0.4658402 79 | ``` 80 | 81 | 这些样本现在全部都是tumor,你也不用担心有normal样本的问题,不信可以看看: 82 | 83 | 84 | ```r 85 | table(as.numeric(substr(coad.tmb$Tumor_Sample_Barcode,14,15))<10) 86 | ## 87 | ## TRUE 88 | ## 454 89 | ``` 90 | 91 | 清一色的tumor! 92 | 93 | 有了这个数据你就可以衔接各种后续的分析,比如差异分析、生存分析等等。 94 | 95 | ## 生存分析 96 | 97 | 根据计算出的TMB分成高低组,再和生存数据合并下,就可以做生存分析了,没有任何难度。 98 | 99 | 加载临床数据,临床数据的下载可以参考推文: 100 | 101 | - [新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g) 102 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 103 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 104 | 105 | 我更推荐**1行代码系列**获取的临床信息,因为更全面,样本名也方便下一步处理: 106 | 107 | 108 | ```r 109 | load(file = "G:/tcga/output_expr/TCGA-COAD_clinical.rdata") 110 | dim(clin_info) 111 | ## [1] 521 109 112 | clin_info[1:4,1:4] 113 | ## barcode patient 114 | ## TCGA-AA-A03F-01A-11R-A16W-07 TCGA-AA-A03F-01A-11R-A16W-07 TCGA-AA-A03F 115 | ## TCGA-G4-6314-01A-11R-1723-07 TCGA-G4-6314-01A-11R-1723-07 TCGA-G4-6314 116 | ## TCGA-A6-3809-01A-01R-A278-07 TCGA-A6-3809-01A-01R-A278-07 TCGA-A6-3809 117 | ## TCGA-AZ-6605-01A-11R-1839-07 TCGA-AZ-6605-01A-11R-1839-07 TCGA-AZ-6605 118 | ## sample shortLetterCode 119 | ## TCGA-AA-A03F-01A-11R-A16W-07 TCGA-AA-A03F-01A TP 120 | ## TCGA-G4-6314-01A-11R-1723-07 TCGA-G4-6314-01A TP 121 | ## TCGA-A6-3809-01A-01R-A278-07 TCGA-A6-3809-01A TP 122 | ## TCGA-AZ-6605-01A-11R-1839-07 TCGA-AZ-6605-01A TP 123 | ``` 124 | 125 | 这样的临床信息很全面,里面直接就包含了`sample_type`这种信息,不用你根据样本名自己判断: 126 | 127 | 128 | ```r 129 | table(clin_info$sample_type) 130 | ## 131 | ## Metastatic Primary Tumor Recurrent Tumor Solid Tissue Normal 132 | ## 1 478 1 41 133 | ``` 134 | 135 | 提取生存时间和生存状态,如果你不知道有哪些列,可以用`names(clin_info)`看看。 136 | 137 | 138 | ```r 139 | clin.surv <- clin_info %>% 140 | filter(!sample_type == "Solid Tissue Normal") %>% # 选择除normal之外的所有样本 141 | select(patient, days_to_last_follow_up, vital_status) %>% 142 | drop_na(vital_status) # 没有生存结局的不要 143 | 144 | dim(clin.surv) 145 | ## [1] 478 3 146 | head(clin.surv) 147 | ## patient days_to_last_follow_up vital_status 148 | ## TCGA-AA-A03F-01A-11R-A16W-07 TCGA-AA-A03F 0 Dead 149 | ## TCGA-G4-6314-01A-11R-1723-07 TCGA-G4-6314 1093 Alive 150 | ## TCGA-A6-3809-01A-01R-A278-07 TCGA-A6-3809 996 Alive 151 | ## TCGA-AZ-6605-01A-11R-1839-07 TCGA-AZ-6605 NA Dead 152 | ## TCGA-F4-6569-01A-11R-1774-07 TCGA-F4-6569 1087 Alive 153 | ## TCGA-D5-6924-01A-11R-1928-07 TCGA-D5-6924 435 Alive 154 | ``` 155 | 156 | 然后把临床数据和肿瘤突变负荷数据合并一下即可。需要注意下TCGA的`patient id`和`sample id`,一个`patient`是可以有多个`sample`的,做生存分析是用`patient`还是用`sample`呢? 157 | 158 | 我这里是根据`patient`进行的,根据TMB进行分组我用了平均值,你用中位数,或者任何你喜欢的数字都行,只要你能解释的通,想用什么用什么。 159 | 160 | 161 | ```r 162 | surv.df <- coad.tmb %>% 163 | # 新建1列,存放patient id 164 | mutate(patient = str_sub(as.character(.$Tumor_Sample_Barcode),1,12)) %>% 165 | distinct(patient, .keep_all = T) %>% # 根据patient id 去重 166 | inner_join(clin.surv, by = "patient") %>% # 合并 167 | mutate(group = if_else(total_perMB_log > mean(total_perMB_log), "high","low"), 168 | times = round(days_to_last_follow_up/365, 1), 169 | status = if_else(vital_status == "Dead",1,0) 170 | ) %>% 171 | select(patient, times,status,group) 172 | 173 | dim(surv.df) 174 | ## [1] 446 4 175 | head(surv.df) 176 | ## patient times status group 177 | ## 1: TCGA-AA-3517 3.2 0 low 178 | ## 2: TCGA-AA-3529 NA 1 low 179 | ## 3: TCGA-AA-A00Z 1.8 0 low 180 | ## 4: TCGA-A6-2674 3.6 0 low 181 | ## 5: TCGA-A6-2674 3.6 0 low 182 | ## 6: TCGA-A6-2674 3.6 0 low 183 | ``` 184 | 185 | 接下来就可以进行生存分析了: 186 | 187 | 188 | ```r 189 | library(survival) 190 | library(survminer) 191 | 192 | f <- survfit(Surv(times,status) ~ group, data = surv.df) 193 | ggsurvplot(f,pval=T) 194 | ``` 195 | 196 | ![plot of chunk unnamed-chunk-9](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-9-162535785.png) 197 | 198 | p值并不显著,当然你也可以用之前介绍过的寻找最佳截点的方式试试看:[R语言生存分析](https://mp.weixin.qq.com/s/bVmWQ0QoRoLeX7QG14ut9A) 199 | 200 | 201 | 202 | 203 | > 以下是专为初学者准备的TCGA教程,建议连续阅读,注意文中给出的链接: 204 | 205 | 1. [新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g) 206 | 2. [新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ) 207 | 3. [手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 208 | 4. [新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA) 209 | 5. [新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw) 210 | 6. [TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw) 211 | 7. [maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s/1cR3Cnfd5Co9U3jIoIWJBA) 212 | 8. [TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s/xbgQvGr0Q5DzBUqg8b__Zg) 213 | 9. [新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s/0hcQ1m_9l1TtvXgEG20F5Q) 214 | 10. [TCGA官网下载的文件数量竟然和TCGAbiolinks不一致!](https://mp.weixin.qq.com/s/EuEaaBFjK6n6rxmUo27UMw) 215 | 11. [可能是最适合初学者的TCGA官网下载和表达矩阵整理教程](https://mp.weixin.qq.com/s/rbnWvstRsfhbi9il-qSYpQ) 216 | 12. [新版TCGAbiolinks包学习:可视化](https://mp.weixin.qq.com/s/j0f1MDwlNmViqUeXU_Ikow) 217 | 13. [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 218 | 14. [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 219 | 15. [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 220 | 16. [ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s/1xpT1E4BaWG-ulrCzylwrA) 221 | 17. [ChAMP分析甲基化数据:从β值矩阵开始的流程](https://mp.weixin.qq.com/s/5x4oeJ6E0BPqtTjmEFPMcg) 222 | 18. [ChAMP分析TCGA结直肠癌的甲基化数据!](https://mp.weixin.qq.com/s/TB3LTaq55yqL-Z95wY-rQA) 223 | 19. [minfi包处理甲基化数据](https://mp.weixin.qq.com/s/E8j6KhEigcALgXA8fZIs9Q) 224 | 225 | 226 | 227 | -------------------------------------------------------------------------------- /tcga/DEseq2差异分析及vst探索.md: -------------------------------------------------------------------------------- 1 | 关于TCGA的差异分析之前介绍过,不过略微有些不够完整,而且主要是演示的`TCGAbiolinks`这个包,对于`DEseq2`介绍的不够,所以今天专门说一下使用`DEseq2`进行差异分析。 2 | 3 | 对于TCGA的差异分析,很多初学者很纠结,不知道到底是用counts/tpm/fpkm,到底是用哪个包,我这里给出我的建议,**对于TCGA的差异分析,就用counts,`DEseq2`进行差异分析!** 4 | 5 | 本文目录: 6 | [toc] 7 | 8 | ## DESeq2分析整理好的counts数据 9 | 10 | 表达矩阵的下载和整理这里就不演示了,我们直接使用**1行代码整理好的TCGA-COAD的counts数据**,无缝衔接! 11 | 12 | - [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 13 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 14 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 15 | 16 | 17 | ```r 18 | # 加载数据和R包 19 | rm(list = ls()) 20 | library(DESeq2) 21 | 22 | load(file = "G:/tcga/output_expr/TCGA-COAD_mrna_expr_counts.rdata") 23 | ``` 24 | 25 | 我们的1行代码获取的表达矩阵是**提取好的标准表达矩阵的形式**,行是基因,列是样本,可以直接使用,不需要任何修改。 26 | 27 | 样本分组需要稍作整理。 28 | 29 | 30 | ```r 31 | # 根据第14、15个字符进行分组,01-09是tumor,10-29是normal 32 | group <- ifelse(substr(colnames(mrna_expr_counts),14,15)<10,"tumor","normal") 33 | metadata <- data.frame(sample_id = colnames(mrna_expr_counts), 34 | group = group 35 | ) 36 | table(metadata$group) 37 | ## 38 | ## normal tumor 39 | ## 41 480 40 | 41 | head(metadata) 42 | ## sample_id group 43 | ## 1 TCGA-AA-A03F-01A-11R-A16W-07 tumor 44 | ## 2 TCGA-G4-6314-01A-11R-1723-07 tumor 45 | ## 3 TCGA-A6-3809-01A-01R-A278-07 tumor 46 | ## 4 TCGA-AZ-6605-01A-11R-1839-07 tumor 47 | ## 5 TCGA-AZ-6605-11A-01R-1839-07 normal 48 | ## 6 TCGA-F4-6569-01A-11R-1774-07 tumor 49 | ``` 50 | 51 | 接下来就是`DEseq2`进行差异分析的流程了。 52 | 53 | 首先构建DDS,需要提供3个参数,表达矩阵-直接使用我们的1行代码得到的表达矩阵即可,无需任何修改。 54 | `colData`是样本名和样本分组组成的数据框,`design`是包含分组信息的列。 55 | 56 | 57 | ```r 58 | ## 首先构建DDS 59 | 60 | dds1 <- DESeqDataSetFromMatrix(countData = mrna_expr_counts, 61 | colData = metadata, 62 | design = ~ group) 63 | ``` 64 | 65 | 接下来时过滤掉表达量低的基因,这一步,可做可不做,因为`DEseq2`在计算结果会自动进行过滤!做了有以下好处:减少内存占用,加快运行速度,画图时减少意外(表达量很低在组间没有差异可能画不出来)。 66 | 67 | 比较流行的方法是:如果某个基因在一半以上(或者75%)的样本中表达量都是低于10(这个数字也没有标准答案),那就过滤掉。 68 | 69 | 70 | ```r 71 | # 我这里没做这一步,写出来给大家做个参考 72 | keep <- rowSums(counts(dds) >= 10) >= 3 73 | table(keep) 74 | dds1 <- dds1[keep,] 75 | ``` 76 | 77 | 真正的差异分析就1行代码而已: 78 | 79 | 80 | ```r 81 | ## 差异分析 82 | dds <- DESeq(dds1) 83 | 84 | ## estimating size factors 85 | ## estimating dispersions 86 | ## gene-wise dispersion estimates 87 | ## mean-dispersion relationship 88 | ## final dispersion estimates 89 | ## fitting model and testing 90 | ## -- replacing outliers and refitting for 1548 genes 91 | ## -- DESeq argument 'minReplicatesForReplace' = 7 92 | ## -- original counts are preserved in counts(dds) 93 | ## estimating dispersions 94 | ## fitting model and testing 95 | 96 | #save(dds,file="output_expr/mRNA_DE_counts.rdata") 97 | ``` 98 | 99 | 下面提取结果就好了,我在之前介绍过`limma`进行差异分析的一些注意事项,主要是谁和谁比的问题,搞不好很容易闹乌龙:[limma差异分析,谁和谁比很重要吗?](https://mp.weixin.qq.com/s/vdkDcBzuoqCASts61efjBw) 100 | 101 | `DEseq2`不用在一开始指定,在提取结果时指定也可以,使用起来很方便: 102 | 103 | 104 | ```r 105 | # 提取结果,如果你一开始没有用因子level限定组别顺序,这里可以限定 106 | # 添加tidy=T,返回数据框 107 | res <- results(dds, contrast = c("group","tumor","normal")) # 指定tumor比normal 108 | res 109 | ## log2 fold change (MLE): group tumor vs normal 110 | ## Wald test p-value: group tumor vs normal 111 | ## DataFrame with 19938 rows and 6 columns 112 | ## baseMean log2FoldChange lfcSE stat pvalue padj 113 | ## 114 | ## MT-CO1 356764 -0.8513972 0.146049 -5.829513 5.55894e-09 1.64448e-08 115 | ## MT-ND4 347353 -0.1095464 0.176165 -0.621841 5.34046e-01 5.81407e-01 116 | ## MT-CO2 238026 -0.0412895 0.153885 -0.268315 7.88457e-01 8.16530e-01 117 | ## MT-CO3 230096 -0.4469429 0.144782 -3.087016 2.02176e-03 3.35341e-03 118 | ## ACTB 211370 -0.1826209 0.103648 -1.761938 7.80798e-02 1.02550e-01 119 | ## ... ... ... ... ... ... ... 120 | ## AC084756.2 0 NA NA NA NA NA 121 | ## AL031178.2 0 NA NA NA NA NA 122 | ## AC119733.1 0 NA NA NA NA NA 123 | ## AL451106.1 0 NA NA NA NA NA 124 | ## AC006486.3 0 NA NA NA NA NA 125 | 126 | # 按照p值排序 127 | resOrdered <- res[order(res$pvalue),] 128 | DEG <- na.omit(resOrdered) # 去掉缺失值 129 | DEG 130 | ## log2 fold change (MLE): group tumor vs normal 131 | ## Wald test p-value: group tumor vs normal 132 | ## DataFrame with 18353 rows and 6 columns 133 | ## baseMean log2FoldChange lfcSE stat pvalue 134 | ## 135 | ## CDH3 3130.674 5.97400 0.150985 39.5669 0.00000e+00 136 | ## KRT80 1343.214 6.77220 0.184900 36.6263 1.09154e-293 137 | ## ETV4 3531.664 5.31186 0.152688 34.7889 3.57919e-265 138 | ## ESM1 233.411 5.76247 0.180466 31.9311 9.89966e-224 139 | ## FOXQ1 2204.014 6.23267 0.199737 31.2044 9.29639e-214 140 | ## ... ... ... ... ... ... 141 | ## MARCHF6 4176.387150 2.06911e-04 0.0796146 0.002598912 0.997926 142 | ## GRXCR2 0.830639 8.49323e-04 0.3678967 0.002308591 0.998158 143 | ## PDE4B 534.259863 -4.51214e-04 0.2007717 -0.002247397 0.998207 144 | ## ATL2 1915.827954 -7.23339e-05 0.0753469 -0.000960012 0.999234 145 | ## FN3KRP 1471.955462 -6.17016e-05 0.0761668 -0.000810084 0.999354 146 | ## padj 147 | ## 148 | ## CDH3 0.00000e+00 149 | ## KRT80 1.00165e-289 150 | ## ETV4 2.18963e-261 151 | ## ESM1 4.54221e-220 152 | ## FOXQ1 3.41233e-210 153 | ## ... ... 154 | ## MARCHF6 0.998144 155 | ## GRXCR2 0.998316 156 | ## PDE4B 0.998316 157 | ## ATL2 0.999288 158 | ## FN3KRP 0.999354 159 | ``` 160 | 161 | 而且结果会提醒你到底是谁比谁:`log2 fold change (MLE): group tumor vs normal` 162 | 163 | 到这里差异分析其实就做好了,接下来你可以根据`padj`和`log2FoldChange`选择合适的基因,我们就不再演示了。 164 | 165 | 下面探索下vst标准化后的数据。 166 | 167 | ## VST探索 168 | 169 | 如果是差异分析,别纠结,就用counts,使用`DESeq`进行差异分析,后续的生存分析、相关性分析、火山图、热图、PCA、聚类等分析,可以统统使用vst标准化后的数据,当然你也可以选择log2(tpm+1)。 170 | 171 | 你看这篇cell的文章用的就是vst后的数据: 172 | ![doi:10.1016/j.cell.2018.03.052.](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221229100729382.png) 173 | 174 | 关于vst这种方法的参考文献也放在下面: 175 | 176 | - variance stabilizing transformations (VST) (Tibshirani 1988; Huber et al. 2003; Anders and Huber 2010) 177 | 178 | vst标准化后的数据有多种获取方式,可以从最开始的`dds1`提取,可以从运行`DESeq`后的`dds`提取,也可以从表达矩阵直接开始,3种结果完全一样! 179 | 180 | 181 | ```r 182 | # 3种方法完全一样 183 | vsd1 <- assay(vst(dds1)) 184 | vsd2 <- assay(vst(dds)) 185 | vsd <- vst(as.matrix(mrna_expr_counts)) 186 | vsd[1:6,1:3] 187 | 188 | identical(vsd,vsd1) 189 | identical(vsd1,vsd2) 190 | ``` 191 | 192 | 可以画个箱线图看看vst标准化后的数据表达情况,经过vst转换后的表达矩阵表达量还是很好的: 193 | 194 | 195 | ```r 196 | boxplot(vsd[,1:30]) 197 | ``` 198 | 199 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230109191108422.png) 200 | 201 | 看看这个表达量,很棒,这也是为什么vst标准化后的数据可以直接进行后续分析(不需要log)的原因。 202 | 203 | ### 热图 204 | 205 | 下面画个热图看看。 206 | 207 | 208 | ```r 209 | library(pheatmap) 210 | 211 | # 这里的`dds`需要是运行`DESeq`之后的 212 | select <- order(rowMeans(counts(dds,normalized=TRUE)), 213 | decreasing=TRUE)[1:20] 214 | 215 | # 这里dds/dds1都行 216 | df <- as.data.frame(colData(dds)[,"group"]) 217 | rownames(df) <- colnames(mrna_expr_counts) 218 | 219 | pheatmap(vsd[select,], 220 | scale = "row", 221 | cluster_rows = F, 222 | cluster_cols = F, 223 | show_rownames = F, 224 | show_colnames = F, 225 | annotation_col = df 226 | ) 227 | ``` 228 | 229 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230109191137312.png) 230 | 231 | TCGA数据由于正常样本比较少,所以直接画出的热图大都不太好看,看不出来明显的四象限,大家可以自己去GEO下载其他测序数据试试看。 232 | 233 | ### 火山图 234 | 235 | 再画个火山图看看。 236 | 237 | 238 | ```r 239 | library(ggplot2) 240 | library(ggrepel) 241 | 242 | tmp.volcano <- as.data.frame(DEG) 243 | tmp.volcano$type <- ifelse(tmp.volcano$log2FoldChange > 2 & tmp.volcano$padj < 0.01, "up", 244 | ifelse(tmp.volcano$log2FoldChange < -2 & tmp.volcano$padj < 0.01, "down", "not-sig")) 245 | tmp.volcano$gene <- rownames(tmp.volcano) 246 | 247 | ggplot(tmp.volcano, aes(log2FoldChange, -log10(padj)))+ 248 | geom_point(aes(color=type))+ 249 | scale_color_manual(values = c("blue","black","red"))+ 250 | geom_hline(yintercept = -log10(0.01),linetype=2)+ 251 | geom_vline(xintercept = c(-2,2), linetype=2)+ 252 | geom_text_repel(data = subset(tmp.volcano, abs(log2FoldChange) > 4), 253 | aes(label=gene),col="black",alpha = 0.8)+ 254 | theme_bw() 255 | ``` 256 | 257 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-163832021.png) 258 | 259 | 260 | ### PCA 261 | 262 | 然后是主成分分析PCA的可视化,`DESeq`自带这个功能: 263 | 264 | 265 | ```r 266 | plotPCA(vst(dds), intgroup="group") 267 | ``` 268 | 269 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-11-163832021.png) 270 | 271 | 如果你嫌丑,可以返回数据,自己画: 272 | 273 | 274 | ```r 275 | library(ggplot2) 276 | 277 | pcaData <- plotPCA(vst(dds), intgroup="group", returnData=TRUE) 278 | percentVar <- round(100 * attr(pcaData, "percentVar")) 279 | ggplot(pcaData, aes(PC1, PC2, color=group)) + 280 | geom_point(size=3) + 281 | xlab(paste0("PC1: ",percentVar[1],"% variance")) + 282 | ylab(paste0("PC2: ",percentVar[2],"% variance")) + 283 | coord_fixed()+ 284 | theme_bw() 285 | ``` 286 | 287 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-12-163832021.png) 288 | 289 | 如果你想添加各种元素,比如置信椭圆、箭头等,可以参考之前的推文自己做PCA然后画图: 290 | 291 | - [R语言主成分分析](http://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247495269&idx=1&sn=830f994a751c210e5bf9a5a8758b7d4b&chksm=facadee2cdbd57f41c1e96f2bce962394a3f79a63a67314e6e57b160f34053e79692b0a42745#rd) 292 | - [R语言主成分分析可视化(颜值高,很详细)](http://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247495271&idx=1&sn=23a1967958e17c4d212f69b6056a27dc&chksm=facadee0cdbd57f6b3f567f6ef7192cfde52d648643a647f96093de17c4cc5e3eb27cac78b4b#rd) 293 | - [R语言PCA可视化3D版](http://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247495599&idx=1&sn=a6b11c466e6aeb99fc4cce113e01dc6a&chksm=facadf28cdbd563e786399b0cd5f79bdfdde52a4b7719fd743eea25faf9fc1635d470325268d#rd) 294 | - [使用R语言美化PCA图](http://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247483965&idx=1&sn=f7217eba8b7aac7402a53fb2b1a36cc6&chksm=fac932bacdbebbac7ae1a875c076bf29ada73b86d75e42c6eb200ffc1a27fed436fbfd248737#rd) 295 | 296 | ## 参考资料 297 | 298 | 1. DEseq2官方文档 299 | 300 | 301 | 302 | 303 | 304 | -------------------------------------------------------------------------------- /tcga/TCGA官网下载文件数量和tcgabiolinks下载的不一致.md: -------------------------------------------------------------------------------- 1 | 最近有小伙伴问我TCGA的表达矩阵整理问题,用到了我的一篇推文中的教程: 2 | 3 | TCGA官网下载的数据也可以用TCGAbiolinks包搞定,只需2行代码! 4 | 5 | 但是总是遇到以下报错: 6 | 7 | ```R 8 | # 查询这一步是需要的!即使网在烂,这一步应该可以成功的... 9 | query <- GDCquery(project = "TCGA-READ", 10 | data.category = "Transcriptome Profiling", 11 | data.type = "Gene Expression Quantification", 12 | workflow.type = "STAR - Counts" 13 | ) 14 | 15 | # 下载这一步就不用了,我们是通过官网手动下载的~ 16 | #GDCdownload(query, files.per.chunk = 100) #每次下载100个文件 17 | 18 | # 整理,网友在这一步遇到了一下报错!!! 19 | GDCprepare(query,save = T,save.filename = "tcga_read.rdata") 20 | 21 | Error in GDCprepare(query, save = T, save.filename = "tcga_read.rdata") : 22 | I couldn't find all the files from the query. Please check if the directory parameter is right or `GDCdownload` downloaded the samples. 23 | ``` 24 | 25 | 看这个报错提示是文件不全,让检查文件路径,在确定了文件路径和代码、网络都没有问题后,我觉得非常神奇! 26 | 27 | 理论上是不应该的呀!这个包就是用的官方的API下载的,不应该和官网直接下载的数据量不一样啊! 28 | 29 | 于是我赶紧检查了一下。 30 | 31 | 首先是看这个`query`一共查到了几个文件: 32 | 33 | ```R 34 | tmp <- query$results[[1]] 35 | 36 | # 查看查询到的文件夹名字这一列 37 | head(tmp$id) 38 | 39 | ## [1] "00f55a16-0ee5-4939-8efb-de34e68d4ccd" "229e0c80-ada5-4fd3-8e93-a9bc1fac11a4" 40 | ## [3] "4b9b8b25-96e3-4667-8315-124711dcc1e0" "0ef12067-7e43-4d08-9374-a961430dd5ab" 41 | ## [5] "b9c1d14a-a169-4e73-a9c6-e884b005a160" "984e14e8-3272-4101-a1cb-81056eec7f8c" 42 | 43 | # 一共177个 44 | length(tmp$id) 45 | 46 | ## 177 47 | ``` 48 | 也就是说我们通过代码的方式查询到了`TCGA-READ`一共177个文件!但是!网友下载的是91个! 49 | 50 | 我也赶紧去官网点点点看了一下,竟然也是91个! 51 | 52 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912205545012.png) 53 | 54 | 太神奇了,难道是`TCGAbiolinks`包出问题了吗??? 55 | 56 | 冷静思考之后,我把网页中**Primary Site**中的打勾去掉了,然后就一切归于平静: 57 | 58 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912210137181.png) 59 | 60 | 只要不选择**Primary Site**中的选项,就和`TCGAbiolinks`包下载的数据完全一样!又试了其他几个癌种,都是一样的了! 61 | 62 | 果然我还是太年轻,没见过世面啊! 63 | 64 | **解决了这个小小的问题后,大家又可以愉快的只用2行代码解决表达矩阵的整理问题了!** 65 | 66 | 接下来还是使用官网网页下载,然后自己新建指定文件路径,就可以用2行代码搞定表达矩阵了: 67 | 68 | ```R 69 | # 查询 70 | query <- GDCquery(project = "TCGA-READ", 71 | data.category = "Transcriptome Profiling", 72 | data.type = "Gene Expression Quantification", 73 | workflow.type = "STAR - Counts" 74 | ) 75 | 76 | # 整理 77 | GDCprepare(query,save = T,save.filename = "tcga_read.rdata") 78 | 79 | |==========================================|100% Completed after 14 s 80 | Starting to add information to samples 81 | => Add clinical information to samples 82 | => Adding TCGA molecular information from marker papers 83 | => Information will have prefix 'paper_' 84 | read subtype information from:doi:10.1038/nature11252 85 | Available assays in SummarizedExperiment : 86 | => unstranded 87 | => stranded_first 88 | => stranded_second 89 | => tpm_unstrand 90 | => fpkm_unstrand 91 | => fpkm_uq_unstrand 92 | => Saving file: tcga_read.rdata 93 | => File saved 94 | class: RangedSummarizedExperiment 95 | dim: 60660 177 96 | metadata(1): data_release 97 | assays(6): unstranded stranded_first ... fpkm_unstrand fpkm_uq_unstrand 98 | rownames(60660): ENSG00000000003.15 ENSG00000000005.6 ... ENSG00000288674.1 99 | ENSG00000288675.1 100 | rowData names(10): source type ... hgnc_id havana_gene 101 | colnames(177): TCGA-AF-3911-01A-01R-1736-07 TCGA-DY-A1DC-01A-31R-A155-07 ... 102 | TCGA-AF-2692-11A-01R-A32Z-07 TCGA-EI-6882-01A-11R-1928-07 103 | colData names(107): barcode patient ... paper_vascular_invasion_present 104 | paper_vital_status 105 | ``` 106 | 107 | 全程不到1分钟即可完成,里面包含了fpkm/tpm/counts的表达矩阵、以及超级详细的临床信息!可以参考另一篇推文:超简单的表达矩阵提取。 108 | 109 | 舒服! -------------------------------------------------------------------------------- /tcga/countstpmfpkmvstcpm表达量差异.md: -------------------------------------------------------------------------------- 1 | 在进行差异分析、生存分析等下游分析时,有很多粉丝朋友对到底使用哪种类型的数据非常纠结,所以我们今天比较一下counts、tpm、fpkm、vst、cpm的表达量差异,让大家对这些数据类型有有一个直观的感受。 2 | 3 | 以TCGA-CHOL为例。 4 | 5 | 首先获取counts、tpm、fpkm表达矩阵,这个过程建议使用1行代码系列,一步到位: 6 | 7 | - [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 8 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 9 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 10 | 11 | ```R 12 | rm(list = ls()) 13 | load(file = "G:/tcga/TCGA-mRNA/TCGA-CHOL_mRNA.Rdata") 14 | 15 | library(tidyverse) 16 | library(SummarizedExperiment) 17 | ``` 18 | 19 | 然后我们再准备下vst格式的表达矩阵: 20 | 21 | ```R 22 | library(DESeq2) 23 | 24 | mrna_expr_vst <- vst(as.matrix(mrna_expr_counts)) 25 | ``` 26 | 27 | 再准备下cpm格式的表达矩阵: 28 | 29 | ```R 30 | library(edgeR) 31 | 32 | mrna_expr_cpm <- cpm(mrna_expr_counts) 33 | ``` 34 | 35 | 简单看下数据情况,都是19938行,44列。 36 | 37 | ```R 38 | dim(mrna_expr_counts) 39 | dim(mrna_expr_fpkm) 40 | dim(mrna_expr_tpm) 41 | dim(mrna_expr_vst) 42 | dim(mrna_expr_cpm) 43 | 44 | [1] 19938 44 45 | [1] 19938 44 46 | [1] 19938 44 47 | [1] 19938 44 48 | [1] 19938 44 49 | ``` 50 | 51 | 然后简单画个箱线图看看表达量分布情况: 52 | 53 | ```R 54 | opar <- par(mfrow=c(3,2)) 55 | boxplot(mrna_expr_counts) 56 | boxplot(mrna_expr_fpkm) 57 | boxplot(mrna_expr_tpm) 58 | boxplot(mrna_expr_vst) 59 | boxplot(mrna_expr_cpm) 60 | ``` 61 | 62 | ![image-20230109192100488](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230109192100488.png) 63 | 64 | 结果很清晰了吧?这里面只有vst是另类,这也是为什么vst不需要再log的原因,其他4种类型的表达量都是很大且很分散的。 65 | 66 | 接下来我们再看看其他几个数据log之后的情况。 67 | 68 | ```R 69 | opar <- par(mfrow=c(3,2)) 70 | boxplot(log2(mrna_expr_counts+1)) 71 | boxplot(log2(mrna_expr_fpkm+1)) 72 | boxplot(log2(mrna_expr_tpm+1)) 73 | boxplot(mrna_expr_vst) 74 | boxplot(log2(mrna_expr_cpm+1)) 75 | ``` 76 | 77 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230109192605821.png) 78 | 79 | 这样看是不是很接近了呢? 80 | 81 | 所以大家不要纠结了!对于TCGA这种转录组数据,差异分析就用counts,使用`DESeq2`包,后续的各种分析都用vst,没啥问题。你看这篇cell的文章用的就是vst后的数据: 82 | ![doi:10.1016/j.cell.2018.03.052.](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221229100729382.png) 83 | 84 | 当然log2之后的tpm也可以用于后续的各种分析,你去pubmed搜一下就知道,大把文章用的都是log2(tpm+1)这种,当然你用log后的tpm做差异分析(limma包)也是可以的(不推荐),可以多看看文献~ -------------------------------------------------------------------------------- /tcga/tcga+gtex联合数据.md: -------------------------------------------------------------------------------- 1 | `TCGA`的数据由于正常样本较少,满足不了大家的需求,GTEx刚好有很多正常组织的测序数据,二者一起用非常合适。 2 | 3 | 但是由于两个来源的数据上游分析流程不一样,不能直接使用。那问题就来了,怎么一起用这两个数据呢? 4 | 5 | 如果你是一个热爱学习的人,肯定不会有这样的疑问,去`pubmed`一搜便知,有无数人已经用这两个数据发了不知道多少篇SCI了,你随便找一篇看看方法部分,就可以模仿了!我下面随便找了几篇,方法五花八门,有的甚至根本没说怎么处理的...各种都有: 6 | 7 | ![doi: 10.7717/peerj.8961](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114174703634.png) 8 | 9 | ![doi: 10.3389/fimmu.2021.688215](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114174918909.png) 10 | 11 | ![doi: 10.3389/fonc.2020.605097](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114175456712.png) 12 | 13 | 14 | 15 | 已发表的文章用法各有不同,对错我不去评判,这里**我给大家推荐两个比较靠谱的数据来源。** 16 | 17 | - 一个是来自Xena 18 | - 另一个是来自于scientific data上的一篇文章 19 | 20 | 这两种都是下载了原始数据,从头处理得到的数据,并且矫正了批次效应,也都有详细的方法说明,并且也有相关的参考文献,因此不用担心审稿人的质疑,参考文献甩他脸上... 21 | 22 | 今天先给大家介绍下scientific data文章里面的做法及数据。 23 | 24 | 文献标题: 25 | 26 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114191135925.png) 27 | 28 | 29 | 30 | 这篇文章详细介绍了他们的数据处理流程: 31 | 32 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114191437322.png) 33 | 34 | 原始数据下载、比对工具、流程参数等细节都写的很清楚,大家可以去阅读原文,我这里之放了一部分: 35 | 36 | ![image-20221114191550482](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114191550482.png) 37 | 38 | 并且他们的数据处理pipeline的**代码也放在了github:https://github.com/mskcc/RNAseqDB** 39 | 40 | 除此之外,**作者把处理好的数据也放在了figshare中,需要的直接去下载即可**,我已经都下载好了,肯定是没有问题的。唯一不足是他们**只处理了编码基因的数据,非编码rna和其他组学数据都没有。** 41 | 42 | **数据处理为3种,分别放在3个仓库中,根据癌症类型都给你直接整理成表达矩阵了,并且自带gene symbol和entrez id:** 43 | 44 | - *Data record 1*: 下载地址:https://figshare.com/articles/dataset/Data_record_1/5330539 The maximum likelihood gene expression levels computed using RSEM, i.e., the expected_count in RSEM’s output, are in Data Citation 1. This dataset includes 52 data files, each being a sample-gene matrix of a certain tissue type (see Table 1 for the tissues we processed). This dataset can be provided to programs such as edgeR for identifying differentially expressed genes. 45 | - *Data record 2*: 下载地址:https://figshare.com/articles/dataset/Data_record_2/5330575 The gene expression levels calculated from the FPKM (Fragments Per Kilobase of transcript per Million) in RSEM’s output are in Data Citation 2. This dataset (of data files) was quantile normalized, but not corrected for batch effects. 46 | - *Data record 3*: 下载地址:https://figshare.com/articles/dataset/Data_record_3/5330593 The normalized gene expression levels (FPKM) are in Data Citation 3. This dataset was not only quantile normalized, but was corrected for batch effects (using ComBat). 47 | 48 | 以上3种,大家选择自己喜欢的就好,别纠结! 49 | 50 | 我把expect_count的数据给大家看看: 51 | 52 | 分为3种不同的表达矩阵,稍微有点TCGA数据库的常识都能看出来,3个表达矩阵分别是TCGA的tumor、TCGA的normal(癌旁)、GTEx的表达矩阵。 53 | 54 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114195018665.png) 55 | 56 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114195041420.png) 57 | 58 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114195122962.png) 59 | 60 | 61 | 62 | 有了这个数据,大家就可以非常方便的去做一些下游分析,不用再担心正常样本不够的问题! 63 | 64 | 我这里演示的是**RSEM得到的结果,这里的expected_count不是整数**,你可以用三大差异分析R包中的任何一个进行差异分析。如果是用`DEseq2`,那可以直接四舍五入把小数去掉,或者可以用`tximport`包处理一下再使用`DESeqDataSetFromTximport`函数进行后续的分析。 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 一共需要下载3个文件:表达矩阵,样本信息文件,基因信息文件 75 | 76 | 77 | 78 | 首先到这个网址下载GTEx的数据:[UCSC Xena (xenabrowser.net)](https://xenabrowser.net/datapages/?cohort=GTEX&removeHub=https%3A%2F%2Fxena.treehouse.gi.ucsc.edu%3A443) 79 | 80 | ![image-20221114121526050](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221114121526050.png) 81 | 82 | 下载id转换需要的文件:https://toil-xena-hub.s3.us-east-1.amazonaws.com/download/probeMap%2Fgencode.v23.annotation.gene.probemap 83 | 84 | 85 | 86 | 整合流程:[GitHub - mskcc/RNAseqDB](https://github.com/mskcc/RNAseqDB) 87 | 88 | xena的建议和处理:[How do I compare tumor vs normal expression? - User Help Pages (gitbook.io)](https://ucsc-xena.gitbook.io/project/how-do-i/tumor-vs-normal) 89 | 90 | xena处理好的数据:[UCSC Xena (xenabrowser.net)](https://xenabrowser.net/datapages/?cohort=TCGA TARGET GTEx) 91 | 92 | nature的文章:[Unifying cancer and normal RNA sequencing data from different sources | Scientific Data (nature.com)](https://www.nature.com/articles/sdata201861) -------------------------------------------------------------------------------- /tcga/tcgabiolinks00数据下载.md: -------------------------------------------------------------------------------- 1 | 众所周知,TCGA数据库改版了!!改的比之前更好用了! 2 | 3 | 对于常规转录组数据,主要是以下几点改变: 4 | - 下载一次即可获得counts、TPM、FPKM三种类型的表达矩阵,再也不用单独下载了 5 | - 自带gene symbol,不用自己找各种方法转换了 6 | - 自带基因类型,可以直接区分mRNA和lncRNA了 7 | 8 | `TCGAbiolinks`不仅是数据下载,它能访问、下载全部的TCGA数据(除了受限制的),用它下载的数据是*最新最全*的!这和直接去GDC官网,使用网页下载的方式是一样的。 9 | 10 | 除了常规的转录组数据,还包括甲基化数据、SNP数据、突变数据、临床数据等多种数据类型,还能进行数据分析,比如差异分析、生存分析、聚类等,除此之外,它也具有强大的绘图功能,可以直接绘制突变瀑布图等多种图形,是一个全面的TCGA包。 11 | 12 | 作为官方唯一推荐的专用下载及分析可视化一体的R包:`TCGAbiolinks`,也进行了相应的更新。 13 | 14 | 而`xena`的数据并不会及时更新,最新的数据还停留在2019年。 15 | 16 | 因为网络问题一直没怎么学习过这个强大的R包,最近数据更新了,学习下。 17 | 18 | ## 安装 19 | 20 | 需要安装版本在2.25.1以上的版本! 21 | 22 | 23 | ```r 24 | # 经典2选1 25 | if (!requireNamespace("BiocManager", quietly=TRUE)) 26 | install.packages("BiocManager") 27 | BiocManager::install("TCGAbiolinks") 28 | 29 | if (!requireNamespace("BiocManager", quietly = TRUE)) 30 | install.packages("BiocManager") 31 | BiocManager::install("BioinformaticsFMRP/TCGAbiolinksGUI.data") 32 | BiocManager::install("BioinformaticsFMRP/TCGAbiolinks") 33 | ``` 34 | 35 | >注意:目前`bioconductor`上面的`TCGAbiolinks`还停留在2.24.3版本,你需要安装开发版本哦~ 36 | 37 | 如果你安装不成功,可以下载到本地安装,如果你不会本地安装,请翻看视频:xxxxxxxxxxx 38 | 39 | ## 使用 40 | 41 | 对网络有要求! 42 | 43 | 如果这一步都不成功,建议下面的就别运行了,因为很可能也不会成功。 44 | 45 | 46 | ```r 47 | # 查看TCGA中33种癌症的简称 48 | library(TCGAbiolinks) 49 | 50 | projects <- TCGAbiolinks::getGDCprojects()$project_id ##获取癌症名字 51 | projects <- projects[grepl('^TCGA', projects, perl=TRUE)] 52 | 53 | projects 54 | ## [1] "TCGA-READ" "TCGA-UCS" "TCGA-COAD" "TCGA-CESC" "TCGA-PAAD" "TCGA-ESCA" 55 | ## [7] "TCGA-KIRP" "TCGA-PCPG" "TCGA-HNSC" "TCGA-BLCA" "TCGA-STAD" "TCGA-SARC" 56 | ## [13] "TCGA-CHOL" "TCGA-LAML" "TCGA-THYM" "TCGA-ACC" "TCGA-SKCM" "TCGA-LUAD" 57 | ## [19] "TCGA-LIHC" "TCGA-KIRC" "TCGA-KICH" "TCGA-DLBC" "TCGA-PRAD" "TCGA-OV" 58 | ## [25] "TCGA-MESO" "TCGA-LUSC" "TCGA-GBM" "TCGA-UVM" "TCGA-LGG" "TCGA-BRCA" 59 | ## [31] "TCGA-TGCT" "TCGA-THCA" "TCGA-UCEC" 60 | ``` 61 | 62 | ## 批量下载mRNA和lncRNA的数据 63 | 64 | 需要良好的网络环境,网络不好就别试了。全部数据40+G。 65 | 66 | 67 | ```r 68 | sapply(projects, function(project){ 69 | 70 | # 查询 71 | query <- GDCquery(project = project, 72 | data.category = "Transcriptome Profiling", 73 | data.type = "Gene Expression Quantification", 74 | workflow.type = "STAR - Counts" 75 | ) 76 | # 下载 77 | GDCdownload(query, method = "api", files.per.chunk = 100) #每次下载100个文件 78 | 79 | # 整理 80 | GDCprepare(query,save = T,save.filename = paste0(project,"_mRNA.Rdata")) 81 | } 82 | ) 83 | ``` 84 | 85 | 如果`query`能成功,但是下载成功,可以通过网页下载后,放在指定目录中,然后再运行`GDCprepare`函数也是可以成功的! 86 | 87 | ## 批量下载临床数据 88 | 89 | 也可以使用`GDCquery_clinic()`直接下载。 90 | 91 | 92 | ```r 93 | sapply(projects, function(project){ 94 | 95 | query <- GDCquery(project = project, 96 | data.category = "Clinical", 97 | file.type = "xml") 98 | GDCdownload(query) 99 | clinical <- GDCprepare_clinic(query, clinical.info = "patient") 100 | saveRDS(clinical,file = paste0(project,"_clinical.rds")) 101 | }) 102 | ``` 103 | 104 | 使用方法做个小记录,可以通过不同的参数快速获取不同的临床数据: 105 | 106 | 107 | ```r 108 | clinical <- GDCprepare_clinic(query, clinical.info = "patient") 109 | 110 | To get the following information please change the clinical.info argument 111 | => new_tumor_events: new_tumor_event 112 | => drugs: drug 113 | => follow_ups: follow_up 114 | => radiations: radiation 115 | ``` 116 | 117 | ## 批量下载miRNA 118 | 119 | 120 | ```r 121 | sapply(projects, function(project){ 122 | 123 | query <- GDCquery(project = project, 124 | data.category = "Transcriptome Profiling", 125 | data.type = "miRNA Expression Quantification" 126 | ) 127 | 128 | GDCdownload(query) 129 | 130 | GDCprepare(query, save = T,save.filename = paste0(project,"_miRNA.Rdata")) 131 | 132 | }) 133 | ``` 134 | 135 | 136 | ## 批量下载SNP 137 | 138 | 139 | ```r 140 | sapply(projects, function(project){ 141 | 142 | query <- GDCquery( 143 | project = project, 144 | data.category = "Simple Nucleotide Variation", 145 | data.type = "Masked Somatic Mutation", 146 | access = "open" 147 | ) 148 | 149 | GDCdownload(query) 150 | 151 | GDCprepare(query, save = T,save.filename = paste0(project,"_SNP.Rdata")) 152 | 153 | }) 154 | ``` 155 | 156 | ## 批量下载CNV 157 | 158 | 159 | ```r 160 | sapply(projects, function(project){ 161 | 162 | query <- GDCquery( 163 | project = project, 164 | data.category = "Copy Number Variation", 165 | data.type = "Masked Copy Number Segment", 166 | access = "open" 167 | ) 168 | 169 | GDCdownload(query) 170 | 171 | GDCprepare(query, save = T,save.filename = paste0(project,"_CNV.Rdata")) 172 | 173 | }) 174 | ``` 175 | 176 | 177 | ## 批量下载甲基化 178 | 179 | 数据太大了,只下载一个COAD的演示一下~ 180 | 181 | β值矩阵: 182 | 183 | 184 | ```r 185 | coad_methy <- GDCquery( 186 | project = "TCGA-COAD", 187 | data.category = "DNA Methylation", 188 | data.type = "Methylation Beta Value", 189 | platform = "Illumina Human Methylation 27" # Illumina Human Methylation 450 190 | ) 191 | GDCdownload(coad_methy) 192 | GDCprepare(coad_methy,save = T,save.filename="COAD_METHY_beta.Rdata") 193 | ``` 194 | 195 | IDAT: 196 | 197 | 198 | ```r 199 | coad_methy <- GDCquery( 200 | project = "TCGA-COAD", 201 | data.category = "DNA Methylation", 202 | data.type = "Masked Intensities", 203 | platform = "Illumina Human Methylation 27", # Illumina Human Methylation 450 204 | legacy = FALSE 205 | ) 206 | GDCdownload(coad_methy) 207 | GDCprepare(coad_methy,save = T,save.filename="COAD_METHY_idat.Rdata") 208 | ``` 209 | 210 | 211 | ## 批量下载蛋白质数据 212 | 213 | 214 | ```r 215 | sapply(projects, function(project){ 216 | 217 | query <- GDCquery( 218 | project = project, 219 | data.category = "Proteome Profiling", 220 | data.type = "Protein Expression Quantification" 221 | ) 222 | 223 | GDCdownload(query) 224 | 225 | GDCprepare(query, save = T,save.filename = paste0(project,"_protein.Rdata")) 226 | 227 | }) 228 | ``` 229 | 230 | 亲测可用,我下载了2天1夜...... 231 | 232 | 除此之外,还有其他数据可用,大家可以去[官网](https://www.bioconductor.org/packages/release/bioc/vignettes/TCGAbiolinks/inst/doc/index.html "TCGAbiolinks官方教程")学习~ 233 | 234 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks03富集分析和生存分析.md: -------------------------------------------------------------------------------- 1 | `TCGAbiolinks`是一个大而全的R包,常见的分析都能做,比如差异分析、富集分析、生存分析等等。上次学习了差异分析,今天学习下富集分析和生存分析。 2 | 3 | 但其实这些分析我们都是把数据保存好用其他包做的~ 4 | 5 | ## 富集分析 6 | 7 | 如果大家要做富集分析,那肯定是首选`clusterprofiler`了,不过今天这个还是要学习下。 8 | 9 | 还是用上篇推文得到的`coadDEGs`继续进行富集分析。 10 | 11 | [新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA) 12 | 13 | 14 | ```r 15 | load(file = "coadDEGs.Rdata") 16 | ``` 17 | 18 | 在`TCGAbiolinks`里进行富集分析很简单,就一句代码搞定。 19 | 20 | 21 | ```r 22 | library(TCGAbiolinks) 23 | 24 | Genelist <- coadDEGs$gene_name # gene_symbol 25 | 26 | # 进行GO和KEGG分析 27 | ansEA <- TCGAanalyze_EAcomplete( 28 | TFname = "TCGAbiolinks enrichment analysis", 29 | RegulonList = Genelist 30 | ) 31 | ## [1] "I need about 1 minute to finish complete Enrichment analysis GO[BP,MF,CC] and Pathways... " 32 | ## [1] "GO Enrichment Analysis BP completed....done" 33 | ## [1] "GO Enrichment Analysis MF completed....done" 34 | ## [1] "GO Enrichment Analysis CC completed....done" 35 | ## [1] "Pathway Enrichment Analysis completed....done" 36 | 37 | 38 | # 富集分析结果可视化 39 | TCGAvisualize_EAbarplot( 40 | tf = rownames(ansEA$ResBP), 41 | GOBPTab = ansEA$ResBP, 42 | GOCCTab = ansEA$ResCC, 43 | GOMFTab = ansEA$ResMF, 44 | PathTab = ansEA$ResPat, 45 | nRGTab = Genelist, 46 | nBar = 10 47 | ) 48 | ## png 49 | ## 2 50 | ``` 51 | 52 | 然后就可以得到一张条形图: 53 | ![Snipaste_2022-07-28_17-08-33](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-07-28_17-08-33.png) 54 | 55 | 56 | ## 生存分析 57 | 58 | 可以使用之前保存好的数据,也可以直接下载使用,临床数据不大,一般都能下载下来~ 59 | 60 | 61 | ```r 62 | # 临床数据可以像这样下载,直接就是一个数据框 63 | clin.coad <- GDCquery_clinic("TCGA-COAD", "clinical") 64 | 65 | dim(clin.coad) 66 | ## [1] 461 70 67 | ``` 68 | 69 | 会直接得到这样一个数据框,非常方便: 70 | ![Snipaste_2022-07-28_18-09-10](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-07-28_18-09-10.png) 71 | 72 | 然后就可以进行生存分析了,比如我们用`gender`作为分组变量: 73 | 74 | 75 | ```r 76 | TCGAanalyze_survival( 77 | data = clin.coad, 78 | clusterCol = "gender", 79 | main = "TCGA Set\n COAD", 80 | height = 10, 81 | width=10 82 | ) 83 | ## File saved as: survival.pdf 84 | ``` 85 | 86 | 结果会得到这样一个图: 87 | ![Snipaste_2022-07-28_18-05-56](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-07-28_18-05-56.png) 88 | 89 | 肯定是不如自己用别的包画的好看~ 90 | 91 | 也可以使用基因表达量进行分组,然后进行差异分析,只要把基因表达量数据加进去即可~ 92 | 93 | 但是如果这样做的话,我们肯定是选择使用`survival`包做,比`TCGAanalyze_survival()`更加灵活好用~ 94 | 95 | 96 | 97 | 除此之外,还可以进行火山图、热图、PCA图的绘制以及甲基化的一些简单分析,但是相比于它下载和准备的数据的功能,其他功能太弱了,都是对于其他包的封装,对于`TCGAbiolinks`的这些分析感兴趣的可以自行去官网学习哦~ 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks04手动整理表达矩阵.md: -------------------------------------------------------------------------------- 1 | 很多人因为网络原因不能使用`TCGAbiolinks`这个神包下载TCGA的RNA-seq数据,只能通过浏览器访问GDC TCGA的官网进行下载,而下载后得到的是一个个文件夹,对于如何整理成一个表达矩阵也是很麻烦的。 2 | 3 | 今天给大家介绍一个简单点的方法,使用`TCGAbiolinks`包整理你通过浏览器官网下载的rna-seq数据。 4 | 5 | 通常大家通过浏览器下载后会得到下面的这种很多个文件夹: 6 | ![Snipaste_2022-08-03_17-51-57](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-03_17-51-57.png) 7 | 8 | 每个文件夹里是一个样本的表达量数据,tsv格式的: 9 | ![Snipaste_2022-08-03_17-52-14](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-03_17-52-14.png) 10 | 11 | 这时候你可以通过之前介绍过的方法得到表达矩阵:新版TCGA数据库表达矩阵整理 12 | 13 | 但是这个方法对于新手还是不够友好,尤其是根据Json文件匹配数据时,但是TCGA表达量数据又是很常用的,这个操作还是很高频的需求。 14 | 15 | 前几天学习`TCGAbiolinks`包时意外发现,**即使是手动下载的数据,只要构建合适的路径,也是可以通过`GDCprepare()`函数进行整理从而简单的得到表达矩阵的!** 16 | 17 | `TCGAbiolinks`包下载的表达量数据的文件路径是有规律的,如果你没有特别指明,通常是位于**GDCdata\TCGA-COAD\harmonized\Transcriptome_Profiling\Gene_Expression_Quantification**这个路径下的。 18 | 19 | 这个包下载数据就是三板斧操作,`query`,`download`,`prepare`,而且最后`GDCprepare()`需要的还是`GDCquery()`得到的对象,因此我们完全可以通过构建一个适合它的路径,让`GDC_prepare()`帮我们整理成表达矩阵! 20 | 21 | 比如我上面的各个样本文件夹的路径在我的电脑中是这样的:**G:\tcga\GDCdata\TCGA-COAD\harmonized\Transcriptome_Profiling\Gene_Expression_Quantification**,我的`get_expr.R`脚本是放在**G:\tcga**这个路径下的。 22 | 23 | 脚本内容如下: 24 | 25 | ```{r} 26 | library(TCGAbiolinks) 27 | 28 | ## ============================================================= 29 | ## ______ ___ ____ ___ 30 | ## || | | | | | o __ | o _ __ 31 | ## || | | ___ |___| |__ | | | | | | | | |_/ |__ 32 | ## || |___ |____| | | |__| | |__| |__ | | |_| | \ __| 33 | ## ------------------------------------------------------------ 34 | ## Query, download & analyze - GDC 35 | ## Version:2.25.2 36 | ## ============================================================== 37 | 38 | 39 | # 查询这一步是需要的!即使网在栏,这一步应该可以成功的... 40 | query <- GDCquery(project = "TCGA-COAD", 41 | data.category = "Transcriptome Profiling", 42 | data.type = "Gene Expression Quantification", 43 | workflow.type = "STAR - Counts" 44 | ) 45 | # 下载这一步就不用了,我们是通过官网手动下载的~ 46 | # GDCdownload(query, files.per.chunk = 100) #每次下载100个文件 47 | 48 | # 整理 49 | GDCprepare(query,save = T,save.filename = "example.rdata") 50 | 51 | ##|===============================================================================|100% ## Completed after 1 m 52 | ##Starting to add information to samples 53 | ## => Add clinical information to samples 54 | ## => Adding TCGA molecular information from marker papers 55 | ## => Information will have prefix 'paper_' 56 | ##coad subtype information from:doi:10.1038/nature11252 57 | ##Available assays in SummarizedExperiment : 58 | ## => unstranded 59 | ## => stranded_first 60 | ## => stranded_second 61 | ## => tpm_unstrand 62 | ## => fpkm_unstrand 63 | ## => fpkm_uq_unstrand 64 | ##=> Saving file: example.rdata 65 | ##=> File saved 66 | ``` 67 | 68 | 这样我们的数据就整理好了: 69 | ![Snipaste_2022-08-03_18-22-19](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-03_18-22-19.png) 70 | 71 | 下次使用直接load即可: 72 | 73 | ```{r} 74 | rm(list = ls()) 75 | load(file = "example.rdata") 76 | 77 | se <- data 78 | se 79 | 80 | class: RangedSummarizedExperiment 81 | dim: 60660 521 82 | metadata(1): data_release 83 | assays(6): unstranded stranded_first ... fpkm_unstrand fpkm_uq_unstrand 84 | rownames(60660): ENSG00000000003.15 ENSG00000000005.6 ... ENSG00000288674.1 ENSG00000288675.1 85 | rowData names(10): source type ... hgnc_id havana_gene 86 | colnames(521): TCGA-A6-5664-01A-21R-1839-07 TCGA-D5-6530-01A-11R-1723-07 ... 87 | TCGA-A6-2683-01A-01R-0821-07 TCGA-A6-2683-11A-01R-A32Z-07 88 | colData names(107): barcode patient ... paper_vascular_invasion_present paper_vital_status 89 | ``` 90 | 91 | **这个`se`就是我们之前介绍过的SummarizedExperiment对象,你可以对它进行各种操作,得到counts矩阵、tpm矩阵、fpkm矩阵都是小事一桩,犹如探囊取物一般简单流畅!** 详情可参考之前的推文。 92 | 93 | >关于TCGA表达矩阵提取,告诉我,你还有哪里搞不定!? -------------------------------------------------------------------------------- /tcga/tcgabiolinks05下载和整理MAF.md: -------------------------------------------------------------------------------- 1 | 关于`TCGAbiolinks`包的学习前面一共介绍了5篇推文: 2 | 3 | [1.新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g) 4 | 5 | [2.新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ) 6 | 7 | [3.手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 8 | 9 | [4.新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA) 10 | 11 | [5.新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw) 12 | 13 | 今天继续学习如何使**用`TCGAbiolinks`下载和整理MAF格式的突变数据。** 14 | 15 | 之前的TCGA的`MAF`文件是可以下载的,每个癌症包含4种软件得到的突变文件: 16 | 17 | ![曾经TCGA可以下载4种MAF文件](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_16-47-33.png) 18 | 19 | 后来就改版了,不让你随便下载了。但其实还是可以下载的,只不过没有那么多选择了! 20 | 21 | 现在的情况是每个样本都是一个单独的maf文件,需要下载后自己整理,就像整理表达矩阵那样。 22 | 23 | ## MAF文件的下载 24 | 25 | 但是现在我们有`TCGAbiolinks`,根本不需要自己动手,直接**三步走**即可得到我们需要的`MAF`文件。 26 | 27 | 28 | ```r 29 | library(TCGAbiolinks) 30 | 31 | query <- GDCquery( 32 | project = "TCGA-COAD", 33 | data.category = "Simple Nucleotide Variation", 34 | data.type = "Masked Somatic Mutation", 35 | access = "open" 36 | ) 37 | 38 | GDCdownload(query) 39 | 40 | GDCprepare(query, save = T,save.filename = "TCGA-COAD_SNP.Rdata") 41 | ``` 42 | 43 | 这样得到的这个`Rdata`文件其实是一个数据框,不过由于内容和之前的`MAF`文件一模一样,所以也是可以直接用`maftools`读取使用的。 44 | 45 | `maftools`是一个非常强大的突变数据可视化和分析的R包,这个包在`bioconductor`上,需要的自行安装。 46 | 47 | ## 无缝对接maftools 48 | 49 | 由于我们在第一步已经下载过了,所以这里就不用下载了,直接加载保存好的数据。 50 | 51 | 我们以`TCGA-COAD`的数据作为演示。 52 | 53 | 54 | ```r 55 | library(maftools) 56 | 57 | load(file = "./TCGA-SNP/TCGA-COAD_SNP.Rdata") 58 | 59 | maf.coad <- data 60 | ``` 61 | 62 | 63 | 简单看一下这个数据: 64 | 65 | 66 | ```r 67 | class(maf.coad) 68 | ## [1] "data.frame" 69 | 70 | dim(maf.coad) 71 | ## [1] 252664 141 72 | 73 | maf.coad[1:10,1:10] 74 | ## X1 Hugo_Symbol Entrez_Gene_Id Center NCBI_Build Chromosome Start_Position 75 | ## 1 1 AGRN 375790 BCM GRCh38 chr1 1046481 76 | ## 2 1 ACAP3 116983 BCM GRCh38 chr1 1295539 77 | ## 3 1 CALML6 163688 BCM GRCh38 chr1 1916980 78 | ## 4 1 PRKCZ 5590 BCM GRCh38 chr1 2150972 79 | ## 5 1 WRAP73 49856 BCM GRCh38 chr1 3635995 80 | ## 6 1 CHD5 26038 BCM GRCh38 chr1 6142440 81 | ## 7 1 CAMTA1 23261 BCM GRCh38 chr1 7663513 82 | ## 8 1 ERRFI1 54206 BCM GRCh38 chr1 8014193 83 | ## 9 1 SLC2A7 155184 BCM GRCh38 chr1 9022922 84 | ## 10 1 PGD 5226 BCM GRCh38 chr1 10411462 85 | ## End_Position Strand Variant_Classification 86 | ## 1 1046481 + Frame_Shift_Del 87 | ## 2 1295539 + Missense_Mutation 88 | ## 3 1916980 + Silent 89 | ## 4 2150972 + Silent 90 | ## 5 3635995 + Silent 91 | ## 6 6142440 + Missense_Mutation 92 | ## 7 7663513 + Silent 93 | ## 8 8014193 + Missense_Mutation 94 | ## 9 9022922 + Missense_Mutation 95 | ## 10 10411462 + Silent 96 | ``` 97 | 98 | 可以看到是一个`data.frame`类型的文件。 99 | 100 | 这个文件一共有252664行,141列,包含了gene symbol,突变类型,突变位置,导致的氨基酸变化等信息。 101 | 102 | 下面就直接用`read.maf()`函数读取即可,没有任何花里胡哨的操作! 103 | 104 | 105 | ```r 106 | maf <- read.maf(maf.coad) 107 | ## -Validating 108 | ## -Silent variants: 63597 109 | ## -Summarizing 110 | ## --Mutiple centers found 111 | ## BCM;WUGSC;BCM;WUGSC;BCM;BI--Possible FLAGS among top ten genes: 112 | ## TTN 113 | ## SYNE1 114 | ## MUC16 115 | ## -Processing clinical data 116 | ## --Missing clinical data 117 | ## -Finished in 6.000s elapsed (5.690s cpu) 118 | ``` 119 | 120 | 然后就是进行各种可视化操作,毫无难度: 121 | 122 | 123 | ```r 124 | plotmafSummary(maf = maf, rmOutlier = TRUE, addStat = 'median', dashboard = TRUE) 125 | ``` 126 | 127 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-5-15148044151480950.png) 128 | 129 | 是不是非常简单,虽然没有直接提供单个癌症的MAF文件,但是使用`TCGAbiolinks`后,会直接帮我们整理好,没有任何难度。 130 | 131 | 如果你由于各种原因不能使用这个包下载数据,那你可以直接用网页下载,然后按照我之前的推文进行整理: 132 | 133 | [手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 134 | 135 | 但是这个方法用在表达谱数据是没有问题的,理论上用在其他类型的数据都是可以的,但是我并没有尝试过,欢迎大家使用后留言。 136 | 137 | **如果你在网络上看见一个叫`xxx.pl`的文件,并且需要付费获取,建议你不要花这个冤枉钱,不值那个价,希望大家多多擦亮眼睛!** 138 | 139 | 140 | 141 | 如果你非要用手撕代码的方式自己整理,也是非常简单的,比整理转录组数据的表达矩阵简单100倍。 142 | 143 | ## 自己整理成MAF格式 144 | 145 | 首先你要去`GDC TCGA`的官网下载某个癌症的所有的`maf`文件,还是以`TCGA-COAD`为例,下载好之后是这样的: 146 | 147 | ![TCGA-COAD-MaskedSomatic-Mutation](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_18-20-24.png) 148 | 149 | 每个样本第一个文件夹,每个文件夹下面有一个`.gz`结尾的压缩文件,这个文件解压缩之后就是大家熟悉的`.maf`文件大,但是只是一个样本的~ 150 | 151 | ![压缩的maf文件](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_18-20-41.png) 152 | 153 | 把这个`.maf`文件用VScode打开后是这样的: 154 | 155 | ![单个样本的maf文件](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_18-17-12.png) 156 | 157 | 不妨多解压几个打开看一看,都是一样的结构,所以就很简单了,把所有的文件读取进来然后直接`rbind()`即可。 158 | 159 | 但是在此之前我们可以先读取一个试试看: 160 | 161 | 162 | ```r 163 | # 路径必须正确 164 | tmp <- read.table("G:/tcga/GDCdata/TCGA-COAD/harmonized/Simple_Nucleotide_Variation/Masked_Somatic_Mutation/007c2ae4-bbd2-42c6-ab67-bf016fbddb51/982004b5-52e1-4a69-97d3-25bdcb77b026.wxs.aliquot_ensemble_masked.maf.gz", 165 | skip = 7, # 前面7行都不要 166 | sep = "\t", # 必须指定 167 | header = T # 有行名 168 | ) 169 | 170 | tmp[1:10,1:8] 171 | ## Hugo_Symbol Entrez_Gene_Id Center NCBI_Build Chromosome Start_Position 172 | ## 1 NOC2L 26155 BCM GRCh38 chr1 945088 173 | ## 2 SDF4 51150 BCM GRCh38 chr1 1217753 174 | ## 3 B3GALT6 126792 BCM GRCh38 chr1 1233752 175 | ## 4 MIB2 142678 BCM GRCh38 chr1 1629520 176 | ## 5 NADK 65220 BCM GRCh38 chr1 1765325 177 | ## 6 GNB1 2782 BCM GRCh38 chr1 1804562 178 | ## 7 PANK4 55229 BCM GRCh38 chr1 2510063 179 | ## 8 PRXL2B 127281 BCM GRCh38 chr1 2588386 180 | ## 9 PRDM16 63976 BCM GRCh38 chr1 3412316 181 | ## 10 WRAP73 49856 BCM GRCh38 chr1 3633442 182 | ## End_Position Strand 183 | ## 1 945088 + 184 | ## 2 1217753 + 185 | ## 3 1233752 + 186 | ## 4 1629520 + 187 | ## 5 1765325 + 188 | ## 6 1804562 + 189 | ## 7 2510063 + 190 | ## 8 2588386 + 191 | ## 9 3412316 + 192 | ## 10 3633442 + 193 | ``` 194 | 195 | 非常顺利,和上面那个整理好的格式一模一样,唯一不同就是这个只是一个样本的。 196 | 197 | 下面我们就批量读取并合并就好了! 198 | 199 | 200 | ```r 201 | # 确定文件路径! 202 | dir.path <- "G:/tcga/GDCdata/TCGA-COAD/harmonized/Simple_Nucleotide_Variation/Masked_Somatic_Mutation" 203 | 204 | # 获取所有maf文件路径 205 | all.maf <- list.files(path = dir.path, pattern = ".gz", 206 | full.names = T, recursive = T) 207 | 208 | # 看看前3个 209 | all.maf[1:3] 210 | ## [1] "G:/tcga/GDCdata/TCGA-COAD/harmonized/Simple_Nucleotide_Variation/Masked_Somatic_Mutation/007c2ae4-bbd2-42c6-ab67-bf016fbddb51/982004b5-52e1-4a69-97d3-25bdcb77b026.wxs.aliquot_ensemble_masked.maf.gz" 211 | ## [2] "G:/tcga/GDCdata/TCGA-COAD/harmonized/Simple_Nucleotide_Variation/Masked_Somatic_Mutation/010f9040-294d-4d14-a2b4-80d7a11625dd/5083b949-1bf3-4bc2-bf4f-f668f8a13792.wxs.aliquot_ensemble_masked.maf.gz" 212 | ## [3] "G:/tcga/GDCdata/TCGA-COAD/harmonized/Simple_Nucleotide_Variation/Masked_Somatic_Mutation/0148fff1-b8af-4bf0-8bcd-de1ff9f750f3/2c16cfe2-bf6d-4a39-af3a-9dfd5ada3e17.wxs.aliquot_ensemble_masked.maf.gz" 213 | ``` 214 | 215 | 然后直接读取就行了,觉得慢可以用`data.table::fread()`加快速度。 216 | 217 | 218 | ```r 219 | maf.list <- lapply(all.maf, read.table, 220 | skip = 7, 221 | sep = "\t", 222 | header = T) 223 | ``` 224 | 225 | 然后直接合并即可,如果不放心可以看看列数列名是不是一样,100%一样,我们就不看了。 226 | 227 | 228 | ```r 229 | # lapply(maf.list, dim) 230 | 231 | maf.merge <- do.call(rbind,maf.list) 232 | ``` 233 | 234 | 目前为止看似一切顺利,本以为即将结束,但是没想到横生枝节! 235 | 236 | **竟然读取不了,而且我们得到的这个`maf.merge`竟然只有137665行!和252664行的差距实在是太大了!** 237 | 238 | 239 | ```r 240 | # 读取失败! 241 | maf1 <- read.maf(maf.merge) 242 | 243 | ## -Validating 244 | ## --Removed 5 duplicated variants 245 | ## --Non MAF specific values in Variant_Classification column: 246 | ## 3UTR DEL T T - novel TCGA-A6-6781-01A-22D-1924-10 TCGA-A6-6781-10A-01D-1924-10 247 | ``` 248 | 249 | 果然不检查数据是不行的! 250 | 251 | 然后只能回过头去看哪里出了问题,通过仔细使用VScode直接打开maf文件和我们读取的文件对比,发现了问题。 252 | 253 | **在`Variant_Classification`这一列中,有一些`3'UTR / 5'UTR`这样的类型,但是在使用`read.table()`读取的时候竟然识别不出来!** 254 | 255 | 小丑竟是我自己! 256 | 257 | ![3'UTR识别出错](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_19-44-41.png) 258 | 259 | ![这才是正确的](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-19_19-45-20.png) 260 | 261 | 所以直接导致遇到这个之后的所有行都是错位的,而且少了非常多行。 262 | 263 | 生气啊! 264 | 265 | 但是找到问题之后解决就非常简单,换个函数就行了,我们直接用`data.table::fread()`读取! 266 | 267 | 268 | ```r 269 | maf.list <- lapply(all.maf, data.table::fread, 270 | sep = "\t", 271 | header = T, 272 | skip = 7 273 | ) 274 | 275 | maf.merge <- do.call(rbind,maf.list) 276 | 277 | dim(maf.merge) 278 | ## [1] 252664 140 279 | ``` 280 | 281 | 现在就和前面的数据一模一样了,252664行,140列(少了一列是表示来自于第几个样本,没有用)。 282 | 283 | 284 | ```r 285 | # 读取成功! 286 | maf1 <- read.maf(maf.merge) 287 | ## -Validating 288 | ## -Silent variants: 63597 289 | ## -Summarizing 290 | ## --Mutiple centers found 291 | ## BCM;WUGSC;BCM;BI;BCM;WUGSC--Possible FLAGS among top ten genes: 292 | ## TTN 293 | ## SYNE1 294 | ## MUC16 295 | ## -Processing clinical data 296 | ## --Missing clinical data 297 | ## -Finished in 3.970s elapsed (3.730s cpu) 298 | ``` 299 | 300 | 301 | ```r 302 | plotmafSummary(maf = maf1, rmOutlier = TRUE, addStat = 'median', dashboard = TRUE) 303 | ``` 304 | 305 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-5-15148044151480950.png) 306 | 307 | 简单!下次说说这个`maftools`的使用。 308 | 309 | **觉得有用请多多转发~拒绝不必要的花钱!难道免费的不如付费的香??** 310 | 311 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks07snp和临床信息制作.md: -------------------------------------------------------------------------------- 1 | 2 | 今天给大家演示下如何用自己的数据完成`maftools`的分析,主要是**snp文件和临床信息的制作**,其实很简单,但是网络上的教程都说的不清楚。 3 | 4 | 这次我们直接用之前**TCGA-COAD和TCGA-READ合并后的数据演示**,合并教程请看前一篇推文: 5 | 6 | [新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493493&idx=1&sn=7d805d747aeee3de70cf5384457b5c59&scene=21#wechat_redirect) 7 | 8 | ## 加载数据和R包 9 | 10 | 因为现在的TCGA数据库不能直接下载4种制作好的maf文件了,需要自己整理,如果你还不知道怎么整理,请看这篇内容: 11 | 12 | [TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247493492&idx=1&sn=0e7a53ab9f60cdf9abcdf672ad36c834&scene=21#wechat_redirect) 13 | 14 | 15 | ```r 16 | load(file = "./TCGA-colrectum/colrectal_snp.rdata") 17 | 18 | library(maftools) 19 | ``` 20 | 21 | 除此之外,我们还要给这个数据添加临床信息,也是只要先加载之前合并后的数据。 22 | 23 | 24 | ```r 25 | load(file = "./TCGA-colrectum/colrectal_clin.rdata") 26 | ``` 27 | 28 | `maftools`包添加临床信息的方式非常简单,**只要两个文件都有`Tumor_Sample_Barcode`这一列且对得上就行**。所以我们还要对snp文件和临床信息进行一些简单的处理。 29 | 30 | - 对于两个文件中的`Tumor_Sample_Barcode`这一列,我们只要前12个字符即可 31 | - 临床信息中有一些是Normal的样本,需要去除 32 | - 之选择在snp文件中有的样本 33 | 34 | 35 | ```r 36 | # 只要前12个字符 37 | colrec_snp$Tumor_Sample_Barcode <- substr(colrec_snp$Tumor_Sample_Barcode,1,12) 38 | head(colrec_snp$Tumor_Sample_Barcode) 39 | ## [1] "TCGA-D5-6530" "TCGA-D5-6530" "TCGA-D5-6530" "TCGA-D5-6530" "TCGA-D5-6530" 40 | ## [6] "TCGA-D5-6530" 41 | ``` 42 | 43 | **如果你是像我这样直接用的`TCGAbiolinks`包下载的数据,那这个临床信息直接包含了`sample_type`这一列,不需要自己根据样本名确定到底是normal还是tumor,十分方便。** 44 | 45 | 46 | ```r 47 | index <- unique(colrec_snp$Tumor_Sample_Barcode) 48 | 49 | # 只要肿瘤样本 50 | clin_snp <- clin[!clin$sample_type == "Solid Tissue Normal", ] 51 | 52 | # 只要snp文件中有的样本 53 | clin_snp <- clin_snp[clin_snp$patient %in% index, ] 54 | 55 | # clin中没有Tumor_Sample_Barcode这一列,直接添加一列 56 | clin_snp$Tumor_Sample_Barcode <- clin_snp$patient 57 | ``` 58 | 59 | 这样两个需要的文件就制作好了。 60 | 61 | 62 | ```r 63 | colrec_snp[1:5,1:5] 64 | ## X1 Hugo_Symbol Entrez_Gene_Id Center NCBI_Build 65 | ## 1 1 AGRN 375790 BCM GRCh38 66 | ## 2 1 ACAP3 116983 BCM GRCh38 67 | ## 3 1 CALML6 163688 BCM GRCh38 68 | ## 4 1 PRKCZ 5590 BCM GRCh38 69 | ## 5 1 WRAP73 49856 BCM GRCh38 70 | ``` 71 | 72 | 73 | ```r 74 | clin_snp[1:5,1:5] 75 | ## barcode patient 76 | ## TCGA-A6-5664-01A-21R-1839-07 TCGA-A6-5664-01A-21R-1839-07 TCGA-A6-5664 77 | ## TCGA-D5-6530-01A-11R-1723-07 TCGA-D5-6530-01A-11R-1723-07 TCGA-D5-6530 78 | ## TCGA-AA-3556-01A-01R-0821-07 TCGA-AA-3556-01A-01R-0821-07 TCGA-AA-3556 79 | ## TCGA-AA-3818-01A-01R-0905-07 TCGA-AA-3818-01A-01R-0905-07 TCGA-AA-3818 80 | ## TCGA-AA-3660-01A-01R-1723-07 TCGA-AA-3660-01A-01R-1723-07 TCGA-AA-3660 81 | ## sample shortLetterCode 82 | ## TCGA-A6-5664-01A-21R-1839-07 TCGA-A6-5664-01A TP 83 | ## TCGA-D5-6530-01A-11R-1723-07 TCGA-D5-6530-01A TP 84 | ## TCGA-AA-3556-01A-01R-0821-07 TCGA-AA-3556-01A TP 85 | ## TCGA-AA-3818-01A-01R-0905-07 TCGA-AA-3818-01A TP 86 | ## TCGA-AA-3660-01A-01R-1723-07 TCGA-AA-3660-01A TP 87 | ## definition 88 | ## TCGA-A6-5664-01A-21R-1839-07 Primary solid Tumor 89 | ## TCGA-D5-6530-01A-11R-1723-07 Primary solid Tumor 90 | ## TCGA-AA-3556-01A-01R-0821-07 Primary solid Tumor 91 | ## TCGA-AA-3818-01A-01R-0905-07 Primary solid Tumor 92 | ## TCGA-AA-3660-01A-01R-1723-07 Primary solid Tumor 93 | ``` 94 | 95 | ## 读取数据 96 | 97 | 两个文件都没有问题,直接读取即可。 98 | 99 | 100 | ```r 101 | colrec.maf <- read.maf(colrec_snp,clinicalData = clin_snp) 102 | ## -Validating 103 | ## --Removed 41322 duplicated variants 104 | ## -Silent variants: 67679 105 | ## -Summarizing 106 | ## --Mutiple centers found 107 | ## BCM;WUGSC;BCM;WUGSC;BCM;BI--Possible FLAGS among top ten genes: 108 | ## TTN 109 | ## SYNE1 110 | ## MUC16 111 | ## -Processing clinical data 112 | ## --Annotation missing for below samples in MAF: 113 | ## TCGA-AA-3695 114 | ## TCGA-AA-3967 115 | ## TCGA-AF-2689 116 | ## TCGA-AF-3914 117 | ## TCGA-AG-3891 118 | ## TCGA-AG-3906 119 | ## TCGA-AZ-4681 120 | ## -Finished in 7.170s elapsed (6.480s cpu) 121 | ``` 122 | 123 | 画图也是没有问题的,关于这个包的使用网络上教程非常多,也很全面,大家直接百度即可,这里就简单演示下。 124 | 125 | 126 | ```r 127 | plotmafSummary(colrec.maf) 128 | ``` 129 | 130 | ![plot of chunk unnamed-chunk-8](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-151561119.png) 131 | 132 | 最常见的额瀑布图: 133 | 134 | 135 | ```r 136 | oncoplot(maf = colrec.maf, 137 | clinicalFeatures = c("ajcc_pathologic_stage","vital_status"), 138 | top = 30, 139 | sortByAnnotation=T 140 | ) 141 | ``` 142 | 143 | ![image-20220820183535812](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220820183535812.png) 144 | 145 | 这个图其实就是`Complexheatmap`画出来的,之前的推文里详细介绍了这个R包,感兴趣的可以看一看: 146 | 147 | [超详细的R语言热图之complexheatmap系列1](https://mp.weixin.qq.com/s/sIGLjqk_Ug4FfwrzWrXprQ) 148 | 149 | [超详细的R语言热图之complexheatmap系列2](https://mp.weixin.qq.com/s/3WA9hoHfktm7ZioGC0imEA) 150 | 151 | [韦恩图进阶!complexheatmap包画upset plot](https://mp.weixin.qq.com/s/CI-wTadPj2lLuEGM_9tTYA) 152 | 153 | 154 | ```r 155 | colrec.titv = titv(maf = colrec.maf, plot = FALSE, useSyn = TRUE) 156 | #plot titv summary 157 | plotTiTv(res = colrec.titv) 158 | ``` 159 | 160 | ![plot of chunk unnamed-chunk-10](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-151561119.png) 161 | 162 | 比较有意思的棒棒糖图,这个图可以用`trackviewer`包画的更好看,下次介绍。 163 | 164 | 画出来简单,但是解释过程挺复杂的,涉及到下游氨基酸的变化,需要了解**碱基变化命名规则和氨基酸变化命名规则**才能知道具体意思。 165 | 166 | 167 | ```r 168 | lollipopPlot(colrec.maf, 169 | gene = "TP53", 170 | AACol = "HGVSp_Short" # 需要注意这一列 171 | ) 172 | ## 8 transcripts available. Use arguments refSeqID or proteinID to manually specify tx name. 173 | ## HGNC refseq.ID protein.ID aa.length 174 | ## 1: TP53 NM_000546 NP_000537 393 175 | ## 2: TP53 NM_001126112 NP_001119584 393 176 | ## 3: TP53 NM_001126118 NP_001119590 354 177 | ## 4: TP53 NM_001126115 NP_001119587 261 178 | ## 5: TP53 NM_001126113 NP_001119585 346 179 | ## 6: TP53 NM_001126117 NP_001119589 214 180 | ## 7: TP53 NM_001126114 NP_001119586 341 181 | ## 8: TP53 NM_001126116 NP_001119588 209 182 | ## Using longer transcript NM_000546 for now. 183 | ``` 184 | 185 | ![plot of chunk unnamed-chunk-11](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-11-151561119.png) 186 | 187 | 拷贝数变异肯定也是没有问题的,也是用的之前合并后的数据,然后经过gistic处理,就得到了我们需要的文件,关于gistic这个软件的使用,大家百度即可~ 188 | 189 | 190 | ```r 191 | all.lesions <- "./TCGA-colrectum/TCGA_COREAD_results/all_lesions.conf_90.txt" 192 | amp.genes <- "./TCGA-colrectum/TCGA_COREAD_results/amp_genes.conf_90.txt" 193 | del.genes <- "./TCGA-colrectum/TCGA_COREAD_results/del_genes.conf_90.txt" 194 | scores.gis <- "./TCGA-colrectum/TCGA_COREAD_results/scores.gistic" 195 | 196 | colrec.gistic = readGistic(gisticAllLesionsFile = all.lesions, 197 | gisticAmpGenesFile = amp.genes, 198 | gisticDelGenesFile = del.genes, 199 | gisticScoresFile = scores.gis, 200 | isTCGA = TRUE) 201 | ## -Processing Gistic files.. 202 | ## --Processing amp_genes.conf_90.txt 203 | ## --Processing del_genes.conf_90.txt 204 | ## --Processing scores.gistic 205 | ## --Summarizing by samples 206 | 207 | colrec.gistic 208 | ## An object of class GISTIC 209 | ## ID summary 210 | ## 1: Samples 611 211 | ## 2: nGenes 2791 212 | ## 3: cytoBands 88 213 | ## 4: Amp 97455 214 | ## 5: Del 313297 215 | ## 6: total 410752 216 | ``` 217 | 218 | 结果也是毫无问题! 219 | 220 | 准备自己的数据,就是如此的简单。 221 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks08:甲基化.md: -------------------------------------------------------------------------------- 1 | `TCGAbiolinks`可以进行甲基化分析,但是功能不如`ChAMP`强大,甲基化分析还是首推`ChAMP`包。 2 | 3 | 不过为了了解`TCGAbiolinks`包,里面关于甲基化分析的部分还是要学习一下。 4 | 5 | 主要是甲基化差异分析,甲基化的一些可视化,甲基化和转录组数据的联合作图。 6 | 7 | ## 加载数据 8 | 9 | 我们还是使用之前下载好的TCGA-COAD的甲基化β值矩阵。 10 | 11 | 数据下载见这篇:[使用TCGAbiolinks批量下载最新版TCGA数据库的各种组学数据!](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492403&idx=1&sn=dcb748ca56e4e13181dedc310aaef5e2&scene=21#wechat_redirect) 12 | 13 | 14 | ```r 15 | library(TCGAbiolinks) 16 | suppressMessages(library(SummarizedExperiment)) 17 | load(file = "G:/tcga/TCGA-dnaMethy/COAD_METHY_beta.Rdata") 18 | ``` 19 | 20 | 查看一下数据,现在这个β值矩阵还是一个`SummarizedExperiment`对象: 21 | 22 | 23 | ```r 24 | beta.m <- data 25 | beta.m 26 | ## class: RangedSummarizedExperiment 27 | ## dim: 485577 352 28 | ## metadata(1): data_release 29 | ## assays(1): '' 30 | ## rownames(485577): cg13869341 cg14008030 ... cg11478607 cg08417382 31 | ## rowData names(52): address_A address_B ... MASK_extBase MASK_general 32 | ## colnames(352): TCGA-D5-6530-01A-11D-1721-05 33 | ## TCGA-AA-3660-11A-01D-1721-05 ... TCGA-A6-5664-01A-21D-1837-05 34 | ## TCGA-D5-6533-01A-11D-1721-05 35 | ## colData names(107): barcode patient ... paper_vascular_invasion_present 36 | ## paper_vital_status 37 | ``` 38 | 39 | ## 甲基化差异分析 40 | 41 | β矩阵不能含有缺失值,所以先去除缺失值,使用缺失值插补方法进行插补也是可以的: 42 | 43 | 44 | ```r 45 | beta.m <- subset(beta.m, subset = (rowSums(is.na(assay(beta.m))) == 0)) 46 | ``` 47 | 48 | 如果你的甲基化矩阵是直接使用`TCGAbiolinks`包整理好的`SummarizedExperiment`对象,那么这个甲基化差异分析就非常简单。 49 | 50 | 我们需要确定谁和谁进行相比,也就是要创建一个含有分组信息的列。 51 | 52 | 所有样本的信息都在`SummarizedExperiment`对象中的`colData`中,包括分组信息、生存信息、分期信息等,我们这里只要用到分组信息即可,所以先把`colData`简化一下。 53 | 54 | 如果你这里都看不懂,可以翻看之前的推文: 55 | 56 | [新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492462&idx=1&sn=0773b4ad0ecdd7e3cf206cd611249399&scene=21#wechat_redirect) 57 | [新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492794&idx=1&sn=ff9e4aa0c76b0d4adadf0d124f2d90a9&scene=21#wechat_redirect) 58 | 59 | 60 | ```r 61 | # 只要两列信息,其实只要sample_type一列也行 62 | sample_info <- as.data.frame(colData(beta.m))[,c("barcode","sample_type")] 63 | 64 | # sample_type改成normal和tumor 65 | sample_info[sample_info == "Solid Tissue Normal"] <- "normal" 66 | sample_info[sample_info != "normal"] <- "tumor" 67 | 68 | table(sample_info$sample_type) 69 | ## 70 | ## normal tumor 71 | ## 38 314 72 | 73 | # 重新变成coldata 74 | colData(beta.m) <- DataFrame(sample_info) 75 | ``` 76 | 77 | 有了`SummarizedExperiment`对象和相应的分组信息就可以进行甲基化差异分析了。 78 | 79 | 80 | ```r 81 | # 非常慢 82 | res <- TCGAanalyze_DMC(data = beta.m, 83 | groupCol = "sample_type", # colData中这一列含有分组信息 84 | group1 = "normal", # normal组 85 | group2 = "tumor" # tumor组 86 | ) 87 | 88 | ## Group1:normal 89 | ## Group2:tumor 90 | ## Calculating the p-values of each probe... 91 | ## |=================================================================|100% Completed after 20 m 92 | ## Saving volcano plot as: methylation_volcano.pdf 93 | ``` 94 | 95 | 查看结果: 96 | 97 | ```r 98 | head(res) 99 | ## mean.normal mean.tumor mean.normal.minus.mean.tumor 100 | ## cg21870274 0.7868787 0.5479701 0.23890856 101 | ## cg16619049 0.2781233 0.2591982 0.01892506 102 | ## cg18147296 0.7219909 0.6847735 0.03721734 103 | ## cg13938959 0.6958773 0.4552416 0.24063575 104 | ## cg12445832 0.4654454 0.2479300 0.21751535 105 | ## cg23999112 0.7941180 0.5310289 0.26308907 106 | ## p.value.normal.tumor p.value.adj.normal.tumor 107 | ## cg21870274 9.732669e-18 2.668610e-16 108 | ## cg16619049 2.314279e-02 4.306785e-02 109 | ## cg18147296 1.024600e-01 1.566558e-01 110 | ## cg13938959 4.389698e-18 1.321596e-16 111 | ## cg12445832 2.608577e-18 8.391252e-17 112 | ## cg23999112 4.649043e-13 5.043637e-12 113 | ## status 114 | ## cg21870274 Hypermethylated in normal 115 | ## cg16619049 Not Significant 116 | ## cg18147296 Not Significant 117 | ## cg13938959 Hypermethylated in normal 118 | ## cg12445832 Hypermethylated in normal 119 | ## cg23999112 Hypermethylated in normal 120 | ``` 121 | 122 | 可以看到和转录组的差异分析结果差不多,但是都是探针信息,基因信息需要注释才行。 123 | 124 | 同时也会在当前目录下生产一个PDF格式的火山图: 125 | 126 | ![image-20220903154948951](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220903154948951.png) 127 | 128 | 保存结果: 129 | 130 | 131 | ```r 132 | save(res, file = "tcga-coad_de_methy.rdata") 133 | ``` 134 | 135 | 136 | ## 甲基化可视化 137 | 138 | 使用箱线图可视化不同组别之间的甲基化值。 139 | 140 | 141 | ```r 142 | mdm <- TCGAvisualize_meanMethylation(data = beta.m, 143 | groupCol = "sample_type", 144 | print.pvalue = T 145 | ) 146 | ``` 147 | 148 | 会在目录下生成一个PDF文件: 149 | 150 | ![image-20220903154914628](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220903154914628.png) 151 | 152 | ## 甲基化旭日图 153 | 154 | 可以在一张图中查看转录组数据和甲基化数据的情况。 155 | 156 | 需要准备转录组差异分析结果和甲基化差异分析结果。 157 | 158 | 转录组差异分析结果使用之前推文中得到的数据:[新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s?__biz=MzUzOTQzNzU0NA==&mid=2247492794&idx=1&sn=ff9e4aa0c76b0d4adadf0d124f2d90a9&scene=21#wechat_redirect) 159 | 160 | 161 | ```r 162 | # 这个数据只是部分差异基因,你可以用所有基因的结果 163 | load(file = "coadDEGs.Rdata") 164 | ``` 165 | 166 | 甲基化差异分析结果就用本次的结果。 167 | 168 | 有了两个差异分析的结果,就可以画旭日图了: 169 | 170 | 171 | ```r 172 | starburst <- TCGAvisualize_starburst( 173 | met = res, 174 | exp = coadDEGs, 175 | group1 = "normal", 176 | group2 = "tumor", 177 | met.platform = "Illumina Human Methylation 450", 178 | genome = "hg38", 179 | met.p.cut = 10^-5, 180 | exp.p.cut = 10^-5, 181 | names = TRUE 182 | ) 183 | ``` 184 | 185 | 会在当前目录下生成一个png格式的旭日图: 186 | 187 | ![starburst](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/starburst.png) 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks10:可视化.md: -------------------------------------------------------------------------------- 1 | 2 | 使用`TCGAbiolinks`包探索最新版TCGA数据库: 3 | 4 | [1.新版TCGA数据库学习:批量下载数据](https://mp.weixin.qq.com/s/m8w1L4N2aXAIers_ZJvp_g) 5 | 6 | [2.新版TCGA数据库学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ) 7 | 8 | [3.手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 9 | 10 | [4.新版TCGAbiolinks包学习:差异分析](https://mp.weixin.qq.com/s/0SLQOZRkZ4hOQY1ETnQRUA) 11 | 12 | [5.新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw) 13 | 14 | [6.TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw) 15 | 16 | [7.maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s/1cR3Cnfd5Co9U3jIoIWJBA) 17 | 18 | [8.TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s/xbgQvGr0Q5DzBUqg8b__Zg) 19 | 20 | 今天学习下`TCGAbiolinks`包中的可视化函数。 21 | 22 | 这些图形都可以使用其他R包进行更好看的可视化,平常大家根本不用,不过作为`TCGAbiolinks`包完整学习的一部分,在这里简单记录一下。。 23 | 24 | 25 | ```r 26 | library(TCGAbiolinks) 27 | suppressMessages(library(SummarizedExperiment)) 28 | ``` 29 | 30 | ## 热图 31 | 32 | 可视化差异基因或者差异甲基化。 33 | 34 | 使用前面推文中得到的COAD的差异基因演示。 35 | 36 | 37 | ```r 38 | # 获取表达矩阵 39 | load("TCGA-mRNA/TCGA-COAD_mRNA.Rdata") 40 | se_mrna <- data[rowData(data)$gene_type == "protein_coding",] 41 | coadMatrix <- assay(se_mrna, "unstranded") 42 | coad_coroutliers <- TCGAanalyze_Preprocessing(se_mrna,cor.cut = 0.7) 43 | ## Number of outliers: 0 44 | coadNorm <- TCGAanalyze_Normalization( 45 | tabDF = coad_coroutliers, 46 | geneInfo = geneInfoHT) 47 | ## I Need about 127 seconds for this Complete Normalization Upper Quantile [Processing 80k elements /s] 48 | ## Step 1 of 4: newSeqExpressionSet ... 49 | ## Step 2 of 4: withinLaneNormalization ... 50 | ## Step 3 of 4: betweenLaneNormalization ... 51 | ## Step 4 of 4: exprs ... 52 | coadFilt <- TCGAanalyze_Filtering( 53 | tabDF = coadNorm, 54 | method = "quantile", 55 | qnt.cut = 0.25 56 | ) 57 | # 保存下方便以后使用 58 | #save(coadFilt,file = "./output/coadFilt.rdata") 59 | 60 | # 准备差异基因 61 | load(file = "./output/coadDEGs.Rdata") 62 | ``` 63 | 64 | 查看数据: 65 | 66 | 67 | ```r 68 | coadFilt[1:4,1:4] 69 | ## TCGA-NH-A8F7-06A-31R-A41B-07 TCGA-3L-AA1B-01A-11R-A37K-07 70 | ## ENSG00000000003 15299 7257 71 | ## ENSG00000000005 26 23 72 | ## ENSG00000000419 5139 2058 73 | ## ENSG00000000457 614 734 74 | ## TCGA-4N-A93T-01A-11R-A37K-07 TCGA-4T-AA8H-01A-11R-A41B-07 75 | ## ENSG00000000003 7125 2918 76 | ## ENSG00000000005 67 89 77 | ## ENSG00000000419 2626 844 78 | ## ENSG00000000457 731 323 79 | ``` 80 | 81 | 查看数据: 82 | 83 | 84 | ```r 85 | head(coadDEGs) 86 | ## logFC logCPM LR PValue FDR 87 | ## ENSG00000000419 1.018334 5.864185 58.75510 1.785702e-14 7.381441e-14 88 | ## ENSG00000000460 1.423716 3.457955 153.99195 2.325351e-35 3.797553e-34 89 | ## ENSG00000000971 -1.052867 4.847858 37.14551 1.096349e-09 3.067592e-09 90 | ## ENSG00000001460 -1.006716 3.531623 170.11301 6.990106e-39 1.377268e-37 91 | ## ENSG00000001497 1.151358 6.086819 114.28071 1.131077e-26 1.106818e-25 92 | ## ENSG00000001617 1.167619 5.505217 51.08214 8.858051e-13 3.195640e-12 93 | ## gene_name gene_type 94 | ## ENSG00000000419 DPM1 protein_coding 95 | ## ENSG00000000460 C1orf112 protein_coding 96 | ## ENSG00000000971 CFH protein_coding 97 | ## ENSG00000001460 STPG1 protein_coding 98 | ## ENSG00000001497 LAS1L protein_coding 99 | ## ENSG00000001617 SEMA3F protein_coding 100 | ``` 101 | 102 | 我们用logFC最大的前500个基因演示: 103 | 104 | 105 | ```r 106 | top500 <- coadDEGs[order(abs(coadDEGs$logFC),decreasing =T),][1:500,] 107 | ``` 108 | 109 | 准备热图需要的表达矩阵: 110 | 111 | 112 | ```r 113 | heat.df <- coadFilt[rownames(coadFilt) %in% rownames(top500),] 114 | dim(heat.df) 115 | ``` 116 | 117 | 准备热图需要的样本信息,必须有一列和表达矩阵的列名相同: 118 | 119 | 120 | ```r 121 | coldata <- colData(data) 122 | dim(coldata) 123 | ## [1] 521 107 124 | 125 | coldata.df <- as.data.frame(subset(coldata, select=c("barcode","sample_type","vital_status","gender", 126 | "ajcc_pathologic_t","ajcc_pathologic_n", 127 | "ajcc_pathologic_m"))) 128 | 129 | head(coldata.df) 130 | ## barcode sample_type 131 | ## TCGA-A6-5664-01A-21R-1839-07 TCGA-A6-5664-01A-21R-1839-07 Primary Tumor 132 | ## TCGA-D5-6530-01A-11R-1723-07 TCGA-D5-6530-01A-11R-1723-07 Primary Tumor 133 | ## TCGA-AA-3556-01A-01R-0821-07 TCGA-AA-3556-01A-01R-0821-07 Primary Tumor 134 | ## TCGA-AA-3660-11A-01R-1723-07 TCGA-AA-3660-11A-01R-1723-07 Solid Tissue Normal 135 | ## TCGA-AA-3818-01A-01R-0905-07 TCGA-AA-3818-01A-01R-0905-07 Primary Tumor 136 | ## TCGA-AA-3660-01A-01R-1723-07 TCGA-AA-3660-01A-01R-1723-07 Primary Tumor 137 | ## vital_status gender ajcc_pathologic_t 138 | ## TCGA-A6-5664-01A-21R-1839-07 Alive male T4a 139 | ## TCGA-D5-6530-01A-11R-1723-07 Alive male T2 140 | ## TCGA-AA-3556-01A-01R-0821-07 Alive male T2 141 | ## TCGA-AA-3660-11A-01R-1723-07 Alive female T3 142 | ## TCGA-AA-3818-01A-01R-0905-07 Dead female T3 143 | ## TCGA-AA-3660-01A-01R-1723-07 Alive female T3 144 | ## ajcc_pathologic_n ajcc_pathologic_m 145 | ## TCGA-A6-5664-01A-21R-1839-07 N2a MX 146 | ## TCGA-D5-6530-01A-11R-1723-07 N0 M0 147 | ## TCGA-AA-3556-01A-01R-0821-07 N0 M0 148 | ## TCGA-AA-3660-11A-01R-1723-07 N0 M0 149 | ## TCGA-AA-3818-01A-01R-0905-07 N0 M0 150 | ## TCGA-AA-3660-01A-01R-1723-07 N0 M0 151 | ``` 152 | 153 | 然后使用`TCGAvisualize_Heatmap`函数画热图,其实也是`complexheatmap`的包装: 154 | 155 | 156 | ```r 157 | TCGAvisualize_Heatmap(data = heat.df, 158 | col.metadata = coldata.df, 159 | cluster_rows = T, 160 | cluster_columns = T, 161 | scale = "row", 162 | extremes = seq(-2,2,1), 163 | color.levels = colorRampPalette(c("green", "black", "red"))(n = 5) 164 | ) 165 | ``` 166 | 167 | 会在当前目录生成一张热图: 168 | ![热图](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-09-08_19-42-44.png) 169 | 170 | ## 火山图 171 | 172 | 使用所有基因的差异信息。 173 | 174 | 175 | ```r 176 | load(file = "./output/coadDEGsAll.Rdata") 177 | 178 | TCGAVisualize_volcano(x=coadDEGAll$logFC, 179 | y=coadDEGAll$FDR, # 纵坐标会自动变成-log10 180 | x.cut = c(-1,1), 181 | y.cut = 2 182 | ) 183 | ``` 184 | 185 | 会在当前目录下保存火山图,这个图纵坐标太大了! 186 | 187 | ![火山图](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220908200751031.png) 188 | 189 | ## PCA图 190 | 191 | 192 | ```r 193 | rm(list = ls()) 194 | load(file = "./output/coadFilt.rdata") 195 | load(file = "./output/coadDEGsAll.Rdata") 196 | ``` 197 | 198 | 定义下样本类型: 199 | 200 | 201 | ```r 202 | # normal 203 | group1 <- TCGAquery_SampleTypes(colnames(coadFilt), typesample = c("NT")) 204 | 205 | # tumor 206 | group2 <- setdiff(colnames(coadFilt), group1) 207 | ``` 208 | 209 | 需要获得一个差异基因table: 210 | 211 | 212 | ```r 213 | # DEGs table with expression values in normal and tumor samples 214 | coadDEGsFiltLevel <- TCGAanalyze_LevelTab( 215 | FC_FDR_table_mRNA = coadDEGAll, 216 | typeCond1 = "Normal", 217 | typeCond2 = "Tumor", 218 | TableCond1 = coadFilt[,group1], 219 | TableCond2 = coadFilt[,group2] 220 | ) 221 | 222 | head(coadDEGsFiltLevel) 223 | ## mRNA logFC FDR Delta Normal 224 | ## ENSG00000161016 ENSG00000161016 1.0634492 4.608668e-12 74483.67 70039.71 225 | ## ENSG00000167658 ENSG00000167658 0.4903969 2.389951e-05 65654.67 133880.68 226 | ## ENSG00000137154 ENSG00000137154 0.6959504 2.038518e-08 62058.29 89170.56 227 | ## ENSG00000089157 ENSG00000089157 0.7335765 1.574363e-09 55289.82 75370.22 228 | ## ENSG00000108821 ENSG00000108821 2.7959748 6.188722e-22 55126.53 19716.39 229 | ## ENSG00000111640 ENSG00000111640 0.9146113 1.156871e-12 54971.11 60103.24 230 | ## Tumor start end 231 | ## ENSG00000161016 99007.33 144789765 144792587 232 | ## ENSG00000167658 126985.97 3976056 3985463 233 | ## ENSG00000137154 103264.10 19375715 19380236 234 | ## ENSG00000089157 86214.63 120196699 120201235 235 | ## ENSG00000108821 105676.55 50184101 50201632 236 | ## ENSG00000111640 74969.70 6534512 6538374 237 | ``` 238 | 239 | PCA分析并画图: 240 | 241 | 242 | ```r 243 | pca <- TCGAvisualize_PCA( 244 | dataFilt = coadFilt, 245 | dataDEGsFiltLevel = coadDEGsFiltLevel, 246 | ntopgenes = 1000, 247 | group1 = group1, 248 | group2 = group2 249 | ) 250 | ``` 251 | 252 | ![PCA](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220908203533659.png) 253 | 254 | 255 | ## 突变全景图 256 | 257 | 完全就是封装了`maftools`包,并且帮助文档里还没更新,还写着`TCGAquery_maf`,但是这个函数在最新版本的`TCGAbiolinks`里面已经没有了。。 258 | 259 | [6.TCGA的maf突变文件不能下载了?直接用TCGAbiolinks包搞定!](https://mp.weixin.qq.com/s/GpXovlWS_MAKdoRv3OAjCw) 260 | 261 | [7.maftools需要的文件如何自己整理](https://mp.weixin.qq.com/s/1cR3Cnfd5Co9U3jIoIWJBA) 262 | 263 | 264 | ```r 265 | rm(list = ls()) 266 | # 加载突变数据 267 | load(file = "./TCGA-SNP/TCGA-COAD_SNP.Rdata") 268 | coad.maf <- data 269 | ``` 270 | 271 | 直接画就行,和`maftools`一模一样,这里就不多介绍了,大家去用`maftools`吧。 272 | 273 | 274 | ```r 275 | TCGAvisualize_oncoprint(mut = coad.maf, 276 | genes = coad.maf$Hugo_Symbol[1:30] 277 | ) 278 | ``` 279 | ![突变全景图](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220908211117050.png) 280 | 281 | ## 甲基化组间表达量/旭日图/条形图 282 | 283 | 可以参考之前的推文: 284 | 285 | [8.TCGAbiolinks的甲基化数据分析](https://mp.weixin.qq.com/s/xbgQvGr0Q5DzBUqg8b__Zg) 286 | 287 | [5.新版TCGAbiolinks包学习:富集分析和生存分析](https://mp.weixin.qq.com/s/z4Pl7D8tA24bHJL6eyTMlw) 288 | 289 | 不得不说这些可视化函数优点鸡肋,不借助其他包是完全可以画出来图的,但是里面又都是封装的其他R包,而且还不如原装的R包好用! 290 | 291 | -------------------------------------------------------------------------------- /tcga/tcgabiolinks11不同癌种数据合并(下).md: -------------------------------------------------------------------------------- 1 | 前几天在我们的QQ交流群中有小伙伴提出合并LUAD和LUSC数据时报错: 2 | 3 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230218121311618.png) 4 | 5 | 使用的是我推文中的教程:[新版TCGA数据库不同癌种的组学数据合并](https://mp.weixin.qq.com/s/0hcQ1m_9l1TtvXgEG20F5Q) 6 | 7 | 上面这篇教程是用COAD和READ演示的,没有任何问题,但是LUAD和LUSC就出问题了,吓得我赶紧去试了一下,果然是报错的。 8 | 9 | 所以这里给大家提供另一种更加简单的方法,只要下载时同时写上LUAD和LUSC即可,整个过程交给`TCGAbiolinks`包。代码如下: 10 | 11 | ```R 12 | # 加载R包 13 | library(TCGAbiolinks) 14 | 15 | ## 合并,同时写TCGA-LUAD和TCGA-LUSC即可 16 | query <- GDCquery(project = c("TCGA-LUAD","TCGA-LUSC"), 17 | data.category = "Transcriptome Profiling", 18 | data.type = "Gene Expression Quantification", 19 | workflow.type = "STAR - Counts" 20 | ) 21 | # 下载,网络不好的这一步经常报错,建议使用我们推文中的其他方法 22 | GDCdownload(query, files.per.chunk = 100) #每次下载100个文件 23 | 24 | # 整理 25 | GDCprepare(query,save = T, 26 | save.filename = "G:/tcga/lusc_luad测试/TCGA_LUAD_LUSC_mRNA.Rdata") 27 | 28 | ``` 29 | 30 | 其中,下载这一步,网络不好的经常报错,建议使用我们推文中的其他方法: 31 | 32 | [可能是最适合初学者的TCGA官网下载和表达矩阵整理教程](https://mp.weixin.qq.com/s/rbnWvstRsfhbi9il-qSYpQ) 33 | 34 | 整个过程非常丝滑,没有任何问题: 35 | 36 | ```R 37 | > GDCprepare(query,save = T,save.filename = "G:/tcga/lusc_luad测试/TCGA_LUAD_LUSC_mRNA.Rdata") 38 | 39 | |=============|100% Completed after 30 s 40 | 41 | Starting to add information to samples 42 | => Add clinical information to samples 43 | => Adding TCGA molecular information from marker papers 44 | => Information will have prefix 'paper_' 45 | luad subtype information from:doi:10.1038/nature13385 46 | lusc subtype information from:doi:10.1038/nature11404 47 | Available assays in SummarizedExperiment : 48 | => unstranded 49 | => stranded_first 50 | => stranded_second 51 | => tpm_unstrand 52 | => fpkm_unstrand 53 | => fpkm_uq_unstrand 54 | => Saving file: G:/tcga/lusc_luad测试/TCGA_LUAD_LUSC_mRNA.Rdata 55 | => File saved 56 | class: RangedSummarizedExperiment 57 | dim: 60660 1153 58 | metadata(1): data_release 59 | assays(6): unstranded stranded_first ... fpkm_unstrand 60 | fpkm_uq_unstrand 61 | rownames(60660): ENSG00000000003.15 ENSG00000000005.6 ... 62 | ENSG00000288674.1 ENSG00000288675.1 63 | rowData names(10): source type ... hgnc_id havana_gene 64 | colnames(1153): TCGA-78-7156-01A-11R-2039-07 65 | TCGA-44-6774-01A-21R-1858-07 ... 66 | TCGA-52-7809-01A-21R-2125-07 TCGA-85-7843-01A-11R-2125-07 67 | colData names(95): barcode patient ... 68 | paper_Homozygous.Deletions paper_Expression.Subtype 69 | ``` 70 | 71 | 保存后的数据是一个`summarisedExperiment`对象,这个对象里面包含了表达矩阵(包含counts、tpm、fpkm)和临床信息等多种信息,可以参考我们之前的推文了解它: 72 | 73 | [新版TCGAbiolinks包学习:表达矩阵提取(mRNA/lncRNA/counts/tpm/fpkm)](https://mp.weixin.qq.com/s/wI0_GyVl5LiKAjX5C3f-NQ) 74 | 75 | 同理,这种方法也可以用于结直肠癌的合并。 76 | 77 | easy! -------------------------------------------------------------------------------- /tcga/tcga又㕛叒叕更新了!.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | --- 4 | 5 | > 粉丝福利又来了!文末免费送书! 6 | 7 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230225154714219.png) 8 | 9 | --- 10 | 11 | 12 | 13 | TCGA作为生信数据挖掘必学的数据库,虽然这个项目已经结束了,但是数据还是在不断更新中的,而且更新很频繁! 14 | 15 | **距离上次更新刚过去3个月,数据又更新了!** 16 | 17 | **目前最新版本是36.0,更新日期为2022.12.12日。** 18 | 19 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230225141513855.png) 20 | 21 | 虽然数据一直在更新,但其实和上次变化不是很大,这次主要更新内容如下图所示: 22 | 23 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230225141925039.png) 24 | 25 | 更详细的内容大家可以到 GDC TCGA 的官网查看。 26 | 27 | 28 | 29 | 虽然更新了,但是咱们的TCGA系列教程还是通用的哦!使用起来依然丝滑,毫无问题! 30 | 31 | 32 | 33 | > 粉丝福利又来了!依然是免费送书! 34 | 35 | **活动规则:** 36 | 37 | - 文末点赞/再看本篇推文,并在评论区留言,说说你和R语言的故事,留言点赞数最多的**前3名**小伙伴将免费获取《R语言临床预测模型实战》1本 38 | - 截止时间:2023.2.27晚8点 39 | 40 | **注意事项:** 41 | 42 | - 中奖的小伙伴请在24小时内添加小编微信,逾期将自动顺延给下一位,添加时请务必备注学校-专业-昵称。 -------------------------------------------------------------------------------- /tcga/tcga批量差异分析可视化.md: -------------------------------------------------------------------------------- 1 | 生信技能树之前推过一篇推文:多次差异分析难道就需要多个火山图吗? 2 | 3 | 里面介绍过一种使用条形图展示多组差异分析结果。 4 | 5 | 今天学习下这个图的画法,不过不是多组差异分析的结果,而是多个癌症的差异分析结果,就是用TCGA的33种癌症。 6 | 7 | ## 差异分析 8 | 9 | 首先读取33个癌症的raw counts表达矩阵,这个是从xena网站下载的,简单处理下即可。生息技能树也有教程的,搜索即可获得! 10 | 11 | ### 读取数据 12 | 13 | ```R 14 | # 清空变量 15 | rm(list = ls()) 16 | # 加载R包 17 | library(tinyarray) 18 | 19 | # 获取路径 20 | fs <- list.files('Rdata/',pattern = 'htseq_counts') 21 | fs 22 | 23 | [1] "TCGA-ACC.htseq_counts.Rdata" 24 | [2] "TCGA-BLCA.htseq_counts.Rdata" 25 | [3] "TCGA-BRCA.htseq_counts.Rdata" 26 | [4] "TCGA-CESC.htseq_counts.Rdata" 27 | [5] "TCGA-CHOL.htseq_counts.Rdata" 28 | [6] "TCGA-COAD.htseq_counts.Rdata" 29 | [7] "TCGA-DLBC.htseq_counts.Rdata" 30 | [8] "TCGA-ESCA.htseq_counts.Rdata" 31 | [9] "TCGA-GBM.htseq_counts.Rdata" 32 | [10] "TCGA-HNSC.htseq_counts.Rdata" 33 | [11] "TCGA-KICH.htseq_counts.Rdata" 34 | [12] "TCGA-KIRC.htseq_counts.Rdata" 35 | [13] "TCGA-KIRP.htseq_counts.Rdata" 36 | [14] "TCGA-LAML.htseq_counts.Rdata" 37 | [15] "TCGA-LGG.htseq_counts.Rdata" 38 | [16] "TCGA-LIHC.htseq_counts.Rdata" 39 | [17] "TCGA-LUAD.htseq_counts.Rdata" 40 | [18] "TCGA-LUSC.htseq_counts.Rdata" 41 | [19] "TCGA-MESO.htseq_counts.Rdata" 42 | [20] "TCGA-OV.htseq_counts.Rdata" 43 | [21] "TCGA-PAAD.htseq_counts.Rdata" 44 | [22] "TCGA-PCPG.htseq_counts.Rdata" 45 | [23] "TCGA-PRAD.htseq_counts.Rdata" 46 | [24] "TCGA-READ.htseq_counts.Rdata" 47 | [25] "TCGA-SARC.htseq_counts.Rdata" 48 | [26] "TCGA-SKCM.htseq_counts.Rdata" 49 | [27] "TCGA-STAD.htseq_counts.Rdata" 50 | [28] "TCGA-TGCT.htseq_counts.Rdata" 51 | [29] "TCGA-THCA.htseq_counts.Rdata" 52 | [30] "TCGA-THYM.htseq_counts.Rdata" 53 | [31] "TCGA-UCEC.htseq_counts.Rdata" 54 | [32] "TCGA-UCS.htseq_counts.Rdata" 55 | [33] "TCGA-UVM.htseq_counts.Rdata" 56 | ``` 57 | 58 | ```r 59 | # 批量读取 60 | dat_list <- lapply(fs, function(x){ 61 | pro <- gsub('.htseq_counts.Rdata','',x) 62 | load(file = file.path('Rdata/',x)) 63 | dat <- pd_mat 64 | return(dat) 65 | }) 66 | 67 | # 获取名称 68 | types <- gsub(".htseq_counts.Rdata","",fs) 69 | types 70 | 71 | [1] "TCGA-ACC" "TCGA-BLCA" "TCGA-BRCA" "TCGA-CESC" 72 | [5] "TCGA-CHOL" "TCGA-COAD" "TCGA-DLBC" "TCGA-ESCA" 73 | [9] "TCGA-GBM" "TCGA-HNSC" "TCGA-KICH" "TCGA-KIRC" 74 | [13] "TCGA-KIRP" "TCGA-LAML" "TCGA-LGG" "TCGA-LIHC" 75 | [17] "TCGA-LUAD" "TCGA-LUSC" "TCGA-MESO" "TCGA-OV" 76 | [21] "TCGA-PAAD" "TCGA-PCPG" "TCGA-PRAD" "TCGA-READ" 77 | [25] "TCGA-SARC" "TCGA-SKCM" "TCGA-STAD" "TCGA-TGCT" 78 | [29] "TCGA-THCA" "TCGA-THYM" "TCGA-UCEC" "TCGA-UCS" 79 | [33] "TCGA-UVM" 80 | ``` 81 | 82 | ### 批量对33种癌症进行差异分析 83 | 84 | 使用`DESeq2`进行差异分析,真的是3个差异分析R包中最简单的一个了,直接一句代码即可! 85 | 86 | ```R 87 | library(DESeq2) 88 | 89 | for(i in 1:length(dat_list)){ 90 | group <- make_tcga_group(dat_list[[i]]) 91 | if(length(unique(group)) <2) next # 有的癌症没有正常样本,不要 92 | 93 | coldata <- data.frame(sample = colnames(dat_list[[i]]), 94 | group = group) 95 | 96 | dds <- DESeqDataSetFromMatrix( 97 | countData = dat_list[[i]], 98 | colData = coldata, 99 | design = ~ group 100 | ) 101 | 102 | dds <- DESeq(dds) # deseq2用起来是真的简单 103 | res <- results(dds,tidy = T) 104 | res2 <- res[abs(res$log2FoldChange) > 1 & res$padj < 0.05,] # 提取差异基因 105 | save(res2, file = paste0(types[i],"_diff_genes.Rdata")) 106 | } 107 | ``` 108 | 109 | 最终获得了24个癌症的差异基因。 110 | 111 | ![image-20220311210128705](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220311210128705.png) 112 | 113 | 把数据都保存好,接下来就可以画图了。 114 | 115 | 116 | 117 | ## 多个差异分析结果的条形图 118 | 119 | ### 构造画图数据 120 | 121 | ```R 122 | # 读取数据 123 | rm(list = ls()) 124 | 125 | files <- list.files("./", pattern = ".Rdata") 126 | 127 | alldiff <- lapply(files, function(x){ 128 | load(file = x) 129 | dat <- res2 130 | return(dat) 131 | }) 132 | 133 | names(alldiff) <- gsub("-diff.Rdata","",files) 134 | 135 | alldiff <- lapply(alldiff,na.omit) # 去掉NA 136 | ``` 137 | 138 | **数就是图,图就是数**,所以最重要的就是构造数据。 139 | 140 | ```R 141 | df_dim <- lapply(alldiff, function(x){ 142 | dime <- cut(x$log2FoldChange, 143 | breaks = c(-Inf,-4,-3,-2.5,-2,-1.5,-1,1,1.5,2,2.5,3,4,Inf)) # 切割值 144 | return(data.frame(table(dime))) 145 | }) 146 | 147 | library(dplyr) 148 | 149 | df <- bind_rows(df_dim) # 列表变成数据框 150 | df$type <- rep(names(alldiff),each=13) # 添加癌症分类 151 | 152 | str(df) 153 | 154 | 'data.frame': 312 obs. of 3 variables: 155 | $ dime: Factor w/ 13 levels "(-Inf,-4]","(-4,-3]",..: 1 2 3 4 5 6 7 8 9 10 ... 156 | $ Freq: int 80 240 211 311 454 742 0 960 576 401 ... 157 | $ type: chr "TCGA-BLCA" "TCGA-BLCA" "TCGA-BLCA" "TCGA-BLCA" ... 158 | ``` 159 | 160 | `df`就长这样,整洁的长数据,适合画图: 161 | 162 | ![image-20220311211035909](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220311211035909.png) 163 | 164 | 165 | 166 | ### 画图 167 | 168 | ```R 169 | library(ggplot2) 170 | 171 | 172 | ggplot(df, aes(x=type, y=Freq, fill=dime))+ 173 | geom_bar(stat = "identity")+ 174 | geom_text(aes(label = Freq),position = position_stack(vjust = 0.5),size=2) 175 | ``` 176 | 177 | 第一个图长这样,不太好看的样子...下面美化一下。 178 | 179 | ![image-20220311211201211](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220311211201211.png) 180 | 181 | 182 | 183 | 美化一下: 184 | 185 | ```R 186 | df_sum <- df %>% group_by(type) %>% summarise(n=sum(Freq)) # 计算每个癌症总的差异基因数目 187 | 188 | # 构造色盘 189 | library(RColorBrewer) 190 | my_col <- c(rev(brewer.pal(6,"Reds")),"white",brewer.pal(6,"Blues")) 191 | 192 | # 画图 193 | ggplot()+ 194 | geom_bar(data = df,mapping = aes(x=type, y=Freq, fill=dime),stat = "identity")+ 195 | geom_text(data = df_sum,mapping = aes(x=type,y=n,label=n),vjust=-1)+ 196 | scale_fill_manual(values = my_col,name = NULL)+ 197 | scale_y_continuous(expand = c(0,0),name = "Counts",limits = c(0,8000))+ 198 | theme_minimal()+ 199 | theme(axis.text.x = element_text(angle = 45,vjust = 1,hjust = 1), 200 | axis.title.x = element_blank()) 201 | ``` 202 | 203 | ![tcga_batch](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/tcga_batch.png) 204 | 205 | 这样看起来还是不错的! 206 | 207 | 但是这个图有什么用呢? -------------------------------------------------------------------------------- /tcga/批量生存分析.md: -------------------------------------------------------------------------------- 1 | 分别介绍两种生存分析,批量logrank检验,批量Cox回归(就是批量单因素分析)。 2 | 3 | 用TCGA-COAD的数据演示,批量进行约2万个基因的生存分析。 4 | 5 | ## 数据准备 6 | 7 | 首先用我的1行代码整理表达矩阵和临床信息,会自动得到6个表达矩阵(mRNA和lncRNA的counts/fpkm/tpm)和临床信息,这样得到的表达矩阵的样本顺序和临床信息的顺序自动就是一致的,不需要再次整理。 8 | 9 | - [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 10 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 11 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 12 | 13 | 14 | ```r 15 | library(SummarizedExperiment) 16 | library(tidyverse) 17 | library(TCGAbiolinks) 18 | 19 | source("getTCGAexpr.r") # 1行代码脚本,代码获取请翻看推文 20 | 21 | getTCGAexpr("TCGA-COAD") 22 | ``` 23 | 24 | 我们选用mRNA的counts矩阵,先用`DESeq2`的`vst`函数处理下。 25 | 26 | 27 | ```r 28 | rm(list = ls()) 29 | 30 | # 加载整理好的表达矩阵和临床信息 31 | load(file = "G:/tcga/output_expr/TCGA-COAD_clinical.rdata") 32 | load(file = "G:/tcga/output_expr/TCGA-COAD_mrna_expr_counts.rdata") 33 | 34 | # 顺序一致 35 | identical(colnames(mrna_expr_counts), rownames(clin_info)) 36 | ## [1] TRUE 37 | ``` 38 | 39 | TCGA的数据直接进行生存分析有很多问题,在进行批量生存分析前,我们还要做一些数据预处理工作,这些不是必须的,也没有标准,大家根据自己的需求来!(但是你不做这些在进行批量生存分析时就会遇到各种报错) 40 | 41 | 比如以下问题: 42 | 43 | - counts/tpm/fpkm/rmse,到底用哪一种?我这里用的是vst后的数据,很多文献里用的是log2(tpm+1),也有用log2(fpkm+1)的,还有用log2(count+1)的!所以别纠结!通常用的比较多的是log2(tpm+1)。 44 | 45 | 你看这篇cell的文章(doi:10.1016/j.cell.2018.03.052)用的就是vst后的数据: 46 | ![doi:10.1016/j.cell.2018.03.052.](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20221229100729382.png) 47 | 48 | 关于counts/tpm/fpkm/vst/cpm的区别,我也专门写了两篇推文进行介绍: 49 | - [DESeq2差异分析及VST变换的探索](https://mp.weixin.qq.com/s/CBznByKNGwPEKIKM5U0Oyw) 50 | - [count、tpm、fpkm、vst、cpm的表达量差异](https://mp.weixin.qq.com/s/aff-AX9aA2tSDa2zbB8ZRQ) 51 | 52 | 除此之外,还要注意以下问题: 53 | - 要不要先进行log/标准化呢?看你用的是哪种数据,vst是不需要的~ 54 | - 表达量非常低的基因,有的基因在多个样本表达量都一样,这种都会导致方差太小,根据表达量进行分组时会有问题,要去掉; 55 | - 还需要去除正常的样本,我这里只对肿瘤样本进行生存分析; 56 | - 有时多个样本,可能是同一个人的,这种情况,需不需要去重复呢?为了省事,这种情况我没做处理,最好去重; 57 | - 临床信息中随访时间可能存在负值!需要去除,某些样本随访时间和结局可能同时缺失,也要去除! 58 | - 单因素cox回归,不符合PH假设,能不能用呢?好像实际做的时候没几篇文章讨论这个问题...... 59 | 60 | 61 | ```r 62 | # 根据列名的第14,15位数判断,小于10 就是tumor 63 | keep_samples <- as.numeric(substr(colnames(mrna_expr_counts),14,15))<10 64 | 65 | # 41个normal,480个tumor 66 | table(keep_samples) 67 | ## keep_samples 68 | ## FALSE TRUE 69 | ## 41 480 70 | 71 | exprset <- mrna_expr_counts[,keep_samples] 72 | 73 | # 临床信息只要两列就够了:生存时间和生存状态 74 | clin <- clin_info[keep_samples, c("days_to_last_follow_up","vital_status")] 75 | names(clin) <- c("time","event") 76 | 77 | dim(exprset) 78 | ## [1] 19938 480 79 | dim(clin) 80 | ## [1] 480 2 81 | 82 | identical(colnames(exprset),rownames(clin)) 83 | ## [1] TRUE 84 | ``` 85 | 86 | 然后是过滤掉低表达基因,方差小于1的我都去掉了,你可以试试其他阈值,没有统一标准~ 87 | 88 | 89 | ```r 90 | #exprset <- exprset[!rowSums(exprset) < 0.1*480, ] 91 | exprset <- exprset[!apply(exprset,1,var) < 1,] 92 | 93 | dim(exprset) # 还剩18443个基因 94 | ## [1] 18443 480 95 | ``` 96 | 97 | 去掉没有生存结局的: 98 | 99 | 100 | ```r 101 | # 2个样本没有结局,去掉 102 | table(is.na(clin$event)) 103 | ## 104 | ## FALSE TRUE 105 | ## 478 2 106 | 107 | drop <- is.na(clin$event) 108 | clin <- clin[!drop,] 109 | 110 | table(is.na(clin$event)) 111 | ## 112 | ## FALSE 113 | ## 478 114 | 115 | exprset <- exprset[,!drop] 116 | 117 | # 没有生存时间小于0的,46个生存时间是NA 118 | table(is.na(clin$time)) 119 | ## 120 | ## FALSE TRUE 121 | ## 432 46 122 | table(clin$time<0) 123 | ## 124 | ## FALSE 125 | ## 432 126 | 127 | # 最后把生存结局用0,1表示 128 | clin$event <- ifelse(clin$event == "Dead",1,0) 129 | ``` 130 | 131 | 最终剩余18443个基因,478个样本。 132 | 133 | 134 | ```r 135 | dim(clin) 136 | ## [1] 478 2 137 | dim(exprset) 138 | ## [1] 18443 478 139 | 140 | identical(colnames(exprset),rownames(clin)) 141 | ## [1] TRUE 142 | 143 | #save(exprset, clin,file = "output_expr/batch_survival.rdata") 144 | ``` 145 | 146 | 基本上做过这些过滤后,你再进行生存分析不容易遇到很多小问题,当然你也可以完全不进行过滤,直接进行生存分析,没有标准! 147 | 148 | ## 批量logrank检验 149 | 150 | 你可以手撕代码解决,这也是目前绝大多数教程的做法。手撕代码又可以有apply系列,for循环系列,purrr系列等,大同小异,殊途同归,条条大路通罗马! 151 | 152 | 我这里就用`apply`了: 153 | 154 | 155 | ```r 156 | rm(list = ls()) 157 | load(file = "G:/tcga/output_expr/batch_survival_vst.rdata") 158 | library(survival) 159 | 160 | logrank_res <- apply(exprset, 1, function(x){ 161 | surv <- Surv(clin$time, clin$event) 162 | group <- ifelse(x > median(x),"high","low") # 根据表达量的中位数分组 163 | fit <- survdiff(surv ~ group) 164 | pvalue <- 1-pchisq(fit$chisq, df=1) 165 | }) 166 | 167 | res.logrank <- data.frame(gene_symbol = rownames(exprset), pvalue = logrank_res) 168 | res.logrank <- res.logrank[order(res.logrank$pvalue),] 169 | #save(res.logrank, file = "G:/tcga/output_expr/batch_logrank_res_vst.rdata") 170 | ``` 171 | 172 | 查看结果: 173 | 174 | 175 | ```r 176 | psych::headTail(res.logrank) 177 | ## gene_symbol pvalue 178 | ## DPP7 DPP7 0 179 | ## HCN2 HCN2 0 180 | ## COLGALT2 COLGALT2 0 181 | ## KIAA0825 KIAA0825 0 182 | ## ... ... 183 | ## RGPD1 RGPD1 1 184 | ## TMEM129 TMEM129 1 185 | ## MICAL3 MICAL3 1 186 | ## ZNF365 ZNF365 1 187 | 188 | table(res.logrank$pvalue<0.05) # 比直接用tpm少了400个左右 189 | ## 190 | ## FALSE TRUE 191 | ## 17184 1405 192 | ``` 193 | 194 | 随便找个基因试试看: 195 | 196 | 197 | ```r 198 | group <- ifelse(t(exprset)[,"HCN2"] >median(t(exprset)[,"HCN2"]),"high","low") 199 | df.tmp <- data.frame(time = clin$time,event=clin$event,group=c(group)) 200 | 201 | # logrank检验和批量的结果一样 202 | survdiff(Surv(time,event)~group, data = df.tmp) 203 | ## Call: 204 | ## survdiff(formula = Surv(time, event) ~ group, data = df.tmp) 205 | ## 206 | ## n=432, 46 observations deleted due to missingness. 207 | ## 208 | ## N Observed Expected (O-E)^2/E (O-E)^2/V 209 | ## group=high 214 42 25.6 10.52 19.7 210 | ## group=low 218 16 32.4 8.31 19.7 211 | ## 212 | ## Chisq= 19.7 on 1 degrees of freedom, p= 9e-06 213 | ``` 214 | 215 | 216 | ```r 217 | # 画个图看看 218 | library(survminer) 219 | ## Loading required package: ggpubr 220 | ## 221 | ## Attaching package: 'survminer' 222 | ## The following object is masked from 'package:survival': 223 | ## 224 | ## myeloma 225 | f <- survfit(Surv(time,event)~group, data = df.tmp) 226 | ggsurvplot(f,pval = T,palette = "jama") 227 | ``` 228 | 229 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-169001711.png) 230 | 231 | 效果很不错! 232 | 233 | 234 | ## 批量Cox单因素分析 235 | 236 | 单因素Cox回归,有两种思路: 237 | 1. 你可以根据表达量高低把样本分为两组,然后进行Cox分析; 238 | 2. 也可以直接把表达量作为连续性变量进行Cox分析,这样的结果解释起来就完全不一样了! 239 | 240 | 你在进行多因素分析时,是继续分成2组进行,还是直接用表达量呢? 241 | 242 | 我的看法是分成两组更合适,如果是直接用连续性数值进行分析,结果的解释是自变量每增加一个单位,风险增加多少倍,这对一个基因来说有点扯,比如表达量从5变成6,患癌症的风险增加3倍,你觉得真实吗? 243 | 244 | 而变成两组后,结果的解释是高表达组的风险是低表达组的风险的多少倍,这样就合理多了。但是这个也没有标准,你随便用,只要能解释得通。 245 | 246 | 数据还是用之前批量logrank检验的数据,是TCGA-COAD的数据,进行了一些数据预处理。 247 | 248 | 249 | ```r 250 | rm(list = ls()) 251 | load(file = "G:/tcga/output_expr/batch_survival_vst.rdata") 252 | library(survival) 253 | ``` 254 | 255 | 我这里借用了`broom`包,帮我自动提取回归系数、HR值、HR值的95%的可信区间、P值,没安装的需要先安装。 256 | 257 | 258 | ```r 259 | cox_res <- apply(exprset, 1, function(x){ 260 | surv <- Surv(clin$time, clin$event) 261 | group <- ifelse(x > median(x),"high","low") # 根据表达量的中位数分组 262 | fit <- coxph(surv ~ group) 263 | tmp <- broom::tidy(fit,exponentiate = T, conf.int = T) 264 | }) 265 | 266 | res.cox <- do.call(rbind, cox_res) 267 | res.cox$gene_symbol <- rownames(exprset) 268 | 269 | #save(res.cox, file = "G:/tcga/output_expr/batch_cox_res_vst.rdata") 270 | ``` 271 | 272 | 查看结果: 273 | 274 | 275 | ```r 276 | psych::headTail(res.cox) 277 | ## term estimate std.error statistic p.value conf.low conf.high gene_symbol 278 | ## 1 grouplow 1.04 0.26 0.16 0.87 0.62 1.75 MT-CO1 279 | ## 2 grouplow 1.09 0.27 0.31 0.76 0.65 1.82 MT-ND4 280 | ## 3 grouplow 1.15 0.27 0.54 0.59 0.68 1.95 MT-CO2 281 | ## 4 grouplow 1.07 0.27 0.27 0.79 0.64 1.81 MT-CO3 282 | ## 5 ... ... ... ... ... ... 283 | ## 6 grouplow 2.32 1.01 0.84 0.4 0.32 16.79 OR2F2 284 | ## 7 grouplow 3.09 1.01 1.12 0.26 0.43 22.4 ZNRF4 285 | ## 8 grouplow 0.32 0.73 -1.57 0.12 0.08 1.33 RPS10-NUDT3 286 | ## 9 grouplow 1.05 1.01 0.05 0.96 0.15 7.64 IQCF2 287 | ``` 288 | 289 | `estimate`:HR值(exp(coef)) 290 | `std.error`:回归系数的标准误(se(coef)) 291 | `statistic`:Wald检验的z值 292 | `p.value`:回归系数的P值 293 | `conf.low/conf.high`:HR的95%的可信区间 294 | 295 | 可以看到这里的`term`项都是`grouplow`,所以结果解释是低表达组相比于高表达组怎么怎么样,如果你想改,就在上面的代码中把`group`变成因子,自定义level即可。 296 | 297 | 298 | ```r 299 | table(res.cox$p.value<0.05) # 和logrank结果非常接近 300 | ## 301 | ## FALSE TRUE 302 | ## 17244 1345 303 | ``` 304 | 305 | 两种方法的结果画个维恩图看看: 306 | 307 | 308 | ```r 309 | load(file = "G:/tcga/output_expr/batch_logrank_res_vst.rdata") 310 | ``` 311 | 312 | 313 | ```r 314 | logrank <- res.logrank$gene_symbol[res.logrank$pvalue<0.05] 315 | cox <- res.cox$gene_symbol[res.cox$p.value<0.05] 316 | 317 | library(VennDiagram) 318 | ## Loading required package: grid 319 | ## Loading required package: futile.logger 320 | ## 321 | ## Attaching package: 'VennDiagram' 322 | ## The following object is masked from 'package:ggpubr': 323 | ## 324 | ## rotate 325 | 326 | l <- list(logrank = logrank, cox=cox) 327 | 328 | venn.diagram(l,filename = "loagran_cox.png", 329 | alpha=c(0.8, 0.8), 330 | fill=c("#0073C2FF","#EFC000FF")) 331 | ## [1] 1 332 | ``` 333 | 334 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/984165165461.png) 335 | 336 | 竟然完美重合! 337 | -------------------------------------------------------------------------------- /tcga/批量生存分析for循环.md: -------------------------------------------------------------------------------- 1 | 批量生存分析是生信数据挖掘的基础操作,我们在之前的推文中介绍了批量logrank检验和批量单因素cox分析:[批量生存分析(logrank和单因素COX)](https://mp.weixin.qq.com/s/o-gCc_1B9SQmNFrG-I6yAQ) 2 | 3 | TCGA的数据在进行批量生存分析前需要进行一些预处理,具体请看上面这篇推文,但是即使是这样,还是偶尔会遇到`there is only 1 group`的报错,主要有以下原因: 4 | 5 | - 有些基因表达量太低了, 6 | - 或者在normal和tumor样本中的表达量都一样或者很接近, 7 | - 或者根据中位数分组后,其中一个组别只有1到2个样本 8 | 9 | 我碰到的最多就是以上几个原因,如果还有,欢迎评论区留言~ 10 | 11 | 避免这个报错最简单的方法就是直接用`for`循环,可以定位到有问题的基因,并且可以跳过有问题的基因! 12 | 13 | ## 准备数据 14 | 15 | 首先用我的1行代码整理表达矩阵和临床信息,会自动得到6个表达矩阵(mRNA和lncRNA的counts/fpkm/tpm)和临床信息,这样得到的表达矩阵的样本顺序和临床信息的顺序自动就是一致的,不需要再次整理。 16 | 17 | - [1行代码提取6种TCGA表达矩阵和临床信息](https://mp.weixin.qq.com/s/1OBGjUKnGyiALmLafYNPUQ) 18 | - [1行代码提取6种TCGA表达矩阵2.0版](https://mp.weixin.qq.com/s/QFGCtrIeaAIichovw6OBVw) 19 | - [1行代码提取TCGA的6种表达矩阵是有视频教程的](https://mp.weixin.qq.com/s/u6VkBcYqakZkaNXjzNTZcw) 20 | 21 | ```R 22 | rm(list = ls()) 23 | 24 | # 加载整理好的表达矩阵和临床信息 25 | load(file = "G:/tcga/output_expr/TCGA-COAD_clinical.rdata") 26 | load(file = "G:/tcga/output_expr/TCGA-COAD_mrna_expr_counts.rdata") 27 | ``` 28 | 29 | 根据样本名字进行分组,然后去掉没有生存信息的样本。 30 | 31 | 我们这里用的是vst后的数据,所以先用`DESeq2`包获取vst后的数据。 32 | 33 | ```R 34 | mrna_expr_counts <- DESeq2::vst(as.matrix(mrna_expr_counts)) 35 | 36 | # 根据列名的第14,15位数判断,小于10 就是tumor 37 | keep_samples <- as.numeric(substr(colnames(mrna_expr_counts),14,15))<10 38 | exprset <- mrna_expr_counts[,keep_samples] 39 | 40 | # 临床信息只要两列就够了:生存时间和生存状态 41 | clin <- clin_info[keep_samples, c("days_to_last_follow_up","vital_status")] 42 | names(clin) <- c("time","event") 43 | 44 | # 2个样本没有结局,去掉 45 | drop <- is.na(clin$event) 46 | clin <- clin[!drop,] 47 | exprset <- exprset[,!drop] 48 | 49 | # 最后把生存结局用0,1表示 50 | clin$event <- ifelse(clin$event == "Dead",1,0) 51 | 52 | dim(clin) 53 | ## 478 2 54 | dim(exprset) 55 | ## 19938 478 56 | ``` 57 | 58 | 这样简单的操作后还剩下19938个基因和478个样本。 59 | 60 | >通常到这一步后还需要过滤一下低表达的基因,但是使用`for`循环的话可以省略这一步,因为可以在计算的时候跳过这样的基因,非常方便的解决`there is only 1 group`的报错! 61 | 62 | 接下来就是大家最常见的一种操作,把这两个数据框合并到一起,然后用for循环做批量生存分析。 63 | 64 | ```R 65 | expr_clin <- cbind(clin,t(exprset)) 66 | dim(expr_clin) 67 | expr_clin[1:4,1:4] 68 | 69 | ## time event MT-CO1 MT-ND4 70 | ## TCGA-AA-A03F-01A-11R-A16W-07 0 1 19.95212 20.11403 71 | ## TCGA-G4-6314-01A-11R-1723-07 1093 0 17.86275 17.61481 72 | ## TCGA-A6-3809-01A-01R-A278-07 996 0 15.04427 12.25016 73 | ## TCGA-AZ-6605-01A-11R-1839-07 NA 1 18.52669 18.21352 74 | ``` 75 | 76 | ## 批量logrank 77 | 78 | 下面就是批量进行logrank检验: 79 | 80 | ```R 81 | library(survival) 82 | 83 | gene <- colnames(expr_clin)[-c(1:2)] 84 | 85 | logrank.result <- list() 86 | 87 | for(i in 1:length(gene)){ 88 | print(i) 89 | group <- ifelse(expr_clin[,gene[i]]>median(expr_clin[,gene[i]]),"high","low") 90 | if(length(table(group)) == 1) next 91 | if(length(grep("high",group)) < 3) next 92 | surv <- as.formula(paste('Surv(time, event)~', "group")) 93 | tmp <- cbind(expr_clin[,1:2],group) 94 | x <- survdiff(surv, data = tmp) 95 | pValue <- 1-pchisq(x$chisq,df=1) 96 | logrank.result[[i]] <- c(gene[i],pValue) 97 | } 98 | ## 下面会把每个基因的序号打印出来! 99 | ## 1 100 | ## 2 101 | ## 3 102 | ## 4 103 | ## 5 104 | ## 6 105 | ## 7 106 | ## 8 107 | ## 9 108 | ## 10 109 | ## 11 110 | ## 12 111 | ## 13 112 | ## 14 113 | ## 15 114 | ## 16 115 | # 省略。。。。。 116 | ## 38 117 | # 省略。。。。。 118 | 119 | res.logrank <- data.frame(do.call(rbind,logrank.result)) 120 | names(res.logrank) <- c("gene","p.value") 121 | ``` 122 | 123 | 这样结果就好了,可以看到我们一开始并没有进行过滤低表达基因,过程中也没有任何报错哦! 124 | 125 | 如果你非常不幸运的还是遇到了各种报错,你可以根据打印出来的序号定位到具体的基因,单独把有问题的基因拿出来,看看到底是哪里的问题。 126 | 127 | 简单看下结果: 128 | 129 | ```R 130 | library(dplyr) 131 | 132 | res.logrank %>% 133 | filter(p.value < 0.05) %>% 134 | arrange(p.value) %>% 135 | head() 136 | 137 | ## gene p.value 138 | ## TAOK2 0.000103602075000153 139 | ## LMAN2L 0.000105203887372118 140 | ## C2orf50 0.00010953355328791 141 | ## FOXD4 0.000110947806679973 142 | ## INTS3 0.000111323387814499 143 | ## LBX2 0.00011999292506526 144 | ``` 145 | 146 | ## 批量cox 147 | 148 | 批量cox回归也可以使用同样的思路进行分析。 149 | 150 | ```{r,echo=FALSE} 151 | library(survival) 152 | 153 | gene <- colnames(expr_clin)[-c(1:2)] 154 | 155 | cox.result <- list() 156 | 157 | for(i in 1:length(gene)){ 158 | print(i) 159 | group <- ifelse(expr_clin[,gene[i]]>median(expr_clin[,gene[i]]),"high","low") 160 | 161 | if(length(table(group)) == 1) next 162 | if(length(grep("high",group)) < 3) next 163 | 164 | surv <- as.formula(paste('Surv(time, event)~', "group")) 165 | tmp <- cbind(expr_clin[,1:2],group) 166 | x <- coxph(surv, data = tmp) 167 | tmp1 <- broom::tidy(x,exponentiate = T, conf.int = T) 168 | cox.result[[i]] <- c(gene[i],tmp1) 169 | } 170 | res.cox <- data.frame(do.call(rbind,cox.result)) 171 | names(res.cox)[1] <- "gene" 172 | ``` 173 | 174 | 随便找几个看看结果: 175 | 176 | ```{r} 177 | head(res.cox) 178 | # 省略 179 | ``` 180 | 181 | 关于每一列的意义,我在之前的推文中说过超多次了,大家自己翻一翻: 182 | 183 | - [R语言生存分析之Cox回归](https://mp.weixin.qq.com/s/eeQ8PJQZunYzQmssGTimNA) 184 | 185 | ```{r} 186 | table(res.cox$p.value<0.05) 187 | ## FALSE TRUE 188 | ## 18003 1387 189 | ``` 190 | 191 | 批量cox分析也做好了,是不是很简单呢? 192 | 193 | 取交集的操作就太简单了,这里就不演示了。 194 | 195 | 后期会把这些函数写进1个R包里,实现1行代码即可完成两种批量生存分析! -------------------------------------------------------------------------------- /tcga/最适合初学者的tcga下载教程.md: -------------------------------------------------------------------------------- 1 | 这篇推文适合初学者看,大佬酌情阅读! 2 | 3 | 从打开网址开始教你一步一步的下载TCGA的数据,图文并茂,真的是详细的不能再详细了! 4 | 5 | 如果你看完了这篇还不会下载TCGA的数据,那不是你疯了就是我疯了! 6 | 7 | **非常适合初学者,因为使用这个方法下载TCGA数据后,只要2行代码即可提取表达矩阵,包含count/FPKM/tpm,自带gene symbol,并且附带和表达矩阵对应的详细临床信息,无需再次下载!** 8 | 9 | 在下载TCGA数据之前,你可能需要一些背景知识,比如TCGA的33癌症简称和英文名,拷贝数变异、单核苷酸多态性、甲基化等的英文,建议自己百度下哦~ 10 | 11 | 首先你要到这个网址:https://portal.gdc.cancer.gov/,进入下面这个界面,如果你打不开这个页面,那你的下载大概率也会有问题的,因为这个对网络有要求! 12 | 13 | ![image-20220912163652737](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912163652737.png) 14 | 15 | 16 | 17 | 打开这个页面后,你需要选择你想要下载的东西,这个数据库下载东西逻辑是很清晰的,比如你想要下载**TCGA的直肠癌的常规转录组的mRNA数据**,首先你要点击`Repository`,下面箭头指的两个地方,任意点一个就行,都是一样的: 18 | 19 | ![image-20220912164329640](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912164329640.png) 20 | 21 | 22 | 23 | 点完了之后会进入到这个界面: 24 | 25 | ![image-20220912165913901](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912165913901.png) 26 | 27 | 这里你只要关注左侧这一栏的东西就好了,你现在的需求是下载**TCGA的直肠癌的常规转录组的mRNA数据**,所以你需要先找到**TCGA的直肠癌**,点击**Cases**。 28 | 29 | **重点来了!!!这里是决定你能不能用2行代码整理表达矩阵的关键!!** 30 | 31 | 有的教程会让你在**Primary Site**中找到**直肠癌**,勾选它,像下图这样,但**我建议你直接跳过这一步!!!** 32 | 33 | image-20220912170857082 34 | 35 | image-20220912171149012 36 | 37 | 38 | 39 | 但是**我建议你直接跳过上面这一步!!直接在`Project`里面选中`TCGA-READ`即可,不要在`Primary Site`中勾选任何东西!!** 40 | 41 | ![image-20220912214851137](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912214851137.png) 42 | 43 | 这样**Cases**这边的选项就选好了,其他东西就不用选了,比如**Disease Type/Gender/Age at Diagnosis等等**。 44 | 45 | 下一步就是到**Files**里面选择数据类型,你想要的**转录组的的mRNA数据**,所以先点击**Files**,然后在下面的**Data Category**里面选择**transcriptome profiling**,在**Data Type**里面选择**Gene Expression Quantification**: 46 | 47 | image-20220912215053313 48 | 49 | OK,到这里你就选择好你想要的数据了:**TCGA的直肠癌的常规转录组的mRNA数据**,其他的都不用选了,你可以看到一共177个文件! 50 | 51 | 下一步,把你的所有数据添加到购物车,也就是点击右侧**Add All Files to Cart**,点完之后你的右上角购物车会出现数字,就像下面这样: 52 | 53 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912215417751.png) 54 | 55 | 56 | 57 | 加入购物车之后,点击**Cart**,进入下面的下载界面,这个界面内容很多,比如167个cases,177个files,747.58M,还有各种下载选项,都给你标出来了。 58 | 59 | ![image-20220912215730994](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912215730994.png) 60 | 61 | 此时,你点击**Download**,下面会出现**Manifest和Cart**的选项。 62 | 63 | 你如果选择**Cart**,会下载一个压缩包,里面就是你选择好的177个文件。点击**Cart**会下载下图中标号**1**的文件,解压后得到标号**2**的文件,把**2**继续解压,就得到标号为**3**的文件夹:![image-20220912182021322](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912182021322.png) 64 | 65 | 打开这个文件夹,里面就是你的178个文件,因为多了一个**Manifest**文件。 66 | 67 | 68 | 69 | 如果你的网络不错,直接下载**Cart**其实是非常简单的方法,比如我这里177个文件,700多M,不到10分钟就下载完了!:smile:下载完成后你如果需要整理成表达矩阵,那你还需要点击**Metadata**,下载一个metadata文件! 70 | 71 | ![image-20220912184217970](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912184217970.png) 72 | 73 | 这个metadata是json格式的,里面记录着文件名和样本名的对应关系,整理成表达矩阵需要这个文件。 74 | 75 | 76 | 77 | 如果你选择了**Manifest**,那么会下载一个manifest文件(这个文件内容和上面通过cart方式下载得到的MANIFEST文件内容完全一样): 78 | 79 | ![image-20220912183518323](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912183518323.png) 80 | 81 | 这个文件里面包含了你选择好的177个文件的信息,有了它,你就可以用GDC官方推荐的**gdc client**工具下载了,后面我们会说怎么用这个文件进行下载。如果你要整理成表达矩阵,那你还需要点击**Metadata**,下载一个metadata文件! 82 | 83 | 除此之外,你还可以在这个界面**下载临床信息**,点击**Clinical**,下载**TSV**格式的临床数据。 84 | 85 | ![image-20220912181338874](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912181338874.png) 86 | 87 | 其他的数据用处不大,可以不用下载。 88 | 89 | 下面说说如何用GDC官方推荐的**gdc client**工具进行下载。 90 | 91 | 首先,需要到`gdc client`的下载地址:https://gdc.cancer.gov/access-data/gdc-data-transfer-tool,下载这个软件,往下拉即可看到各个平台的版本: 92 | 93 | ![image-20220912162758228](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912162758228.png) 94 | 95 | 左边的是命令行版本,右边是图形化界面,可以用鼠标点点点的那种! 96 | 97 | 我先给大家演示下点点点的版本,适合不会写代码的人!根据你的系统,下载合适的版本,比如我是Windows,我就下载了下面这个: 98 | 99 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912184930655.png) 100 | 101 | 然后解压它,安装它,打开它,就会出现下面这个界面: 102 | 103 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912190252435.png) 104 | 105 | 点击那个**Select Manifest File**,会让你选择你的**manifest**文件,也就是上一步下载的那个,选好之后会出现下面的界面: 106 | 107 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912211050696.png) 108 | 109 | 110 | 111 | 稍等片刻,如果你的网络没问题就会变成下面这个界面,然后你点击右下角的**Download**就可以下载了(下载前你可以先设置下,见下一张图),下载过程会告诉你一共多少几个,下载中几个,失败几个,停止几个,完成几个等,非常清晰明了: 112 | 113 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912220530992.png) 114 | 115 | 下载前可以先进行一些设置:比如更改你的保存路径,每次下载的大小,自动重连的次数等等,改好之后记得点击**Save Settings**: 116 | 117 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912211611086.png) 118 | 119 | 都设置好之后,点击**Download**即可愉快的下载了! 120 | 121 | 如果有失败的,会在下面显示,直接选中继续下载即可: 122 | 123 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912213741905.png) 124 | 125 | 126 | 127 | 下载完之后也是177个文件: 128 | 129 | ![image-20220912190839901](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220912190839901.png) 130 | 131 | 这个方法本质上和命令行版本的gdc client没有区别! 132 | 133 | 这个点点点的图形化界面真的太香了,这不比命令行版本的gdc client香多了么!还要命令行那么复杂的东西干啥?? 134 | 135 | **根据这个教程下载后,可以无缝衔接另一篇教程:只要2行代码即可整理成表达矩阵!** 136 | 137 | [3.手动下载的TCGA数据也是可以用TCGAbiolinks包整理的](https://mp.weixin.qq.com/s/DHj9wp6hkae2Zrl61sU1fQ) 138 | 139 | TCGA傻瓜版下载教程未完待续,下一次说说怎么用gdc client的命令行进行下载,后面还会介绍如何整理成表达矩阵! 140 | 141 | 万里长城第一步,这才开始! -------------------------------------------------------------------------------- /常见分析/0001combat去批次.md: -------------------------------------------------------------------------------- 1 | 今天演示下如何使用不同方法去除批次效应。 2 | 3 | 本期目录: 4 | 5 | [toc] 6 | 7 | ## 准备数据 8 | 9 | 我们直接用`easyTCGA`下载结肠癌和直肠癌的转录组基因表达数据。 10 | 11 | 12 | ```r 13 | library(easyTCGA) 14 | 15 | # 1行代码搞定一切 16 | getmrnaexpr(c("TCGA-COAD","TCGA-READ")) 17 | ``` 18 | 19 | 然后就可以加载数据了。 20 | 21 | 先使用`tpm`数据做个演示。如果是基因表达芯片数据,也是和`tpm`数据的处理方法一样的。 22 | 23 | 24 | ```r 25 | # 加载表达矩阵和临床信息 26 | load(file = "output_mRNA_lncRNA_expr/TCGA-COAD_TCGA-READ_mrna_expr_tpm.rdata") 27 | load(file = "output_mRNA_lncRNA_expr/TCGA-COAD_TCGA-READ_lncrna_expr_tpm.rdata") 28 | load(file = "output_mRNA_lncRNA_expr/TCGA-COAD_TCGA-READ_clinical.rdata") 29 | ``` 30 | 31 | 表达矩阵进行`log2`转换,然后提取临床信息中的样本类型和`project`类型。 32 | 33 | `easyTCGA`下载的是最新的官网数据,理论上这种数据是最全的,但是也都是未经整理的,很多临床信息的名字和`xena`这些网站下载的并不一样,需要自己多探索哈。`easyTCGA`包会保存临床信息到csv文件里的,打开一看便知。 34 | 35 | TCGA的官网是:https://portal.gdc.cancer.gov/。建议初学者熟悉下官网的数据,再结合第三方网站的数据,一起探索。 36 | 37 | 我们的临床信息中`project_id`就是我们需要的批次信息,一个是`TCGA-COAD`,一个是`TCGA-READ`。 38 | 39 | `sample_type`是样本类型,但是太详细了,我们其实只要`normal/tumor`即可。 40 | 41 | 42 | ```r 43 | exprset <- log2(mrna_expr_tpm+0.1) 44 | exprset_lnc <- log2(lncrna_expr_tpm+0.1) 45 | dim(mrna_expr_tpm) 46 | ## [1] 19938 701 47 | table(clin_info$project_id) 48 | ## 49 | ## TCGA-COAD TCGA-READ 50 | ## 524 177 51 | table(clin_info$sample_type) 52 | ## 53 | ## Metastatic Primary Tumor Recurrent Tumor Solid Tissue Normal 54 | ## 1 647 2 51 55 | ``` 56 | 57 | 可以看到一共有19938个编码基因,701个样本。其中`TCGA-COAD`有524个,`TCGA-READ`有177个。 58 | 59 | 然后是不同的样本类型,其实太详细了,我们只要分为`normal`和`tumor`即可。 60 | 61 | 62 | ```r 63 | # 修改下样本类型,project_id就是批次信息,不改了 64 | clin_info$sample_type <- ifelse(as.numeric(substr(clin_info$barcode,14,15))<10,"tumor","normal") 65 | table(clin_info$sample_type) 66 | ## 67 | ## normal tumor 68 | ## 51 650 69 | table(clin_info$project_id) 70 | ## 71 | ## TCGA-COAD TCGA-READ 72 | ## 524 177 73 | 74 | head(clin_info[,c("project_id","sample_type")]) 75 | ## project_id sample_type 76 | ## TCGA-D5-6540-01A-11R-1723-07 TCGA-COAD tumor 77 | ## TCGA-AA-3525-11A-01R-A32Z-07 TCGA-COAD normal 78 | ## TCGA-AA-3525-01A-02R-0826-07 TCGA-COAD tumor 79 | ## TCGA-AA-3815-01A-01R-1022-07 TCGA-COAD tumor 80 | ## TCGA-D5-6923-01A-11R-A32Z-07 TCGA-COAD tumor 81 | ## TCGA-G4-6322-01A-11R-1723-07 TCGA-COAD tumor 82 | ``` 83 | 84 | 样本顺序和表达矩阵完全一致,方便各种增删改查! 85 | 86 | 87 | ```r 88 | identical(clin_info$barcode, colnames(exprset)) 89 | ## [1] TRUE 90 | identical(clin_info$barcode, colnames(exprset_lnc)) 91 | ## [1] TRUE 92 | ``` 93 | 94 | ## 数据探索 95 | 96 | `easyTCGA`更加侧重下载和整理数据,只是顺便带了差异分析和批量生存分析,下游的各种分析已经有非常多的R包实现了。 97 | 98 | 首先我们用非常好用的`tinyarray`探索下还没有进行批次矫正的数据。这里就用mRNA的数据作为示例了。 99 | 100 | 101 | ```r 102 | library(tinyarray) 103 | ``` 104 | 105 | ### pca 106 | 107 | 首先是`pca`可视化,1行代码即可,极大节省你自己写代码的时间。 108 | 109 | 110 | ```r 111 | draw_pca(exp = exprset, group_list = factor(clin_info$sample_type)) 112 | ``` 113 | 114 | ![plot of chunk unnamed-chunk-7](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-7-176440171.png) 115 | 116 | 可以看到`normal`和`tumor`重叠的部分还是蛮多的,数据质量不是非常好,但基本上还是能分得开,也不算太差。如果是非常好的数据应该是分的很开那种,当然也不是绝对的。 117 | 118 | 我们换个思路,把分组信息换成批次信息再看一看。 119 | 120 | 121 | ```r 122 | draw_pca(exp = exprset, group_list = factor(clin_info$project_id)) 123 | ``` 124 | 125 | ![plot of chunk unnamed-chunk-8](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-176440171.png) 126 | 127 | 其实这样看还是可以的,`COAD`和`READ`基本混在一起,没有呈现出明显的批次。 128 | 129 | ### 层次聚类 130 | 131 | 探索完`pca`之后,我们再使用聚类分析探索下数据。 132 | 133 | 因为列名太长了,不方便展示,所以我改成了数字了,非常不推荐哈,这样就不能清晰地知道哪个样本不合群了。 134 | 135 | 这里的聚类还加了个颜色条,展示`normal/tumor`分组,我觉的是个非常不错的技巧。 136 | 137 | 参考历史推文:[聚类分析可视化之dendextend](https://mp.weixin.qq.com/s/YPz9pL2fDQ7cFX9_Fyw1yg) 138 | 139 | 140 | ```r 141 | suppressPackageStartupMessages(library(dendextend)) 142 | 143 | tmp <- exprset 144 | colnames(tmp) <- 1:ncol(tmp) 145 | 146 | h.clust <- hclust(dist(scale(t(tmp)))) 147 | h.clust <- as.dendrogram(h.clust) 148 | 149 | sample_colors <- ifelse(clin_info$sample_type == "tumor","red","green") 150 | 151 | # 留足画图空间,防止颜色条显示不出来 152 | par(mar=c(15,1,1,1)) 153 | plot(h.clust) 154 | colored_bars(colors = sample_colors, dend = h.clust) 155 | ``` 156 | 157 | ![plot of chunk unnamed-chunk-9](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-9-176440171.png) 158 | 159 | 简单的数据探索过程就到这里,如果你发现有明显的异常样本,可以手动删除,我们这里为了省事,就不做这一步了。过段时间再写个专门的推文讨论这个问题。 160 | 161 | ## combat 162 | 163 | 首先用`sva`包的`ComBat`函数去批次: 164 | 165 | 166 | ```r 167 | library(sva) 168 | ## Loading required package: mgcv 169 | ## Loading required package: nlme 170 | ## This is mgcv 1.8-41. For overview type 'help("mgcv-package")'. 171 | ## Loading required package: genefilter 172 | ## Loading required package: BiocParallel 173 | 174 | expr_combat <- ComBat(dat = exprset, batch = clin_info$project_id) 175 | ## Found 620 genes with uniform expression within a single batch (all zeros); these will not be adjusted for batch. 176 | ## Found2batches 177 | ## Adjusting for0covariate(s) or covariate level(s) 178 | ## Standardizing Data across genes 179 | ## Fitting L/S model and finding priors 180 | ## Finding parametric adjustments 181 | ## Adjusting the Data 182 | 183 | # 查看去除批次后的数据 184 | expr_combat[1:4,1:4] 185 | ## TCGA-D5-6540-01A-11R-1723-07 TCGA-AA-3525-11A-01R-A32Z-07 186 | ## MT-CO2 14.50611 14.11911 187 | ## MT-CO3 14.43620 13.98267 188 | ## MT-ND4 14.36872 13.31916 189 | ## MT-CO1 14.61993 13.99882 190 | ## TCGA-AA-3525-01A-02R-0826-07 TCGA-AA-3815-01A-01R-1022-07 191 | ## MT-CO2 14.04289 14.85734 192 | ## MT-CO3 14.20102 14.67482 193 | ## MT-ND4 13.51694 14.52215 194 | ## MT-CO1 13.62324 14.51841 195 | expr_combat <- as.data.frame(expr_combat) 196 | 197 | # 再画图看看 198 | draw_pca(exp = expr_combat, group_list = factor(clin_info$sample_type)) 199 | ``` 200 | 201 | ![plot of chunk unnamed-chunk-10](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-176440171.png) 202 | 203 | 效果好像不太明显,和没去除批次效应之前的图基本差不多。 204 | 205 | 206 | ```r 207 | # lncRNA的也做一下,保存下数据 208 | expr_lnc_combat <- ComBat(dat = exprset_lnc, batch = clin_info$project_id) 209 | expr_lnc_combat <- as.data.frame(expr_lnc_combat) 210 | save(expr_combat,expr_lnc_combat,clin_info,file = "step1_output.rdata") 211 | ``` 212 | 213 | 214 | `ComBat`里面有个`mod`选项,可以用来指定感兴趣的分组(这里就是normal和tumor),告诉函数不要把本来的分组信息给整没了。 215 | 216 | 我们再试试: 217 | 218 | 219 | ```r 220 | mod <- model.matrix(~factor(clin_info$sample_type)) 221 | expr_combat <- ComBat(dat = exprset, batch = clin_info$project_id,mod = mod) 222 | ## Found 620 genes with uniform expression within a single batch (all zeros); these will not be adjusted for batch. 223 | ## Found2batches 224 | ## Adjusting for1covariate(s) or covariate level(s) 225 | ## Standardizing Data across genes 226 | ## Fitting L/S model and finding priors 227 | ## Finding parametric adjustments 228 | ## Adjusting the Data 229 | draw_pca(exp = expr_combat, group_list = factor(clin_info$sample_type)) 230 | ``` 231 | 232 | ![plot of chunk unnamed-chunk-12](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-12-176440171.png) 233 | 234 | 还是差不多哈... 235 | 236 | ## removeBatchEffect 237 | 238 | 然后我们再尝试下`limma`包的`removeBatchEffect`函数去批次。使用起来也是一模一样的简单。 239 | 240 | 241 | ```r 242 | library(limma) 243 | 244 | mod <- model.matrix(~factor(clin_info$sample_type)) 245 | expr_rbe <- removeBatchEffect(exprset, batch = clin_info$project_id, design=mod) 246 | 247 | # 继续画图 248 | draw_pca(exp = expr_rbe, group_list = factor(clin_info$sample_type)) 249 | ``` 250 | 251 | ![plot of chunk unnamed-chunk-13](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-13-176440171.png) 252 | 253 | 好像比`ComBat`差一点。 254 | 255 | ## count数据 256 | 257 | 如果是基因表达芯片数据,那么思路和上面一模一样,也是可以用`sva`和`limma`即可。 258 | 259 | 如果是count数据(测序数据),则可以采用下面的思路。 260 | 261 | 到底是用`count,fpkm,tpm`哪一种?也不用太纠结,我们已经写过很多推文介绍了: 262 | 263 | - [DESeq2差异分析及VST变换的探索](https://mp.weixin.qq.com/s/CBznByKNGwPEKIKM5U0Oyw) 264 | - [count、tpm、fpkm等表达量差异](https://mp.weixin.qq.com/s/aff-AX9aA2tSDa2zbB8ZRQ) 265 | - [批量生存分析(logrank和单因素COX)](https://mp.weixin.qq.com/s/o-gCc_1B9SQmNFrG-I6yAQ) 266 | 267 | 首先加载数据。 268 | 269 | 270 | ```r 271 | load(file = "output_mRNA_lncRNA_expr/TCGA-COAD_TCGA-READ_mrna_expr_counts.rdata") 272 | identical(clin_info$barcode, colnames(mrna_expr_counts)) 273 | ## [1] TRUE 274 | ``` 275 | 276 | 首先还是`sva`包,用其中的`ComBat_seq`函数即可。专门针对`count`数据。 277 | 278 | 279 | ```r 280 | expr_count_combat <- ComBat_seq(counts = as.matrix(mrna_expr_counts), 281 | batch = clin_info$project_id, 282 | group = clin_info$sample_type 283 | ) 284 | ## Found 2 batches 285 | ## Using full model in ComBat-seq. 286 | ## Adjusting for 1 covariate(s) or covariate level(s) 287 | ## Estimating dispersions 288 | ## Fitting the GLM model 289 | ## Shrinkage off - using GLM estimates for parameters 290 | ## Adjusting the data 291 | expr_count_combat[1:4,1:4] 292 | ## TCGA-D5-6540-01A-11R-1723-07 TCGA-AA-3525-11A-01R-A32Z-07 293 | ## MT-CO1 474829 441211 294 | ## MT-ND4 371029 249643 295 | ## MT-CO2 201649 211390 296 | ## MT-CO3 217204 221701 297 | ## TCGA-AA-3525-01A-02R-0826-07 TCGA-AA-3815-01A-01R-1022-07 298 | ## MT-CO1 139679 219156 299 | ## MT-ND4 120710 202674 300 | ## MT-CO2 84905 126534 301 | ## MT-CO3 106881 126317 302 | ``` 303 | 304 | 画图看看去除批次效应之前和之后的pca: 305 | 306 | 307 | ```r 308 | draw_pca(exp = mrna_expr_counts, group_list = factor(clin_info$sample_type)) 309 | ``` 310 | 311 | ![plot of chunk unnamed-chunk-16](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-16-176440171.png) 312 | 313 | ```r 314 | draw_pca(exp = expr_count_combat, group_list = factor(clin_info$sample_type)) 315 | ``` 316 | 317 | ![plot of chunk unnamed-chunk-16](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-16-276440171.png) 318 | 319 | 差别不是很大,因为我们用的`TCGA-COAD`和`TCGA-READ`并没有很明显的批次效应,所以这几种方法用下来差别都不是很大。 320 | 321 | 也可以使用`DESeq2`,但是这个包是在做差异分析时顺便帮你把批次效应去除,不能单独去除批次效应。 322 | 323 | 324 | ```r 325 | library(DESeq2) 326 | 327 | dds1 <- DESeqDataSetFromMatrix(countData = mrna_expr_counts, 328 | colData = clin_info, 329 | design = ~ sample_type+project_id # 批次效应写在这里即可 330 | ) 331 | ``` 332 | 333 | 后面就是做差异分析的步骤了,就不再演示了。可以参考咱们的历史推文: 334 | 335 | [DESeq2差异分析及VST变换的探索](https://mp.weixin.qq.com/s/CBznByKNGwPEKIKM5U0Oyw) 336 | -------------------------------------------------------------------------------- /常见分析/0003ImmLnc和ImmReLnc识别免疫相关lncRNA.md: -------------------------------------------------------------------------------- 1 | 和免疫相关的各种分析感觉都挺火的......免疫相关的lncRNA也很火。 2 | 3 | ## ImmReg获取免疫相关lncRNA 4 | 5 | 我在查找免疫相关lncRNA时发现了一个专门的网站:[ImmReg](http://bio-bigdata.hrbmu.edu.cn/ImmReg/index.jsp): http://bio-bigdata.hrbmu.edu.cn/ImmReg/index.jsp 6 | 7 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521110220342.png) 8 | 9 | 这个网站可以下载**免疫相关的转录因子、RNA结合蛋白、miRNA、lncRNA**,下载后就可以直接用在你的文章里! 10 | 11 | 然后顺便在网站下方的参考文献里找到了这篇发表在NC上的文章:*Pan-cancer characterization of immune-related lncRNAs identifies potential oncogenic biomarkers*(DOI:https://doi.org/10.1038/s41467-020-14802-2) 12 | 13 | 里面提到了`ImmLnc`这个R包可以计算免疫相关的lncRNA,但是非常不幸运的是文章中提到的可以下载这个R包的网址已经更新了,变成了上面的那个网站,而且已经不再提供该R包的下载了,只提供了2段代码...... 14 | 15 | 但是不要紧,所有数据都可以在网站上直接下载,毕竟我们只是要一个结果而已。 16 | 17 | 在网站的`download`界面可以非常方便的下载免疫相关lncRNA: 18 | 19 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521110850489.png) 20 | 21 | 认真读过上面提到的文献,就知道免疫相关的lncRNA只要下载红框里的`sig.txt`即可! 22 | 23 | 下载完成后我们读取到R里面。 24 | 25 | 26 | ```r 27 | # 读取文件 28 | lnc_pathway_sig <- data.table::fread("E:/projects/ImmLnc/lncRNA_Pathway_sig.txt") 29 | ``` 30 | 31 | 这个免疫相关lncRNA的寻找过程在文献里写的还蛮清楚的,主要是2个步骤: 32 | 33 | 1. 计算mrna和lncRNA的相关性 34 | 2. 基于免疫相关通路进行GSEA富集分析 35 | 36 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521111814774.png) 37 | 38 | 具体细节我们就不去管了,下面我们探索下这个下载的结果。 39 | 40 | 41 | ```r 42 | names(lnc_pathway_sig) 43 | ## [1] "Cancer" "lncRNA Id" "lncRNA Symbol" 44 | ## [4] "Immune Pathway" "P Value" "P Adjust" 45 | ## [7] "ES" "Score" "Number of Marker Gene" 46 | ## [10] "Marker Gene" 47 | 48 | lnc_pathway_sig[1:4,1:4] 49 | ## Cancer lncRNA Id lncRNA Symbol Immune Pathway 50 | ## 1: ACC ENSG00000082929 LINC01587 Cytokines 51 | ## 2: ACC ENSG00000117242 PINK1-AS Antigen Processing and Presentation 52 | ## 3: ACC ENSG00000130600 H19 TCR signaling Pathway 53 | ## 4: ACC ENSG00000145063 AC062028.1 Natural Killer Cell Cytotoxicity 54 | ``` 55 | 56 | 非常详细,给出了每个癌种的lncRNA和免疫相关的通路信息,还给出了P值和富集分数。 57 | 58 | 根据网站和文献所说,`FDR<0.05 & |score| > 0.995`可被认为是免疫相关lncRNA。 59 | 60 | 看下这个标准下和`TCGA-COAD/TCGA-READ`相关的免疫相关lncRNA有多少: 61 | 62 | 63 | ```r 64 | suppressMessages(library(tidyverse)) 65 | 66 | tt <- lnc_pathway_sig %>% 67 | filter(Cancer %in% c("COAD","READ")) %>% 68 | filter(abs(Score)>0.995, `P Adjust` < 0.05) 69 | 70 | length(unique(tt$`lncRNA Symbol`)) 71 | ## [1] 2828 72 | ``` 73 | 74 | 2828个,如果你觉得多,可以调低筛选标准。 75 | 76 | 下面我们画个图,看看在每一条免疫通路中有多少lncRNA。这个免疫相关通路也是从其他网站下载的,大家可以读原文,写的很清楚。 77 | 78 | 79 | ```r 80 | library(tidyverse) 81 | source("tools_plot.R")#我自己常用的一些画图相关函数 82 | 83 | plot_df <- lnc_pathway_sig %>% 84 | filter(Cancer %in% c("COAD","READ")) %>% 85 | filter(abs(Score)>0.995, `P Adjust` < 0.01) %>% 86 | count(`Immune Pathway`) %>% 87 | mutate(n=log2(n)) %>% 88 | arrange(n) 89 | 90 | ggplot(plot_df, aes(n, fct_reorder(`Immune Pathway`,n)))+ 91 | geom_bar(stat = "identity", aes(fill=`Immune Pathway`))+ 92 | scale_fill_manual(values = sample(col_vector, 16))+ 93 | labs(x="log2(number of immune-related lncrnas)", y=NULL)+ 94 | theme_classic() 95 | ``` 96 | 97 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-4-17644417376444244.png) 98 | 99 | 这个方法简单实用哈,下载就能用,NC出品,作为参考文献也不寒碜。 100 | 101 | ## ImmReLnc识别免疫相关lncRNA 102 | 103 | 顺着这个方法我继续搜索,竟然又发现了一个类似的算法:`ImmReLnc`。 104 | 105 | 文章发表在`frontiers in genetics`,题目:*ImReLnc: Identifying Immune-Related LncRNA Characteristics in Human Cancers Based on Heuristic Correlation Optimization* (DOI: doi: 10.3389/fgene.2021.792541) 106 | 107 | 作者提出了自己的免疫相关lncRNA鉴定算法:`ImmReLnc` 108 | 109 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521113618633.png) 110 | 111 | 和上面那篇非常相似,而且也给出了相关的代码,在github:https://github.com/meihonggao/ImReLnc 112 | 113 | 我已经下载下来跑过了,能跑通,可以得到和文章中一样的结果。 114 | 115 | 而且作者还和`ImmLnc`的结果做了比较: 116 | 117 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521114106887.png) 118 | 119 | 这种方法得到的lncRNA数量很少哈,比如BRCA,只有几个,不太够用。 120 | 121 | ## TilSig识别免疫相关lncRNA 122 | 123 | 继续找资料,很快就发现了还有一个识别免疫相关lncRNA的方法! 124 | 125 | 文章发表在`Journal For Immunotherapy of Cancer`,题目:*Identification of tumor immune infiltration- associated lncRNAs for improving prognosis and immunotherapy response of patients with non- small cell lung cancer* (DOI:10.1136/jitc-2019-000110) 126 | 127 | 作者提到了一种自己开发的`TILSig`的方法: 128 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230521114902960.png) 129 | 130 | 然而这篇文章并没有提供相关的代码和数据,大家感兴趣的可以根据文章中提到的方法进行复现试一试。 131 | 132 | ## 其他方法 133 | 134 | 比较常见的是WGCNA识别免疫相关lncRNA,放到下一次再讲。 135 | 136 | 其实还有很多简单的方法,比如直接粗暴的计算lncRNA和免疫相关mRNA的相关性,然后再做差异分析,取个交集就是了。 137 | 138 | 但是这种方法很显然不如上面介绍的其他几种方法炫酷啦。 139 | 140 | 本次涉及的3篇文献可在后台回复**免疫相关lncRNA**获取。 141 | 142 | -------------------------------------------------------------------------------- /常见分析/GSVA和ssGSEA.md: -------------------------------------------------------------------------------- 1 | 最近写了这么多关于富集分析的推文,不知道大家看懂了没有,其实富集分析主要就分为两种:`ORA`和`GSEA`。 2 | 3 | 假如你手上有一撮基因,但是你不知道它们有哪些功能,你可以先做个`ORA`富集分析;假如你有一撮基因,你想看看它们在两种状态下分别会富集在哪些通路,或者两种状态下的功能会有哪些不一样,那你可以做`GSEA`。 4 | 5 | 平常最常见的GO和KEGG只是已知功能的基因集合而已,这些基因的功能我们已经研究透了,现在把它们放一起,用来方便大家探索你手上的基因可能有哪些功能,这就是注释基因集,用已知功能的基因来注释你手上的基因。 6 | 7 | 除了GO和KEGG,还有非常多的注释基因集,比如我们之前介绍过的`WikiPathways`、`Reactome`等等。 8 | 9 | `GSVA`是`GSEA`的变种方法,它是一种常见的可以为样本**打分**的方法,可以把**行为基因列为样本的表达矩阵**变为**行为基因集列为样本的表达矩阵**,也就是说,你提供一个行为基因列为样本的表达矩阵以及几个注释基因集,它就可以计算出样本的变异分数,返回一个每行是一个基因集,列为样本的矩阵。 10 | 11 | 网上常见的**根据通路对样本打分**的方法说的就是这个`GSVA`。 12 | 13 | `ssGSEA`是`GSVA`的一种特殊类型,二者没有本质上的区别,除了这两种,还有`zscore`和`plage`方法,都是通过`GSVA`包实现的。 14 | 15 | 我们使用`TCGA-SKCM`的数据进行演示,注释基因集一般是从`misigdb`网站下载的,根据你自己的需求来,有些人想看看免疫相关的,那你就下载免疫相关的基因集,你想看炎症相关的就下载炎症相关的基因集。 16 | 17 | ## 准备基因集 18 | 19 | 我们就从msigdb下载经典的`Hallmark_gene_sets`。下载之后使用`clusterProfiler`的`read.gmt`函数直接读取,然后使用`split`变成`GSVA`需要的格式。 20 | 21 | 22 | ```r 23 | hall_mark <- "G:/bioinfo/000files/h.all.v2023.1.Hs.symbols.gmt" 24 | 25 | # 结果是一个data.frame 26 | genesets <- clusterProfiler::read.gmt(hall_mark) 27 | ## 28 | head(genesets) 29 | ## term gene 30 | ## 1 HALLMARK_TNFA_SIGNALING_VIA_NFKB JUNB 31 | ## 2 HALLMARK_TNFA_SIGNALING_VIA_NFKB CXCL2 32 | ## 3 HALLMARK_TNFA_SIGNALING_VIA_NFKB ATF3 33 | ## 4 HALLMARK_TNFA_SIGNALING_VIA_NFKB NFKBIA 34 | ## 5 HALLMARK_TNFA_SIGNALING_VIA_NFKB TNFAIP3 35 | ## 6 HALLMARK_TNFA_SIGNALING_VIA_NFKB PTGS2 36 | 37 | # 按照term对symbol进行分组,变成list 38 | genesets4gsva <- split(genesets$gene, genesets$term) 39 | class(genesets4gsva) 40 | ## [1] "list" 41 | length(genesets4gsva) 42 | ## [1] 50 43 | #genesets4gsva[1:4] 44 | ``` 45 | 46 | 这个`split`的操作在之前的泛癌可视化中也介绍过:[任意基因在泛癌中的表达量可视化](https://mp.weixin.qq.com/s/MIDRG57oRSMTyX6Gm99-3w) 47 | 48 | 大家可以自己尝试下看看具体的格式,这个格式在免疫浸润分析中也用过的: 49 | 50 | - [1行代码完成8种免疫浸润分析](https://mp.weixin.qq.com/s/JqO7rVBMGGmOXRA8w8nDSg) 51 | - [免疫浸润可视化](https://mp.weixin.qq.com/s/YcUVElp0BEj5TxEqfSEkIQ) 52 | 53 | ## 准备表达矩阵 54 | 55 | 我们从TCGA下载黑色素瘤的转录组数据,使用`easyTCGA`,1行代码解决,即可得到6种表达矩阵和临床信息,而且是官网最新的数据: 56 | 57 | 58 | ```r 59 | library(easyTCGA) 60 | getmrnaexpr("TCGA-SKCM") 61 | ``` 62 | 63 | 加载数据: 64 | 65 | 66 | ```r 67 | load(file = "G:/easyTCGA_test/output_mRNA_lncRNA_expr/TCGA-SKCM_mrna_expr_tpm.rdata") 68 | ``` 69 | 70 | 这个数据是直接从`GDC`的官网数据中提取出来的,没有经过任何转化,所以我们先进行log2转换。 71 | 72 | 73 | ```r 74 | expr <- log2(mrna_expr_tpm+1) 75 | dim(expr) 76 | ## [1] 19938 473 77 | expr[1:4,1:4] 78 | ## TCGA-EB-A3Y6-01A-21R-A239-07 TCGA-D9-A4Z6-06A-12R-A266-07 79 | ## MT-CO2 15.82250 15.25351 80 | ## MT-CO3 15.38751 14.93694 81 | ## MT-ND4 14.67998 15.34512 82 | ## MT-CO1 15.22099 15.14673 83 | ## TCGA-FW-A5DY-06A-11R-A311-07 TCGA-EE-A2GH-06A-11R-A18T-07 84 | ## MT-CO2 16.32066 14.97308 85 | ## MT-CO3 15.90499 14.58077 86 | ## MT-ND4 15.67466 14.42920 87 | ## MT-CO1 16.02932 14.58028 88 | ``` 89 | 90 | 一共有19938个mRNA和473个样本。 91 | 92 | ## GSVA分析 93 | 94 | 下面就开始进行`GSVA`分析了,代码其实非常简单: 95 | 96 | 97 | ```r 98 | library(GSVA) 99 | 100 | expr_geneset <- gsva(expr = as.matrix(expr), # 不能是data.frame 101 | gset.idx.list = genesets4gsva, 102 | method="gsva", 103 | kcdf="Gaussian", # log后的tpm用高斯分布 104 | parallel.sz=10 # 多线程 105 | ) 106 | ## Setting parallel calculations through a MulticoreParam back-end 107 | ## with workers=10 and tasks=100. 108 | ## Estimating GSVA scores for 50 gene sets. 109 | ## Estimating ECDFs with Gaussian kernels 110 | ## Estimating ECDFs in parallel on 10 cores 111 | ## 112 | | 113 | | | 0% 114 | |======================================================================| 100% 115 | 116 | dim(expr_geneset) 117 | ## [1] 50 473 118 | 119 | expr_geneset[1:4,1:2] 120 | ## TCGA-EB-A3Y6-01A-21R-A239-07 121 | ## HALLMARK_TNFA_SIGNALING_VIA_NFKB -0.30185257 122 | ## HALLMARK_HYPOXIA -0.19158522 123 | ## HALLMARK_CHOLESTEROL_HOMEOSTASIS -0.01329616 124 | ## HALLMARK_MITOTIC_SPINDLE -0.28850995 125 | ## TCGA-D9-A4Z6-06A-12R-A266-07 126 | ## HALLMARK_TNFA_SIGNALING_VIA_NFKB -0.15484044 127 | ## HALLMARK_HYPOXIA -0.07166491 128 | ## HALLMARK_CHOLESTEROL_HOMEOSTASIS -0.39672253 129 | ## HALLMARK_MITOTIC_SPINDLE -0.10932485 130 | 131 | # 结果是matrix,变成data.frame方便使用 132 | expr_geneset <- as.data.frame(expr_geneset) 133 | ``` 134 | 135 | Hallmark中只有50个数据集,而且我们用了10个线程,所以这里还是蛮快的。 136 | 137 | 结果是50行,对应着我们的50个基因集,473列,依然是对应着473个样本。 138 | 139 | 这个结果和我们的原始表达矩阵有区别吗?没有 140 | 141 | 所以对原始表达矩阵可以做的操作都可以对这个`expr_geneset`做,比如差异分析,生存分析等等。 142 | 143 | ## 后续分析 144 | 145 | 有了这个结果,我们就可以做很多事情,因为它本质上也是一个表达矩阵而已。比如我想看看某个基因和炎症反应的关系,这有何难?做个相关性分析不就行了吗? 146 | 147 | 我们就以`HOPX`这个基因为例。 148 | 149 | 首先提取下这个`HOPX`和炎症反应的表达矩阵: 150 | 151 | 152 | ```r 153 | HOPX_expr <- expr["HOPX",] 154 | HOPX_expr[,1:4] 155 | ## TCGA-EB-A3Y6-01A-21R-A239-07 TCGA-D9-A4Z6-06A-12R-A266-07 156 | ## HOPX 1.198746 0.4733194 157 | ## TCGA-FW-A5DY-06A-11R-A311-07 TCGA-EE-A2GH-06A-11R-A18T-07 158 | ## HOPX 1.760987 2.010207 159 | 160 | inflam_expr <- expr_geneset["HALLMARK_INFLAMMATORY_RESPONSE",] 161 | inflam_expr[1:4,1:4] 162 | ## TCGA-EB-A3Y6-01A-21R-A239-07 163 | ## HALLMARK_INFLAMMATORY_RESPONSE -0.2640837 164 | ## NA NA 165 | ## NA.1 NA 166 | ## NA.2 NA 167 | ## TCGA-D9-A4Z6-06A-12R-A266-07 168 | ## HALLMARK_INFLAMMATORY_RESPONSE -0.4386833 169 | ## NA NA 170 | ## NA.1 NA 171 | ## NA.2 NA 172 | ## TCGA-FW-A5DY-06A-11R-A311-07 173 | ## HALLMARK_INFLAMMATORY_RESPONSE 0.2886898 174 | ## NA NA 175 | ## NA.1 NA 176 | ## NA.2 NA 177 | ## TCGA-EE-A2GH-06A-11R-A18T-07 178 | ## HALLMARK_INFLAMMATORY_RESPONSE 0.4181877 179 | ## NA NA 180 | ## NA.1 NA 181 | ## NA.2 NA 182 | ``` 183 | 184 | 然后就是计算`HPOX`和凋亡通路的相关性和P值: 185 | 186 | 187 | ```r 188 | identical(colnames(HOPX_expr),colnames(inflam_expr)) 189 | ## [1] TRUE 190 | 191 | cor.test(t(HOPX_expr),t(inflam_expr)) 192 | ## 193 | ## Pearson's product-moment correlation 194 | ## 195 | ## data: t(HOPX_expr) and t(inflam_expr) 196 | ## t = 9.3453, df = 471, p-value < 2.2e-16 197 | ## alternative hypothesis: true correlation is not equal to 0 198 | ## 95 percent confidence interval: 199 | ## 0.3166304 0.4689398 200 | ## sample estimates: 201 | ## cor 202 | ## 0.3955007 203 | ``` 204 | 205 | 你还想再画个图?那真是轻而易举,我们画个简单的,下面这张图我们在免疫浸润可视化中也用过,而且是批量出图的:[免疫浸润可视化](https://mp.weixin.qq.com/s/YcUVElp0BEj5TxEqfSEkIQ) 206 | 207 | 208 | ```r 209 | library(ggplot2) 210 | library(ggpubr) 211 | 212 | plot_df <- data.frame(t(HOPX_expr), t(inflam_expr)) 213 | names(plot_df) <- c("hopx","inflam") 214 | head(plot_df) 215 | ## hopx inflam 216 | ## TCGA-EB-A3Y6-01A-21R-A239-07 1.1987456 -0.2640837 217 | ## TCGA-D9-A4Z6-06A-12R-A266-07 0.4733194 -0.4386833 218 | ## TCGA-FW-A5DY-06A-11R-A311-07 1.7609873 0.2886898 219 | ## TCGA-EE-A2GH-06A-11R-A18T-07 2.0102069 0.4181877 220 | ## TCGA-EE-A2GR-06A-11R-A18S-07 0.2441564 -0.5117789 221 | ## TCGA-EB-A4XL-01A-11R-A27Q-07 5.7113490 0.1410712 222 | 223 | ggplot(plot_df, aes(hopx, inflam))+ 224 | geom_point()+ 225 | geom_rug()+ 226 | geom_smooth(method = "lm",color="blue")+ 227 | stat_cor(method = "spearman",color="red") 228 | ## `geom_smooth()` using formula = 'y ~ x' 229 | ``` 230 | 231 | ![plot of chunk unnamed-chunk-8](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-178938950.png) 232 | 233 | 如果你还想继续美化,那你需要自己学习`ggplot2`,还需要多看文献,模仿别人! 234 | 235 | 当然这个图还可以更加花里胡哨,使用我们之前介绍过的`ggstatsplot`:[统计可视化的颜值天花板:ggstatsplot](https://mp.weixin.qq.com/s/-v8MxlGgFawt2F9cWlVV9Q) 236 | 237 | 238 | ```r 239 | library(ggstatsplot) 240 | ## You can cite this package as: 241 | ## Patil, I. (2021). Visualizations with statistical details: The 'ggstatsplot' approach. 242 | ## Journal of Open Source Software, 6(61), 3167, doi:10.21105/joss.03167 243 | 244 | ggscatterstats(data = plot_df, 245 | x = hopx, 246 | y = inflam, 247 | xlab = "log2(HOPX TPM + 1)", 248 | ylab = "Inflammatory Response", 249 | bf.message = F 250 | ) 251 | ## Registered S3 method overwritten by 'ggside': 252 | ## method from 253 | ## +.gg ggplot2 254 | ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. 255 | ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. 256 | ``` 257 | 258 | ![plot of chunk unnamed-chunk-9](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-9-178938950.png) 259 | 260 | 什么?你还想批量计算所有通路和`HOPX`的相关性,那就赶紧看我们之前介绍过的方法吧:[单基因富集分析]() 261 | 262 | 263 | ## 一个小测试 264 | 265 | 从图中可以看出这个相关性不是很好,只有0.4左右,我认为这是由于HOPX的表达矩阵里有一些异常样本(或者叫离群值吧),比如图的右侧有一些样本很离散的,离多数样本很远的。我们尝试下把这些离群值删除,再重新画图看看。 266 | 267 | 268 | ```r 269 | suppressMessages(library(dplyr)) 270 | 271 | plot_df %>% 272 | filter(hopx < 3) %>% 273 | ggscatterstats(data = ., 274 | x = hopx, 275 | y = inflam, 276 | xlab = "log2(HOPX TPM + 1)", 277 | ylab = "Inflammatory Response", 278 | bf.message = F 279 | ) 280 | ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. 281 | ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. 282 | ``` 283 | 284 | ![plot of chunk unnamed-chunk-10](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-178938950.png) 285 | 286 | 果然!结果和我预想的一样,相关性从0.4提升到了0.55!对于很多结果来说这就是起死回生了! 287 | 288 | >但是,这种数据操作,你如果不能解释清楚,那算操纵数据吗? 289 | 290 | -------------------------------------------------------------------------------- /常见分析/SIC图表学习01.md: -------------------------------------------------------------------------------- 1 | 今天学习1篇去年发表在NC上的经典文献:Machine learning-based integration develops an immune-derived lncRNA signature for improving outcomes in colorectal cancer,其中的Fig 1 。 2 | 3 | 关于这篇文献的解读请看:[机器学习算法识别结直肠癌中的免疫相关lncRNA signature](https://mp.weixin.qq.com/s/3mgiswzEiuCKYmATxLBKxw) 4 | 5 | 其中的 Fig 1 一共包含9个子图: 6 | 7 | ![image-20230806221444798](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230806221444798.png) 8 | 9 | 其中, 10 | 11 | - A和B图是一致性聚类的图形 12 | - C是根据面浸润结果进行分子分型,并使用热图展示免疫浸润情况及不同的临床信息 13 | - D和E是不同免疫浸润方法的可视化 14 | - F和G是WGCNA的图 15 | - H是免疫相关lncRNA的展示 16 | - I是两种方法识别的免疫相关lncRNA的交集 17 | 18 | 虽然只是1个Fig 1,但是这工作量真的不小。 19 | 20 | 为了学习这个Fig 1,我单独写了4篇推文,不知道有没有细心的小伙伴发现: 21 | 22 | - [批次效应去除之combat和removebatcheffect](https://mp.weixin.qq.com/s/yRUmVTimI9f9itoHWxyYrA) 23 | - [免疫浸润结果分子分型(一致性聚类ConsensusClusterPlus)](https://mp.weixin.qq.com/s/96s_hfBH0HjLvvTfNgTIlQ) 24 | - [免疫相关lncRNA的识别](https://mp.weixin.qq.com/s/jrgZ6brGyrh1cAnW6Ddp3w) 25 | - [WGCNA实战:识别免疫相关lncRNA](https://mp.weixin.qq.com/s/Pr33WscVtNQQaoryxTiJ-Q) 26 | 27 | 并且在推文中扩展了一些其他技能。 28 | 29 | **以后会继续出一些SCI图表学习的文章,但是我不会100%复现其中的图,只是演示下用到的技能,因为最后的美化太浪费时间了......**。 30 | 31 | -------------------------------------------------------------------------------- /常见分析/WGCNA分类变量处理.md: -------------------------------------------------------------------------------- 1 | 这篇推文主要探讨下`WGCNA`如何处理分类性状。 2 | 3 | `eigengenes`可以代表某个模块,在计算出模块的`eigengenes`后,下一步就是探索`eigengenes`和性状之间的关系,也就是模块和性状之间的关系。 4 | 5 | 大家见到的比较多的是计算相关性,此时需要性状是数字才行。但是大家的性状有很多分类变量,此时应该如何处理呢? 6 | 7 | 以下是常规的分类变量处理原则: 8 | 9 | - 如果是二分类,只要变为0/1即可(也可以变成1/2,没有影响),或者变成因子型; 10 | - 如果是有序多分类,比如治愈、好转、未愈,这种,可以变成数字1,2,3,或者变成因子型; 11 | - 如果是无序多分类,那么此时需要使用`WGCNA`提供的函数进行处理。 12 | 13 | 假如我们有一个无序分类变量`x`,它有3组: 14 | 15 | 16 | ```r 17 | library(WGCNA) 18 | 19 | x <- rep(c("A","B","C"), each = 3) 20 | x 21 | ## [1] "A" "A" "A" "B" "B" "B" "C" "C" "C" 22 | ``` 23 | 24 | 我们可以把它变成3组之间**两两比较**的形式,使用的是`binarizeCategoricalVariable()`函数: 25 | 26 | 27 | ```r 28 | out <- binarizeCategoricalVariable(x,includePairwise = T,includeLevelVsAll = F) 29 | data.frame(x, out) 30 | ## x B.vs.A C.vs.A C.vs.B 31 | ## 1 A 0 0 NA 32 | ## 2 A 0 0 NA 33 | ## 3 A 0 0 NA 34 | ## 4 B 1 NA 0 35 | ## 5 B 1 NA 0 36 | ## 6 B 1 NA 0 37 | ## 7 C NA 1 1 38 | ## 8 C NA 1 1 39 | ## 9 C NA 1 1 40 | ``` 41 | 42 | 或者变成`1-vs-all`的形式: 43 | 44 | 45 | ```r 46 | out <- binarizeCategoricalVariable(x,includePairwise = F,includeLevelVsAll = T) 47 | data.frame(x, out) 48 | ## x A.vs.all B.vs.all C.vs.all 49 | ## 1 A 1 0 0 50 | ## 2 A 1 0 0 51 | ## 3 A 1 0 0 52 | ## 4 B 0 1 0 53 | ## 5 B 0 1 0 54 | ## 6 B 0 1 0 55 | ## 7 C 0 0 1 56 | ## 8 C 0 0 1 57 | ## 9 C 0 0 1 58 | ``` 59 | 60 | `binarizeCategoricalVariable()`是针对1个变量的,通常我们的性状数据都是包含在1个数据框中的,并且可能同时有多个分类变量,此时可以使用`binarizeCategoricalColumns()`。 61 | 62 | 比如,对于我们之前用过的`datTraits`这个性状数据,我们假设其中的`stage`和`msi`是无序多分类变量,然后对这两个变量进行转换: 63 | 64 | 65 | ```r 66 | load(file = "../000files/wgcna-02-networkConstruction-stepByStep.rdata") 67 | load(file = "../000files/wgcna-01-dataInput.rdata") 68 | 69 | out <- binarizeCategoricalColumns(datTraits, 70 | convertColumns = c("stage","msi"), 71 | includePairwise = T, 72 | includeLevelVsAll = F 73 | ) 74 | out[1:4,4:9] 75 | ## stage.2.vs.1 stage.3.vs.1 stage.4.vs.1 76 | ## TCGA-D5-6540-01A-11R-1723-07 0 0 0 77 | ## TCGA-AA-3525-01A-02R-0826-07 NA 1 NA 78 | ## TCGA-AA-3815-01A-01R-1022-07 1 NA NA 79 | ## TCGA-D5-6923-01A-11R-A32Z-07 0 0 0 80 | ## stage.5.vs.1 stage.3.vs.2 stage.4.vs.2 81 | ## TCGA-D5-6540-01A-11R-1723-07 0 NA NA 82 | ## TCGA-AA-3525-01A-02R-0826-07 NA 1 NA 83 | ## TCGA-AA-3815-01A-01R-1022-07 NA 0 0 84 | ## TCGA-D5-6923-01A-11R-A32Z-07 0 NA NA 85 | 86 | colnames(out) 87 | ## [1] "status" "age" "gender" "stage.2.vs.1" "stage.3.vs.1" 88 | ## [6] "stage.4.vs.1" "stage.5.vs.1" "stage.3.vs.2" "stage.4.vs.2" "stage.5.vs.2" 89 | ## [11] "stage.4.vs.3" "stage.5.vs.3" "stage.5.vs.4" "msi.2.vs.1" "msi.3.vs.1" 90 | ## [16] "msi.4.vs.1" "msi.3.vs.2" "msi.4.vs.2" "msi.4.vs.3" "cluster" 91 | ``` 92 | 93 | `datTraits`这个数据在之前的推文里,因为4篇推文都是前后有联系的,所以我都放在这里: 94 | 95 | - [批次效应去除之combat和removebatcheffect](https://mp.weixin.qq.com/s/yRUmVTimI9f9itoHWxyYrA) 96 | - [免疫浸润结果分子分型(一致性聚类ConsensusClusterPlus)](https://mp.weixin.qq.com/s/96s_hfBH0HjLvvTfNgTIlQ) 97 | - [免疫相关lncRNA的识别](https://mp.weixin.qq.com/s/jrgZ6brGyrh1cAnW6Ddp3w) 98 | - [WGCNA实战:识别免疫相关lncRNA](https://mp.weixin.qq.com/s/Pr33WscVtNQQaoryxTiJ-Q) 99 | 100 | 接下来就是计算模块(使用eigengenes代表)和性状(临床信息)之间的相关性和P值: 101 | 102 | 103 | ```r 104 | # 计算模块的eigengenes,也就是第一主成分 105 | MEs0 <- moduleEigengenes(datExpr, moduleColors)$eigengenes 106 | MEs <- orderMEs(MEs0) # 对列(也就是模块)的顺序重新排序,让相似性大的在一起 107 | 108 | # 计算模块和性状的相关系数 109 | # 这个cor是WGCNA::cor,可以计算任意两个矩阵的每列之间的相关性 110 | #(比如500个lncRNA和1000个mRNA),很实用! 111 | moduleTraitCor <- cor(MEs, out, use = "p") 112 | 113 | # 计算相关系数的P值 114 | moduleTraitPvalue <- corPvalueStudent(moduleTraitCor, nrow(datExpr)) 115 | ``` 116 | 117 | 然后画图就可以了: 118 | 119 | 120 | ```r 121 | sizeGrWindow(10,6) 122 | 123 | # 把相关系数和P值放在一起 124 | textMatrix <- paste(signif(moduleTraitCor, 2), 125 | "\n(", 126 | signif(moduleTraitPvalue, 1), ")", 127 | ep = "") 128 | dim(textMatrix) <- dim(moduleTraitCor) 129 | #textMatrix[1:6,1:6] 130 | 131 | par(mar = c(9, 10, 3, 3)) 132 | labeledHeatmap(Matrix = moduleTraitCor, 133 | xLabels = names(out), 134 | yLabels = names(MEs), 135 | ySymbols = names(MEs), 136 | colorLabels = FALSE, 137 | colors = blueWhiteRed(50), 138 | textMatrix = textMatrix, 139 | setStdMargins = FALSE, 140 | cex.text = 1, 141 | zlim = c(-1,1), 142 | main = paste("Module-trait relationships")) 143 | ``` 144 | 145 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230917104259080.png) 146 | 147 | 和没进行转换之前的图形比较一下: 148 | 149 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20230604184748762.png) 150 | 151 | ## 参考资料 152 | 153 | 1. https://peterlangfelder.com/2018/11/25/working-with-categorical-variables/ 154 | 2. https://www.biostars.org/p/293281/ 155 | 3. https://support.bioconductor.org/p/111449/#111450 156 | 157 | -------------------------------------------------------------------------------- /常见分析/WGCNA注意事项.md: -------------------------------------------------------------------------------- 1 | > We do not recommend attempting WGCNA on a data set consisting of fewer than 15 samples. In a typical high-throughput setting, correlations on fewer than 15 samples will simply be too noisy for the network to be biologically meaningful. If at all possible, one should have at least 20 samples; as with any analysis methods, more samples usually lead to more robust and refined results. 2 | 3 | 4 | 5 | > **We do not recommend filtering genes by differential expression.** WGCNA is designed to be an unsupervised analysis method that clusters genes based on their expression profiles. Filtering genes by differential expression will lead to a set of correlated genes that will essentially form a single (or a few highly correlated) modules. It also completely invalidates the scale-free topology assumption, so choosing soft thresholding power by scale-free topology fit will fail. 6 | 7 | 8 | 9 | > **Signed networks.** The choice of signed vs. unsigned networks is complex, but in general we prefer signed (or "signed hybrid") networks to unsigned networks. 10 | 11 | 12 | 13 | >**Can WGCNA be used to analyze RNA-Seq data?** 14 | 15 | 16 | 17 | Yes. As far as WGCNA is concerned, working with (properly normalized) RNA-seq data isn't really any different from working with (properly normalized) microarray data. 18 | 19 | We suggest removing features whose counts are consistently low (for example, removing all features that have a count of less than say 10 in more than 90% of the samples) because such low-expressed features tend to reflect noise and correlations based on counts that are mostly zero aren't really meaningful. The actual thresholds should be based on experimental design, sequencing depth and sample counts. 20 | 21 | We then recommend a variance-stabilizing transformation. For example, package DESeq2 implements the function `varianceStabilizingTransformation` which we have found useful, but one could also start with normalized counts (or RPKM/FPKM data) and log-transform them using `log2(x+1)`. For highly expressed features, the differences between full variance stabilization and a simple log transformation are small. 22 | 23 | Whether one uses RPKM, FPKM, or simply normalized counts doesn't make a whole lot of difference for WGCNA analysis as long as all samples were processed **the same way**. These normalization methods make a big difference if one wants to compare expression of gene A to expression of gene B; but WGCNA calculates correlations for which gene-wise scaling factors make no difference. (Sample-wise scaling factors of course do, so samples do need to be normalized.) 24 | 25 | If data come from different batches, we recommend to check for batch effects and, if needed, adjust for them. We use ComBat for batch effect removal but other methods should also work. 26 | 27 | Finally, we usually check quantile scatterplots to make sure there are no systematic shifts between samples; if sample quantiles show correlations (which they usually do), quantile normalization can be used to remove this effect. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | - If the reader has access to a large workstation with more than 4 GB of memory, the parameter maxBlockSize can be increased. A 16GB workstation should handle up to 20000 probes; a 32GB workstation should handle perhaps 30000. A 4GB standard desktop or a laptop may handle up to 8000-10000 probes, depending on operating system and ihow much memory is in use by other running programs. 38 | 39 | - If a computer with large-enough memory is not available, the reader should follow Section 2.c, Dealing with large datasets, and adapt the code presented there for their needs. In general it is preferable to analyze a data set in one block if possible, although in Section 2.c we present a comparison of block-wise and single-block analysis that indicates that the results are very similar. 40 | 41 | 42 | 43 | 44 | 45 | 一些常见的注意事项: 46 | 47 | - 15个样本以上 48 | - counts、tpm、fpkm,芯片数据都可以,count建议使用`DESeq2`进行表转化,其他建议进行`log2`转换 49 | - 选signed -------------------------------------------------------------------------------- /常见分析/单基因富集分析.md: -------------------------------------------------------------------------------- 1 | 前面给大家介绍了这么多的富集分析,其实主要就是两种:`ORA`和`GSEA`。通常都是需要一个基因集才可以做。 2 | 3 | >单个基因能做富集分析吗?肯定是不行的,所以需要我们用间接的方法实现。 4 | 5 | 对于单基因,你如果要做富集分析,有两种思路: 6 | 7 | - 批量计算和这个基因相关的其他基因,把其他基因进行富集分析,这个富集分析结果就可以近似的看做是单基因的结果 8 | - 根据这个基因的表达量进行分组,然后做差异分析,用差异基因做富集分析,这个富集结果,也是基于单基因的富集 9 | 10 | 这个思路同样也适用于其他分子,比如lncRNA,比如miRNA(miRNA其实应该是找靶基因做,这样更合理)。 11 | 12 | 下面我们进行演示,我们选择`HOPX`这个基因,来自一篇文章:https://doi.org/10.1186/s12935-023-02962-2 13 | 14 | ## 数据准备 15 | 16 | 首先我们从TCGA下载黑色素瘤的转录组数据,使用`easyTCGA`,1行代码解决,即可得到6种表达矩阵和临床信息,而且是官网最新的数据: 17 | 18 | 19 | ```r 20 | library(easyTCGA) 21 | getmrnaexpr("TCGA-SKCM") 22 | ``` 23 | 24 | 加载数据: 25 | 26 | 27 | ```r 28 | load(file = "G:/easyTCGA_test/output_mRNA_lncRNA_expr/TCGA-SKCM_mrna_expr_tpm.rdata") 29 | ``` 30 | 31 | 这个数据是直接从`GDC`的官网数据中提取出来的,没有经过任何转化,所以我们先进行log2转换。 32 | 33 | 34 | ```r 35 | expr <- log2(mrna_expr_tpm+1) 36 | dim(expr) 37 | ## [1] 19938 473 38 | ``` 39 | 40 | 一共有19938个mRNA和473个样本。 41 | 42 | 提取下这个`HOPX`的表达矩阵看看: 43 | 44 | 45 | ```r 46 | HOPX_expr <- expr["HOPX",] 47 | HOPX_expr[,1:4] 48 | ## TCGA-EB-A3Y6-01A-21R-A239-07 TCGA-D9-A4Z6-06A-12R-A266-07 49 | ## HOPX 1.198746 0.4733194 50 | ## TCGA-FW-A5DY-06A-11R-A311-07 TCGA-EE-A2GH-06A-11R-A18T-07 51 | ## HOPX 1.760987 2.010207 52 | ``` 53 | 54 | ## 相关性分析 55 | 56 | 批量计算`HPOX`和其他所有mRNA的相关性和P值,你自己写的循环太慢了,所以我这里推荐一种更快的方法,基于`WGCNA`,不过是借助`linkET`包实现的,这个方法我们在之前的免疫浸润中也讲过:[免疫浸润结果可视化](https://mp.weixin.qq.com/s/YcUVElp0BEj5TxEqfSEkIQ) 57 | 58 | 59 | ```r 60 | # 自定义一个函数 61 | cormatrixes <- function(x,y){ 62 | tem <- linkET::correlate(t(x),t(y),engine = "WGCNA") 63 | tem1 <- as.data.frame(tem[[1]]) 64 | tem1 <- cbind(rownames(tem1),tem1) 65 | tem1_long <- reshape2::melt(tem1,value.name = "correlation") 66 | tem2 <- as.data.frame(tem[[2]]) 67 | tem2 <- cbind(rownames(tem2),tem2) 68 | tem2_long <- reshape2::melt(tem2,value.name = "pvalue") 69 | result <- cbind(tem1_long,tem2_long$pvalue) 70 | names(result) <- c("v1","v2","correlation","pvalue") 71 | return(result) 72 | } 73 | ``` 74 | 75 | 这个函数接受两个表达矩阵,然后返回相关系数和P值,不过要确认你的两个表达矩阵的样本顺序是一样的: 76 | 77 | 78 | ```r 79 | # 确保两个两个矩阵样本顺序一样 80 | identical(colnames(expr),colnames(HOPX_expr)) 81 | ## [1] TRUE 82 | 83 | cor_res <- cormatrixes(HOPX_expr,expr) 84 | ## 85 | ## Using rownames(tem1) as id variables 86 | ## Using rownames(tem2) as id variables 87 | ``` 88 | 89 | 这个速度还是很快的,我还没找到比这更快的方法! 90 | 91 | 92 | ```r 93 | head(cor_res) 94 | ## v1 v2 correlation pvalue 95 | ## 1 HOPX MT-CO2 -0.08073411 0.07941864 96 | ## 2 HOPX MT-CO3 -0.05334072 0.24692973 97 | ## 3 HOPX MT-ND4 -0.08936978 0.05208752 98 | ## 4 HOPX MT-CO1 -0.06033840 0.19019751 99 | ## 5 HOPX MT-CYB -0.05946605 0.19669609 100 | ## 6 HOPX MT-ATP6 -0.05107928 0.26756587 101 | ``` 102 | 103 | 有些结果是NA,因为有的分子可能表达量在所有样本中都一样!我们把NA去掉即可。 104 | 105 | 最后筛选P值小于0.05和相关系数大于0.7的mRNA(这个东西没有标准,只要你能解释得通就行!) 106 | 107 | 108 | ```r 109 | cor_res <- na.omit(cor_res) 110 | 111 | suppressMessages(library(dplyr)) 112 | 113 | hopx_related_mrna <- cor_res %>% 114 | filter(correlation > 0.7, pvalue < 0.05) %>% 115 | distinct(v2) %>% 116 | pull(v2) 117 | 118 | length(hopx_related_mrna) 119 | ## [1] 82 120 | head(hopx_related_mrna) 121 | ## [1] CSTA AQP3 TACSTD2 TUBA4A SLURP1 ST14 122 | ## 19938 Levels: MT-CO2 MT-CO3 MT-ND4 MT-CO1 MT-CYB MT-ATP6 FTL MT-ND2 ... AC006486.3 123 | ``` 124 | 125 | 根据这个结果得到82个mRNA,然后对这82个mRNA进行富集分析即可,不过我们就不演示了,因为富集分析在之前已经详细介绍过了! 126 | 127 | ## 根据表达量分组 128 | 129 | 我们这里根据`HOPX`表达量中位数进行分组,把所有样本分为高表达组和低表达组。 130 | 131 | 然后进行差异分析,这里也是用`easyTCGA`1行代码解决: 132 | 133 | 134 | ```r 135 | sample_group <- ifelse(expr["HOPX",] > median(t(expr["HOPX",])), "high","low") 136 | sample_group <- factor(sample_group, levels = c("low","high")) 137 | 138 | library(easyTCGA) 139 | deg_res <- diff_analysis(exprset = expr, 140 | group = sample_group, 141 | is_count = F, 142 | logFC_cut = 1, 143 | pvalue_cut = 0.05, 144 | adjpvalue_cut = 0.05, 145 | save = F 146 | ) 147 | ## => log2 transform not needed 148 | ## => Running limma 149 | ## => Running wilcoxon test 150 | ## => Analysis done. 151 | 152 | # 提取limma的结果 153 | deg_limma <- deg_res$deg_limma 154 | 155 | head(deg_limma) 156 | ## logFC AveExpr t P.Value adj.P.Val B 157 | ## HOPX 1.411491 1.330710 17.92159 3.648490e-55 7.274359e-51 114.22524 158 | ## IL18 1.579073 2.882566 15.19126 1.021080e-42 1.017914e-38 86.06859 159 | ## TNFSF10 1.627203 3.868731 14.82989 4.077339e-41 2.709799e-37 82.44504 160 | ## DAPP1 1.120535 1.551681 13.49540 2.489357e-35 1.240820e-31 69.35296 161 | ## ANKRD22 1.459943 1.975013 13.06324 1.661069e-33 6.623677e-30 65.22542 162 | ## ZBED2 1.241665 1.613864 12.12598 1.202387e-29 3.995531e-26 56.49488 163 | ## genesymbol 164 | ## HOPX HOPX 165 | ## IL18 IL18 166 | ## TNFSF10 TNFSF10 167 | ## DAPP1 DAPP1 168 | ## ANKRD22 ANKRD22 169 | ## ZBED2 ZBED2 170 | ``` 171 | 172 | 只有1个是下调的,310个上调的,这个下调的很有意思!我对它很好奇,让我们看看它是谁! 173 | 174 | 175 | ```r 176 | deg_limma %>% 177 | dplyr::filter(logFC < 0) 178 | ## logFC AveExpr t P.Value adj.P.Val B 179 | ## VGF -1.197905 5.679119 -3.760606 0.0001907947 0.0008006871 0.02293662 180 | ## genesymbol 181 | ## VGF VGF 182 | ``` 183 | 184 | 接下来就可以使用这311个差异基因进行富集分析了,我们还是演示下吧,进行GO和KEGG的富集分析: 185 | 186 | 187 | ```r 188 | suppressMessages(library(clusterProfiler)) 189 | 190 | deg_entrezid <- bitr(deg_limma$genesymbol,fromType = "SYMBOL" 191 | ,toType = "ENTREZID",OrgDb = "org.Hs.eg.db") 192 | ## 193 | ## 'select()' returned 1:1 mapping between keys and columns 194 | # GO 195 | go_res <- enrichGO(deg_entrezid$ENTREZID, 196 | OrgDb = "org.Hs.eg.db", 197 | ont = "ALL", 198 | readable = T 199 | ) 200 | 201 | # KEGG 202 | kegg_res <- enrichKEGG(deg_entrezid$ENTREZID) 203 | ## Reading KEGG annotation online: "https://rest.kegg.jp/link/hsa/pathway"... 204 | ## Reading KEGG annotation online: "https://rest.kegg.jp/list/pathway/hsa"... 205 | ``` 206 | 207 | 顺手再画个图: 208 | 209 | 210 | ```r 211 | library(enrichplot) 212 | 213 | p1 <- dotplot(go_res,label_format=50,showCategory=20) 214 | p2 <- dotplot(kegg_res,label_format=50,showCategory=20) 215 | 216 | cowplot::plot_grid(p1,p2,labels = c("A","B")) 217 | ``` 218 | 219 | ![plot of chunk unnamed-chunk-12](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-12-178938553.png) 220 | 221 | 什么?你还不会富集分析?赶紧翻看万字长文,带你彻底了解富集分析:[富集分析常见类型](https://mp.weixin.qq.com/s/RtF7DPXYaObiDauIQTnkFg) 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /常见分析/单基因富集分析之火山图和热图.md: -------------------------------------------------------------------------------- 1 | 介绍下绘制火山图和热图的方法,如何在火山图或者热图中标记特定的基因,顺便学习下`EnhancedVolcano`包绘制火山图。 2 | 3 | ## 数据准备 4 | 5 | 使用TCGA黑色素瘤的转录组数据,使用`easyTCGA`,1行代码下载,即可得到6种表达矩阵和临床信息,而且是官网最新的数据: 6 | 7 | 8 | ```r 9 | library(easyTCGA) 10 | getmrnaexpr("TCGA-SKCM") 11 | ``` 12 | 13 | 加载数据: 14 | 15 | 16 | ```r 17 | load(file = "G:/easyTCGA_test/output_mRNA_lncRNA_expr/TCGA-SKCM_mrna_expr_tpm.rdata") 18 | ``` 19 | 20 | 这个数据是直接从`GDC`的官网数据中提取出来的,没有经过任何转化,所以我们先进行log2转换。 21 | 22 | 23 | ```r 24 | expr <- log2(mrna_expr_tpm+1) 25 | dim(expr) 26 | ## [1] 19938 473 27 | ``` 28 | 29 | 一共有19938个mRNA和473个样本。 30 | 31 | 我们这里根据`HOPX`表达量中位数进行分组,把所有样本分为高表达组和低表达组。 32 | 33 | 然后进行差异分析,这里也是用`easyTCGA`1行代码解决: 34 | 35 | 36 | ```r 37 | sample_group <- ifelse(expr["HOPX",] > median(t(expr["HOPX",])), "high","low") 38 | sample_group <- factor(sample_group, levels = c("low","high")) 39 | 40 | library(easyTCGA) 41 | deg_res <- diff_analysis(exprset = expr, 42 | group = sample_group, 43 | is_count = F, 44 | save = F 45 | ) 46 | ## => log2 transform not needed 47 | ## => Running limma 48 | ## => Running wilcoxon test 49 | ## => Analysis done. 50 | 51 | # 提取limma的结果 52 | deg_limma <- deg_res$deg_limma 53 | 54 | head(deg_limma) 55 | ## logFC AveExpr t P.Value adj.P.Val B 56 | ## HOPX 1.411491 1.330710 17.92159 3.648490e-55 7.274359e-51 114.22524 57 | ## IL18 1.579073 2.882566 15.19126 1.021080e-42 1.017914e-38 86.06859 58 | ## TNFSF10 1.627203 3.868731 14.82989 4.077339e-41 2.709799e-37 82.44504 59 | ## DAPP1 1.120535 1.551681 13.49540 2.489357e-35 1.240820e-31 69.35296 60 | ## ANKRD22 1.459943 1.975013 13.06324 1.661069e-33 6.623677e-30 65.22542 61 | ## ZBED2 1.241665 1.613864 12.12598 1.202387e-29 3.995531e-26 56.49488 62 | ## genesymbol 63 | ## HOPX HOPX 64 | ## IL18 IL18 65 | ## TNFSF10 TNFSF10 66 | ## DAPP1 DAPP1 67 | ## ANKRD22 ANKRD22 68 | ## ZBED2 ZBED2 69 | ``` 70 | 71 | 72 | ## ggplot2绘制火山图 73 | 74 | 绘制火山图需要差异分析的结果,我么再增加一列信息展示这个基因是上调、下调还是没意义。 75 | 76 | 77 | ```r 78 | library(dplyr) 79 | ## 80 | ## Attaching package: 'dplyr' 81 | ## The following objects are masked from 'package:stats': 82 | ## 83 | ## filter, lag 84 | ## The following objects are masked from 'package:base': 85 | ## 86 | ## intersect, setdiff, setequal, union 87 | library(ggplot2) 88 | library(ggrepel) 89 | 90 | deg_limma <- deg_limma %>% 91 | mutate(type = case_when(logFC > 1 & adj.P.Val < 0.05 ~ "Up-regulation", 92 | logFC < -1 & adj.P.Val < 0.05 ~ "Down-regulation", 93 | .default = "None" 94 | )) 95 | head(deg_limma) 96 | ## logFC AveExpr t P.Value adj.P.Val B 97 | ## HOPX 1.411491 1.330710 17.92159 3.648490e-55 7.274359e-51 114.22524 98 | ## IL18 1.579073 2.882566 15.19126 1.021080e-42 1.017914e-38 86.06859 99 | ## TNFSF10 1.627203 3.868731 14.82989 4.077339e-41 2.709799e-37 82.44504 100 | ## DAPP1 1.120535 1.551681 13.49540 2.489357e-35 1.240820e-31 69.35296 101 | ## ANKRD22 1.459943 1.975013 13.06324 1.661069e-33 6.623677e-30 65.22542 102 | ## ZBED2 1.241665 1.613864 12.12598 1.202387e-29 3.995531e-26 56.49488 103 | ## genesymbol type 104 | ## HOPX HOPX Up-regulation 105 | ## IL18 IL18 Up-regulation 106 | ## TNFSF10 TNFSF10 Up-regulation 107 | ## DAPP1 DAPP1 Up-regulation 108 | ## ANKRD22 ANKRD22 Up-regulation 109 | ## ZBED2 ZBED2 Up-regulation 110 | ``` 111 | 112 | 随便选择几个基因展示一下: 113 | 114 | 115 | ```r 116 | # 要标记的基因 117 | marker <- c("CSTA","AQP3","CD3D","CXCL9","CXCL13","CXCL10","S100A9","S100A8","JCHAIN","KRT5") 118 | ``` 119 | 120 | 下面画图即可: 121 | 122 | 123 | ```r 124 | ggplot(deg_limma, aes(logFC, -log10(adj.P.Val)))+ 125 | geom_point(aes(color=type))+ 126 | scale_color_manual(values = c("blue","gray70","red"),name = NULL)+ 127 | geom_hline(yintercept = -log10(0.05),linetype=2)+ 128 | geom_vline(xintercept = c(-1,1), linetype=2)+ 129 | geom_label_repel(data = subset(deg_limma, genesymbol %in% marker), 130 | aes(label=genesymbol),col="black",alpha = 0.8)+ 131 | theme_bw()+ 132 | theme(legend.position = c(0.15,0.8), 133 | legend.background = element_blank() 134 | ) 135 | ``` 136 | 137 | ![plot of chunk unnamed-chunk-7](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-7-178938730.png) 138 | 139 | ## EnhancedVolcano 140 | 141 | 一个专门用于绘制火山图的R包,增加了很多好用的功能,比如添加要展示的基因更加方便: 142 | 143 | 144 | ```r 145 | library(EnhancedVolcano) 146 | 147 | EnhancedVolcano(deg_limma, 148 | x = "logFC", 149 | y = "adj.P.Val", 150 | lab = rownames(deg_limma), 151 | selectLab = marker, 152 | boxedLabels = TRUE, 153 | drawConnectors = TRUE, 154 | pCutoff = -log10(0.05), 155 | FCcutoff = 1, 156 | title = NULL, 157 | subtitle = NULL 158 | ) 159 | ``` 160 | 161 | ![plot of chunk unnamed-chunk-8](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-8-178938730.png) 162 | 163 | ## pheatmap绘制热图 164 | 165 | 首先是准备热图需要的数据,其实就是表达矩阵的可视化而已。 166 | 167 | 我们选择311个差异基因的表达矩阵进行展示。 168 | 169 | 170 | ```r 171 | deg_genes <- deg_limma %>% 172 | filter(abs(logFC)>1, adj.P.Val < 0.05) %>% 173 | pull(genesymbol) 174 | 175 | heat_df <- expr[deg_genes,] 176 | 177 | # 自己进行标准化的好处就是可以自定义范围 178 | heat_df <- t(scale(t(heat_df))) 179 | heat_df[heat_df >= 3] <- 3 180 | heat_df[heat_df < -3] <- -3 181 | 182 | # 列注释 183 | anno_col <- data.frame(sample_group = sample_group) 184 | rownames(anno_col) <- colnames(heat_df) 185 | ``` 186 | 187 | 有了数据,画图就很简单: 188 | 189 | 190 | ```r 191 | library(pheatmap) 192 | 193 | pheatmap::pheatmap(heat_df, 194 | annotation_col = anno_col, 195 | show_colnames = F, 196 | show_rownames = F 197 | ) 198 | ``` 199 | 200 | ![plot of chunk unnamed-chunk-10](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/unnamed-chunk-10-178938730.png) 201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /常见分析/常见镜像设置.md: -------------------------------------------------------------------------------- 1 | 国内网络问题很烂,大家都知道,github、pubmed这些网站经常访问不了! 2 | 3 | 如果你平常会用到**Ubuntu、conda、R语言、Python、Julia,** 那你肯定为安转各种包、库、软件而烦恼过! 4 | 5 | **由于众所周知的原因,这些东西我们的网络访问不了,所以导致你安装库、包、软件时总是失败、下载不完整。** 6 | 7 | 但其实,这些东西都是有镜像的! 8 | 9 | 只要你**换了国内的镜像,下载就会嗖嗖的变快,再也不愁网络问题了!** 10 | 11 | 今天给大家介绍常见的镜像,初学R语言或者生信,这些东西必须得学会! 12 | 13 | ## Ubuntu镜像 14 | 15 | 主要是更改`apt`的镜像,让你安装软件更快。 16 | 17 | 大家可以去**清华大学开源镜像站**,查看使用方法及镜像源,`apt`镜像[网址](https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/ "apt镜像")也给大家 18 | 19 | ![image-20220612120705571](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220612120705571.png) 20 | 21 | 22 | 23 | ## conda镜像 24 | 25 | 更改conda镜像也是为了让你下载软件变快,不在出现不能下载、下载不完全的问题。推荐大家使用北外的镜像站,清华大学的conda镜像站总是出问题。北外conda镜像站[网址](https://mirrors.bfsu.edu.cn/help/anaconda/ "conda镜像")。 26 | 27 | conda软件安装包也可以在这里下载哦: 28 | 29 | ![image-20220612121007894](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220612121007894.png) 30 | 31 | 32 | 33 | ## bioconductor镜像 34 | 35 | 在R语言里面需要更改2个镜像,才能顺利下载安装R包,cran的镜像可以通过Rstudio点点点实现更换,bioconductor镜像需要自己设置。 36 | 37 | 每次在安装bioconductor前,先运行下面这句代码,实现更换镜像: 38 | 39 | `options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")` 40 | 41 | ,如果你不想每次都更改,可以把这句代码放在你的`.Rprofile`文件中,这样每次你打开R,它会自动悄悄的执行! 42 | 43 | ## Python镜像 44 | 45 | 主要是`pip`的镜像,也是为了让你安装python库的时候快一点,稳一点! 46 | 47 | `pip`我推荐大家使用阿里云的镜像。 48 | 49 | ```R 50 | # 临时使用: 51 | pip install -i https://mirrors.aliyun.com/pypi/simple/ 包名 52 | 53 | # 永久使用: 54 | pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 55 | 56 | # 查看设置结果: 57 | pip config list 58 | 59 | # 取消设置: 60 | pip config unset global.index-url 61 | ``` 62 | 63 | 64 | 65 | ## Julia镜像 66 | 67 | Julia,简称朱丽叶,朱丽叶在v1.0以前,非常难用,那个时候还没有中国镜像站,非常难以下载! 68 | 69 | 不过现在有中国镜像站了,社区也丰富起来了,喜欢的小伙伴可以入手了。 70 | 71 | 首先是朱丽叶这个软件的下载,有[中国镜像](https://cn.julialang.org/downloads/ "Julia下载"),不用去官网(你可能打不开官网😂)。 72 | 73 | 然后是安装朱丽叶第三方扩展包时需要用到的镜像,pkgserver,[这里](https://discourse.juliacn.com/t/topic/2969 "PkgServer镜像")有详细说明,大家按照说明修改即可。 74 | 75 | 76 | 77 | 这个网络环境是真的烦,用个软件还得比别人多好几个步骤,还有很多人不知道这些镜像的,天天就耗在下载安装上,时间都白白浪费了! -------------------------------------------------------------------------------- /常见分析/手动计算logFC.md: -------------------------------------------------------------------------------- 1 | 前段时间有小伙伴问怎么手动计算`logFC`,今天说一下。 2 | 3 | `logFC`是`log fold change`的缩写,也就是log之后的差异倍数。这个差异倍数意思是某个基因在A组表达量的平均值是B组表达量平均值的几倍。 4 | 5 | 这个东西的计算其实很简单的,就是常规的对数计算而已。 6 | 7 | 一般来说,我们用`tpm`或者`fpkm`时,通常都会先进行log2处理,在log2处理后的表达矩阵里,如果某个基因在A组表达量是x,在B组表达量是y,那么这个基因的`logFC = x - y`。 8 | 9 | >这不是巧合,只是一个很简单的数学公式log(x/y)=log(x)-log(y) 10 | 11 | ## 准备数据 12 | 13 | 用`gse87466`这个GEO的数据做演示,下载整理的过程这次就不演示了。数据在粉丝qq群文件,需要的加群下载即可。 14 | 15 | 16 | ```r 17 | library(easyTCGA) 18 | library(dplyr) 19 | ## 20 | ## Attaching package: 'dplyr' 21 | ## The following objects are masked from 'package:stats': 22 | ## 23 | ## filter, lag 24 | ## The following objects are masked from 'package:base': 25 | ## 26 | ## intersect, setdiff, setequal, union 27 | library(tidyr) 28 | 29 | load(file = "G:/easyTCGA_test/gse87466.Rdata") 30 | ``` 31 | 32 | 这是一个炎症性肠病的数据集,一共108个样本,21个`normal`,87个`uc`(ulcerative colitis)。 33 | 34 | 探针注释我已经提前做好了,但是有一些探针对应多个`symbol`,为了方便我这里直接删掉了: 35 | 36 | 37 | ```r 38 | exprSet[1:4,1:4] 39 | ## GSM2332098 GSM2332099 GSM2332100 40 | ## IGK@ /// IGKC 13.86197 13.76880 13.95740 41 | ## 13.95740 13.92619 13.79664 42 | ## IGL@ 13.73797 13.61266 13.86197 43 | ## IGH@ /// IGHA1 /// IGHA2 /// LOC100126583 13.79664 13.16844 13.76880 44 | ## GSM2332101 45 | ## IGK@ /// IGKC 13.95740 46 | ## 13.86197 47 | ## IGL@ 13.76880 48 | ## IGH@ /// IGHA1 /// IGHA2 /// LOC100126583 13.73797 49 | 50 | exprSet <- exprSet[!grepl("/",rownames(exprSet)),] 51 | 52 | group <- factor(group_list,levels = c("normal","UC")) 53 | table(group) 54 | ## group 55 | ## normal UC 56 | ## 21 87 57 | ``` 58 | 59 | ## 使用limma做差异分析 60 | 61 | 首先对这个数据做下差异分析,也是用`easyTCGA`包,1行代码即可,基因芯片数据也是支持的。 62 | 63 | - 如果是`count`矩阵,会自动使用`DESeq2`、`limma`、`edgeR`进行差异分析; 64 | - 如果是`tpm`、`fpkm`、`基因表达芯片数据`,它会自动检测需不需要进行log2转换,然后进行`wilcoxon`和`limma`的差异分析: 65 | 66 | 67 | ```r 68 | library(easyTCGA) 69 | 70 | diff_res <- diff_analysis(exprset = exprSet 71 | , group = group 72 | , is_count = F 73 | ) 74 | ## => log2 transform not needed 75 | ## => Running limma 76 | ## => Running wilcoxon test 77 | ## => Analysis done. 78 | 79 | # limma的结果 80 | diff_limma <- diff_res$deg_limma 81 | 82 | diff_limma <- diff_limma %>% 83 | arrange(desc(logFC)) 84 | 85 | head(diff_limma) 86 | ## logFC AveExpr t P.Value adj.P.Val B 87 | ## MMP3 5.125542 9.319122 12.754123 2.387453e-23 1.132335e-20 42.56916 88 | ## SLC6A14 5.025462 9.414419 21.582496 3.792392e-41 7.554445e-37 82.65877 89 | ## DUOX2 4.912367 9.917941 17.377496 3.456356e-33 1.721265e-29 64.81419 90 | ## DEFB4A 4.609705 8.710986 8.923018 1.217313e-14 5.214811e-13 22.81705 91 | ## CHI3L1 4.554672 9.777758 12.195694 4.281634e-22 1.332658e-19 39.72614 92 | ## S100A8 4.259343 10.016995 12.112299 6.602449e-22 1.906098e-19 39.29950 93 | ## genesymbol 94 | ## MMP3 MMP3 95 | ## SLC6A14 SLC6A14 96 | ## DUOX2 DUOX2 97 | ## DEFB4A DEFB4A 98 | ## CHI3L1 CHI3L1 99 | ## S100A8 S100A8 100 | ``` 101 | 102 | 现在有很多文章中直接使用的`wilcoxon`检验,但是它并不能计算`logFC`: 103 | 104 | 105 | ```r 106 | diff_wilc <- diff_res$deg_wilcoxon 107 | head(diff_wilc) 108 | ## pvalue genesymbol 109 | ## 9.202462e-03 110 | ## IGL@ 1.182949e-06 IGL@ 111 | ## RPL41 1.708300e-02 RPL41 112 | ## RPL24 2.428482e-01 RPL24 113 | ## RPL37A 1.903898e-01 RPL37A 114 | ## RPS11 8.255636e-03 RPS11 115 | ``` 116 | 117 | ## 自己计算logFC 118 | 119 | 根据前面的理论,我们可以自己计算`logFC`,思路就是分别计算某个基因在两组中的平均表达量,然后直接相减即可。 120 | 121 | 下面我们用`dplyr`中的`rowwise`操作实现这一过程,当然还有其他方法,选择自己喜欢的即可。 122 | 123 | 124 | ```r 125 | library(dplyr) 126 | library(tidyr) 127 | 128 | uc <- colnames(exprSet)[group_list == "UC"] 129 | normal <- colnames(exprSet)[group_list == "normal"] 130 | 131 | logfc_df <- exprSet %>% 132 | rowwise() %>% 133 | mutate(mean_uc=rowMeans(across(all_of(uc))), 134 | mean_normal=rowMeans(across(all_of(normal))), 135 | logfc = mean_uc - mean_normal, # 这个就是logFC了 136 | .keep = "none" 137 | ) %>% 138 | bind_cols(genesymbol = rownames(exprSet)) %>% 139 | arrange(desc(logfc)) 140 | 141 | head(logfc_df) 142 | ## # A tibble: 6 × 4 143 | ## # Rowwise: 144 | ## mean_uc mean_normal logfc genesymbol 145 | ## 146 | ## 1 10.3 5.20 5.11 MMP3 147 | ## 2 10.4 5.37 5.01 SLC6A14 148 | ## 3 10.9 5.95 4.92 DUOX2 149 | ## 4 9.60 5.00 4.60 DEFB4A 150 | ## 5 10.7 6.10 4.56 CHI3L1 151 | ## 6 10.8 6.55 4.29 S100A8 152 | ``` 153 | 154 | 可以看到,我们手动计算的这个logfc和上面limma包计算的logFC基本上是一样的(有误差,可以忽略)哦。 155 | 156 | ## 参考资料 157 | 158 | 当然是来自于万能的生信菜鸟团啦,2015年的文章了:http://www.bio-info-trainee.com/1209.html 159 | 160 | 点击**阅读原文**可直接访问参考文章。 161 | 162 | -------------------------------------------------------------------------------- /常见分析/生信初学者资源推荐.md: -------------------------------------------------------------------------------- 1 | 如果你是一个生信初学者,又或者你是一个学临床的,为了发文章开始学生信,学了点数据挖掘,GEO,TCGA什么的,但是对很多专有名词不理解,对很多流程或者步骤云里雾里,那我强烈推荐你看看这本书:**[生物信息学最佳实践-基础篇](http://www.biotrainee.com/jmzeng/book/basic/ "观看网址")**! 2 | 3 | 这本书的作者:**曾建明**,绝对是中文生物信息学知识分享领域的第一人,他创办的生信技能树、生信菜鸟团、单细胞天地等,已带领数十万人成功进入生信领域。 4 | 5 | 对于很多半路学生信的朋友,或者就是为了发文章而学的人,在初学时都会被庞杂的生物学知识+计算机知识难倒!对于有生物医学背景的来说,计算机知识是最薄弱的地方。 6 | 7 | 本书则很好的补全了这方面的知识,既然是基础篇,那内容都是生物信息学中最重要的地基部分!学会了这些基础知识,你会发现你的生信数据挖掘豁然开朗,很多不理解的地方都通了。 8 | 9 | 全书图文并茂,完全免费,电脑手机直接访问即可:http://www.biotrainee.com/jmzeng/book/basic/ 。虽然成书于2017年,但是对于初学者来说是很好的学习资料。 10 | 11 | ## 下面是一些内容简介 12 | 13 | > 生物信息学的重头戏就是处理各种各样的数据,**第1章**介绍了生物信息学主流数据产生方法,包括多种多样的芯片技术,二代测序技术和三代测序技术。 14 | 15 | ![image-20220802185053581](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220802185053581.png) 16 | 17 | 18 | 19 | > 既然数据的来源是如此的丰富多样,而且指定标准的单位比较多,就必然会产生各种各样的数据存储形式来规范化交流,**第2章**会详细介绍fastq,fasta,sam,bam,vcf,gff,gtf,bed,MAF等,理解了它们才能真正的入门生物信息学。 20 | 21 | ![image-20220802185435724](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220802185435724.png) 22 | 23 | > 了解了生物信息学领域的常见数据的产生和数据规范还不够,非常高频的需求是跟已有的各种数据库资源做比较,包括与参考基因组比对,基因结构以及功能的注释等等。**第3章**会详细介绍生信工作者必须了解的主流数据库,包括NCBI,UCSC,ENSEMBL,以及GO,KEGG,GENCODE,SRTINGDB,还有TCGA,ENCODE,1000GENOMES等等。 24 | 25 | ![image-20220802185638607](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/image-20220802185638607.png) 26 | 27 | **前3章我觉得是最重要的~** 28 | 29 | > 在**第4章**会罗列一些统计学常识以及高频统计学分析方法。当然,也会推荐一些好的学习资源供大家深入学习提高自己。 30 | > 31 | > **第5章**主要介绍计算机资源及编程。 32 | > 33 | > **第6章**是生物学基础。 34 | 35 | 觉得自己基础知识这一块薄弱的快去学起来~ 36 | 37 | 网址:http://www.biotrainee.com/jmzeng/book/basic/ 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /甲基化/champ_betaMatrix.md: -------------------------------------------------------------------------------- 1 | 之前的推文详细介绍了`ChMAP`包从IDAT文件开始的甲基化数据分析流程,今天说一下从β矩阵开始的分析流程。 2 | 3 | [16.ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s/1xpT1E4BaWG-ulrCzylwrA) 4 | 5 | ## 数据准备 6 | 7 | 还是用GSE149282这个数据。 8 | 9 | 10 | ```r 11 | suppressMessages(library(GEOquery)) 12 | ``` 13 | 14 | 首先获取GSE149282这个数据的β矩阵文件,可以通过`getGEO()`函数下载,但是由于网络原因经常下载失败,所以我直接去GEO官网下载了这个数据,放到指定文件夹下读取即可。 15 | 16 | 17 | ```r 18 | GSE149282 <- getGEO("GSE149282",destdir = './gse149282', 19 | getGPL = F, AnnotGPL = F 20 | ) 21 | ## Found 1 file(s) 22 | ## GSE149282_series_matrix.txt.gz 23 | ## Using locally cached version: ./gse149282/GSE149282_series_matrix.txt.gz 24 | # 其实你用read.delim()也能读取成功 25 | ``` 26 | 27 | 现在这个`GSE149282`是一个`ExpressionSet`对象,在刚学的时候,我不能理解R语言里面的很多对象,但是这并不影响一些操作,只要记住即可,学习不断深入,后面对R语言的各种对象的理解,会逐步明朗。 28 | 29 | 30 | ```r 31 | GSE149282 32 | ## $GSE149282_series_matrix.txt.gz 33 | ## ExpressionSet (storageMode: lockedEnvironment) 34 | ## assayData: 865918 features, 24 samples 35 | ## element names: exprs 36 | ## protocolData: none 37 | ## phenoData 38 | ## sampleNames: GSM4495491 GSM4495492 ... GSM4495514 (24 total) 39 | ## varLabels: title geo_accession ... tumour stage:ch1 (41 total) 40 | ## varMetadata: labelDescription 41 | ## featureData: none 42 | ## experimentData: use 'experimentData(object)' 43 | ## pubMedIds: 32380793 44 | ## Annotation: GPL21145 45 | ``` 46 | 47 | 获取β值矩阵非常简单: 48 | 49 | 50 | ```r 51 | beta.m <- exprs(GSE149282[[1]]) 52 | dim(beta.m) 53 | ## [1] 865918 24 54 | 55 | beta.m[1:4,1:4] 56 | ## GSM4495491 GSM4495492 GSM4495493 GSM4495494 57 | ## cg00000029 0.3680475 0.1580980 0.3562024 0.2530871 58 | ## cg00000103 0.7357062 0.5472209 0.7322839 0.5866429 59 | ## cg00000109 0.8182613 0.8746516 0.7908351 0.8354254 60 | ## cg00000155 0.9376374 0.9057370 0.8820246 0.8979353 61 | ``` 62 | 63 | 这个**β矩阵可能含有很多缺失值,需要去掉,不然会报错**,你可以用各种缺失值插补的方法,这里我们就简单点,直接删除,在实际分析时不建议这么做! 64 | 65 | 66 | ```r 67 | beta.m <- na.omit(beta.m) 68 | dim(beta.m) 69 | ## [1] 827476 24 70 | ``` 71 | 72 | 有了这个β值矩阵,下面我们再把样本信息csv文件读取进来,上次推文中已经制作好了,直接读取即可: 73 | 74 | 75 | ```r 76 | pd <- read.csv("./gse149282/GSE149282_RAW/sample_type.csv") 77 | head(pd) 78 | ## Sample_Name Sentrix_ID Sentrix_Position Sample_Type 79 | ## 1 GSM4495491 GSM4495491_200811050117 R01C01 normal 80 | ## 2 GSM4495492 GSM4495492_200811050117 R02C01 cancer 81 | ## 3 GSM4495493 GSM4495493_200811050117 R03C01 normal 82 | ## 4 GSM4495494 GSM4495494_200811050117 R04C01 cancer 83 | ## 5 GSM4495495 GSM4495495_200811050117 R05C01 normal 84 | ## 6 GSM4495496 GSM4495496_200811050117 R06C01 cancer 85 | ``` 86 | 87 | ## β值矩阵读取 88 | 89 | 现在有了β值和样本信息csv文件,我们就可以用`ChAMP`包分析了! 90 | 91 | 92 | ```r 93 | suppressMessages(library(ChAMP)) 94 | ``` 95 | 96 | `champ.load()`是从IDAT开始的,包括`champ.import()`和`champ.filter()`,`champ.import()`也是从IDAT开始的,现在我们**只有β矩阵,可以直接从`champ.filter()`开始!** 97 | 98 | 99 | ```r 100 | myLoad <- champ.filter(beta = beta.m, 101 | pd = pd, 102 | arraytype = "EPIC" 103 | ) 104 | ``` 105 | 106 | 107 | ```r 108 | [===========================] 109 | [<<<< ChAMP.FILTER START >>>>>] 110 | ----------------------------- 111 | 112 | In New version ChAMP, champ.filter() function has been set to do filtering on the result of champ.import(). You can use champ.import() + champ.filter() to do Data Loading, or set "method" parameter in champ.load() as "ChAMP" to get the same effect. 113 | 114 | This function is provided for user need to do filtering on some beta (or M) matrix, which contained most filtering system in champ.load except beadcount. User need to input beta matrix, pd file themselves. If you want to do filterintg on detP matrix and Bead Count, you also need to input a detected P matrix and Bead Count information. 115 | 116 | Note that if you want to filter more data matrix, say beta, M, intensity... please make sure they have exactly the same rownames and colnames. 117 | 118 | 119 | [ Section 1: Check Input Start ] 120 | You have inputed beta for Analysis. 121 | 122 | pd file provided, checking if it's in accord with Data Matrix... 123 | pd file check success. 124 | 125 | Parameter filterDetP is TRUE, checking if detP in accord with Data Matrix... 126 | !!! Parameter detP is not found, filterDetP is reset FALSE now. 127 | 128 | Parameter filterBeads is TRUE, checking if beadcount in accord with Data Matrix... 129 | !!! Parameter beadcount is not found, filterBeads is reset FALSE now. 130 | 131 | parameter autoimpute is TRUE. Checking if the conditions are fulfilled... 132 | !!! ProbeCutoff is 0, which means you have no needs to do imputation. autoimpute has been reset FALSE. 133 | 134 | Checking Finished :filterMultiHit,filterSNPs,filterNoCG,filterXY would be done on beta. 135 | [ Section 1: Check Input Done ] 136 | 137 | 138 | [ Section 2: Filtering Start >> 139 | 140 | Filtering NoCG Start 141 | Only Keep CpGs, removing 2792 probes from the analysis. 142 | 143 | Filtering SNPs Start 144 | Using general EPIC SNP list for filtering. 145 | Filtering probes with SNPs as identified in Zhou's Nucleic Acids Research Paper 2016. 146 | Removing 94704 probes from the analysis. 147 | 148 | Filtering MultiHit Start 149 | Filtering probes that align to multiple locations as identified in Nordlund et al 150 | Removing 10 probes from the analysis. 151 | 152 | Filtering XY Start 153 | Filtering probes located on X,Y chromosome, removing 16250 probes from the analysis. 154 | 155 | Updating PD file 156 | filterDetP parameter is FALSE, so no Sample Would be removed. 157 | 158 | Fixing Outliers Start 159 | Replacing all value smaller/equal to 0 with smallest positive value. 160 | Replacing all value greater/equal to 1 with largest value below 1.. 161 | [ Section 2: Filtering Done ] 162 | 163 | All filterings are Done, now you have 713720 probes and 24 samples. 164 | 165 | [<<<<< ChAMP.FILTER END >>>>>>] 166 | [===========================] 167 | [You may want to process champ.QC() next.] 168 | ``` 169 | 170 | 171 | 可以和上次直接从IDAT读取的对比一下,可以看到少了很多信息,所以有的过滤不能执行,比如filterDetP、filterBeads。 172 | 173 | 下面的分析就和上一篇推文一模一样了 174 | 175 | 176 | ```r 177 | # 数据预处理 178 | champ.QC(beta = myLoad$beta, 179 | pheno = myLoad$pd$Sample_Type, 180 | resultsDir="./CHAMP_QCimages1/" 181 | ) 182 | myNorm <- champ.norm(beta = myLoad$beta, 183 | arraytype = "EPIC", 184 | #method = "PBC", 185 | cores = 8, 186 | resultsDir="./CHAMP_Normalization1/" 187 | ) 188 | champ.SVD(beta = myNorm |> as.data.frame(), # 这里需要注意 189 | pd=myLoad$pd) 190 | ``` 191 | 192 | ```r 193 | [===========================] 194 | [<<<<< ChAMP.SVD START >>>>>] 195 | ----------------------------- 196 | champ.SVD Results will be saved in ./CHAMP_SVDimages/ . 197 | 198 | Your beta parameter is data.frame format. ChAMP is now changing it to matrix. 199 | [SVD analysis will be proceed with 713720 probes and 24 samples.] 200 | 201 | 202 | [ champ.SVD() will only check the dimensions between data and pd, instead if checking if Sample_Names are correctly matched (because some user may have no Sample_Names in their pd file),thus please make sure your pd file is in accord with your data sets (beta) and (rgSet).] 203 | 204 | (character):GSM4495491, GSM4495492, GSM4495493, GSM4495494, GSM4495495, GSM4495496, GSM4495497, GSM4495498, GSM4495499, GSM4495500, GSM4495501, GSM4495502, GSM4495503, GSM4495504, GSM4495505, GSM4495506, GSM4495507, GSM4495508, GSM4495509, GSM4495510, GSM4495511, GSM4495512, GSM4495513, GSM4495514 205 | (character):200811050117_R01C01, 200811050117_R02C01, 200811050117_R03C01, 200811050117_R04C01, 200811050117_R05C01, 200811050117_R06C01, 200811050117_R07C01, 200811050117_R08C01, 200811050116_R01C01, 200811050116_R02C01, 200811050116_R03C01, 200811050116_R04C01, 200811050116_R05C01, 200811050116_R06C01, 200811050116_R07C01, 200811050116_R08C01, 202193490061_R01C01, 202193490061_R02C01, 202193490061_R03C01, 202193490061_R04C01, 202193490061_R05C01, 202193490061_R06C01, 202193490061_R07C01, 202193490061_R08C01 206 | (character):normal, cancer 207 | [champ.SVD have automatically select ALL factors contain at least two different values from your pd(sample_sheet.csv), if you don't want to analysis some of them, please remove them manually from your pd variable then retry champ.SVD().] 208 | 209 | 210 | [Factors are ignored because they only indicate Name or Project, or they contain ONLY ONE value across all Samples.] 211 | 212 | Sentrix_ID Sentrix_Position Sample_Type 213 | [1,] 0.4607709 0.4607709 4.146041e-05 214 | [2,] 0.4607709 0.4607709 9.406855e-02 215 | [3,] 0.4607709 0.4607709 4.189234e-01 216 | [4,] 0.4607709 0.4607709 3.263485e-01 217 | [5,] 0.4607709 0.4607709 7.728300e-01 218 | ``` 219 | 220 | 221 | ![](https://aliyun-bucket0324.oss-cn-shanghai.aliyuncs.com/img/Snipaste_2022-08-29_20-40-22.png) 222 | 223 | 后续的分析和之前推文中介绍的一模一样,就不演示了,大家可以移步之前的推文: 224 | 225 | [16.ChAMP分析甲基化数据:标准流程](https://mp.weixin.qq.com/s/1xpT1E4BaWG-ulrCzylwrA) 226 | 227 | 228 | 229 | --------------------------------------------------------------------------------