六安沧州西安三亚宝鸡菏泽
投稿投诉
菏泽德阳
山西湖州
宝鸡上海
茂名内江
三亚信阳
长春北海
西安安徽
黄石烟台
沧州湛江
肇庆鹤壁
六安韶关
成都钦州

数据挖掘流程代码版方便抄袭

  GEO数据挖掘流程代码版(方便抄袭)
  微信公众号:生信小知识
  关注可了解更多的教程及单细胞知识。问题或建议,请公众号留言;
  内容目录
  step0installpackagesstep1downloaddata1。背景知识2。关于GEO中的几个文件说明A。2种familyfile(s)B。SeriesMatrixFile(s)C。GSE64634RAW。tar3。关于下载镜像问题4。关于探针id转换idmap1包针对bioconductor包附加小功能对基因名字进行注释(annoGene)idmap2包万能芯片探针ID注释平台包(提取soft文件)idmap3包idmap1和idmap2都无法注释的平台AnnoProbe包5。整体代码这里抄step2checkstep3DEGstep4annogokegg真正代码detailedplot综合显示图(更推荐)step5annoGSEAstep6annoGSVAstep7visualization致谢
  step0installpackages
  简单安装R包和设置镜像代码:
  1镜像设置
  2if(T){
  3rm(listls())
  4options()repos
  5options()BioCmirror
  6options(BioCmirrorhttps:mirrors。ustc。edu。cnbioc)
  7options(reposc(CRANhttps:mirrors。tuna。tsinghua。edu。cnCRAN))
  8options()repos
  9options()BioCmirror
  10}11:12https:bioconductor。orgpackagesreleasebiochtmlGEOquery。html
  13BiocManager安装的R包
  14if(T){
  15if(!requireNamespace(BiocManager,quietlyTRUE))
  16install。packages(BiocManager)17:18pkgsc(KEGG。db,GSEABase,GSVA,clusterProfiler,GEOquery,limma,impute,genefu,org。Hs。eg。db,hgu133plus2。db)
  19for(pkginpkgs){
  20if(!requireNamespace(pkg,quietlyTRUE))
  21BiocManager::install(pkg,askF,updateF)
  22}
  23}24:25直接通过install。package函数安装的R包
  26if(T){
  27options()repos
  28pkgsc(FactoMineR,factoextra,WGCNA,ggplot2,pheatmap,ggpubr)
  29for(pkginpkgs){
  30if(!requireNamespace(pkg,quietlyTRUE))
  31install。packages(pkg)
  32}
  33}34:35
  36载入R包
  37if(T){
  38library(FactoMineR)
  39library(factoextra)
  40library(GSEABase)
  41library(GSVA)
  42library(clusterProfiler)
  43library(genefu)
  44library(ggplot2)
  45library(ggpubr)
  46library(hgu133plus2。db)
  47library(limma)
  48library(org。Hs。eg。db)
  49library(pheatmap)
  50}
  step1downloaddata
  1。背景知识
  这里通过使用GEOqueryR包来帮助我们下载数据,比手动登录GEO数据库一个个点击要方便很多!
  而且我发现,最近NCBI更新后,GEO数据库也更新了!
  点击后:
  点击后:
  可以看到官网的代码和我们目前用的代码基本一致。
  2。关于GEO中的几个文件说明
  下面一个个的来说吧!
  A。2种familyfile(s)
  也就是SOFTformattedfamilyfile(s)和MINiMLformattedfamilyfile(s),通过字面,我们可以理解这是2种不同格式的探针说明文件。为什么我会这样说呢?因为我下载了soft文件来查看:
  这时首行的内容:
  就是告诉你这个数据是GPL570这个平台测序得到的:
  中间有很多行关于GSM的,可能记录的是用到这个平台测序的sample:
  接着就是一系列探针信息了:
  我们可以通过在R种提取信息对我们得到的矩阵种探针做注释。
  B。SeriesMatrixFile(s)
  这里面包含了3部分资料:数据属性患者信息表达矩阵
  数据属性在最前面的几行,和患者信息之间有一个空行,但是他们都是以!开头:
  接下来是患者信息:
  紧接着患者信息下一行会有个提示:!seriesmatrixtablebegin,然后下面就是表达矩阵信息了:
  这个就是我们需要的表达矩阵信息了,矩阵中每一行是一个基因(也就是一个探针),每一列是一个样本(GSM)
  C。GSE64634RAW。tar
  这个我一开始不知道是什么东西,后来问了问jimmy,然后他给我发了个资料你要挖的公共数据集作者上传了错误的表达矩阵肿么办。大致瞅了瞅,知道这个应该是芯片的原始数据,然后也把这个文件给下载下来看了看:
  根据常识猜了猜想:
  X和Y应该代表着芯片上的位置,这个可能和探针有对应关系。
  MEAN是信号的平均值,STDV是信号的标准差。
  NPIXELS是像素点吧。
  既然知道了这是原始数据,jimmy又给发了代码,感觉不学习下有点对不起自己,那就跟着代码过一遍吧:
  1BiocManager::install(c(oligo),askF,updateF)
  2library(oligo)
  3BiocManager::install(c(pd。hg。u133。plus。2),askF,updateF)
  4library(pd。hg。u133。plus。2)
  5hr6读入cel文件数据
  7celFilesamp;lt;list。celfiles(。,listGzippedT)
  8celFiles
  9affyRawamp;lt;read。celfiles(celFiles)
  10提取矩阵并做normalization
  11esetamp;lt;rma(affyRaw)
  12eset
  13检查数据
  14datexprs(eset)
  15dim(dat)
  16boxplot(dat,las2)
  可以看到,整个过程非常的简单,就是利用了oligo这个R包而已。读入所有的cel文件后,利用rma()函数将数据进行了normalization,得到的是一个ExpressionSet对象!!
  后面会比较我们利用rawdata得到的结果和我们直接下载的SeriesMatrixFile(s)文件之间的区别!
  3。关于下载镜像问题
  jimmy曾经发表过GEO数据库中国区镜像横空出世推文,因为我每次下载都是用vpn,但是怕以后万一没有vpn了,所以还是学习下,以防万一嘛!再说了,可以学习下新知识,何乐而不为呢?
  通过学习,发现实际上jimmy是开发了一个R包,或者说包装了一个函数吧,如果不想了解具体原理,那么用法如下:
  1安装方法1:
  2library(devtools)
  3installgithub(jmzeng1314GEOmirror)
  4library(GEOmirror)
  5安装方法2:
  6source(http:raw。githubusercontent。comjmzeng1314GEOmirrormasterRgeoChina。R)
  7安装方法3(源码):
  8geoChinaamp;lt;function(gseGSE2546,mirrortercent){
  9suppressPackageStartupMessages(library(GEOquery))
  10options(download。file。methodlibcurl)
  11eSetgetGEO(GSE2546,destdir。,AnnotGPLF,getGPLF)
  12http:49。235。27。111GEOmirrorGSE2nnnGSE2546eSet。Rdata
  13gseGSE2546;mirrortercent
  14gsetoupper(gse)
  15downifelse(as。numeric(gsub(GSE,,gse))amp;lt;1000,
  16paste0(GEOmirrorGSEnnn,gse,
  17eSet。Rdata),
  18paste0(GEOmirror,
  19gsub(〔09〕〔09〕〔09〕,nnn,gse),,gse,
  20eSet。Rdata))21:22if(mirrortercent){
  23uphttp:49。235。27。111
  24}
  25tpfpaste0(gse,eSet。Rdata)
  26download。file(paste0(up,down),tpf,modewb)
  27suppressWarnings(load(tpf))
  28return(gset)
  29}
  具体用法也非常简单:
  1eSetgeoChina(GSE2345)
  通过安装方法3(源码)我们可以看出这个包的原理:
  通过访问下载http:49。235。27。111GEOmirrorGSE2nnnGSE2546eSet。Rdata
  所以可以猜到,应该是jimmy事先用循环的方式帮我们下载好了很多GEO数据,并做成了Rdata格式的文件!非常的良苦用心了!!
  4。关于探针id转换
  因为GEO数据矩阵中,横坐标都是探针的代号,如下图:
  我们只看这些代号并不能理解具体是什么基因,于是这就需要我们做id转换了:将探针的代号转为基因symbol。
  idmap1包针对bioconductor包
  这里又要提到jimmy开发的一个R包了:
  第一个万能芯片探针ID注释平台R包37个芯片平台
  老规矩,还是先学习下:
  一般重要的芯片在R的bioconductor里面都是有包的。但是需要我们单独下载对应的包。具体关系如下:
  (具体的R包名称是biocpackage后加。db)
  1gplbiocpackagetitle
  2GPL201hgfocus〔HGFocus〕AffymetrixHumanHGFocusTargetArray
  3GPL96hgu133a〔HGU133A〕AffymetrixHumanGenomeU133AArray
  4GPL571hgu133a2〔HGU133A2〕AffymetrixHumanGenomeU133A2。0Array
  5GPL97hgu133b〔HGU133B〕AffymetrixHumanGenomeU133BArray
  6GPL570hgu133plus2〔HGU133Plus2〕AffymetrixHumanGenomeU133Plus2。0Array
  7GPL13667hgu219〔HGU219〕AffymetrixHumanGenomeU219Array
  8GPL8300hgu95av2〔HGU95Av2〕AffymetrixHumanGenomeU95Version2Array
  9GPL91hgu95av2〔HGU95A〕AffymetrixHumanGenomeU95AArray
  10GPL92hgu95b〔HGU95B〕AffymetrixHumanGenomeU95BArray
  11GPL93hgu95c〔HGU95C〕AffymetrixHumanGenomeU95CArray
  12GPL94hgu95d〔HGU95D〕AffymetrixHumanGenomeU95DArray
  13GPL95hgu95e〔HGU95E〕AffymetrixHumanGenomeU95EArray
  14GPL887hgug4110bAgilent012097Human1AMicroarray(V2)G4110B(FeatureNumberversion)
  15GPL886hgug4111aAgilent011871Human1BMicroarrayG4111A(FeatureNumberversion)
  16GPL1708hgug4112aAgilent012391WholeHumanGenomeOligoMicroarrayG4112A(FeatureNumberversion)
  17GPL13497HsAgilentDesign026652Agilent026652WholeHumanGenomeMicroarray4x44Kv2(ProbeNameversion)
  18GPL6244hugene10sttranscriptcluster〔HuGene10st〕AffymetrixHumanGene1。0STArray〔transcript(gene)version〕
  19GPL11532hugene11sttranscriptcluster〔HuGene11st〕AffymetrixHumanGene1。1STArray〔transcript(gene)version〕
  20GPL6097illuminaHumanv1Illuminahuman6v1。0expressionbeadchip
  21GPL6102illuminaHumanv2Illuminahuman6v2。0expressionbeadchip
  22GPL6947illuminaHumanv3IlluminaHumanHT12V3。0expressionbeadchip
  23GPL10558illuminaHumanv4IlluminaHumanHT12V4。0expressionbeadchip
  24GPL6885illuminaMousev2IlluminaMouseRef8v2。0expressionbeadchip
  25GPL81mgu74av2〔MGU74Av2〕AffymetrixMurineGenomeU74AVersion2Array
  26GPL82mgu74bv2〔MGU74Bv2〕AffymetrixMurineGenomeU74BVersion2Array
  27GPL83mgu74cv2〔MGU74Cv2〕AffymetrixMurineGenomeU74Version2Array
  28GPL339moe430a〔MOE430A〕AffymetrixMouseExpression430AArray
  29GPL6246mogene10sttranscriptcluster〔MoGene10st〕AffymetrixMouseGene1。0STArray〔transcript(gene)version〕
  30GPL340mouse4302〔MOE430B〕AffymetrixMouseExpression430BArray
  31GPL1261mouse430a2〔Mouse4302〕AffymetrixMouseGenome4302。0Array
  32GPL8321mouse430a2〔Mouse430A2〕AffymetrixMouseGenome430A2。0Array
  因为很多时候,用户是找不到这些GPL平台对应的R包,或者下载安装困难,其实仅仅是需要探针与基因对应关系,没有必要去下载安装这几十个M的包。于是jimmy就开发了idmap1这个R包来帮我们:
  安装方法(这里好像只能用方法1,因为在载入包的同时附带有一个变量p2sdf加载,如果用方法2和3没办法得到这个变量):
  也可以直接下载:https:codeload。github。comjmzeng1314idmap1legacy。tar。gzmaster
  1安装方法1:
  2library(devtools)
  3installgithub(jmzeng1314idmap1)
  4library(idmap1)
  5安装方法2:
  6source(https:raw。githubusercontent。comjmzeng1314idmap1masterRgetIDs。R)
  7安装方法3(源码):
  8getIDsamp;lt;function(gpl){
  9gplgpl570
  10gpltoupper(gpl)
  11if(!gplinunique(p2sdfgpl)){
  12stop(yourgplisnotinourannotationlist。)
  13}
  14return(p2sdf〔p2sdfgplgpl,〕)
  15}
  具体用法也非常简单:
  1idsgetIDs(gpl570)
  2head(ids)
  关于我们得到的ExpressionSet对象,可以通过gsetannotation得到我们需要的注释平台信息。
  前面说到了这个变量p2sdf,像我这么喜欢资源的人,当然也要保存一份在本地了。大家有兴趣的可以自己write到本地保存。哈哈哈哈哈哈哈哈哈哈(jimmy应该不会打我吧)!
  附加小功能对基因名字进行注释(annoGene)
  同样的,还是idmap1这个R包里的函数,如果安装过这个R包就无须再安装了,如果没有安装又想用这个功能,还真的没有办法,因为这些数据存在于这个包的自带变量中(humanGTF、mouseGTF、ratGTF):
  1安装方法2(无效):
  2source(https:raw。githubusercontent。comjmzeng1314idmap1masterRannoGene。R)
  3安装方法3(源码)(无效):
  4annoGeneamp;lt;function(IDs,IDtype,specieshuman,outfile){
  5if(length(unique(IDs))amp;lt;1){
  6stop(Youshouldgivemesomegenestobeannotated!!!)
  7}
  8if(!IDtypeinc(ENSEMBL,SYMBOL)){
  9stop(WeonlyacceptENSEMBLorSYMBOL!!!)
  10}
  11if(specieshuman){
  12GTFamp;lt;humanGTF
  13}elseif(speciesmouse){
  14GTFamp;lt;mouseGTF
  15}elseif(speciesrat){
  16GTFamp;lt;ratGTF
  17}else{
  18stop(Weonlyaccepthumanormouse,orrat,)
  19}
  20resamp;lt;GTF〔eval(parse(textpaste0(GTF,IDtype)))inIDs,〕21:22missIdsamp;lt;IDs〔!(IDsineval(parse(textpaste0(res,IDtype))))〕
  23missIdsPercentageround((length(missIds)length(IDs))100,2)
  24if(length(missIds)!0){
  25warning(
  26paste0(missIdsPercentage,ofinputIDsarefailtoannotate。。。)
  275。29ofinputgeneIDsarefailtomap。。。
  28)
  29}
  30if(hasArg(outfile)){
  31resultsres
  32if(grepl(。html,outfile)){
  33Ensemblprefixamp;lt;https:asia。ensembl。orgHomosapiensGeneSummary?g
  34hrefpaste0(Ensemblprefix,resultsENSEMBL)
  35resultsENSEMBLpaste0(lt;stronggt;lt;atargetblackhref,gt;,resultsENSEMBL,lt;agt;lt;stronggt;)36:37symbolprefixamp;lt;http:www。ncbi。nlm。nih。govgene?term
  38hrefpaste0(symbolprefix,resultsSYMBOL)
  39resultsSYMBOLpaste0(lt;stronggt;lt;atargetblackhref,gt;,resultsSYMBOL,lt;agt;lt;stronggt;)40:41yamp;lt;DT::datatable(results,escapeF,rownamesF)
  42DT::saveWidget(y,fileoutfile)
  43}elseif(grepl(。csv,outfile)){
  44write。csv(results,fileoutfile)
  45}else{
  46stop(Weonlyacceptcsvorhtmlformat!!!)
  47}48:49}
  50return(res)
  51}
  这里补充学习了2个函数:
  R语言parse函数与eval函数的字符串转命令行及执行操作:
  parse()函数能将字符串转换为表达式expression;eval()函数能对表达式求解
  idmap2包万能芯片探针ID注释平台包(提取soft文件)
  第二个万能芯片探针ID注释平台R包有122个GPL
  这次是根据〔soft文件〕(A。2种familyfile(s))进行提取信息得到的!
  如果是我自己来处理这样的文件,我应该会分2步:
  用linux中的grepv命令将表头以和!开头的行去掉
  1grepv!GPL570。softgrepvgrepvamp;gt;GPL570。txt
  用R读入数据
  1tmpread。table(dataGPL570。txt,headerT,sep,fillT)
  结果证明这样有错误,但是,具体原因有空再去找吧。下面看正确的读入方法借助GEOqueryR包工具:
  1library(GEOquery)
  2gplamp;lt;getGEO(GPL570,destdirdata)
  3GPLTable(gpl)
  一般来说,大家关心的其实就是探针的ID,以及基因的symbol列。有了这个变量后,就可以按照R语言基本操作来提取我们需要的信息了。
  注意:我检查了得到的结果,里面存在有的探针ID对应2个基因,如下图:
  虽然不知道这些代表着什么意思,但是,我将这个数据和bioconductor包里的hgu133plus2。db数据做了比较,结果是这样的:自己提取的结果中如果是一个ID对应2个基因,那么这个探针在bioconductor包里基本上找不到数据。而其他一个ID对应2个基因的结果均和bioconductor包一致。
  当然了,我这只是单独来看一个平台的探针,而在idmap2jimmy已经帮我们整理好了,直接用就行了!!
  安装方法:
  (比较慢)
  也可以直接下载:https:codeload。github。comjmzeng1314idmap2legacy。tar。gzmaster
  1library(devtools)
  2installgithub(jmzeng1314idmap2)
  3library(idmap2)
  使用方法:
  1library(idmap2)
  2idsgetsoftIDs(gpl570)
  查看支持的平台:
  1gpllist〔,1:4〕gpllist是R包自带的变量
  idmap3包idmap1和idmap2都无法注释的平台
  第三个万能芯片探针ID注释平台R包idmap1和idmap2都无法注释的平台
  如果我们拿到的soft注释文件中是序列信息,那么我们该怎么做呢?
  应该是先将序列比对到参考基因组上,然后通过提取基因注释文件中的数据得到基因symbol!
  img
  而在idmap3包中,jimmy已经帮我们做好了!!说他宠粉也是真的了!!我都懒得做,他居然还写了个循环来完成了这个事。
  安装方法:
  (比较慢)
  也可以直接下载:https:codeload。github。comjmzeng1314idmap3legacy。tar。gzmaster
  1library(devtools)
  2installgithub(jmzeng1314idmap3)
  3library(idmap3)
  使用方法:
  1library(idmap3)
  2idsidmap3::getpipeIDs(GPL21827)
  查看支持的平台:
  1gpllist〔,1:4〕gpllist是R包自带的变量
  AnnoProbe包
  芯片探针序列的基因注释已经无需你自己亲自做了一个汇总
  安装方法:
  https:codeload。github。comjmzeng1314AnnoProbelegacy。tar。gzmaster
  1library(devtools)
  2installgithub(jmzeng1314AnnoProbe)
  3library(AnnoProbe)
  使用方法:
  1gplGPL21827
  2probe2geneidmap(gpl,typepipe)
  5。整体代码这里抄
  1rm(listls())魔幻操作,一键清空
  2options(stringsAsFactorsF)
  3下面代码只需要修改file的名字
  4下载的文件会自动保存到。data下
  5得到的gset是一个ExpressionSet对象
  6hr7hr8只需要修改file的名字,即可下载得到相应的geo数据
  9获取患者信息,需要自行修改
  10fileGSE64634
  11https:www。ncbi。nlm。nih。govgeoqueryacc。cgi?accGSE6463412:13if(T){
  14数据下载
  15if(T){
  16library(GEOquery)
  17这个包需要注意两个配置,一般来说自动化的配置是足够的。
  18Settingoptions(download。file。method。GEOqueryauto)
  19Settingoptions(GEOquery。inmemory。gplFALSE)
  20fdatapaste0(file,eSet。Rdata)
  21fpathpaste0(data,fdata)
  22if(!file。exists(fpath)){
  23gsetamp;lt;getGEO(file,destdirdata,
  24AnnotGPLF,注释文件
  25getGPLF)平台文件
  26gsetgset〔〔1〕〕
  27save(gset,filefpath)保存到本地
  28}
  29load(fpath)
  30}
  31gset32:33获取患者信息,这里需要自行修改
  34if(T){
  35pdpData(gset)根据diseasestate:ch1一列得知分组信息
  36grouplistc(rep(normal,4),rep(npc,12))nasopharyngealcarcinomaNPC鼻咽癌
  37table(grouplist)
  38}39:40对数据进行normalization
  41if(T){
  42datexprs(gset)
  43dim(dat)44:45dat〔1:4,1:4〕
  46boxplot(dat,las2)
  47datdat〔apply(dat,1,sd)amp;gt;0,〕去除都是0的探针
  48dat〔datamp;lt;0〕1
  49boxplot(dat,las2)50:51datlog2(dat1)
  52boxplot(dat,las2)
  53library(limma)
  54datnormalizeBetweenArrays(dat)
  55boxplot(dat,las2)
  56}57:58
  59探针注释2种方法,推荐方法2
  60方法1:比较麻烦,而且不方便,一般不用这种方法
  61if(F){
  62library(GEOquery)
  63DownloadGPLfile,putitinthecurrentdirectory,andloadit:
  64gplamp;lt;getGEO(GPL570,destdirdata)
  65GPLTable(gpl)
  66colnames(GPL)
  67head(GPL〔,c(1,11)〕)youneedtocheckthis,whichcolumndoyouneed
  68probe2geneGPL〔,c(1,11)〕
  69head(probe2gene)
  70save(probe2gene,fileprobe2gene。Rdata)
  71}72:73方法2:用hgu133plus2。db这个R包比较方便
  74if(T){
  75library(hgu133plus2。db)
  76idstoTable(hgu133plus2SYMBOL)
  77head(ids)
  78idsids〔idssymbol!,〕
  79idsids〔idsprobeidinrownames(dat),〕过滤没法注释的探针80:81dat〔1:4,1:4〕
  82datdat〔idsprobeid,〕调整顺序,让dat的顺序和ids中的一致83:84idsmedianapply(dat,1,median)
  85idsids〔order(idssymbol,idsmedian,decreasingT),〕按照基因名、中位数大小排序
  86idsids〔!duplicated(idssymbol),〕只保留相同symbol中中位数最大的探针
  87datdat〔idsprobeid,〕调整顺序,让dat的顺序和ids中的一致
  88rownames(dat)idssymbolid转换
  89dat〔1:4,1:4〕
  90}
  91}92:93save(dat,grouplist,filedatastep1output。Rdata)
  step2check
  画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转置。格式要求data。frame。
  关于scale:在基因表达量的数据中,有些基因表达量极低,有些基因表达量极高,因此把每个基因在不同处理和重复中的数据转换为平均值为0,方差为1的数据,所以在这里也需要先转置。
  1PCA检查
  2PCA,图会保存在picallsamplesPCA。png
  3if(T){
  4载入数据
  5if(T){
  6rm(listls())魔幻操作,一键清空
  7options(stringsAsFactorsF)8:9load(filedatastep1output。Rdata)
  10print(table(grouplist))
  11每次都要检测数据
  12dat〔1:4,1:4〕
  13}14:15PCA,图会保存在picallsamplesPCA。png
  16if(T){
  17exprSetdat
  18过滤标准
  19if(T){
  20dim(exprSet)
  21过滤标准需要修改,目前是保留每一个基因在amp;gt;5个人中表达量amp;gt;1
  22exprSetexprSet〔apply(exprSet,1,function(x)sum(xamp;gt;1)amp;gt;5),〕
  23boxplot(apply(exprSet,1,mean))
  24dim(exprSet)
  25过滤标准需要修改,目前是去除每一个基因在amp;gt;5个人中表达量amp;gt;12
  26exprSetexprSet〔!apply(exprSet,1,function(x)sum(xamp;gt;12)amp;gt;5),〕
  27dim(exprSet)
  28}
  29去除文库大小差异normalization,同时利用log做scale
  30exprSetlog(edgeR::cpm(exprSet)1)
  31datexprSet
  32datas。data。frame(t(dat))画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换。格式要求data。frame
  33library(FactoMineR)计算PCA
  34library(factoextra)画图展示35:36dat。pcaamp;lt;PCA(dat,graphF)
  37fvizpcaind按样本fvizpcavar按基因
  38fvizpcaind(dat。pca,
  39geom。indpoint,c(point,text)2选1
  40col。indgrouplist,colorbygroups
  41palettec(00AFBB,E7B800),自定义颜色
  42addEllipsesT,加圆圈
  43legend。titleGroups图例名称
  44)
  45ggsave(picallsamplesPCA。png)
  46}
  47}48:49
  50挑选1000个SD最大的基因画表达量热图
  51结果图存放在picheatmaptop1000sd。png中
  52if(T){
  53载入数据
  54if(T){
  55rm(listls())
  56load(filedatastep1output。Rdata)
  57dat〔1:4,1:4〕
  58}59:60挑选1000个SD最大的基因画表达量热图
  61结果图存放在picheatmaptop1000sd。png中
  62if(T){
  63cgnames(tail(sort(apply(dat,1,sd)),1000))找到SD最大的1000个基因
  64library(pheatmap)
  65headmap。datdat〔cg,〕
  66把每个基因在不同处理和重复中的数据转换为平均值为0,
  67方差为1的数据,所以在这里也需要先转置(针对基因)。
  68headmap。datt(scale(t(headmap。dat)))
  69headmap。dat〔headmap。datamp;gt;2〕2
  70headmap。dat〔headmap。datamp;lt;2〕271:72分组信息设置
  73acdata。frame(groupgrouplist)
  74rownames(ac)colnames(headmap。dat)75:76可以看到TNBC具有一定的异质性,拿它来区分乳腺癌亚型指导临床治疗还是略显粗糙。
  77pheatmap(headmap。dat,showcolnamesT,showrownamesF,
  78annotationcolac,
  79filenamepicheatmaptop1000sd。png)
  80}
  81}82:83
  84过滤标准需要修改
  85利用top500mad基因画相关性热图热图
  86结果图存放在piccortop500mad。png中
  87if(T){
  88导入数据
  89if(T){
  90rm(listls())
  91load(filedatastep1output。Rdata)
  92dat〔1:4,1:4〕
  93exprSetdat
  94}95:96利用所有基因画相关性热图
  97if(T){
  98acdata。frame(groupgrouplist)
  99rownames(ac)colnames(exprSet)
  100pheatmap::pheatmap(cor(exprSet),
  101annotationcolac,
  102showrownamesF,
  103filenamepiccorallgenes。png)
  104}105:106过滤标准
  107if(T){
  108dim(exprSet)
  109过滤标准需要修改,目前是保留每一个基因在amp;gt;5个人中表达量amp;gt;1
  110exprSetexprSet〔apply(exprSet,1,function(x)sum(xamp;gt;1)amp;gt;5),〕
  111boxplot(apply(exprSet,1,mean))
  112dim(exprSet)
  113过滤标准需要修改,目前是去除每一个基因在amp;gt;5个人中表达量amp;gt;12
  114exprSetexprSet〔!apply(exprSet,1,function(x)sum(xamp;gt;12)amp;gt;5),〕
  115dim(exprSet)
  116}117:118数据normalization处理
  119if(T){
  120去除文库大小差异normalization,同时利用log做scale
  121exprSetlog(edgeR::cpm(exprSet)1)
  122取top500mad的基因画图
  123exprSetexprSet〔names(sort(apply(exprSet,1,mad),decreasingT)〔1:500〕),〕
  124}125:126利用top500mad基因画相关性热图热图
  127if(T){
  128Mcor(exprSet)
  129pheatmap::pheatmap(M,
  130showrownamesF,
  131annotationcolac,
  132filenamepiccortop500mad。png)
  133}
  134}
  allsamplesPCA。png
  heatmaptop1000sd。png
  cortop500mad。png
  step3DEG
  关于差异分析是否需要比较矩阵
  差异分析的统计学本质探究
  原始版火山图:plot(logFC,log10(P。Value))
  原始版MA图:plot(AveExpr,logFC)
  1载入数据,检查数据
  2if(T){
  3rm(listls())
  4options(stringsAsFactorsF)
  5library(ggpubr)
  6load(filedatastep1output。Rdata)
  7每次都要检测数据
  8dat〔1:4,1:4〕
  9table(grouplist)
  10boxplot(dat〔1,〕grouplist)按照grouplist分组画箱线图
  11hr12boxplot的美化版
  13bplotfunction(g){
  14dfdata。frame(geneg,stagegrouplist)
  15pamp;lt;ggboxplot(df,xstage,ygene,
  16colorstage,palettejco,
  17addjitter)
  18Addpvalue
  19pstatcomparemeans()
  20}
  21}
  22利用定义好的函数检查数据
  23bplot(dat〔1,〕)
  24bplot(dat〔2,〕)
  25bplot(dat〔3,〕)
  26bplot(dat〔4,〕)
  27hr28hr29limma
  30library(limma)
  31方法1:不制作比较矩阵,简单
  32但是做不到随心所欲的指定任意两组进行比较
  33if(T){
  34designmodel。matrix(factor(grouplist))
  35fitlmFit(dat,design)
  36fit2eBayes(fit)
  37上面是limma包用法的一种方式
  38options(digits4)设置全局的数字有效位数为4
  39topTable(fit2,coef2,adjustBH)
  40}
  41hr42方法2:制作比较矩阵
  43可以随心所欲的指定任意两组进行比较
  44if(T){
  45designamp;lt;model。matrix(0factor(grouplist))
  46colnames(design)levels(factor(grouplist))
  47head(design)
  48exprSetdat
  49rownames(design)colnames(exprSet)
  50design
  51hr52比较矩阵
  53这个矩阵声明,我们要把npc组跟Normal进行差异分析比较
  54contrast。matrixamp;lt;makeContrasts(npcnormal,
  55levelsdesign)
  56contrast。matrix
  57hr58degfunction(exprSet,design,contrast。matrix){
  59step1
  60fitamp;lt;lmFit(exprSet,design)
  61step2
  62fit2amp;lt;contrasts。fit(fit,contrast。matrix)
  63hr64fit2amp;lt;eBayes(fit2)defaultnotrend!!!
  65eBayes()withtrendTRUE
  66hr67step3
  68有了比较矩阵后,coef1,而numberInf是把所有结果都打印出来
  69tempOutputtopTable(fit2,coef1,numberInf)
  70nrDEGna。omit(tempOutput)
  71write。csv(nrDEG2,limmanotrend。results。csv,quoteF)
  72head(nrDEG)
  73return(nrDEG)
  74}
  75hr76degdeg(exprSet,design,contrast。matrix)
  77hr78head(deg)
  79}
  80hr81hr82save(deg,filedatadeg。Rdata)
  83hr84load(filedatadeg。Rdata)
  85head(deg)
  86bplot(dat〔rownames(deg)〔1〕,〕)
  87forvolcanoandMAplot
  88结果存放在picvolcano。png和picMA。png
  89if(T){
  90nrDEGdeg
  91head(nrDEG)
  92attach(nrDEG)
  93原始版火山图
  94plot(logFC,log10(P。Value))
  95library(ggpubr)
  96dfnrDEG
  97dfylog10(P。Value)
  98ggscatter(df,xlogFC,yy,size0。5)
  99定义logFC2为阈值
  100dfstateifelse(dfP。Valueamp;gt;0。01,stable,
  101ifelse(dflogFCamp;gt;2,up,
  102ifelse(dflogFCamp;lt;2,down,stable))
  103)
  104table(dfstate)
  105dfnamerownames(df)
  106head(df)
  107ggscatter(df,xlogFC,yy,size0。5,colorstate)
  108ggscatter(df,xlogFC,yy,colorstate,size0。5,
  109labelname,repelT,
  110label。selectrownames(df)〔dfstate!stable〕,
  111label。selectc(TTC9,AQP3,CXCL11,PTGS2),挑选一些基因在图中显示出来
  112palettec(00AFBB,E7B800,FC4E07))
  113ggsave(picvolcano。png)114:115MA图
  116ggscatter(df,xAveExpr,ylogFC,size0。2)
  117dfpcifelse(dfP。Valueamp;lt;0。001,pamp;lt;0。001,
  118ifelse(dfP。Valueamp;lt;0。01,0。001amp;lt;pamp;lt;0。01,pamp;gt;0。01))lt;!0。01,pgt;
  119table(dfpc)
  120ggscatter(df,xAveExpr,ylogFC,colorpc,size0。2,
  121palettec(green,red,black))
  122ggsave(picMA。png)
  123}124:125forheatmap
  126if(T){
  127load(filedatastep1output。Rdata)
  128每次都要检测数据
  129dat〔1:4,1:4〕
  130table(grouplist)
  131xdeglogFC
  132names(x)rownames(deg)133:134cg中存放着变化上升和下降的前100个基因名
  135cgc(names(head(sort(x),100)),
  136names(tail(sort(x),100)))
  137library(pheatmap)
  138nt(scale(t(dat〔cg,〕)))139:140n〔namp;gt;2〕2
  141n〔namp;lt;2〕2
  142n〔1:4,1:4〕
  143pheatmap(n,showcolnamesF,showrownamesF)
  144acdata。frame(groupgrouplist)
  145rownames(ac)colnames(n)将ac的行名也就分组信息(是‘noTNBC’还是‘TNBC’)给到n的列名,即热图中位于上方的分组信息
  146pheatmap(n,showcolnamesF,
  147showrownamesF,
  148clustercolsF,
  149annotationcolac,filenamepicheatmaptop200DEG。png)列名注释信息为ac即分组信息150:151
  152}153:154write。csv(deg,filedatadeg。csv)
  volcano。png
  MA。png
  heatmaptop200DEG。png
  step4annogokegg
  关于基因名和ID之间的各种转换:bitr(geneID,fromType,toType,OrgDb,dropTRUE)例如:
  1head(unique(degsymbol))
  2〔1〕LOC388780SLC6A6RGS22AKR1D1AOC1FOXJ1
  3bitr(unique(degsymbol),fromTypeSYMBOL,
  4toTypec(ENTREZID),
  5OrgDborg。Hs。eg。db)
  这里将KEGG和GO富集分析函数自定义为3个函数runkegg、rungo、keggplot
  每次运行前先运行下面代码:
  1KEGGpathwayanalysis
  2具体结果数据在data下,图在pic下
  3runkeggamp;lt;function(geneup,genedown,geneListF,protest){
  4geneupunique(geneup)
  5genedownunique(genedown)
  6genediffunique(c(geneup,genedown))
  7overrepresentationtest
  8下面把3个基因集分开做超几何分布检验
  9首先是上调基因集。
  10kk。upamp;lt;enrichKEGG(genegeneup,
  11organismhsa,
  12universegeneall,
  13pvalueCutoff0。9,
  14qvalueCutoff0。9)
  15head(kk。up)〔,1:6〕
  16kkkk。up
  17dotplot(kk)
  18barplot(kk)
  19kkDOSE::setReadable(kk,OrgDborg。Hs。eg。db,keyTypeENTREZID)
  20head(kk)
  21write。csv(kkresult,paste0(data,pro,kk。up。csv))
  22hr23首先是下调基因集。
  24kk。downamp;lt;enrichKEGG(genegenedown,
  25organismhsa,
  26universegeneall,
  27pvalueCutoff0。9,
  28qvalueCutoff0。9)
  29head(kk。down)〔,1:6〕
  30kkkk。down
  31dotplot(kk)
  32barplot(kk)
  33kkDOSE::setReadable(kk,OrgDborg。Hs。eg。db,keyTypeENTREZID)
  34write。csv(kkresult,paste0(data,pro,kk。down。csv))
  35hr36最后是上下调合并后的基因集。
  37kk。diffamp;lt;enrichKEGG(genegenediff,
  38organismhsa,
  39pvalueCutoff0。05)
  40head(kk。diff)〔,1:6〕
  41kkkk。diff
  42dotplot(kk)
  43barplot(kk)
  44kkDOSE::setReadable(kk,OrgDborg。Hs。eg。db,keyTypeENTREZID)
  45write。csv(kkresult,paste0(data,pro,kk。diff。csv))
  46hr47hr48keggdowndtamp;lt;as。data。frame(kk。down)
  49keggupdtamp;lt;as。data。frame(kk。up)
  50downkeggamp;lt;keggdowndt〔keggdowndtpvalueamp;lt;0。01,〕;downkegggroup1
  51upkeggamp;lt;keggupdt〔keggupdtpvalueamp;lt;0。01,〕;upkegggroup1
  52画图设置,这个图很丑,大家可以自行修改。
  53keggplot(upkegg,downkegg)
  54hr55ggsave(gkegg,filenamepaste0(pic,pro,keggupdown。png))
  56hr57GSEA
  58if(geneList){
  59hr60GSEA算法跟上面的使用差异基因集做超几何分布检验不一样。
  61kkgseamp;lt;gseKEGG(geneListgeneList,
  62organismhsa,
  63nPerm1000,
  64minGSSize20,
  65pvalueCutoff0。9,
  66verboseFALSE)
  67head(kkgse)〔,1:6〕
  68gseaplot(kkgse,geneSetIDrownames(kkgse〔1,〕))
  69gseaplot(kkgse,hsa04110,titleCellcycle)
  70kkDOSE::setReadable(kkgse,OrgDborg。Hs。eg。db,keyTypeENTREZID)
  71tmpkkresult
  72write。csv(kkresult,paste0(pro,kegg。gsea。csv))
  73hr74hr75这里找不到显著下调的通路,可以选择调整阈值,或者其它。
  76downkeggamp;lt;kkgse〔kkgsepvalueamp;lt;0。05amp;amp;kkgseenrichmentScoreamp;lt;0,〕;downkegggroup1
  77upkeggamp;lt;kkgse〔kkgsepvalueamp;lt;0。05enrichmentscoreamp;gt;0,〕;upkegggroup1lt;!0。05gt;
  78hr79gkeggkeggplot(upkegg,downkegg)
  80print(gkegg)
  81ggsave(gkegg,filenamepaste0(pro,kegggsea。png))
  82}
  83}
  84hr85GOdatabaseanalysis
  86具体结果数据在data下,图在pic下
  87rungoamp;lt;function(geneup,genedown,protest){
  88geneupunique(geneup)
  89genedownunique(genedown)
  90genediffunique(c(geneup,genedown))
  91glistlist(geneupgeneup,
  92genedowngenedown,
  93genediffgenediff)
  94因为go数据库非常多基因集,所以运行速度会很慢。
  95if(T){
  96goenrichresultsamp;lt;lapply(glist,function(gene){
  97lapply(c(BP,MF,CC),function(ont){
  98cat(paste(Nowprocess,names(gene),ont))
  99egoamp;lt;enrichGO(genegene,
  100universegeneall,
  101OrgDborg。Hs。eg。db,
  102ontont,
  103pAdjustMethodBH,
  104pvalueCutoff0。99,
  105qvalueCutoff0。99,
  106readableTRUE)107:108print(head(ego))
  109return(ego)
  110})
  111})
  112save(goenrichresults,filepaste0(data,pro,goenrichresults。Rdata))113:114}
  115只有第一次需要运行,就保存结果哈,下次需要探索结果,就载入即可。
  116load(filepaste0(data,pro,goenrichresults。Rdata))117:118n1c(geneup,genedown,genediff)
  119n2c(BP,MF,CC)
  120for(iin1:3){
  121for(jin1:3){
  122fnpaste0(pic,pro,dotplot,n1〔i〕,,n2〔j〕,。png)
  123cat(paste0(fn,))
  124png(fn,res150,width1080)
  125print(dotplot(goenrichresults〔〔i〕〕〔〔j〕〕))
  126dev。off()
  127}
  128}
  129}130:131132:133合并up和down的基因KEGG结果,放在一幅图里展示
  134keggplotamp;lt;function(upkegg,downkegg){
  135datrbind(upkegg,downkegg)
  136colnames(dat)
  137datpvaluelog10(datpvalue)
  138datpvaluedatpvaluedatgroup139:140datdat〔order(datpvalue,decreasingF),〕141:142gkeggamp;lt;ggplot(dat,aes(xreorder(Description,order(pvalue,decreasingF)),ypvalue,fillgroup))
  143geombar(statidentity)
  144scalefillgradient(lowblue,highred,guideFALSE)
  145scalexdiscrete(namePathwaynames)
  146scaleycontinuous(namelog10Pvalue)
  147coordflip()themebw()theme(plot。titleelementtext(hjust0。5))
  148ggtitle(PathwayEnrichment)
  149print(gkegg)
  150}
  真正代码
  1载入数据
  2if(T){
  3rm(listls())
  4options(stringsAsFactorsF)5:6load(filedatadeg。Rdata)
  7head(deg)
  8}9:10数据预处理
  11不同的阈值,筛选到的差异基因数量就不一样,后面的超几何分布检验结果就大相径庭。
  12logFCt1。5
  13预处理1
  14if(T){
  15deggifelse(degP。Valueamp;gt;0。05,stable,
  16ifelse(deglogFCamp;gt;logFCt,UP,
  17ifelse(deglogFCamp;lt;logFCt,DOWN,stable))
  18)
  19table(degg)
  20head(deg)
  21degsymbolrownames(deg)
  22library(ggplot2)
  23library(clusterProfiler)
  24library(org。Hs。eg。db)
  25dfamp;lt;bitr(unique(degsymbol),fromTypeSYMBOL,
  26toTypec(ENTREZID),
  27OrgDborg。Hs。eg。db)
  28head(df)
  29DEGdeg
  30head(DEG)31:32DEGmerge(DEG,df,by。ySYMBOL,by。xsymbol)
  33head(DEG)
  34save(DEG,filedataannoDEG。Rdata)
  35}
  36预处理2
  37if(T){
  38geneupDEG〔DEGgUP,ENTREZID〕
  39genedownDEG〔DEGgDOWN,ENTREZID〕
  40genediffc(geneup,genedown)
  41geneallas。character(DEG〔,ENTREZID〕)
  42data(geneList,packageDOSE)
  43head(geneList)
  44boxplot(geneList)
  45boxplot(DEGlogFC)46:47geneListDEGlogFC
  48names(geneList)DEGENTREZID
  49geneListsort(geneList,decreasingT)
  50}51:52detailedplot
  53if(T){
  54source(keggandgoupanddown。R)
  55runkegg(geneup,genedown,pronpcVSnormal)
  56需要多go数据库的3个条目进行3次富集分析,非常耗时。
  57rungo(geneup,genedown,pronpcVSnormal)
  58}59:60
  61综合显示图
  62if(F){
  63goamp;lt;enrichGO(geneup,OrgDborg。Hs。eg。db,ontall)
  64library(ggplot2)
  65library(stringr)
  66barplot(go,splitONTOLOGY)facetgrid(ONTOLOGY。,scalefree)
  67barplot(go,splitONTOLOGY,font。size10)
  68facetgrid(ONTOLOGY。,scalefree)
  69scalexdiscrete(labelsfunction(x)strwrap(x,width50))
  70ggsave(picgeneupGOallbarplot。png)71:72goamp;lt;enrichGO(genedown,OrgDborg。Hs。eg。db,ontall)
  73barplot(go,splitONTOLOGY,font。size10)
  74facetgrid(ONTOLOGY。,scalefree)
  75scalexdiscrete(labelsfunction(x)strwrap(x,width50))
  76ggsave(picgenedownGOallbarplot。png)
  77}
  detailedplot
  npcVSnormalkeggupdown。png(kegg结果还可以接受)
  GO系列结果过于冗余:
  npcVSnormaldotplotgenediffBP。png
  npcVSnormaldotplotgenediffCC。png
  npcVSnormaldotplotgenediffMF。png
  npcVSnormaldotplotgenedownBP。png
  npcVSnormaldotplotgenedownCC
  npcVSnormaldotplotgenedownMF。png
  npcVSnormaldotplotgeneupBP。png
  npcVSnormaldotplotgeneupCC。png
  npcVSnormaldotplotgeneupMF。png
  综合显示图(更推荐)
  genedownGOallbarplot。png
  geneupGOallbarplot。png
  step5annoGSEA
  GSEA数据下载网页:https:www。gseamsigdb。orggseadownloads。jsp
  msigdb。v7。0。symbols。gmt:https:www。gseamsigdb。orggseamsigdbdownloadfile。jsp?filePathresourcesmsigdb7。0msigdb。v7。0。symbols。gmt
  msigdb。v7。0。entrez。gmt:https:www。gseamsigdb。orggseamsigdbdownloadfile。jsp?filePathresourcesmsigdb7。0msigdb。v7。0。entrez。gmt
  所有打包gmt:https:www。gseamsigdb。orggseamsigdbdownloadfile。jsp?filePathresourcesmsigdb7。0msigdbv7。0filestodownloadlocally。zip
  1载入数据和R包
  2DEG为limma得到的差异分析结果
  3if(T){
  4rm(listls())
  5options(stringsAsFactorsF)
  6load(filedataannoDEG。Rdata)
  7library(ggplot2)
  8library(clusterProfiler)
  9library(org。Hs。eg。db)
  10}11:12
  13对MigDB中的全部基因集做GSEA分析。
  14按照FC的值对差异基因进行排序
  15http:www。bioinfotrainee。com2105。html
  16http:www。bioinfotrainee。com2102。html
  17自行修改存放gmt文件路径d
  18GSEA每个geneset的具体结果保存在gsearesults这个list中
  19而最终结果保存在gsearesultsdf数据框中
  20ddataGSEAgmtmsigdbv7。0filestodownloadlocallymsigdbv7。0GMTssymbols
  21if(T){
  22geneListDEGlogFC
  23names(geneList)DEGsymbol
  24geneListsort(geneList,decreasingT)
  25选择gmt文件(MigDB中的全部基因集)26:27gmtslist。files(d,patternall)
  28gmts29:30GSEA分析
  31library(GSEABase)BiocManager::install(GSEABase)
  32下面使用lapply循环读取每个gmt文件,并且进行GSEA分析
  33如果存在之前分析后保存的结果文件,就不需要重复进行GSEA分析。
  34fdatagsearesults。Rdata
  35if(!file。exists(f)){
  36gsearesultsamp;lt;lapply(gmts,function(gmtfile){
  37gmtfilegmts〔2〕
  38filepathpaste0(d,gmtfile)
  39genesetamp;lt;read。gmt(filepath)
  40print(paste0(Nowprocessthe,gmtfile))
  41egmtamp;lt;GSEA(geneList,TERM2GENEgeneset,verboseFALSE)
  42head(egmt)
  43gseaplot(egmt,geneSetIDrownames(egmt〔1,〕))
  44return(egmt)
  45})
  46上面的代码耗时,所以保存结果到本地文件
  47save(gsearesults,filef)
  48}
  49load(filef)
  50提取gsea结果,熟悉这个对象
  51gsearesultslistamp;lt;lapply(gsearesults,function(x){
  52cat(paste(dim(xresult)),)
  53xresult
  54})
  55}
  56随便看几个结果图
  57dev。off()
  58gsearesultsdfamp;lt;do。call(rbind,gsearesultslist)
  59gseaplot(gsearesults〔〔2〕〕,geneSetIDNIKOLSKYBREASTCANCER7P15AMPLICON)
  60gseaplot(gsearesults〔〔2〕〕,RICKMANHEADANDNECKCANCERD)
  step6annoGSVA
  老实说,我对GSVA还不是很理解,但是知道在代码方面,做起来比较简单,有2个输入文件,一个是表达矩阵,一个是gmt文件即可。先把代码谢在这里,日后如果有需要,再仔细研究吧:
  1对MigDB中的全部基因集做GSVA分析。
  2还有ssGSEA,PGSEA
  3载入数据
  4if(T){
  5rm(listls())
  6options(stringsAsFactorsF)7:8library(ggplot2)
  9library(clusterProfiler)
  10library(org。Hs。eg。db)
  11load(filedatastep1output。Rdata)
  12每次都要检测数据
  13dat〔1:4,1:4〕
  14}15:16GSVA分析
  17存放geneset的文件路径需要具体修改
  18ddataGSEAgmtmsigdbv7。0filestodownloadlocallymsigdbv7。0GMTssymbols
  19if(T){
  20Xdat
  21table(grouplist)
  22MolecularSignaturesDatabase(MSigDb)
  23gmtslist。files(d,patternall)
  24gmts
  25library(GSVA)BiocManager::install(GSVA)
  26if(!file。exists(datagsvamsigdb。Rdata)){
  27esmaxamp;lt;lapply(gmts,function(gmtfile){
  28gmtfilegmts〔8〕;gmtfile
  29genesetamp;lt;read。gmt(file。path(d,gmtfile))
  30es。maxamp;lt;gsva(X,geneset,
  31mx。diffFALSE,verboseFALSE,
  32parallel。sz1)
  33return(es。max)
  34})
  35adjPvalueCutoffamp;lt;0。001
  36logFCcutoffamp;lt;log2(2)
  37esdegamp;lt;lapply(esmax,function(es。max){
  38es。maxesmax〔〔1〕〕
  39table(grouplist)
  40dim(es。max)
  41designamp;lt;model。matrix(0factor(grouplist))
  42colnames(design)levels(factor(grouplist))
  43rownames(design)colnames(es。max)
  44design
  45library(limma)
  46contrast。matrixamp;lt;makeContrasts(paste0(unique(grouplist),collapse),levelsdesign)
  47contrast。matrixamp;lt;makeContrasts(npcnormal,
  48levelsdesign)49:50contrast。matrix这个矩阵声明,我们要把progres。组跟stable进行差异分析比较51:52degfunction(es。max,design,contrast。matrix){
  53step1
  54fitamp;lt;lmFit(es。max,design)
  55step2
  56fit2amp;lt;contrasts。fit(fit,contrast。matrix)
  57这一步很重要,大家可以自行看看效果58:59fit2amp;lt;eBayes(fit2)defaultnotrend!!!
  60eBayes()withtrendTRUE
  61step3
  62resamp;lt;decideTests(fit2,p。valueadjPvalueCutoff)
  63summary(res)
  64tempOutputtopTable(fit2,coef1,nInf)
  65nrDEGna。omit(tempOutput)
  66write。csv(nrDEG2,limmanotrend。results。csv,quoteF)
  67head(nrDEG)
  68return(nrDEG)
  69}70:71redeg(es。max,design,contrast。matrix)
  72nrDEGre
  73head(nrDEG)
  74return(nrDEG)
  75})
  76gmts
  77save(esmax,esdeg,filedatagsvamsigdb。Rdata)
  78}
  79}80:81画图展示,结果存放在pic下
  82if(T){
  83load(filedatagsvamsigdb。Rdata)
  84library(pheatmap)
  85lapply(1:length(esdeg),function(i){
  86i8
  87print(i)
  88datesmax〔〔i〕〕
  89dfesdeg〔〔i〕〕
  90dfdf〔dfP。Valueamp;lt;0。01amp;gt;0。3,〕lt;!0。01gt;
  91print(dim(df))
  92if(nrow(df)amp;gt;5){
  93nrownames(df)
  94datdat〔match(n,rownames(dat)),〕
  95acdata。frame(ggrouplist)
  96rownames(ac)colnames(dat)
  97rownames(dat)substring(rownames(dat),1,50)
  98pheatmap::pheatmap(dat,
  99fontsizerow8,height11,
  100annotationcolac,showcolnamesF,
  101filenamepaste0(〔picgsva,strsplit(gmts〔i〕,〔。〕)〔〔1〕〕〔1〕,。pdf))102:103}
  104})105:106adjPvalueCutoffamp;lt;0。001
  107logFCcutoffamp;lt;log2(2)
  108dfdo。call(rbind,esdeg)
  109esmatrixdo。call(rbind,esmax)
  110dfdf〔dfP。Valueamp;lt;0。01amp;gt;0。5,〕lt;!0。01gt;
  111write。csv(df,filedataGSVADEG。csv)
  112}
  因为用到的这个样本用GSVA没有得到显著性结果,所以没有图出来,具体也没有深究,有需要日后再仔细研究吧
  step7visualization
  http:www。360doc。comconteant1803091833459258735717104。shtml
  1主要是关于KEGG方面的扩展图
  2主要是关于KEGG方面的扩展图
  3hr4载入数据
  5if(T){
  6rm(listls())
  7options(stringsAsFactorsF)
  8hr9library(ggplot2)
  10library(clusterProfiler)
  11library(org。Hs。eg。db)
  12load(filedataannoDEG。Rdata)13:14head(DEG)
  15}16:17preprocessdata
  18if(T){
  19geneupDEG〔DEGgUP,ENTREZID〕
  20genedownDEG〔DEGgDOWN,ENTREZID〕
  21genediffc(geneup,genedown)
  22geneallas。character(DEG〔,ENTREZID〕)
  23制作差异基因listL
  24boxplot(DEGlogFC)25:26geneListDEGlogFC
  27names(geneList)DEGENTREZID
  28geneListsort(geneList,decreasingT)
  29}30:31
  32KEGG富集分析得到结果
  33if(T){
  34if(!file。exists(dataenrichkk。rdata)){
  35genedown
  36geneup
  37enrichKKamp;lt;enrichKEGG(genegeneup,
  38organismhsa,
  39universegeneall,
  40pvalueCutoff0。1,
  41qvalueCutoff0。1)
  42save(enrichKK,filedataenrichkk。rdata)
  43}
  44load(filedataenrichkk。rdata)
  45查看KEGG结果
  46head(enrichKK)〔,1:6〕
  47打开网页看相关KEGG通路图
  48browseKEGG(enrichKK,hsa05150)49:50将数据中的entrzid变成symbol
  51更为易读
  52enrichKKDOSE::setReadable(enrichKK,OrgDborg。Hs。eg。db,keyTypeENTREZID)
  53enrichKK
  54}55:56
  57可视化
  58条带图
  59if(T){
  60par(mfrowc(2,1))
  61barplot(enrichKK,showCategory20)
  62ggsave(picbarplot。png)
  63}64:65气泡图
  66if(T){
  67dotplot(enrichKK)
  68ggsave(picdotplot。png)
  69}70:71下面的图需要映射颜色,设置和示例数据一样的geneList72:73展示top5通路的共同基因,要放大看。
  74GeneConceptNetwork
  75if(T){
  76cnetplot(enrichKK,foldChangegeneList,colorEdgeTRUE,circularF)
  77ggsave(piccnetplot。png)
  78cnetplot(enrichKK,foldChangegeneList,colorEdgeTRUE,circularT)
  79ggsave(piccnetplotcircular。png)
  80}81:82
  83EnrichmentMap
  84if(T){
  85emapplot(enrichKK)
  86ggsave(picEnrichmentMap。png)
  87}88:89(4)展示通路关系,仅仅是针对于GO数据库结果。
  90goplot(enrichKK)
  91(5)Heatmaplikefunctionalclassification
  92if(T){
  93heatplot(enrichKK,foldChangegeneList)
  94ggsave(picEnrichmentHeatmap。png)
  95}
  条带图:
  气泡图:
  GeneConceptNetwork图:每一个小蓝圈表示一个基因,其颜色表示FC值,每个KEGGterm圈的大小由里面包含基因的数目决定。
  成环:更炫酷了,但是感觉图形展示不方便
  不成环:信息展示更有力吧
  EnrichmentMap图:这里和上面的图类似,只不过不再显示具体的基因,而是直接画出每个term和term之间的关系,每个圆圈代表着一个term,圆圈大小代表着有多少个基因,颜色表示p值。
  如果term和term之间有共同的基因,那么就会连接起来,聚在一起。
  Heatmaplikefunctionalclassification:
  和我们常规的热图不太像,这里纵轴是每个KEGG通路,横轴是涉及到的基因。颜色表示FC值。
  致谢
  上面所有的代码都来自生信技能树曾老板jimmy的帮助,同时我在测试运行的过程中又进行了部分改进和增补。
  就用曾老板亲自编辑的感谢词来感谢吧:
  FatYangthankDr。JianmingZeng(UniversityofMacau),andallthemembersofhisbioinformaticsteam,biotrainee,forgenerouslysharingtheirexperienceandcodes!

喜欢和爱的区别你说我想你了,我笑了,这是喜欢。你说我想你了,我哭了,这是爱。喜欢和爱到底有什么区别呢?操作方法01:hr喜欢就是放肆但爱就是克制。喜欢一个人很简单,但爱一个……老年人应该如何补肾固肾在养护肾脏的问题上,许多中老年人的一致认可是采用中医补肾才是最好的选择。其实老年人选择补肾的方法要更加慎重,稍有不慎,就很难修复健康,在补肾上面,老年人不宜过补和盲目补。那么,……类药物让女性变成性冷淡许多女性出现性功能障碍,往往把原因归结在自己没兴趣或丈夫不配合,并没有想到一些常吃的药物,也会是扫性的原因之一,下面跟着本站小编一起来了解一下哪5类药物让女性变成性冷淡吧?……生查子软金杯古诗带拼音和意思《生shng查zh子z软run金jn杯bi》风fng流li紫z府f郎lng,痛tng饮yn乌w纱sh岸n。柔ru软run九ji回hu肠chng,冷lng怯qi玻b璃……中国最难考的所大学能考上的都是学现在的社会考一个大学并不是很难,主要是为什么呢?先是社会上已经提供了一个比较自由公正的教育环境,国家和社会就鼓励、扶持学生上学;在家庭方面更是一样,现在生活水平高了,民众的观念……产后尿潴留可以温灸气海穴一般来说,产妇在顺产后4~6小时内就可以自己小便了,但如果在分娩6~8小时后,或者剖宫产手术拔掉导尿管后,仍然不能正常地将尿液排出,甚至在月子中仍不能正常排尿,并且膀胱还有饱胀……四种房产过户需要办理公证你都知道吗(一)继承房产办理过户。通过继承取得房产应当先到公证部门办理《继承权公证书》。继承人在办理房产过户时,除了提供相应的材料外,继承权公证书不能缺少。(二)赠与房产办理……二招让你的网速飞起来技巧一:只改一个值,马上加快宽带上网速度如果是使用宽带方式上网,那么在注册表中设定适当的TcpWindow值,就可以加快上网速度。具体的操作方法如下:选择:开……朵玫瑰代表什么18朵玫瑰代表什么?18朵玫瑰花的含义是:青春美丽18朵玫瑰花语是真诚与坦白;也有人理解为要发也是可以的;还有人解读为祝她年年18岁。其实,不管理解为哪种花语,都是……巴西铁巴西铁别称香龙血树、龙血树、中斑龙血树巴西铁生长习性巴西铁种类很多耐寒10,性喜高温、多湿、半阴环境生长。性喜光照充足、高温、高湿的环境,亦耐阴、耐干燥。在明……下巴对人命运的影响当今拥有尖脸尖下巴已成为美女的一个标准,看看现在当红女星们的脸型仿佛是一个模子刻出来的,即使不是这种脸型也要把自己整成这种脸型再出来混。尖下巴仿佛是大势所趋,从演艺圈一路蔓延像……面试放鸽子的大最奇葩理由怎样为面试迟到找借口,的确是一门大学问,这不,英国一家猎头公司要求该公司的猎头们回忆一下面试迟到或根本未在面试中露面的求职者都给出了哪些最奇葩的理由。现在,让我们一起鉴赏一下吧……
小狗大熊镇子上,住着一个讨厌跟人来往的先生。因为想把到他家里来的人都赶出去,所以他想养一只又大又很会叫的狗。可是,当他真的养了一只狗的时候,他的狗却是一只又乖又讨人喜欢的小狗。你呀,赶……周总理的外交故事1、1971年,基辛格博士为恢复中美外交关系秘密访华。在一次正式谈判尚未开始之前,基辛格突然向周恩来总理提出一个要求:尊敬的总理阁下,贵国马王堆一号汉墓的发掘成果震惊世界,那具……卡西欧如何把日期改为时间方法步骤一:在计时模式中,按住A钮约三秒钟直到城市代码开始在显示屏中闪动,此表示现已进入设定模式。方法步骤二:用D钮及B钮选择所需要的城市代码,在变更任何其他设定前,必须……真相带来力量內勒斯工作坊分享时间飞逝得快到让人无法知觉,直到昨晚翻看自己的日志《勇敢面对真相》,我才意识到离我参加德国排列师内勒师老师的课程已过去近半年了。Psy525。cn那次课程中,我坐在讲台左……在朋友圈这个大卖场微商到底靠什么赚钱微商一词刚刚出现时,很多人怀着好奇心去靠近她,试图了解她,甚至梦想与她成就一桩美好姻缘。如今,当朋友圈被大量微商广告占领的时候,很多人不胜其烦,不得不经常在朋友圈设置不看……越是讨好顾客越不领情你学会怎么让客户领情了吗在门店,相信99的导购都遇到过这种情况:我们自己觉得产品好,可是顾客就是不领情?这个时候,怎么办呢?是放任单子溜走,还是尽力挽回呢?其实很多时候并不是顾客真的不想买,只是……巧妙索要电话与微信巧你学会了吗作为一位优秀营销人员,学会索要客户的电话号码和微信不得不说是必备技能,它不仅仅是一门技术活,更重要的是,可以有助于销售业绩的提升。在如今的市场环境下,如果你销售的时候没有方法,……两张图教会你掌握一个社交新零售项目如何起盘每个企业老板新零售项目咨询我起盘,作为一名资深商业顾问,第一步就是要诊断、把脉,这个项目到底可不可行。做顾问像病人找专家大夫看病,首先,需要望闻问切来诊断把脉。今天,我教……张丘建算经主要内容简介及赏析数学著作。三卷。北魏张丘建(丘或作邱)撰。约成书于北魏天安元年太和九年(466485年)之间。张丘建,生平事迹不详。自序最后题清河张丘建谨序,清河是张姓郡望,未必是作者的……秒懂币盘点贝币最新市场行情天然海贝市场估价80元左右普通陶贝市场估价50元左右普通骨贝市场估价150元左右普通玉贝市场估价300元左右,(根据玉材质估价可达近万元)普通齐鲁贝市场……如何处理婆媳关系婆媳关系男人才是关键看到太多的婆媳矛盾,轻则导致家庭不睦,重则导致家庭破裂,说来说去,这些婆媳矛盾的家庭,都没有弄清楚婆媳关系的中心点,那就是:婆媳关系好与坏,男人才是关键点。试想一下,现在……乾隆皇帝时期为什么没有出现九子夺嫡康熙与乾隆,都是清朝历史上很有名的皇帝,对清朝的发展也是做出了相当大的贡献了,而且这两位皇帝也都有一些相似性,比如他们都在位时间非常长,长达六十年,而且也都是子嗣众多。不过,在……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网