【ONE·R || 两次作业(二):GEO数据处理下载分析】

news2024/11/16 20:36:28

总言

  两次作业汇报·其二:GEO数据处理学习汇报。
  

  

文章目录

  • 总言
  • 2、作业二:GEO数据处理下载分析
    • 2.1、GEO数据库下载前准备
    • 2.2、GEO数据库下载及数据初步处理
      • 2.2.1、分阶段解析演示
        • 2.2.1.1、编号下载流程
        • 2.2.1.2、对gset[ 1 ]初步分析
        • 2.2.1.3、对gset[ 2 ]初步分析
      • 2.2.2、该部分整体脚本展示
    • 2.3、以gset[1]中数据为例,进行数据检验
      • 2.3.1、分阶段解析演示
        • 2.3.1.1、绘制箱线图
        • 2.3.1.2、PCA主成分分析
        • 2.3.1.3、层次聚类分析
      • 2.3.2、该部分整体脚本展示
    • 2.4、以gset[1]中数据为例,将探针ID转换为基因ID
      • 2.4.1、分阶段解析演示
      • 2.4.2、该部分整体脚本展示
    • 2.5、基于上述步骤,进行基因的差异性分析
      • 2.5.1、分阶段解析演示
        • 2.5.1.1、箱线图和t检验
        • 2.5.1.2、差异分析走标准的limma流程
        • 2.5.1.3、查看上调基因和下调基因
      • 2.5.2、该部分整体脚本展示
    • 2.6、基于上述步骤,绘制火山图、热图
      • 2.6.1、分阶段解析演示
        • 2.6.1.1、火山图
        • 2.6.1.2、热图
      • 2.6.2、该部分整体脚本展示

  
  
  

2、作业二:GEO数据处理下载分析

在这里插入图片描述
  
  

2.1、GEO数据库下载前准备

  1)、NCBI:

  相关链接

在这里插入图片描述
  
  
  2)、GEO数据查看举例:

在这里插入图片描述
  
  
  3)、演示数据说明:
  ①此处以参考资料中的GSE编码为例,其主要原因在于:比起随便寻找一条编码数据,该条编码比较方便演示后续数据分析的操作过程。
  ②编码号:GSE14520
  ③该数据部分需要我们关注的信息展示:
在这里插入图片描述
  
  
  

2.2、GEO数据库下载及数据初步处理

  对于相关数据下载,一种方式是在官网直接下载,此处我们采取的是:在RStudio使用相关包下载GEO数据。演示过程如下:

2.2.1、分阶段解析演示

2.2.1.1、编号下载流程

  1)、选定编码号:
  f='GSE14520_eSet.Rdata' ,同理更改GSE14520即可达到下载其它编码号的目的。

rm(list = ls()) ##该代码可用于清空environment中的相关数据。
options(stringsAsFactors = F) ##字符串是否作为因子?此处我们选择的是false。
f='GSE14520_eSet.Rdata' ##这里填写的是我们需要下载的GSE编号

  
  2)、相关包的下载与加载:
  要下载GEO数据库信息,需要下载GEOquery包,但其是包含在BiocManager包中的一个包,因此需要先下载BiocManager包。

if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")##下载"BiocManager"包
if (!requireNamespace("GEOquery", quietly = TRUE))
  BiocManager::install("GEOquery")##下载"GEOquery"包
library(GEOquery) ##加载包

在这里插入图片描述
  
  
  3)、下载GSE14520这个数据 :
  利用GEOquery包中的getGEO函数来下载需要的GSE编号GSE14520

#下载'GSE14520'这个数据 
if(!file.exists(f)){
  gset <- getGEO('GSE14520', destdir=".",
                 AnnotGPL = F, ##注释文件   
                 getGPL = F)   ##平台文件   
  save(gset,file=f)            ##保存到本地

}

在这里插入图片描述

  
  

2.2.1.2、对gset[ 1 ]初步分析

  1)、降级提取gset[1] :
  两个[[]]能达到提取文件的目的,gset[[1]] 表示提取第一个文件。

load('GSE14520_eSet.Rdata')   
class(gset)
> class(gset) ##查看gset的类型
[1] "list"
> gset[[1]]            ##降级提取gset
ExpressionSet (storageMode: lockedEnvironment) ##表达数组
assayData: 22268 features, 445 samples  ##有22268个探针,有445个样本
  element names: exprs 
protocolData: none
phenoData
  sampleNames: GSM362958 GSM362959 ... GSM712542 (445 total) ##样本名称
  varLabels: title geo_accession ... Tissue:ch1 (46 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 21159642  ##pubMedIds,可根据这个ID号在NCBI中搜索到相关文章
22202459
25597408
31022357
29209147
26058814
31828106
33748106
33771199
35367211
32502310 
Annotation: GPL3921 ##依托的芯片平台GPL3921

> class(gset[[1]]) ##查看文件一的数据类型:为表达数组
[1] "ExpressionSet"
attr(,"package")
[1] "Biobase"

在这里插入图片描述

  2)、获取样本的表达矩阵,并将病人的临床信息按一定依据分组:

> dat1<-exprs(gset[[1]])##使用函数exprs获取样本表达矩阵
> pd1<-pData(gset[[1]]) ##使用函数pData获取样本临床信息(如性别、年龄、肿瘤分期等等)

在这里插入图片描述

  3)、分组,初步处理数据与保存:
  根据2)中提供信息pd1$characteristics_ch1,我们根据是否为肿瘤组织('Tumor','Non_Tumor'),将数据样本分类存储于group_list1中,并将其保存save命名为Expreset1.Rdata,这样一来之后若还需要使用,就能直接在本地获取到相关数据。
在这里插入图片描述

> group_list1<-ifelse(pd1$characteristics_ch1=="Tissue: Liver Tumor Tissue"|pd1$characteristics_ch1=="tissue: Liver Tumor Tissue",
+                     'Tumor','Non_Tumor')
> class(group_list1)
[1] "character"

> group_list1
  [1] "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"    
  [9] "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Non_Tumor"
 [17] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor"
 [25] "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Non_Tumor"
 [33] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor"
 [41] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
 [49] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
 [57] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
 [65] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"    
 [73] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
 [81] "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
 [89] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
 [97] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[105] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"    
[113] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[121] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[129] "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[137] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[145] "Tumor"     "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[153] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor"
[161] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[169] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor"
[177] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[185] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[193] "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[201] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"     "Non_Tumor"
[209] "Tumor"     "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[217] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[225] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[233] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[241] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Tumor"    
[249] "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"    
[257] "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[265] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[273] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"    
[281] "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"    
[289] "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor"
[297] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[305] "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[313] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor"
[321] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[329] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[337] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor"
[345] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"    
[353] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[361] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor"
[369] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Tumor"    
[377] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"    
[385] "Non_Tumor" "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[393] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Tumor"     "Non_Tumor" "Tumor"    
[401] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor"
[409] "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor"
[417] "Non_Tumor" "Non_Tumor" "Tumor"     "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"    
[425] "Tumor"     "Tumor"     "Tumor"     "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"    
[433] "Non_Tumor" "Non_Tumor" "Tumor"     "Non_Tumor" "Tumor"     "Non_Tumor" "Non_Tumor" "Non_Tumor"
[441] "Non_Tumor" "Non_Tumor" "Non_Tumor" "Non_Tumor" "Tumor"    

  如下,可看到Non_Tumor有220个,Tumor 有225个。

> table(group_list1) 
group_list1
Non_Tumor     Tumor 
      220       225 
> save(dat1,group_list1,file = 'Expreset1.Rdata')

  
  

2.2.1.3、对gset[ 2 ]初步分析

  同理,可对gset[[2]]初步处理,以下为演示过程:
  1)、降级提取gset[2] :

> gset[[2]]  ##同理,可对gset[[2]]初步处理,以下为演示过程
ExpressionSet (storageMode: lockedEnvironment)
assayData: 22268 features, 43 samples  ##有22268个探针,43个样本
  element names: exprs 
protocolData: none
phenoData
  sampleNames: GSM362947 GSM362948 ... GSM363451 (43 total)
  varLabels: title geo_accession ... Tissue:ch1 (43 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 21159642 ##以下为pubMedIds
22202459
25597408
31022357
29209147
26058814
31828106
33748106
33771199
35367211
32502310 
Annotation: GPL571  ##依托的平台
> class(gset[[2]])
[1] "ExpressionSet" 
attr(,"package")
[1] "Biobase"

  
  2)、获取样本的表达矩阵,并将病人的临床信息按一定依据分组:

> dat2<-exprs(gset[[2]])##使用函数exprs获取样本表达矩阵
> pd2<-pData(gset[[2]]) ##使用函数pData获取样本临床信息(如性别、年龄、肿瘤分期等等)

在这里插入图片描述
  
  3)、分组,初步处理数据与保存:
  如下,将病人分为了三类,Healthy有2个,Non_Tumor_HCC 有19个,Tumor_HCC 有22个。

> group_list2<-ifelse(pd2$characteristics_ch1=="Tissue: Liver Non-Tumor Tissue","Non_Tumor_HCC",
+                     ifelse(pd2$characteristics_ch1=="Tissue: Liver Tumor Tissue","Tumor_HCC","Healthy"))
> table(group_list2)
group_list2
      Healthy Non_Tumor_HCC     Tumor_HCC 
            2            19            22 
> save(dat2,group_list2,file = 'Expreset2.Rdata')

  
  
  
  

2.2.2、该部分整体脚本展示

###一、下载表达矩阵的信息以及初步数据处理
#####################################################
rm(list = ls()) ##该代码可用于清空environment中的相关数据。
options(stringsAsFactors = F) ##字符串是否作为因子?此处我们选择的是false。
f='GSE14520_eSet.Rdata' ##这里填写的是我们需要下载的GSE编号


##要下载GEO数据库信息,需要下载GEOquery包,但其是包含在BiocManager包中的一个包,因此需要先下载BiocManager包
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")##下载"BiocManager"包
if (!requireNamespace("GEOquery", quietly = TRUE))
  BiocManager::install("GEOquery")##下载"GEOquery"包
library(GEOquery)##加载包

##下载'GSE14520'这个数据 
if(!file.exists(f)){
  gset <- getGEO('GSE14520', destdir=".",
                 AnnotGPL = F, ##注释文件   
                 getGPL = F)   ##平台文件   
  save(gset,file=f)            ##保存到本地

}

load('GSE14520_eSet.Rdata')   
class(gset) ##查看gset的类型

gset[[1]]   ##降级提取gset
class(gset[[1]])    ##查看文件一的数据类型:为表达数组

dat1<-exprs(gset[[1]])##使用函数exprs获取样本表达矩阵
pd1<-pData(gset[[1]]) ##使用函数pData获取样本临床信息(如性别、年龄、肿瘤分期等等)
group_list1<-ifelse(pd1$characteristics_ch1=="Tissue: Liver Tumor Tissue"|
pd1$characteristics_ch1=="tissue: Liver Tumor Tissue",'Tumor','Non_Tumor')
                    
group_list1 ##查看group_list1
table(group_list1) ##整体汇总查看
save(dat1,group_list1,file = 'Expreset1.Rdata') ##将获取的这份信息输出保存

gset[[2]]  ##同理,可对gset[[2]]初步处理,以下为演示过程
class(gset[[2]])

dat2<-exprs(gset[[2]])##使用函数exprs获取样本表达矩阵
pd2<-pData(gset[[2]]) ##使用函数pData获取样本临床信息(如性别、年龄、肿瘤分期等等)
group_list2<-ifelse(pd2$characteristics_ch1=="Tissue: Liver Non-Tumor Tissue","Non_Tumor_HCC",
                    ifelse(pd2$characteristics_ch1=="Tissue: Liver Tumor Tissue","Tumor_HCC","Healthy"))
                    
table(group_list2)
save(dat2,group_list2,file = 'Expreset2.Rdata')
#####################################################

  
  
  
  
  

2.3、以gset[1]中数据为例,进行数据检验

  1)、总述:
  该步骤目的: 主要是为了检验我们下载的数据是否能够进行分析,以及初步展示数据情况。
  主要方法:
    ①箱线图
    ②PCA主成分分析
    ③层次聚类分析
  

2.3.1、分阶段解析演示

2.3.1.1、绘制箱线图

  1)、过程演示:
  绘制箱线图时,考虑到Expreset1.Rdata是根据dat1生成的,而由上述内容其中含有442列数据,如果全部使用则绘制出来的箱线图特别密集,此处我们采取了前100数据作为观察dat1[,1:100]

> rm(list = ls())  ##清空environment中的相关数据
> options(stringsAsFactors = F) ##取消字符串作为因子的设置
> load(file = 'Expreset1.Rdata')  ##加载我们在步骤一中保存的Expreset1.Rdata数据
> boxplot(dat1[,1:100],cex=0.2,las=2,col="red") ##画箱线图

  cex=0.2缩小到标准的0.2倍,col="red"颜色为红色。
在这里插入图片描述
  ①如图,由红色区域显示可知,用于观测的这100个样本的基因表达相对集中,在4~6之间,中位数也大致位于一条线上。
  ②若箱线图显示出的基因表达矩阵分布差距比较大,就需要对数据进行标准化、归一化。
  
  
  

2.3.1.2、PCA主成分分析

  1)、简述:

  PCA主成分分析主要目的是将数据进行降维处理。降维就是一种对高维度特征数据预处理方法。PCA主成分分析方法,是一种使用最广泛的数据降维算法。

  以我们这次的数据为例,查看dat1时,我们统计了该数据探针数量为22268个,经过PCA降维处理,可将这些数据分为几类,然后我们分析这几类的表达差异即可。
  

  2)、过程演示一:数据处理
  ①预处理:(非必要工作,视情况而定)

> rm(list = ls())  ##清空environment中的相关数据
> options(stringsAsFactors = F) ##取消字符串作为因子的设置
> load(file = 'Expreset1.Rdata')  ##加载我们在步骤一中保存的Expreset1.Rdata数据

  ②在进行PCA主成分分析前,每次都要检测数据。如下,我们提取了矩阵的前四行、前四列检测。发现其行是GSM编号(样本名),列是探针名。

> dat1[1:4,1:4]##在进行PCA主成分分析前,每次都要检测数据
          GSM362958 GSM362959 GSM362960 GSM362961
1007_s_at     6.876     7.648     7.915     6.662
1053_at       4.651     4.283     4.250     4.105
117_at        6.775     3.796     3.380     4.483
121_at        5.578     6.213     5.579     6.590

  ③画PCA图时,要求是行名是样本名,列名是探针名,因此我们需要对矩阵行转置。

> dat1<-t(dat1)##画PCA图时要求是行名是样本名,列名是探针名,因此对矩阵进行转置
> dat1[1:4,1:4]##查看是否转置成功
          1007_s_at 1053_at 117_at 121_at
GSM362958     6.876   4.651  6.775  5.578
GSM362959     7.648   4.283  3.796  6.213
GSM362960     7.915   4.250  3.380  5.579
GSM362961     6.662   4.105  4.483  6.590

在这里插入图片描述
  ④将矩阵转换为数据框,并将分组信息(即'Tumor','Non_Tumor')作为最后一列加入dat1中。

> class(dat1);
[1] "matrix" "array"
> dat1<-as.data.frame(dat1)##将matrix转换为data.frame
> dat1<-cbind(dat1,group_list1)##cbind横向追加,即将分组信息group_list1追加到最后一列
> class(dat1);
[1] "data.frame"

在这里插入图片描述
  
  
  3)、过程演示二:画图
  ①画主成分分析图需要加载"FactoMineR""factoextra"这两个包。
在这里插入图片描述

library("FactoMineR")##画主成分分析图需要加载这两个包
library("factoextra") 
dat.pca <- PCA(dat1[,-ncol(dat1)], graph = FALSE)##将矩阵进行PCA分析,不包含最后一列(即我们的分组信息)
head(dat.pca$ind$coord)

  用head查看以下我们进行的PCA分析结果,如下,它将数据分为了五个维度:

> head(dat.pca$ind$coord)
              Dim.1     Dim.2     Dim.3    Dim.4     Dim.5
GSM362958 -37.72371  36.03526  3.130064 59.37616 -20.15968
GSM362959  -7.16702  62.49527 37.802374 34.30964 -37.75507
GSM362960  18.08779  68.40447 40.345610 57.98628 -23.63783
GSM362961 142.87247  45.84149 60.418633 50.58922 -55.68823
GSM362962  53.39154 -15.62183 14.978976 43.15879 -33.99242
GSM362963  74.05701 -11.75220 17.999868 42.29533 -25.63312

  ②以上述dat.pca结果画图:

> fviz_pca_ind(dat.pca,
+              geom.ind = "point", # show points only (nbut not "text")
+              col.ind = dat1$group_list1, # color by groups
+              palette = c("#00AFBB", "#E7B800"),
+              addEllipses = TRUE, # Concentration ellipses
+              legend.title = "Groups"
+ )

在这里插入图片描述
  

ggsave('Expreset1_PCA.png') ##这句代码可以将画出的图像以矢量形式存储。

  也可以通过下述export直接导出。
在这里插入图片描述

  
  
  

2.3.1.3、层次聚类分析

  聚类分析法(Cluster Analysis) 是在多元统计分析中研究如何对样品(或指标)进行分类的一种统计方法,它直接比较各事物之间的性质,将性质相近的归为一类,将性质差别较大的归入不同的类。

  操作如下:

> rm(list = ls())  ##清空environment中的相关数据
> options(stringsAsFactors = F) ##取消字符串作为因子的设置
> load(file = 'Expreset1.Rdata') ##加载我们在步骤一中保存的Expreset1.Rdata数据
> dat1[1:4,1:4]##每次都要检测数据
          GSM362958 GSM362959 GSM362960 GSM362961
1007_s_at     6.876     7.648     7.915     6.662
1053_at       4.651     4.283     4.250     4.105
117_at        6.775     3.796     3.380     4.483
121_at        5.578     6.213     5.579     6.590

  层次聚类分析同样要求行名是样本名,列名是探针名,因此需要将矩阵转置

> dat1<-t(dat1)##层次聚类分析要求行名是样本名,列名是探针名,因此此时需要转置
> dat1[1:4,1:4]
          1007_s_at 1053_at 117_at 121_at
GSM362958     6.876   4.651  6.775  5.578
GSM362959     7.648   4.283  3.796  6.213
GSM362960     7.915   4.250  3.380  5.579
GSM362961     6.662   4.105  4.483  6.590

  以下是用d计算基因表达相近的样本的距离

> d<-dist(dat1)
> fit.complete<-hclust(d,method="complete")##hclust层次聚类
> plot(fit.complete,hang = -1,cex=0.8)##将聚类的结果绘制出来

在这里插入图片描述

  
  

2.3.2、该部分整体脚本展示


###二、数据的检验
#####################################################
##箱线图
rm(list = ls())  ##清空environment中的相关数据
options(stringsAsFactors = F)
load(file = 'Expreset1.Rdata')
boxplot(dat1[,1:100],cex=0.2,las=2,col="red")



##PCA主成分分析
rm(list = ls())  ##清空environment中的相关数据
options(stringsAsFactors = F)
load(file = 'Expreset1.Rdata')

dat1[1:4,1:4]##在进行PCA主成分分析前,每次都要检测数据
dat1<-t(dat1)##画PCA图时要求是行名是样本名,列名是探针名,因此对矩阵进行转置
dat1[1:4,1:4]##查看是否转置成功

class(dat1);
dat1<-as.data.frame(dat1)##将matrix转换为data.frame
dat1<-cbind(dat1,group_list1)##cbind横向追加,即将分组信息group_list1追加到最后一列
class(dat1);

library("FactoMineR")##画主成分分析图需要加载这两个包
library("factoextra") 
dat.pca <- PCA(dat1[,-ncol(dat1)], graph = FALSE)##将矩阵进行PCA分析,不包含最后一列(即我们的)
head(dat.pca$ind$coord)
fviz_pca_ind(dat.pca,
             geom.ind = "point", # show points only (nbut not "text")
             col.ind = dat1$group_list1, # color by groups
             palette = c("#00AFBB", "#E7B800"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups"
)
ggsave('Expreset1_PCA.png') 




###层次聚类分析
rm(list = ls())  ##清空environment中的相关数据
options(stringsAsFactors = F) ##取消字符串作为因子的设置
load(file = 'Expreset1.Rdata') ##加载我们在步骤一中保存的Expreset1.Rdata数据
dat1[1:4,1:4]##每次都要检测数据

dat1<-t(dat1)##层次聚类分析要求行名是样本名,列名是探针名,因此需要将矩阵转置
dat1[1:4,1:4]

##此处是用d计算基因表达相近的样本的距离
d<-dist(dat1)
fit.complete<-hclust(d,method="complete")##hclust层次聚类
plot(fit.complete,hang = -1,cex=0.8)##将聚类的结果绘制出来

##扩充:
##使用factoextra,igraph包对它进行美化,首先画一张基础的分类图
library(factoextra)
library(igraph)
fviz_dend(fit.complete)##基础图
heatmap(as.matrix(d))##热图
#####################################################

  
  
  

2.4、以gset[1]中数据为例,将探针ID转换为基因ID

  在上述过程中,我们知道dat1数据行名为探针名称,而我们并不知道它所对应的基因名称。故我们需要将探针的ID号转换为基因ID号。
在这里插入图片描述

2.4.1、分阶段解析演示

  ①预处理:

rm(list = ls()) 
options(stringsAsFactors = F)
load(file = 'Expreset1.Rdata')

  ②要想将探针的ID号转换为基因的ID号,需要知道所依托的芯片平台。

> gset[[1]] ##一中我们可用于降维提取时使用过,此处用来查看芯片平台
ExpressionSet (storageMode: lockedEnvironment)
assayData: 22268 features, 445 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: GSM362958 GSM362959 ... GSM712542 (445 total)
  varLabels: title geo_accession ... Tissue:ch1 (46 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 21159642
22202459
25597408
31022357
29209147
26058814
31828106
33748106
33771199
35367211
32502310 
Annotation: GPL3921

  ③如上图所示,其GPL平台是GPL3921,我们需要提取GPL3921芯片平台的探针ID和对应的基因,这里我们借助了相关的R包。而对这些R包的整理,此处附上一个网址:用R获取芯片探针与基因的对应关系三部曲
在这里插入图片描述
  查询可得需要下载"hthgu133a.db"包,以下为相关代码,若"BiocManager"包没下载也需要一并下载,因为前者依托于后者中。

if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")##下载"BiocManager"包,注意.db
if (!requireNamespace("hthgu133a.db", quietly = TRUE))
  BiocManager::install("hthgu133a.db")##下载"hthgu133a.db"包

  下载好后需要提取GPL3921芯片平台的探针ID和对应的基因。

> library(hthgu133a.db)
> ls("package:hthgu133a.db")##查看包中相关数据
 [1] "hthgu133a"             
 [2] "hthgu133a.db"          
 [3] "hthgu133a_dbconn"      
 [4] "hthgu133a_dbfile"      
 [5] "hthgu133a_dbInfo"      
 [6] "hthgu133a_dbschema"    
 [7] "hthgu133aACCNUM"       
 [8] "hthgu133aALIAS2PROBE"  
 [9] "hthgu133aCHR"          
[10] "hthgu133aCHRLENGTHS"   
[11] "hthgu133aCHRLOC"       
[12] "hthgu133aCHRLOCEND"    
[13] "hthgu133aENSEMBL"      
[14] "hthgu133aENSEMBL2PROBE"
[15] "hthgu133aENTREZID"     
[16] "hthgu133aENZYME"       
[17] "hthgu133aENZYME2PROBE" 
[18] "hthgu133aGENENAME"     
[19] "hthgu133aGO"           
[20] "hthgu133aGO2ALLPROBES" 
[21] "hthgu133aGO2PROBE"     
[22] "hthgu133aMAP"          
[23] "hthgu133aMAPCOUNTS"    
[24] "hthgu133aOMIM"         
[25] "hthgu133aORGANISM"     
[26] "hthgu133aORGPKG"       
[27] "hthgu133aPATH"         
[28] "hthgu133aPATH2PROBE"   
[29] "hthgu133aPFAM"         
[30] "hthgu133aPMID"         
[31] "hthgu133aPMID2PROBE"   
[32] "hthgu133aPROSITE"      
[33] "hthgu133aREFSEQ"       
[34] "hthgu133aSYMBOL"       
[35] "hthgu133aUNIPROT"  

ids <- toTable(hthgu133aSYMBOL)##提取GPL3921芯片平台的探针ID和对应的基因:SYMBOL是我们需要的注释信息ids

  ④现在就可以将dat1中探针ID变为基因名,演示如下:

> dat1<-as.data.frame(dat1)##先把表达矩阵变为数据框
> dat1$probe_id<-rownames(dat1)##将探针ID添加到dat1表达矩阵的新的一列
> dat1<-merge(dat1,ids,by='probe_id')#通过merge()函数,将dat1的探针id与芯片平台探针id相匹配,合并到dat1

  ⑤我们查看以下合成的dat1,最后一列为symbol,说明我们成功合并基因名称。但能发现的是,其中一些探针的基因名称是重复的。因此需要对多个探针的基因做处理。
在这里插入图片描述

> library(limma)##取平均值需要limma这个包
> dat1<-avereps(dat1[,-c(1,447)],ID=dat1$symbol)
> dat1<-as.matrix(dat1)##转换
> save(dat1,group_list1,file = 'Expreset3.Rdata')

在这里插入图片描述

  
  
  
  

2.4.2、该部分整体脚本展示


###三、探针ID转换为基因ID
#####################################################
rm(list = ls()) 
options(stringsAsFactors = F)
load(file = 'Expreset1.Rdata')

gset[[1]] ##一中我们可用于降维提取时使用过,此处用来查看芯片平台

if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")##下载"BiocManager"包
if (!requireNamespace("hthgu133a.db", quietly = TRUE))
  BiocManager::install("hthgu133a.db")##下载"hthgu133a.db"包
library(hthgu133a.db)
ls("package:hthgu133a.db")##查看相关数据
ids <- toTable(hthgu133aSYMBOL)##提取GPL3921芯片平台的探针ID和对应的基因:SYMBOL是我们需要的注释信息ids

dat1<-as.data.frame(dat1)##先把表达矩阵变为数据框
dat1$probe_id<-rownames(dat1)##将探针ID添加到dat1表达矩阵的新的一列
dat1<-merge(dat1,ids,by='probe_id')#通过merge()函数,将dat1的探针id与芯片平台探针id相匹配,合并到dat1

#多个探针检测一个基因,合并一起,取其平均值
library(limma)##取平均值需要limma这个包
dat1<-avereps(dat1[,-c(1,447)],ID=dat1$symbol)
dat1<-as.matrix(dat1)##转换
save(dat1,group_list1,file = 'Expreset3.Rdata')

#####################################################

  
  
  
  

2.5、基于上述步骤,进行基因的差异性分析

2.5.1、分阶段解析演示

2.5.1.1、箱线图和t检验

  ①要注意加载正确的表达矩阵,此处需要的是2.5章节中转换后的dat1。

> rm(list = ls())  ##一键清空
> options(stringsAsFactors = F)
> load(file = 'Expreset3.Rdata')##注意此处需要用探针ID转换为基因ID后的数据

> dat1[1:4,1:4]##每次都要检测数据:可以看到行名为基因名
      GSM362958 GSM362959 GSM362960 GSM362961
DDR1   5.493500  6.311000    6.5640  5.059750
RFC2   4.768500  4.440000    4.3280  4.059500
HSPA6  8.083500  4.098500    3.7135  4.338500
PAX8   3.737125  3.920625    3.8765  4.300875


> table(group_list1) #table函数,查看group_list1中的分组个数
group_list1
Non_Tumor     Tumor 
      220       225 

  ②对基因以group_list分组画箱线图
  Ⅰ、第一个基因:由下述代码可知,第一个基因Non_Tumor平均值为4.336030 ,Tumor 平均值为4.974918 。

> boxplot(dat1[1,]~group_list1) ##一个基因以group_list分组画箱线图
> t.test(dat1[1,]~group_list1)  ##对第一个基因做t检验

	Welch Two Sample t-test

data:  dat1[1, ] by group_list1
t = -5.0617, df = 337.1, p-value = 6.849e-07
alternative hypothesis: true difference in means between group Non_Tumor and group Tumor is not equal to 0
95 percent confidence interval:
 -0.5000559 -0.2201685
sample estimates:
mean in group Non_Tumor     mean in group Tumor 
               5.352051                5.712163 

在这里插入图片描述

  Ⅱ、第二个基因:由下述代码可知,第二个基因Non_Tumor平均值为4.336030 ,Tumor 平均值为4.974918 。

> boxplot(dat1[2,]~group_list1) ##第二个基因以group_list分组画箱线图
> t.test(dat1[2,]~group_list1)  ##对第二个基因做t检验

	Welch Two Sample t-test

data:  dat1[2, ] by group_list1
t = -15.524, df = 299.17, p-value < 2.2e-16
alternative hypothesis: true difference in means between group Non_Tumor and group Tumor is not equal to 0
95 percent confidence interval:
 -0.7198772 -0.5578993
sample estimates:
mean in group Non_Tumor     mean in group Tumor 
               4.336030                4.974918 

在这里插入图片描述
  Ⅲ、自定义一个函数,用于上述重复性操作,其中做了数据美化处理。

> bp=function(g){         ##自定义一个函数bp,函数为{}里的内容
+   library(ggpubr)
+   df=data.frame(gene=g,stage=group_list1)
+   p <- ggboxplot(df, x = "stage", y = "gene",
+                  color = "stage", palette = "jco",
+                  add = "jitter")
+   #  Add p-value
+   p + stat_compare_means()
+ }
> bp(dat1[3,]) ## 调用上面定义好的函数,避免同样的绘图代码重复多次敲。
##同理可尝试其它:
##bp(dat1[1,])
##bp(dat1[2,])
##bp(dat1[4,])
##……

在这里插入图片描述

  
  

2.5.1.2、差异分析走标准的limma流程

  1)、概述:
  由于上述2.5.1.1中的差异化分析是一个基因一个基因进行的,相对比较低效麻烦,此处我们可以直接对整体的数据进行差异化分析,则需要走limma流程。
  走limma流程前首先要准备的相关数据:
    ①表达矩阵:上述步骤中的dat1即是。
    ②分组矩阵:我们没有,需要创建。
    ③差异比较矩阵:我们没有,也需要创建。

  2)、分组矩阵创建:
  代码如下:

##差异分析走标准的limma流程
> library(limma)
> design=model.matrix(~0+factor(group_list1))##创建一个分组的矩阵
> colnames(design)=levels(factor(group_list1))
> rownames(design)=colnames(dat1)
> head(design)
          Non_Tumor Tumor
GSM362958         0     1
GSM362959         0     1
GSM362960         0     1
GSM362961         1     0
GSM362962         1     0
GSM362963         1     0

  分组矩阵中,将矩阵分为Non_TumorTumor两个部分,0表示否/false,1表示是/true。
  例如上述GSM362958 Non_Tumor=0即其不是非肿瘤组,Tumor=1,即其是肿瘤组。

  
  
  3)、差异比较矩阵创建:
  代码如下:

> ##创建差异比较矩阵
> contrast.matrix<-makeContrasts(paste0(unique(group_list1),collapse = "-"),levels = design)
> contrast.matrix ##这个矩阵声明,我们要Tumor组和Non_Tumor组进行差异分析比较
           Contrasts
Levels      Tumor-Non_Tumor
  Non_Tumor              -1
  Tumor                   1

  
  
  4)、limma流程三板斧:

  ①第一步lmFit:lmFit为每个基因给定一系列的阵列来拟合线性模型

> ##limma流程三板斧:
> ##第一步lmFit
> ##lmFit为每个基因给定一系列的阵列来拟合线性模型
> fit<-lmFit(dat1,design)

  ②第二步eBayes:eBayes给出了一个微阵列线性模型拟合,通过经验贝叶斯调整标准误差到一个共同的值来计算修正后的t统计量、修正后的f统计量和微分表达式的对数概率。

> ##第二步eBayes
> ##eBayes给出了一个微阵列线性模型拟合,
> ##通过经验贝叶斯调整标准误差到一个共同的值来计算修正后的t统计量、修正后的f统计量和微分表达式的对数概率。
> fit2<-contrasts.fit(fit, contrast.matrix)
> fit2<-eBayes(fit2)

  ③第三步topTable:topTable是从线性模型拟合中提取出排名靠前的基因表。

> ##第三步topTable
> ##topTable是从线性模型拟合中提取出排名靠前的基因表。
> options(digits = 4) #设置全局的数字有效位数为4
> ##topTable(fit2,coef=2,adjust='BH')

  然后我们就得到的相关数据:

> tempOutput<-topTable(fit2,coef=1,n=Inf) 
> tempOutput<-na.omit(tempOutput)##如果有NA值,则需要移除
> head(tempOutput)
        logFC AveExpr      t    P.Value  adj.P.Val     B
ECM1   -2.378   6.391 -43.73 2.164e-163 2.736e-159 363.0
VIPR1  -2.853   5.699 -41.68 6.499e-156 4.108e-152 345.9
CXCL14 -3.456   5.139 -41.41 6.570e-155 2.769e-151 343.6
STAB2  -1.917   4.889 -38.03 4.833e-142 1.528e-138 314.1
FCN3   -3.361   7.373 -36.66 1.153e-136 2.916e-133 301.7
CYP1A2 -4.718   7.868 -35.47 6.700e-132 1.412e-128 290.8

在这里插入图片描述
  如果要提取某一特定基因,相关操作如下:

> tempOutput["CCL5",]
       logFC AveExpr      t   P.Value adj.P.Val     B
CCL5 -0.7769   5.547 -8.898 1.439e-17 5.193e-17 28.59

> tempOutput["VIPR1",]
       logFC AveExpr      t    P.Value  adj.P.Val     B
VIPR1 -2.853   5.699 -41.68 6.499e-156 4.108e-152 345.9

  
  
  
  

2.5.1.3、查看上调基因和下调基因

##上调基因和下调基因:使用了条件语句
tempOutput$g=ifelse(tempOutput$P.Value>0.01,'stable', 
##if 判断:如果这一基因的P.Value>0.01,则为stable基因
  ifelse( tempOutput$logFC >1.5,'up', 
  ##接上句else 否则:接下来开始判断那些P.Value<0.01的基因,再if 判断:如果logFC >1.5,则为up(上调)基因
  ifelse( tempOutput$logFC < -1.5,'down','stable') )
  ##接上句else 否则:接下来开始判断那些logFC <1.5 的基因,再if 判断:如果logFC <1.5,则为down(下调)基因,否则为stable基因
)
> table(tempOutput$g)

  down stable     up 
   232  12325     86 

  可看到上调基因86个,下调基因232个,stable基因12325个。
在这里插入图片描述
  
  

2.5.2、该部分整体脚本展示

###四、基因的差异性分析
#####################################################
rm(list = ls())  ##一键清空
options(stringsAsFactors = F)
load(file = 'Expreset3.Rdata')##注意此处需要用探针ID转换为基于ID后的数据
dat1[1:4,1:4]##每次都要检测数据:可以看到行名为基因名
table(group_list1) ##table函数,查看group_list1中的分组个数

boxplot(dat1[1,]~group_list1) ##一个基因以group_list分组画箱线图
t.test(dat1[1,]~group_list1)  ##对第一个基因做t检验

boxplot(dat1[2,]~group_list1) ##第二个基因以group_list分组画箱线图
t.test(dat1[2,]~group_list1)  ##对第二个基因做t检验


bp=function(g){         ##自定义一个函数bp,函数为{}里的内容
  library(ggpubr)
  df=data.frame(gene=g,stage=group_list1)
  p <- ggboxplot(df, x = "stage", y = "gene",
                 color = "stage", palette = "jco",
                 add = "jitter")
  #  Add p-value
  p + stat_compare_means()
}
bp(dat1[3,]) ## 调用上面定义好的函数,避免同样的绘图代码重复多次敲。
##同理可尝试其它:
bp(dat1[1,])
bp(dat1[2,])
bp(dat1[4,])
##……







##差异分析走标准的limma流程
library(limma)

##创建一个分组的矩阵
design=model.matrix(~0+factor(group_list1))##创建一个分组的矩阵
colnames(design)=levels(factor(group_list1))
rownames(design)=colnames(dat1)
head(design)

##创建差异比较矩阵
contrast.matrix<-makeContrasts(paste0(unique(group_list1),collapse = "-"),levels = design)
contrast.matrix ##这个矩阵声明,我们要Tumor组和Non_Tumor组进行差异分析比较

##limma流程三板斧:
##第一步lmFit
##lmFit为每个基因给定一系列的阵列来拟合线性模型
fit<-lmFit(dat1,design)

##第二步eBayes
##eBayes给出了一个微阵列线性模型拟合,
##通过经验贝叶斯调整标准误差到一个共同的值来计算修正后的t统计量、修正后的f统计量和微分表达式的对数概率。
fit2<-contrasts.fit(fit, contrast.matrix)
fit2<-eBayes(fit2)

##第三步topTable
##topTable是从线性模型拟合中提取出排名靠前的基因表。
options(digits = 4) #设置全局的数字有效位数为4
##topTable(fit2,coef=2,adjust='BH') 

##再运行以下我们输出的数据,就得到了相关基因
tempOutput<-topTable(fit2,coef=1,n=Inf) 
tempOutput<-na.omit(tempOutput)##如果有NA值,则需要移除
head(tempOutput)
##提取其中特定基因:
tempOutput["CCL5",]
tempOutput["VIPR1",]





##上调基因和下调基因:使用了条件语句
tempOutput$g=ifelse(tempOutput$P.Value>0.01,'stable',
  ##if 判断:如果这一基因的P.Value>0.01,则为stable基因
  ifelse( tempOutput$logFC >1.5,'up', 
  ##接上句else 否则:接下来开始判断那些P.Value<0.01的基因,再if 判断:如果logFC >1.5,则为up(上调)基因
  ifelse( tempOutput$logFC < -1.5,'down','stable') )
  ##接上句else 否则:接下来开始判断那些logFC <1.5 的基因,再if 判断:如果logFC <1.5,则为down(下调)基因,否则为stable基因
)
table(tempOutput$g)
save(dat1,group_list1,tempOutput,file = 'tempOutput.Rdata')

#####################################################

  
  
  
  

2.6、基于上述步骤,绘制火山图、热图

2.6.1、分阶段解析演示

2.6.1.1、火山图

  ①数据加载:

rm(list = ls())  ## 一键清空
options(stringsAsFactors = F)
load(file = 'tempOutput.Rdata')

  ②以R自带函数绘制火山图

> DEG<-tempOutput##创建一个名为DEG的对象:后续对使用该数据进行增删查改操作,不影响原始数据
> head(DEG)
        logFC AveExpr      t    P.Value  adj.P.Val     B    g
ECM1   -2.378   6.391 -43.73 2.164e-163 2.736e-159 363.0 down
VIPR1  -2.853   5.699 -41.68 6.499e-156 4.108e-152 345.9 down
CXCL14 -3.456   5.139 -41.41 6.570e-155 2.769e-151 343.6 down
STAB2  -1.917   4.889 -38.03 4.833e-142 1.528e-138 314.1 down
FCN3   -3.361   7.373 -36.66 1.153e-136 2.916e-133 301.7 down
CYP1A2 -4.718   7.868 -35.47 6.700e-132 1.412e-128 290.8 down
attach(DEG)
plot(logFC,-log10(P.Value))##使用R语言自带的函数绘制火山图

在这里插入图片描述

  ③以ggpubr绘制火山图

> library(ggpubr)##使用ggpubr绘制火山图
> df=DEG##再创建一个新的对象,用于后续绘图的临时操作
> df$v= -log10(P.Value) ##在df中新增加一列'v',值为-log10(P.Value)

  Ⅰ、基础绘制

> ggscatter(df, x = "logFC", y = "v",size=0.5) ##基础绘制

在这里插入图片描述

  
  Ⅱ、美化处理(一)

##根据基因上调下调添加颜色ggscatter(df, x = "AveExpr", y = "logFC",size = 0.2)
ggscatter(df, x = "logFC", y = "v",size=0.5,color = 'g')

在这里插入图片描述

  
  Ⅲ、美化处理(二)
  改变x、y轴的初始图和添加颜色后的图

ggscatter(df, x = "AveExpr", y = "logFC",size = 0.2)

在这里插入图片描述

> df$p_c = ifelse(df$P.Value<0.001,'p<0.001',
+                 ifelse(df$P.Value<0.01,'0.001<p<0.01','p>0.01'))
> table(df$p_c )

0.001<p<0.01      p<0.001       p>0.01 
         905         8561         3177
         
>ggscatter(df,x = "AveExpr", y = "logFC", color = "p_c",size=0.2, 
          palette = c("green", "red", "black") )        

在这里插入图片描述
  
  

2.6.1.2、热图

  ①数据加载:

rm(list = ls())  ## 一键清空
options(stringsAsFactors = F)
load(file = 'tempOutput.Rdata')

  ②数据检测和基因表达情况

> ##每次都要检测数据
> dat1[1:4,1:4]
      GSM362958 GSM362959 GSM362960 GSM362961
DDR1      5.494     6.311     6.564     5.060
RFC2      4.768     4.440     4.328     4.059
HSPA6     8.084     4.098     3.713     4.338
PAX8      3.737     3.921     3.876     4.301
> table(group_list1)
group_list1
Non_Tumor     Tumor 
      220       225 

  ③挑选差异最大、最小的100个基因

> ##挑选出差异最大100个基因和差异最小的100个基因
> x=tempOutput$logFC ##deg取logFC这列并将其重新赋值给x
> names(x)=row.names(tempOutput)##将基因名作为名字,命名给给x
> x[1:4] ##查看结果
  ECM1  VIPR1 CXCL14  STAB2 
-2.378 -2.853 -3.456 -1.917 

cg=c(names(head(sort(x),100)),names(tail(sort(x),100)))
##对x进行从小到大排列,取前100及后100,并取其对应的基因名,作为向量赋值给cg

  ④绘制热图:下载与加载相关R包

> install.packages("pheatmap")
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.2/pheatmap_1.0.12.zip'
Content type 'application/zip' length 78905 bytes (77 KB)
downloaded 77 KB

程序包‘pheatmap’打开成功,MD5和检查也通过

下载的二进制程序包在
	C:\Users\无咎\AppData\Local\Temp\Rtmpe0tV9z\downloaded_packages里
> library(pheatmap)##热图相关R包

  
  Ⅰ、对dat按照cg取行,所得到的矩阵来画热图

> pheatmap(dat1[cg,],show_colnames =F,show_rownames = F) 

在这里插入图片描述
  Ⅱ、对log-ratio数值进行归一化后进行热图绘制

> n=t(scale(t(dat1[cg,])))##通过“scale”对log-ratio数值进行归一化
##scale()函数需要行是样本名,列是基因名,所以需要转置,然后再转置回来。
> n[n>2]=2
> n[n< -2]= -2
> n[1:4,1:4]
        GSM362958 GSM362959 GSM362960 GSM362961
HAMP       -1.692   -0.4746   -0.5258   0.93232
CYP1A2     -1.479   -0.9950   -1.0875   0.55476
MT1M       -1.347   -0.6389   -1.3781  -0.08755
SLC22A1    -1.447   -1.5096   -1.0158   0.72860
> pheatmap(n,show_colnames =F,show_rownames = F)

在这里插入图片描述
  Ⅲ、以‘Non_Tumor’‘Tumor’分组画热图

 ac=data.frame(g=group_list1)
> rownames(ac)=colnames(n) ##将ac的行名也就分组信息(是‘Non_Tumor’还是‘Tumor’)给到n的列名,即热图中位于上方的分组信息
> pheatmap(n,show_colnames =F,
+          show_rownames = F,
+          cluster_cols = F, 
+          annotation_col=ac) ##列名注释信息为ac即分组信息

在这里插入图片描述

  
  
  

2.6.2、该部分整体脚本展示

## for volcano 火山图
#####################################################
rm(list = ls())  ## 一键清空
options(stringsAsFactors = F)
load(file = 'tempOutput.Rdata')

DEG<-tempOutput##创建一个名为DEG的对象:后续对使用该数据进行增删查改操作,不影响原始数据
head(DEG)
attach(DEG)
plot(logFC,-log10(P.Value))##使用R语言自带的函数绘制火山图

library(ggpubr)##使用ggpubr绘制火山图
df=DEG##再创建一个新的对象,用于后续绘图的临时操作
df$v= -log10(P.Value) ##在df中新增加一列'v',值为-log10(P.Value)

ggscatter(df, x = "logFC", y = "v",size=0.5) ##基础绘制
ggscatter(df, x = "logFC", y = "v",size=0.5,color = 'g')##根据基因上调下调添加颜色

ggscatter(df, x = "AveExpr", y = "logFC",size = 0.2)

df$p_c = ifelse(df$P.Value<0.001,'p<0.001',
                ifelse(df$P.Value<0.01,'0.001<p<0.01','p>0.01'))
table(df$p_c )
ggscatter(df,x = "AveExpr", y = "logFC", color = "p_c",size=0.2, 
          palette = c("green", "red", "black") )

#####################################################
## for heatmap 热图
#####################################################
rm(list = ls())  ##一键清空
options(stringsAsFactors = F)
load(file = 'tempOutput.Rdata')

##每次都要检测数据
dat1[1:4,1:4]
table(group_list1)

##挑选出差异最大100个基因和差异最小的100个基因
x=tempOutput$logFC ##取logFC这列并将其重新赋值给x
names(x)=row.names(tempOutput)##将基因名作为名字,命名给给x
x[1:4]##查看结果
cg=c(names(head(sort(x),100)),names(tail(sort(x),100)))
##对x进行从小到大排列,取前100及后100,并取其对应的基因名,作为向量赋值给cg

library(pheatmap)##热图相关R包
pheatmap(dat1[cg,],show_colnames =F,show_rownames = F) ##对dat按照cg取行,所得到的矩阵来画热图




n=t(scale(t(dat1[cg,])))##通过“scale”对log-ratio数值进行归一化
##scale()函数需要行是样本名,列是基因名,所以我们需要转置,然后再转置回来。
n[n>2]=2
n[n< -2]= -2
n[1:4,1:4]
pheatmap(n,show_colnames =F,show_rownames = F)

##以‘Non_Tumor’和‘Tumor’分组画热图
ac=data.frame(g=group_list1)
rownames(ac)=colnames(n) 
##将ac的行名也就分组信息(是‘Non_Tumor’还是‘Tumor’)给到n的列名,即热图中位于上方的分组信息
pheatmap(n,show_colnames =F,
         show_rownames = F,
         cluster_cols = F, 
         annotation_col=ac) ##列名注释信息为ac即分组信息
#####################################################

  

  相关参考:
  1、R语言进行GEO数据挖掘与分析
  2、主成分分析(PCA)原理详解
  3、基于R语言做层次聚类分析
  4、一个GSE有两个GPL该怎么办
  
  
  
  
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于requests框架实现接口自动化测试项目实战

requests库是一个常用的用于http请求的模块&#xff0c;它使用python语言编写&#xff0c;在当下python系列的接口自动化中应用广泛&#xff0c;本文将带领大家深入学习这个库&#xff0c;Python环境的安装就不在这里赘述了&#xff0c;我们直接开干。 01 requests的安装 win…

销售结束语话术

销售要记住&#xff0c;结束语不代表结束&#xff0c;而是下一次沟通的开始&#xff0c;所以销售要学会通过结束语来为自己争取下次沟通的机会。 前言 不论是哪一行业&#xff0c;对于销售而言&#xff0c;大多数成交的客户都是经过持续有效的跟踪的&#xff0c;还会出现有很多…

Java设计模式-原型模式Prototype

介绍 当我们有一个类的实例&#xff08;Prototype&#xff09;并且我们想通过复制原型来创建新对象时&#xff0c;通常使用Prototype模式。 原型模式是一种创建型设计模式。能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类。 场景举例 现在有一只羊 tom&#xf…

iTerm2连接ssh配置

iTerm2连接ssh配置 #首先在/Users目录下按照如下命令创建sh脚本 cd /Users/#创建iterm文件夹 mkdir iterm#进入iterm文件夹 cd iterm#创建myserver.sh文件 touch myserver.sh#编辑myserver.sh文件 vi myserver.sh如果出现没有权限&#xff0c;就命令前面加上sudo 键盘输入i编…

斯皮尔曼相关(spearman)相关性分析一文详解+python实例代码

前言 相关性分析算是很多算法以及建模的基础知识之一了&#xff0c;十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性系数就有三种&#xff1a;person相关系数&#xff0c;spearman相关系数&#xff0c;Kendalls tau-b等级相关系数…

Java + OpenCv 根据PID/VID调用指定摄像头

问题&#xff1a; 主机接入了多个USB摄像头&#xff0c;传统的OpenCv是用摄像头插入usb的下标调取的&#xff0c;如过只接入一个摄像头那直接使用capture.open(0);这种方式调用没有任何问题&#xff0c;多个的话&#xff0c;就会出现问题&#xff0c;因为USB拔插时候对应摄像头…

用原生的方式写vue组件之深度剖析组件内部的原理

目录前言一&#xff0c;对组件的复习及理解二&#xff0c;模块化与组件化三&#xff0c;用原生的方式写vue组件3.1 准备工作3.2 创建组件3.3 组件中的data为什么是函数式写法3.4 组件中的template四&#xff0c;注册组件五&#xff0c;使用组件六&#xff0c;全局组件七&#x…

阿里云服务器ECS购买教程

本文是关于阿里云主机&#xff08;服务器ECS&#xff09;购买流程的一个详细介绍。阿里云服务器&#xff08;Elastic Compute Service&#xff0c;简称 ECS&#xff09;是一种简单高效、处理能力可弹性伸缩的计算服务&#xff0c;帮助您快速构建更稳定、安全的应用&#xff0c;…

机器学习实战教程(十二):线性回归提高篇

一、前言本篇文章讲解线性回归的缩减方法&#xff0c;岭回归以及逐步线性回归&#xff0c;同时熟悉sklearn的岭回归使用方法&#xff0c;对乐高玩具套件的二手价格做出预测。二、岭回归如果数据的特征比样本点还多应该怎么办&#xff1f;很显然&#xff0c;此时我们不能再使用上…

【Elsevier出版社】1区智能物联网类SCIEI,审稿友好~

1区智能物联网类SCI&EI 【出版社】Elsevier 【期刊简介】IF&#xff1a;5.5-6.0&#xff0c;JCR1区&#xff0c;中科院3区 【检索情况】SCI&EI 双检&#xff0c;正刊 【参考周期】3个月左右录用 【截稿日期】2023.2.28 【征稿领域】 ①物联网辅助的智能解决方案…

送给SQL开发者的一份新年礼物!麦聪软件发布一款纯Web化SQL开发工具,免安装还免费!

2023年新年伊始&#xff0c;麦聪软件再次迎来一个好消息&#xff1a;一款100%自主研发的纯Web化SQL开发工具——SQL Studio 1.0正式发布。这款产品让SQL开发者在Navicat、DBeaver之外&#xff0c;又多一款值得信赖的SQL开发工具可用。 图片 目前&#xff0c;SQL Studio 1.0面向…

qt读写xml文件(DOM和SAX两种方式)

一、XML简介&#xff1a; XML, 全称为扩展标记语言, 可用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML非常适合万维网传输&#xff0c;提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据&#xff0c;是Internet环境…

纵向联邦线性回归实现-Federated Machine Learning Concept and Applications论文复现

本实验的算法实现思路来自这篇论文Federated Machine Learning Concept and Applications 文章目录场景介绍同态加密算法python的phe库实现了加法同态加密角色1角色2传统的线性回归纵向联邦线性回归纵向联邦线性回归代码实现导入工具包准备数据使用普通线性回归训练搭建训练过程…

什么神仙操作,用代码能画这样的图

大家好&#xff0c;我是车辙。不知道同学们画流程图或者时序图一般用的什么软件&#xff1f;Visio 还是 Process On 或者语雀&#xff1f; 因为公司原因&#xff0c;在很多情况下&#xff0c;我一般用语雀画流程图或者思维导图。不过凡事也有例外&#xff0c;对于比较简单的图…

你的电路是抄来的还是算出来的?

在你看这篇文章之前&#xff0c;我想提出几点说明&#xff1a; &#xff08;1&#xff09;最近在看拉扎维的书&#xff0c;写下来这些东西&#xff0c;这也只是我个人在学习过程中的一点总结&#xff0c;有什么观点大家可以相互交流&#xff1b;&#xff08;2&#xff09;不断的…

立创eda专业版学习笔记(3)(隐藏部分飞线)

又到了喜闻乐见的隐藏gnd飞线环节&#xff0c;我发现这个专业版的操作和标志版不一样&#xff0c;我想试一试这个标题的搜索结果&#xff0c;发现有用的结果还是很少&#xff0c;于是我也随便总结了一下&#xff0c;算是添砖加瓦吧。 原来的飞线是这个样子的&#xff1a; 现在我…

巧妙解决appleid问题答案忘了的问题

先说下这个问题解决办法的目标——主要是为了释放被占用的appleid邮箱&#xff0c;而如果你想保留该appleid并且正常使用的话&#xff0c;那么需要付出一点代价&#xff0c;也是可以做到的。 我最近就碰到这种情况&#xff0c;某个邮箱被appleid占用了&#xff0c;问题答案因为…

从实战出发,聊聊缓存数据库一致性

在云服务中&#xff0c;缓存是极其重要的一点。所谓缓存&#xff0c;其实是一个高速数据存储层。当缓存存在后&#xff0c;日后再次请求该数据就会直接访问缓存&#xff0c;提升数据访问的速度。但是缓存存储的数据通常是短暂性的&#xff0c;这就需要经常对缓存进行更新。而我…

Linux常用命令——lsb_release命令

在线Linux命令查询工具 lsb_release 显示发行版本信息 补充说明 LSB是Linux Standard Base的缩写&#xff0c;lsb_release命令用来显示LSB和特定版本的相关信息。如果使用该命令时不带参数&#xff0c;则默认加上-v参数。 -v 显示版本信息。 -i 显示发行版的id。 -d 显示该…

2023 Real World CTF 体验赛 --- wp

文章目录misc&#x1f411;了拼&#x1f411;webEvil MySQL ServerBe-a-Language-ExpertBe-a-Wiki-HackerYummy ApiApacheCommandTextmisc &#x1f411;了拼&#x1f411; 游戏类题目&#xff0c;直接打开js文件搜索rwctf&#xff0c;发现flag rwctf{wellcome_to_the_rwct…