芯片的差异分析

数据清洗data_wrangling(即将表达量数据添加分组信息)

1、表达量数据格式为matrix,转为数据框

exprSet_t <- t(exprSet)
as.data.frame()

2、用cbing命令添加分组信息

group <- rep(c("A","B"),each=3)
groupdata <- cbind(group=group,dataframe)

统计方法如何选以及全代码作图实现

更好用的宽长转换工具

1、写入数据

GEO推荐用read.table读,他有comment那个参数

data <- read.table("data/GSE9103_series_matrix.txt",sep = "\t",comment.char="!",stringsAsFactors=F,header=T)

2、第一列变成行名

rownames(data) <- data[,1] #命名行名
data <- data[,-1]  #删除第一列

探针对应的信息可以从平台文件获取1

探针对应的信息可以从平台文件获取2

探针对应的信息可以从平台文件获取3

NM_,NR_开头的识别号如何转换成基因名称

非编码序列如何转换

如何让基因名称在多个数据库间随意转换?

GZ02_批次矫正视频课程-包括GEO和TCGA

GZ03_GEO芯片的探针ID转换,包括mRNA,lncRNA和环状RNA

GEO教程长期更新的链接是这个

3、log2转换,因为limma包需要经过log2后的矩阵作为表达矩阵输入

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")
}

判断GEO芯片数据表达矩阵是否需要log2转换

4、表达矩阵校正

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

一文解决GEO芯片数据分析80%的工作!建议收藏!里面有解释

5、探针基因名转换

platformMap <- data.table::fread("platformMap.txt",data.table = F)
index <- "GPL570"
paste0(platformMap$bioc_package[grep(index,platformMap$gpl)],".db")
if(!requireNamespace("hgu133plus2.db")){
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
BiocManager::install("hgu133plus2.db",update = F,ask = F)
}

library(hgu133plus2.db)
bbq <- toTable(get("hgu133plus2SYMBOL"))
## 探针有多少个?
length(unique(a1$probe_id))
## 这么多行中,基因名称有重复的么?
length(unique(a1$symbol))

library(dplyr)
library(tibble)

data2 <- data1 %>%
## 行名转列名,因为只有变成数据框的列,才可以用inner_join
rownames_to_column("probe_id") %>%
## 合并探针的信息
inner_join(bbq,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")

platformMap永久网盘

行名转列名 方法一
library(dplyr) library(tibble) data1 <- data1 %>% rownames_to_column(“probe_id”) 方法二 data <- cbind(gene_id= rownames(data),data)

6、使用limma来做芯片的差异分析

library(limma)
load(file = "output/exprSet_rmdup.Rdata")
### 创建分组;这一步根据样本来就行,原则就是: 跟样本匹配,取决于样本的排序
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"),ordered = F)

### 主成分分析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")
### 到此差异基因的分析就结束了
####################################################################################
####################################################################################

7、 作图环节

## 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")

GEO芯片分析中的大坑,差异基因完全相反

GEO芯片如果超过了两组,也可以一次搞定差异分析

GEO芯片中配对样本如何做差异分析

因子(factor)就像贤内助,让你始终分清主次,拨开云雾。

GEO的样本名称太多而且排序不规则,你们都是手动分组的么?

GEO教程长期更新的链接是这个