美文网首页鸡易呕
GEO数据挖掘视频笔记_version2

GEO数据挖掘视频笔记_version2

作者: 力达兄弟 | 来源:发表于2019-04-23 13:51 被阅读0次

    GEO数据挖掘

    第二遍看GEO数据挖掘的视频,比之前更容易看懂很多,也有很多东西是需要重新掌握的,发现了很多第一遍完全没有听到的东西。

    P1 0-项目总览及Github介绍

     # 以文件夹以及Project的形式来管理代码及文件
     # 读文献理解文献的实验设计
     # 在github中有课程的代码:https://github.com/jmzeng1314/GEO/tree/master/task1-check-specific-genes
    

    P2 1-通用文献阅读及规律

     # 一个基因对应多个转录本,即一个基因对应多个探针,之后操作的时候要进行筛选
     # 2015年,芯片→测序仪
     # 不同的芯片的数据可以组成一个大的数据,不是重点
    

    P3 2-了解GEO数据库

     # GEO数据库
     # GEO数据库主页:样品、平台(定制的平台可能会没有探针以及基因对应的关系)
     # ref seq ID: NM开头,可以跟基因对应
     # 芯片的基础知识
     # illumina与affymatrix的芯片是不一样的
     # GPL570: hgu133plus2是使用最多的一款芯片
     # 看GSE相关的文章
    

    P4 3-数据下载的3种方式

    # 1. Raw data下载 # 不同的芯片的处理方法不一样,不推荐,分析不好
        ## 用Read.Affy来读取,旧版的芯片
        ## 不同的版本用不同的函数来提取
    # 2. Series Matrix files # 要注意是否下载完整 Linux 可以用md5检验
    a=read.table('GSE42972_series_matrix.txt.gz',sep='\t',comment.char='!',fill=T,header=T,quote="")
        ## 思路:先用编辑器打开看一下,找到相应的函数来读取数据。
    # 3. Geoquerry包下载:下载过来的是一个对象,可以把表达矩阵、分组信息提取出来
    library(GEOquerry)
    gset<-getGEO('GSE42872',destdir='.',
                 AnnotGPL=F,
                 getGPL=F)  #避免下载平台,因为比较大
    gset
    

    P5 4-ID转换大全

    library(GEOquerry)
    gset<-getGEO('GSE42872',destdir='.',
                 AnnotGPL=F,
                 getGPL=F)  #避免下载平台,因为比较大
    gset
    class(gset)
    b= gset[[1]] 
    a1= exprs(b) ##这个取出来的跟前面的a相同
    #a=read.table('GSE42972_series_matrix.txt.gz',sep='\t',comment.char='!',fill=T,header=T,quote="") 
    # rownames(a)=a[,1]
    # a=a[,-1]
    ## GEOquerry这个包就是做了上面的这句话。
    
    ## 包装成函数  
    downGSE <- function(studyID = "GSE1009", destdir = ".") {
    
        library(GEOquery)
        eSet <- getGEO(studyID, destdir = destdir, getGPL = F)
    
        exprSet = exprs(eSet[[1]])
        pdata = pData(eSet[[1]])
    
        write.csv(exprSet, paste0(studyID, "_exprSet.csv"))
        write.csv(pdata, paste0(studyID, "_metadata.csv"))
        return(eSet)
    
    } 
    # 使用GEOmetadb包来获取对应GEO数据的实验信息,参考
    #  http://www.bio-info-trainee.com/1085.html
    downGSE('GSE42872') #对多两个csv表格
    ## ID转换的背景知识
    # 探针需要转换成基因名,多个探针可能对应同一个基因,需要策略筛选
    # 1. 找到GPL平台对应的bioconductor的包
    # 2. 找到GPL自己的注释
    library(hugene10sttranscriptcluster.db)
    ?hugene10sttranscriptcluster.db
    ls('package:hugene10sttranscriptcluster.db')
    ids=toTable(hugene10sttranscriptclusterSYMBOL) #蛋白编码的基因就2万个左右
    length(unique(ids$symbol)) #看一下有多少个基因
    tail(sort(table(ids$symbol))) #看一下基因对应多个探针的后面几位
    table(sort(table(ids$symbol))) #看一下基因对应的探针情况 #作者的数据可能已经把数据过滤了,所以要默认它是对的,不然要自己处理。
    plot(table(sort(table(ids$symbol))))
    exprSet=a1
    table(rownames(exprSet))%in%ids$probe_id)
    dim(exprSet) #只有经过注释的探针我们才能进行分析,这个代码用来看过滤之前的探针数目
    exprSet=exprSet[rownames(exprSet)%in%ids$probe_id,]
    dim(exprSet) # 看一下过滤完之后的探针数目
    ids=ids[match(rownames(exprSet),ids$probe_id),]# 将ids顺序调整为与表达矩阵一样
    # 为什么要顺序调整成一样,就是为了通过逻辑值来判断,一个的正确与否跟另外一个一样。
    head(ids)
    exprSet[1:5,1:5]
    tmp=by(exprSet,ids$symbol,function(x) rownames(x)[which.max(rowMeans(x)])
    #需要对表达矩阵进行分割,达到一个新的探针列表,这里取的是最大值
    probes=as.character(tmp)
    # 根据probe来进行过滤
    dim(exprSet)
    exprSet=exprSet[rownames(exprSet)%in%probes,]                                                  
    dim(exprSet)                                                                
    

    GPL找不到相对应的包的解决方法

    # 参考github:https://github.com/jmzeng1314/my-R/tree/master/9-microarray-examples
    gpl<- getGEO('GPL6480',destdir='.') 
    colnames(Table(gpl)) ## 41108 17
    head(Table(gpl))[,c(1,6,7)] # 需要自己检查,需要哪几列
    write.csv(Table(gpl)[,c(1,6,7)],"GPL6480.csv")
    

    P6 5-了解你的表达矩阵

    # 使用R语言20题来进行演示
    ## 检验常见的基因,如内参、自己敲低或者过表处理的基因,GAPDH,ACTB的表达
    ## 查看分布图,各个样本的表达的boxplot
    ## PCA图与Hclust图
    plot(hclust(dist(t(exprSet))))
    # 代码在R语言的20题,这边要对代码进行修改以及合并。
    

    P7 6-差异分析

    # 参考微信文章《用Limma对芯片数据做差异分析》
    library(limma)
    design<- model.matrix(~0+factor(group_list))#构建design矩阵,分组矩阵
    # 即tmp=data.frame(case=c(0,0,0,1,1,1),control=c(1,1,1,0,0,0)),样本多就需要用之前的来进行操作。
    colnames(design)=levels(factor(group_list))#列名是分组信息,并且赋值
    rownames(design)=colnames(exprSet) #样品名是design的行名
    ## 构建比较矩阵
    contrast.matrix<-makeContrasts(paste0(unique(group_list),collpase='-'),levels=design) 
    contrast.matrix
    # paste0(unique(group_list),collpase='-'),知道是谁跟谁比,case比control,还是control比case,a/b → a=1,b=-1
    ## 进行分析
    fit<- lmFit(exprSet,design)
    fit2<- contrasts.fit(fit,contrast.matrix)
    fit2<- eBayes(fit2)
    tempOutpu=topTable(fit2,coef=1,n=Inf)
    nrDEG=na.omit(tempOutput)
    head(nrDEG)
    ## 画热图
    library(pheatmap)
    choose_gene=head(rownames(nrDEG),25)
    choose_matrix=exprSet[choose_gene,]
    choose_matrix=t(scale(t(choose_matrix)))
    pheatmap(choose_matrix)
    # 参考 《差异分析 一文不够》
    

    P8 7-火山图及热图制作及美化

    # volcano plot
    colnames(nrDEG)
    ## plot(nrDEG$logFC,-log10(nrDEG$P.value))
    ## 可以google好看的火山图代码
    # 富集分析,对上调下调基因进行注释,知道这些基因是干什么用的。
    # 参考微信文章 《结果注释一文就够》
    # 你的通路有多少基因,你的差异基因中有多少被抽中了
    # 1000/20000,基因被抽中的概率是1/20,cell cycle的基因假设有100个,那么被抽中的个数应该是5个,但是如果抽到了20个,说明cell cycle这个通路发生了变化。
    ## KEGG 分析
    library(clusterProfiler)
    ## 需要将基因转变为ENTREZID
    gene.df<- bitr(gene,fromType='SYMBOL',
                  toType=c('ENSEMBL',"ENTREZID"),
                  OrgDb=org.Hs.eg.db)
    head(gene.df)
    ## ENTREZID 
    kk<-enrichKEGG(gene=gene.df$ENTREZID,
                  organism='hsa',
                  pvalueCutoff=0.05)
    head(kk)[,1:6]
    ## 拿DNA replication这个通路距离,它的BgRatio为36/7431,而例子中18/425,差异基因中富集了18个,说明这个通路被明显影响了
    vignette('clusterProfiler') #查看包的说明书,需要从头看到尾
    ## GO analysis
    

    P9 8-KEGG-GO等数据库的注释及GSEA分析

    # KEGG,GO的缺点
    # 超几何分布检验的弊端,无法考量每一个基因的本身作用,事实上基因是有重要与不重要的区分的
    # GSEA分析
    data(geneList,package='DOSE')
    geneList
    boxplot(geneList) #差异基因的LogFC,要看包的说明书,知道是哪里来的geneList
    nrDEG$logFC
    geneList=nrDEG$logFC
    names(geneList)=rownames(nrDEG)
    
    ## 会报错,需要转换ID
    gene.df<-bitr(names(geneList),fromType='SYMBOL',
                  toType=c('ENSEMBL','ENTREZID'),
                  OrgDb=org.Hs.eg.db)
    head(gene.df)
    tmp=data.frame(SYMBOL=names(geneList),
                  logFc=as.numeric(geneList))
    tmp=merge(tmp,gene.df,by='SYMBOL')
    geneList=tmp$logFc
    names(geneList)=gene.df$ENREZID
    geneList=sort(geneList,decreasing=T)
    ## 主要是为了满足kk2的输入文件的条件
    
    kk2<- gseKEGG(geneList =geneList,
                 organism ='hsa',
                 nPerm =1000,
                 minGSSize=120,
                 pvalueCutoff=0.05,
                 verbose= FALSE)
    head(kk2)
    ## 需要自己调整,将自己的数据调整别人轮子需要的数据。
    ## GSEA软件需要制作练个输入文件
    

    P10 9- 收尾的几点建议

    # 看github的代码
    

    P11 10- 批量生存分析代码大放送

    # 人群太大了,异质性太高,没有一个决定性的分子能够决定死与活,病人情况太复杂,生存分析只是其中的一种。
    # 参考公众号《生信技能树 生存分析》
    # 跑R语言的习题
    

    相关文章

      网友评论

        本文标题:GEO数据挖掘视频笔记_version2

        本文链接:https://www.haomeiwen.com/subject/qmdvgqtx.html