基础生信分析的一下代码

###### 工作路径 ######

#获得路径
getwd()
#设置路径
setwd()
#删除环境变量
rm(list = ls())
## 保存使用save, 可以同时保存多个数据
save(cancergene,b,file = "twoinone.Rdata")
## 加载已有数据使用load
load(file = "twoinone.Rdata")
## 介绍apply()
rm(list = ls())
## apply 处理的是矩阵或者数据框的行或者列
## apply(X, MARGIN, FUN, …) 
## 其中X为一个数组;MARGIN为一个向量(表示要将函数FUN应用到X的行还是列),
## 若为1表示取行,为2表示取列,为c(1,2)表示行、列都计算。
#管道操作符
#%>%  是管道操作符在R语言中由magrittr包提供的,
#%>%的工作原理是将左侧的表达式的结果作为右侧表达式的第一个参数


###### 读取数据 ######
## 最常用的是read.table,速度最快最智能的是fread
fcsv1 = read.table(file = "data/B cell receptor signaling pathway.csv",sep = ",",header = T,stringsAsFactors = F,check.names = F)
fcsv2 = read.csv(file = "data/B cell receptor signaling pathway.csv",check.names = F)
fcsv3 = data.table::fread(file = "data/B cell receptor signaling pathway.csv")
class(fcsv3)
fcsv4 = data.table::fread(file = "data/B cell receptor signaling pathway.csv",data.table = F)
class(fcsv4)
fcsv5 <- as.data.frame(fcsv3)
class(fcsv5)

## 读取txt
platformMap1 <- read.table("data/platformMap.txt",sep = "\t",header = T,stringsAsFactors = F)
platformMap2 <- data.table::fread("data/platformMap.txt",data.table = F)

## 读取GEO数据
exprSet1 <- read.table("data/GSE42872_series_matrix.txt",sep = "\t",comment.char="!",stringsAsFactors=F,header=T)
exprSet2 <- data.table::fread("data/GSE42872_series_matrix.txt",skip = 59,data.table = F)

## 读取TCGA甲基化文件
expr_df <- data.table::fread("data/jhu-usc.edu_BRCA.HumanMethylation450.9.lvl-3.TCGA-BH-A1EV-11A-24D-A138-05.gdc_hg38.txt"
                             ,data.table = F)
## 读取TCGA数据RNAseq data counts 文件
RNAsEQ1 <- read.table("data/0e30bd18-8e8b-4c52-aace-b5587c6df51a.htseq.counts",header = F,stringsAsFactors = F,sep = "\t")
RNAsEQ2 <- data.table::fread("data/0e30bd18-8e8b-4c52-aace-b5587c6df51a.htseq.counts",data.table = F)

## 读取GEO平台注释信息soft文件
GPL6244_anno <-data.table::fread("data/GSE42872_family.soft",skip = "ID",data.table = F)

## GEO soft文件的通用读入(推荐使用,原理我们进阶后讲解)
library(GEOquery)
dd <- GEOquery:::parseGPL("data/GSE42872_family.soft")
data <- dd@dataTable@table

## 读取json文件
metadata <- jsonlite::fromJSON("data/metadata.cart.2018-10-04.json")

### 读取xml文件
library("XML")
result <- xmlParse(file = "data/nationwidechildrens.org_clinical.TCGA-3A-A9IS.xml")
rootnode <- xmlRoot(result)  
xmldataframe <- xmlToDataFrame(rootnode[2])





###### 导出图片以及编辑 ######
## 加载R包
library(export)
## 导成PPT可编辑的格式
graph2ppt(file="dotplot2.pptx")

## 导成AI可以编辑的状态
graph2eps(file="dotplot2.eps")
graph2pdf(file="dotplot2.pdf")
graph2png(file="dotplot2.png")
graph2tif(file="dotplot2.tif")

###### 数据初步处理(TCGA) ######
rm(list = ls())

## 数据调整实战!!:获取清洁数据,表达量绘图,相关性分析
## 最终我们会获得任何一个gene在特定癌症中的表达情况并作图
## 包含的核心步骤
## 1. 获取表达量数据
## 2. 行列转换
## 3. 添加分组信息

### 1.准备自己的数据

### 加载数据,假设我们手上已经获取了这部分数据,他们来自于明天的课程
### 是deseq2 经过vst标准化后的数据
load(file = "data/BRCA_exprSet_vst.Rdata")

### 为了代码复用,把名称改为expr_df
expr_df <- exprSet_vst
### 选取一部分数据
test <- expr_df[1:10,1:10]

### 行名变成第一列,cbind十分好用
expr_df <- cbind(gene_id= rownames(expr_df),expr_df)

#看一下右侧的环境变量区域
#我们有查看大数据的法宝
class(expr_df) #类型
dim(expr_df) #维度
str(expr_df) #结构

#如果不够直观,我们还有一个大法宝,截取部分数据查看
test <- expr_df[1:10,1:10]

### 2.基因名称转换
### 加载数据,至少两列
load(file = "data/gtfdata.Rdata")

write.csv(gtfdata,file = "gtfdata.csv",row.names = F,quote = F)

library(dplyr)
exprSet <- gtfdata %>% 
  ## 和表达量的数据交叉合并,等同于merge
  dplyr::inner_join(expr_df,by ="gene_id") %>% 
  ## 去掉多余列
  dplyr::select(-gene_id) %>% 
  ## 以下是为了删除重复的行(有些基因名称相同)
  ## 增加一列
  mutate(rowMean = rowMeans(.[,-1])) %>% 
  ## rowMena 前置
  dplyr::select(rowMean,everything()) %>% 
  ## 排序
  arrange(desc(rowMean)) %>% 
  ## 去重
  distinct(gene_name,.keep_all = T) %>% 
  ## 删除多余列
  dplyr::select(-rowMean) 

test <- exprSet[1:10,1:10]
### 3.准备分类信息
#制作metadata,不要管这个单词,这一步就是区别肿瘤和正常组
#要对TCGA的id有一点了解,其中第14和15位的数字很重要
#其中01-09是tumor,也就是癌症样本;其中10-29是normal,也就是癌旁

TCGA_id <- colnames(exprSet)[-1]
## 使用table来统计频次么
table(substring(TCGA_id,14,15))

## 分类信息
## 讲解ifelse
sample <- ifelse(substring(TCGA_id,14,15)=="01","Tumor","Normal")
sample <- factor(sample,levels = c("Normal","Tumor"))
metadata <- data.frame(TCGA_id,sample) 

table(metadata$sample)

### 4.(可选)额外的分组信息:比如亚型信息,突变,免疫浸润
## 除了按照正常和肿瘤分组,我们还可以用Pam50亚型分类器来给肿瘤分亚型,我已经分好了,读取数据
## 这个pam50只有乳腺癌有,其他肿瘤,自己添加本领域的分组
pam50score <- read.table("data/TCGA_BRCA_PAM50__pam50scores.txt",header = T)
class(pam50score)
#选取第1列和第7列,因为第7列是分类的结果
subgroup <- pam50score[,c(1,7)]
## 修改列名
colnames(subgroup) <- c("TCGA_id","subgroup")
table(subgroup$subgroup)

### 5.数据转置
### 要实现最终效果,我们需要把他转置,即行列互换
### 转置秘诀,矩阵
### 这个是常用操作,第一列变成行名,需要熟练使用
### 还有个逆向操作,行名变成第一列
test <- exprSet[1:10,1:10]

### 设置行名:
rownames(exprSet) <- exprSet[,1]
## 删除第一列
exprSet <- exprSet[,-1]
#看一下现在数据结构
test <- exprSet[1:10,1:10]

## 行列转置(一定要把数据变成类似矩阵矩阵的结构)
exprSet <-t(exprSet)
exprSet <-as.data.frame(exprSet)
#看一下现在数据结构
test <- exprSet[1:10,1:10]
### 6.添加分类信息
### 加入肿瘤和对照的信息,在metadata里面
### 准备merge 的列
exprSet <- cbind(TCGA_id=rownames(exprSet),exprSet)
test <- exprSet[1:10,1:10]
### 1.加入分组信息
exprSet <- merge(metadata,exprSet,by="TCGA_id")
test <- exprSet[1:10,1:10]
table(exprSet$sample)
### 2.加入亚组信息
exprSet <- merge(subgroup,exprSet,by="TCGA_id")
test <- exprSet[1:10,1:10]
table(exprSet$subgroup)
### 保存数据
### save(exprSet,file = "data/TCGA_BRCA_exprSet_plot.Rdata")

###### 基因间的相关性 ######
### 相关性分析单次操作
gene1 = as.numeric(exprSet[,"FOXA1"])
gene2 = as.numeric(exprSet[,"ESR1"])
dd = cor.test(gene1,gene2,method="spearman")
### 提取p值和相关性系数
dd$p.value
dd$estimate

### 能单次操作就能批量操作
##1.设定容器
correlation <- data.frame()
##2.准备数据
test <- exprSet[1:10,1:10]
data <- exprSet[,-c(1,2,3)]
test <- data[1:10,1:10]
##3.获取基因列表
genelist <- colnames(data)
##4.指定基因
gene <- "ESR1"
genedata <- as.numeric(data[,gene])
##5.开始for循环
for(i in 1:length(genelist)){
  ## 1.指示
  print(i)
  ## 2.计算
  dd = cor.test(genedata,as.numeric(data[,i]),method="spearman")
  ## 3.填充
  correlation[i,1] = gene
  correlation[i,2] = genelist[i]
  correlation[i,3] = dd$estimate
  correlation[i,4] = dd$p.value
}

colnames(correlation) <- c("gene1","gene2","cor","p.value")
## 6.p值矫正
correlation$padjust = p.adjust(correlation$p.value,method = "BH")


###### GEO数据分析 ######

#先解压GSE42872_series_matrix.txt.gz,注意解压到当前目录,再读入
#comment.char="!" 意思是!后面的内容不要读取,可以打开文件看一下?read.table

exprSet <- read.table("data/GSE42872_series_matrix.txt",
                      comment.char="!",
                      stringsAsFactors=F,
                      header=T)

### 高频操作来了:第一列变成行名
### 分两步操作
rownames(exprSet) <- exprSet[,1]
exprSet <- exprSet[,-1]

### 数据预处理,探针ID转换,探针去重
ex <- exprSet
qx <- as.numeric(quantile(ex, c(0., 0.25, 0.5, 0.75, 0.99, 1.0), na.rm=T))
LogC <- (qx[5] > 100) ||
  (qx[6]-qx[1] > 50 && qx[2] > 0) ||
  (qx[2] > 0 && qx[2] < 1 && qx[4] > 1 && qx[4] < 2)

## 开始判断
if (LogC) { 
  ex[which(ex <= 0)] <- NaN
  ## 取log2
  exprSet <- log2(ex)
  print("log2 transform finished")
}else{
  print("log2 transform not needed")
}

library(limma) 
boxplot(exprSet,outline=FALSE, notch=T, las=2)
### 该函数默认使用quntile 矫正差异 
exprSet=normalizeBetweenArrays(exprSet)
boxplot(exprSet,outline=FALSE, notch=T, las=2)
## 这步把矩阵转换为数据框很重要
exprSet <- as.data.frame(exprSet)


## 探针基因名转换
##platformMap 中有常见的平台个R注释包的对应关系,这是我整理的。
## 读取,这都是我们已经讲过的
platformMap <- data.table::fread("resource/platformMap.txt",data.table = F)

## 平台的名称如何知道?
index <- "GPL6244"
## 数据储存在bioc_package这一列中
paste0(platformMap$bioc_package[grep(index,platformMap$gpl)],".db")

## 安装R包,可以直接安装,这里用了判断
if(!requireNamespace("hugene10sttranscriptcluster.db")){
  options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
  BiocManager::install("hugene10sttranscriptcluster.db",update = F,ask = F)
} 

## 加载R包
library(hugene10sttranscriptcluster.db)
## 获取探针和基因的对应关系:这是探针注释的关键步骤
probe2symbol_df <- toTable(get("hugene10sttranscriptclusterSYMBOL"))
## 探针有多少个?
length(unique(probe2symbol_df$probe_id))
## 这么多行中,基因名称有重复的么?
length(unique(probe2symbol_df$symbol))

### 探针转换以及去重,获得最终的表达矩阵
### 拆分体会,要学会分步探索排查,#号的使用
library(dplyr)
library(tibble)
exprSet <- exprSet %>% 
  ## 行名转列名,因为只有变成数据框的列,才可以用inner_join
  rownames_to_column("probe_id") %>% 
  ## 合并探针的信息
  inner_join(probe2symbol_df,by="probe_id") %>% 
  ## 去掉多余信息
  select(-probe_id) %>%  
  ## 重新排列
  select(symbol,everything()) %>%  
  ## rowMeans求出行的平均数(这边的.代表上面传入的数据)
  ## .[,-1]表示去掉出入数据的第一列,然后求行的平均值
  mutate(rowMean =rowMeans(.[,-1])) %>% 
  ## 把表达量的平均值按从大到小排序
  arrange(desc(rowMean)) %>% 
  ## 去重,symbol留下第一个
  distinct(symbol,.keep_all = T) %>% 
  ## 反向选择去除rowMean这一列
  select(-rowMean) %>% 
  ## 列名转行名
  column_to_rownames("symbol")

### 保存数据
save(exprSet,file = "output/exprSet_rmdup.Rdata")


###### GEO数据差异分析 ######
### 使用limma来做芯片的差异分析###

#加载limma包,用于校正和比较差异
rm(list = ls())
library(limma)
### 加载数据,注意解决报错
load(file = "output/exprSet_rmdup.Rdata")

### 1.创建分组
### 这一步根据样本来就行,原则就是: 跟样本匹配,取决于样本的排序
group <- c(rep("con",3),rep("treat",3)) 
#group <- c("con","con","treat","con","treat","treat") 
### 分组变成向量,并且限定leves的顺序
### levels里面,把对照组放在前面
group <- factor(group,levels = c("con","treat"))

### 主成分分析PCA:提前预测结果
### 行是样本列是基因

res.pca <- prcomp(t(exprSet), scale = TRUE)
library(factoextra)
fviz_pca_ind(res.pca,col.ind = group)

### 构建比较矩阵
design <- model.matrix(~group)
### 比较矩阵命名
colnames(design) <- levels(group)
design

### 2.线性模型拟合
fit <- lmFit(exprSet,design)
### 3.贝叶斯检验
fit2 <- eBayes(fit)
### 4.输出差异分析结果,其中coef的数目不能操过design的列数
### 此处的2代表的是design中第二列和第一列的比较
allDiff=topTable(fit2,adjust='fdr',coef=2,number=Inf) 
### 这个数据很重要需要保存一下
save(allDiff,file = "output/allDiff.Rdata")

### 定义差异基因:差异倍数2倍,矫正后的p值小于0.05

library(dplyr)
diffgene <- allDiff %>% 
  filter(adj.P.Val < 0.05) %>% 
  filter(abs(logFC) >1)

### 如果出现行名丢失的情况,需要先把行名变成列,处理完毕后再把列变成行名
### 这个工作是由tibble这个包里面的rownames_to_column()和column_to_rownames()完成的
library(tibble)
diffgene <- allDiff %>% 
  rownames_to_column() %>% 
  filter(adj.P.Val < 0.05) %>% 
  filter(abs(logFC) >1) %>% 
  column_to_rownames()

### 可选方案:使用subset直接获取,&是and的意思
diffgene <- subset(allDiff,abs(logFC) >1 & adj.P.Val < 0.05)
test <- allDiff[allDiff$adj.P.Val < 0.05 & abs(allDiff$logFC)>1,]
### 该数据也需要保存,此处一次性保存两个数据,如果是多个,一次写入变量名称即可。
save(diffgene,group,file = "output/diffgene.Rdata")
### 到此差异基因的分析就结束了

## 作图环节
## 1.把现在数据调整成可以作图的格式
### 这个技能是data wrangling部分重点掌握的技能
### 复习一下流程:输入数据是表达量,经过三步
### 1.探针ID转换,2.行列转置,3,添加分组信息。最终获得的是数据框

### 行列转置
exprSet <- as.data.frame(t(exprSet))
### 添加分组信息
dd <- cbind(group=group,exprSet)
### 截取部分展示,这就是清洁数据
test = dd[,1:10]

## 2.作图展示
library(ggplot2)
ggplot(data = dd,aes(x=group,y=CD36,fill=group))+
  geom_boxplot()+
  geom_point()+
  theme_bw()

## 3.steal plot
my_comparisons <- list(
  c("treat", "con")
)
library(ggpubr)
ggboxplot(
  dd, x = "group", y = "CD36",
  color = "group", palette = c("#00AFBB", "#E7B800"),
  add = "jitter"
)+
  stat_compare_means(comparisons = my_comparisons, method = "t.test")

## 改写成函数
diffplot <- function(gene){
  my_comparisons <- list(
    c("treat", "con")
  )
  library(ggpubr)
  ggboxplot(
    dd, x = "group", y = gene,
    color = "group", palette = c("#00AFBB", "#E7B800"),
    add = "jitter"
  )+
    stat_compare_means(comparisons = my_comparisons, method = "t.test")
}

diffplot("CD36")
diffplot("MOXD1")

## 4.多个基因作图查看
## 先把基因提取出来
genelist <- rownames(diffgene)[1:6]
## 再提取表达量,使用名称选取行
data <- dd[,c("group",genelist)]
## 用pivot_longer调整数据,数据变长,增加的是行
library(tidyr)
data <- data %>% 
  pivot_longer(cols=-1,
               names_to= "gene",
               values_to = "expression")
## 多基因作图
## 作图
ggplot(data = data,aes(x=gene,y=expression,fill=group))+
  geom_boxplot()+
  geom_jitter()+
  theme_bw()+
  stat_compare_means(aes(group=group), label = "p.signif", method = "t.test")

## 尝试更清晰的展示
ggplot(data = data,aes(x=group,y=expression,fill=group))+
  geom_boxplot()+
  geom_jitter()+
  theme_bw()+
  facet_grid(.~gene)+
  stat_compare_means(comparisons = my_comparisons, label = "p.signif", method = "t.test")

## 图片导出
library(export)
## 导成PPT可编辑的格式
graph2ppt(file="output/diffgenboxplot.pptx")
## 其他自己想要的格式
graph2pdf(file="output/diffgenboxplot.pdf")
graph2tif(file="output/diffgenboxplot.tif")
## 导成AI可以编辑的状态
graph2eps(file="output/diffgenboxplot.eps")


####差异分析后第一步就是制作heatmap热图
### 热图就是表达量数据,行是差异基因,列是样本
### 想一想该如何提取

### 用行名提取数据
rm(list = ls())
## 1.加载表达数据
load(file = "output/exprSet_rmdup.Rdata")
## 2.加载差异列表
load(file = "output/allDiff.Rdata")
library(dplyr)
library(tibble)
diffgene <- allDiff %>% 
  rownames_to_column() %>% 
  filter(adj.P.Val < 0.05) %>% 
  filter(abs(logFC) >1) %>% 
  column_to_rownames()

## 3.用名称提取部分数据用作热图绘制
heatdata <- exprSet[rownames(diffgene),]
## 4.制作一个分组信息用于注释
group <- c(rep("con",3),rep("treat",3)) 
annotation_col <- data.frame(group)
rownames(annotation_col) <- colnames(heatdata)

## 加载热图的R包
library(pheatmap)
## 颜色包 viridisLite
library(viridisLite)
## 直接作图
pheatmap(heatdata)

### 经过修饰的图
pheatmap(heatdata, #热图的数据
         cluster_rows = TRUE,#行聚类
         cluster_cols = TRUE,#列聚类,可以看出样本之间的区分度
         annotation_col =annotation_col, #标注样本分类
         annotation_legend=TRUE, # 显示注释
         show_rownames = F,# 显示行名
         scale = "row", #以行来标准化,这个功能很不错
         color = viridis(10, alpha = 1, begin = 0.5, end = 1, direction = 1),#调色
         cellwidth = 40, # 格子宽度
         cellheight = 0.2,# 格子高度
         fontsize = 10 # 字体大小
)


### 可以重新筛选,阈值设大一点
diffgene <- allDiff %>% 
  rownames_to_column() %>% 
  filter(adj.P.Val < 0.05) %>% 
  filter(abs(logFC) >3) %>% 
  column_to_rownames()

## 用名称提取部分数据用作热图绘制
heatdata <- exprSet[rownames(diffgene),]
## 制作一个分组信息用于注释
group <- c(rep("con",3),rep("treat",3)) 

annotation_col <- data.frame(group)
rownames(annotation_col) <- colnames(heatdata)

#如果注释出界,可以通过调整格子比例和字体修正
pheatmap(heatdata, #热图的数据
         cluster_rows = TRUE,#行聚类
         cluster_cols = TRUE,#列聚类,可以看出样本之间的区分度
         annotation_col =annotation_col, #标注样本分类
         annotation_legend=TRUE, # 显示注释
         show_rownames = T,# 显示行名
         scale = "row", #以行来标准化,这个功能很不错
         color = viridis(10, alpha = 1, begin = 0.5, end = 1, direction = 1),#调色
         #filename = "heatmap_F.pdf",#是否保存
         cellwidth = 40, # 格子宽度
         cellheight = 12,# 格子高度
         fontsize = 10 # 字体大小
)

### 导出图
## 加载R包
library(export)
## 导成PPT可编辑的格式
graph2ppt(file="output/heatmap_modified.pptx")
graph2pdf(file="output/heatmap_modified.pdf")


####差异分析后第二步就是制作火山图
rm(list = ls())
##用ggplot2
library(ggplot2)
library(ggrepel)
library(dplygener)
load(file = "output/allDiff.Rdata")
### 无论是什么名称,都改为data
data <- allDiff
### 如果没有gene这一列就需要添加
data$gene <- rownames(data)
## 仔细观察data数据
## 如果是你自己的数据,至少有三列
## logFC,P.Value,gene
ggplot(data=data, aes(x=logFC, y =-log10(P.Value))) +
  ## 三个部分分别画点
  geom_point(data=subset(data,abs(data$logFC) <= 1),aes(size=abs(logFC)),color="black",alpha=0.1) +
  geom_point(data=subset(data,data$P.Value<0.05 & data$logFC > 1),aes(size=abs(logFC)),color="red",alpha=0.2) +
  geom_point(data=subset(data,data$P.Value<0.05 & data$logFC < -1),aes(size=abs(logFC)),color="green",alpha=0.2) +
  ## 画线
  geom_hline(yintercept = -log10(0.05),lty=4,lwd=0.6,alpha=0.8)+
  geom_vline(xintercept = c(1,-1),lty=4,lwd=0.6,alpha=0.8)+
  ## 主题
  theme_bw()+
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),   
        axis.line = element_line(colour = "black"))+
  labs(x="log2 (fold change)",y="-log10 (q-value)")+
  theme(plot.title = element_text(hjust = 0.5))+
  theme(legend.position='none')+
  ## 标签
  geom_text_repel(data=subset(data, abs(logFC) > 3), aes(label=gene),col="black",alpha = 0.8)


##换一种风格
library(ggplot2)
library(ggrepel)
data <- allDiff
data$gene <- rownames(data)
data$significant <- as.factor(data$adj.P.Val<0.05 & abs(data$logFC) > 1)
data$gene <- rownames(data)
ggplot(data=data, aes(x=logFC, y =-log10(adj.P.Val),color=significant)) +
  geom_point(alpha=0.8, size=1.2,col="black")+
  geom_point(data=subset(data, logFC > 1),alpha=0.8, size=1.2,col="red")+
  geom_point(data=subset(data, logFC < -1),alpha=0.6, size=1.2,col="blue")+
  labs(x="log2 (fold change)",y="-log10 (adj.P.Val)")+
  theme(plot.title = element_text(hjust = 0.4))+
  geom_hline(yintercept = -log10(0.05),lty=4,lwd=0.6,alpha=0.8)+
  geom_vline(xintercept = c(1,-1),lty=4,lwd=0.6,alpha=0.8)+
  theme_bw()+
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),   
        axis.line = element_line(colour = "black")) +
  geom_point(data=subset(data, abs(logFC) >= 3),alpha=0.8, size=3,col="green")+
  geom_text_repel(data=subset(data, abs(logFC) > 3), 
                  aes(label=gene),col="black",alpha = 0.8)

### advanced 
library(ggplot2)
library(ggrepel)
data <- allDiff
data$gene <- rownames(data)
logFCfilter = 1.5
logFCcolor = 3
### 标记上下调
index = data$adj.P.Val <0.05 & abs(data$logFC) > logFCfilter
data$group <- 0
data$group[index & data$logFC>0] = 1
data$group[index & data$logFC<0] = -1
data$group <- factor(data$group,levels = c(1,0,-1),
                     labels =c("Up","NS","Down") )
### 正式画图
ggplot(data=data, aes(x=logFC, y =-log10(adj.P.Val),color=group)) +
  geom_point(alpha=0.8, size=1.2)+
  scale_color_manual(values = c("red", "grey50", "blue4"))+
  labs(x="log2 (fold change)",y="-log10 (adj.P.Val)")+
  theme(plot.title = element_text(hjust = 0.4))+
  geom_hline(yintercept = -log10(0.05),lty=4,lwd=0.6,alpha=0.8)+
  geom_vline(xintercept = c(-logFCfilter,logFCfilter),lty=4,lwd=0.6,alpha=0.8)+
  theme_bw()+
  theme(panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(colour = "black")) +
  theme(legend.position="top")+
  geom_point(data=subset(data, abs(logFC) >= logFCcolor & adj.P.Val <0.05),alpha=0.8, size=3,col="green4")+
  geom_text_repel(data=subset(data, abs(logFC) >= logFCcolor & adj.P.Val <0.05),
                  aes(label=gene),col="black",alpha = 0.8)

## 加载R包
library(export)
## 导成PPT可编辑的格式
graph2ppt(file="output/volcano.pptx")
graph2pdf(file="output/volcano.pdf")

###### 富集分析 ######
## 本节任务:KEGG分析
rm(list = ls())
library(clusterProfiler)
load(file = "output/diffgene.Rdata")
### 这个分析需要什么数据?
### 获得基因列表
gene <- rownames(diffgene)
#基因名称转换,返回的是数据框
### 支持ENSEMBL,SYMBOL,ENTREZID
gene = bitr(gene, 
            fromType="SYMBOL", 
            toType="ENTREZID", 
            OrgDb="org.Hs.eg.db")
head(gene)
#**KEGG分析**
# 如果你想把KEGG 本地化
# organism = 'hsa'
# http://rest.kegg.jp/list/organism
# https://mp.weixin.qq.com/s/PwrdQAkG3pTlwMB6Mj8wXQ
if(F){
  remotes::install_github("YuLab-SMU/createKEGGdb")
  library(createKEGGdb)
  species <-c("mmu","hsa")
  create_kegg_db(species)
}
## 使用我们已经处理好的本地化KEGG数据
##install.packages("./KEGG.db_1.0.tar.gz", repos=NULL)
library(KEGG.db)
EGG <- enrichKEGG(gene = gene$ENTREZID,
                  organism = 'hsa',
                  pvalueCutoff = 0.05,
                  use_internal_data =T)
barplot(EGG)
dotplot(EGG)

## 在线分析
## 实时提取KEGG信息,需要网络支持,
## 如果失败了怎么办?
R.utils::setOption( "clusterProfiler.download.method",'auto' )
EGG <- enrichKEGG(gene = gene$ENTREZID,
                  organism = 'hsa',
                  pvalueCutoff = 0.05)

test <- as.data.frame(EGG)
## 画图
barplot(EGG)
dotplot(EGG)

### KEGG的富集分析比较特殊,他的背后是个网站
KEGG_df <- as.data.frame(EGG)
symboldata <- setReadable(EGG, OrgDb="org.Hs.eg.db", keyType = "ENTREZID")
symboldata  <- as.data.frame(symboldata )

browseKEGG(EGG, 'hsa04110')
save(EGG,file = "output/EGG.Rdata")

### GO, MF,CC,BP
### 1.CC
ego <- enrichGO(gene          = gene$ENTREZID,
                OrgDb         = org.Hs.eg.db,
                ont           = "CC",
                pAdjustMethod = "BH",
                pvalueCutoff  = 0.01,
                qvalueCutoff  = 0.05,
                readable      = TRUE)
barplot(ego)

test <- as.data.frame(ego)


#### 2.MF
ego_MF <- enrichGO(gene          = gene$ENTREZID,
                   OrgDb         = org.Hs.eg.db,
                   ont           = "MF",
                   pAdjustMethod = "BH",
                   pvalueCutoff  = 0.01,
                   qvalueCutoff  = 0.05,
                   readable      = TRUE)
barplot(ego_MF,label_format = 60)
test <- as.data.frame(ego_MF)
dput(test$Description[1:10])

### 3.BP
ego_BP <- enrichGO(gene          = gene$ENTREZID,
                   OrgDb         = org.Hs.eg.db,
                   ont           = "BP",
                   pAdjustMethod = "BH",
                   pvalueCutoff  = 0.01,
                   qvalueCutoff  = 0.05,
                   readable      = TRUE)

barplot(ego_BP,label_format = 60)
test <- as.data.frame(ego_BP)
dput(test$Description[1:10])
goplot(ego_BP) ##这个可以画超级牛逼的层级图
### 4.ALL
ego_all <- enrichGO(gene          = gene$ENTREZID,
                    OrgDb         = org.Hs.eg.db,
                    ont           = "all",
                    pAdjustMethod = "BH",
                    pvalueCutoff  = 0.01,
                    qvalueCutoff  = 0.05,
                    readable      = TRUE)

barplot(ego_all, split="ONTOLOGY",label_format = 60)+ facet_grid(ONTOLOGY~.,
                                                                 scale="free")



###### pathview可视化KEGG富集分析 ######
rm(list = ls())
load(file = "output/EGG.Rdata")
KEGG_df <- as.data.frame(EGG)

## 安装这个R包
if(!requireNamespace("pathview")){
  options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
  BiocManager::install("pathview",update = F,ask = F)
} 

### 这个分析需要什么啊??
### 很重要的部分,制作geneList
### 什么是geneList

library(clusterProfiler)
load(file = "output/diffgene.Rdata")
gene <- rownames(diffgene)
## 基因名称转换,从symbol 到ENTREZID
gene = bitr(gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")
## 去重
gene <- dplyr::distinct(gene,SYMBOL,.keep_all=TRUE)
## 新的数据框
gene_df <- data.frame(logFC=diffgene$logFC,SYMBOL = rownames(diffgene))
## 根据基因名称合并数据
gene_df <- merge(gene_df,gene,by="SYMBOL")

## geneList 三部曲
## 1.获取基因logFC
geneList <- gene_df$logFC
## 2.命名
names(geneList) = gene_df$ENTREZID
## 3.排序很重要
geneList = sort(geneList, decreasing = TRUE)

head(geneList)
### pathview可视化
library(pathview)
pathway.id = "hsa04110"
pv.out <- pathview(gene.data  = geneList,
                   pathway.id = pathway.id,
                   species    = "hsa",
                   limit      = list(gene=max(abs(geneList)), cpd=1))
## 改变倍数的颜色
pv.out <- pathview(gene.data  = geneList,
                   pathway.id = pathway.id,
                   species    = "hsa"
                   #limit      = list(gene=max(abs(geneList)), cpd=1)
)
## 改变构图
pv.out <- pathview(gene.data  = geneList,
                   pathway.id = pathway.id,
                   species    = "hsa",
                   #limit      = list(gene=max(abs(geneList)), cpd=1),
                   #改变构图
                   kegg.native=F)

### pathview批量画图
### 新建文件夹,
dir.create("output/pathview_out")
### 设置工作目录到想要的地方
getwd()
### 然后循环绘图
for (pathway.id in KEGG_df$ID ){
  print(pathway.id)
  pathview(gene.data  = geneList,
           pathway.id = pathway.id,
           species    = "hsa"
  )
}

你可能感兴趣的:(数据分析)