FPKM数据下游分析

前面分享了FPKM数据该怎么分析?
后来看了一下别人分享的例子,应该把FPKM转换为TPM后再进行分析。
为什么说FPKM和RPKM都错了?
简单小需求:如何将FPKM转换成TPM

1、数据下载

rm(list = ls())  ## 魔幻操作,一键清空~
options(stringsAsFactors = F)#在调用as.data.frame的时,将stringsAsFactors设置为FALSE可以避免character类型自动转化为factor类型
# 注意查看下载文件的大小,检查数据 
  gset <- read.table("GSE115422_BM_EC_9GY_fpkms.txt.gz",
                     sep='\t',
                     quote = "",
                     fill = T, 
                     comment.char = "!",
                     header = T) # 提取表达矩阵       
  save(gset,file="GSE115422_gset.Rdata")   ## 保存到本地


head(gset)
View(gset)

#去重
# a <- gset$gene_name
# 
# gset1 <- gset[a,]
# gset1 <- gset[gset$gene_name,]
# 
# gset2  <- unique(gset1)

#不知这步处理之后,为啥会提示“Mar-01” Mar-02重复

#生信技能树或者菜鸟团有相关的推文,找推文为啥基因或者探针会出现日期

#除去Mar-01,Mar-02
gset <- gset[!(gset$gene_name == 'Mar-01'),]

gset <- gset[!(gset$gene_name == 'Mar-02'),]

#把第一列添加为行名
rownames(gset) <- gset[,1]

#删除第一列
gset <- gset[,-1]

2.将FPKM转换为TPM

exprSet <- gset

fpkmToTpm <- function(fpkm)
{
  exp(log(fpkm) - log(sum(fpkm)) + log(1e6))
}
tpms <- apply(exprSet,2,fpkmToTpm)
tpms[1:3,]
colSums(tpms)
#输出结果:
tpms[1:3,]

3、质控和检测数据质量

View(tpms)

# group_list <- colnames(tpms)
# group_list <- as.factor(group_list)
# 
# group_list <- as.character(group_list)
# 
# library(stringr)
# 
# group_list <- str_split(as.character(group_list),'.', simplify = T)[,1]

group_list <- c(rep('BMC',3),rep('Lin',3),rep('LSK',3),rep('EC',3),rep('X9GY',3))

#表达矩阵数据校正
exprSet <- tpms
#exprSet <- exprSet[,10:15]
exprSet

boxplot(exprSet,las=2)


#数据里面有很多基因在某些样本中的检测值为零,除去某个这部分值;

#如果一个基因在三个及三个以上的样本里面为零,则除去该基因

#apply(dat1,1,function(x){sum(floor(x)==0)>3})

exprSet <- exprSet[!apply(exprSet,1,function(x){sum(floor(x)==0)>3}),]

boxplot(exprSet,las=2)#不在同一水平线上

#limma归一化
library(limma)
exprSet <- normalizeBetweenArrays(exprSet)
boxplot(exprSet,las=2)

#
exprSet <- log(exprSet+1)##表达值为成千上万,需要取log值
boxplot(exprSet,las=2)

if(F){
  exprSet <- log(exprSet+1)#应该取log2,完全不在一个水平上面
  boxplot(exprSet,las=2)
  
  #归一化
  exprSet <- normalizeBetweenArrays(exprSet)
  
  boxplot(exprSet,las=2)###归一化后,表达值偏离
  
  #数据里面有很多基因在某些样本中的检测值为零,除去某个这部分值;
  
  #如果一个基因在三个及三个以上的样本里面为零,则除去该基因
  
  #apply(dat1,1,function(x){sum(floor(x)==0)>3})
  
  exprSet <- exprSet[!apply(exprSet,1,function(x){sum(floor(x)==0)>3}),]
  
  boxplot(exprSet,outline=FALSE,notch=T,las=2)#不在同一水平线上
  #应该先做该步,后边再做归一化
  
}

#PCA看样本分组情况
## PCA

library(ggfortify)
df=as.data.frame(t(exprSet))
df$group=group_list
png('pca.png',res=120)

pp <- autoplot(prcomp( df[,1:(ncol(df)-1)] ), 
               data=df,
               colour = 'group')+
  theme_bw()
pp
dev.off()



#boxplot(exprSet,outline=FALSE, notch=T,col=group_list, las=2)
library(limma) 
exprSet <- normalizeBetweenArrays(exprSet)
boxplot(exprSet,las=2)##表达值很高,应该取log2,完全不在一个水平上面

#boxplot(exprSet,outline=FALSE, notch=T,col=group_list, las=2)
#判断数据是否需要转换
exprSet <- log2(exprSet+1)#应该取log2,完全不在一个水平上面

#取EC,x9GY
exprSet <- exprSet[,10:15]

boxplot(exprSet,las=2)

exprSet <- log2(exprSet+1)

boxplot(exprSet,las=2)

exprSet <- normalizeBetweenArrays(exprSet)

boxplot(exprSet,las=2)


## 下面是画PCA的必须操作,需要看说明书。

dat <- t(exprSet)#画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换
dat <- as.data.frame(dat)#将matrix转换为data.frame
dat <- cbind(dat,group_list) #cbind横向追加,即将分组信息追加到最后一列
#dat[1:5,1:5]
head(dat)

#BiocManager::install("FactoMineR")
#BiocManager::install("factoextra")
library("FactoMineR")#画主成分分析图需要加载这两个包
library("factoextra") 
# The variable group_list (index = 54676) is removed
# before PCA analysis
dat.pca <- PCA(dat[,-ncol(dat)], graph = FALSE)#现在dat最后一列是group_list,需要重新赋值给一个dat.pca,这个矩阵是不含有分组信息的

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


#  ## hclust
colnames(exprSet) <- paste(group_list,1:ncol(exprSet),sep='_')
# Define nodePar
nodePar <- list(lab.cex = 0.4, pch = c(NA, 19),
                cex = 0.7, col = "blue")
hc=hclust(dist(t(exprSet)))
par(mar=c(5,5,5,10))
png('hclust.tif',res=120)

plot(as.dendrogram(hc), nodePar = nodePar, horiz = TRUE)
dev.off()
save(exprSet,group_list,file = 'step2-output.Rdata')
#样品聚类比较好,本次因为本来就是来自不同类型的细胞分开的非常好,
#实际分析中可以删除某些离群或者混淆的样本

4、差异分析

#差异分析:

#单分组
if(F){dat <- exprSet
design=model.matrix(~factor( group_list ))
fit=lmFit(dat,design)
fit=eBayes(fit)
options(digits = 4)
topTable(fit,coef=2,adjust='BH')
bp=function(g){
  library(ggpubr)
  df=data.frame(gene=g,stage=group_list)
  p <- ggboxplot(df, x = "stage", y = "gene",
                 color = "stage", palette = "jco",
                 add = "jitter")
  #  Add p-value
  p + stat_compare_means()
}
deg=topTable(fit,coef=2,adjust='BH',number = Inf)
head(deg) 
}

#本例为多分组
group_list <- c(rep('BMC',3),rep('Lin',3),rep('LSK',3),rep('EC',3),rep('X9GY',3))

group <- factor(group_list)
design <- model.matrix(~0 + group)
colnames(design) <- levels(group)
design

#指定那类样本比上那类样本,特别注意有顺序,横杠前的样本比上横杠后的样本
contrast.matrix <- makeContrasts(X9GY - EC, 
                                 Lin - BMC,
                                 LSK - BMC, 
                                 levels=design)

contrast.matrix


fit <- lmFit(exprSet, design)

fit2 <- contrasts.fit(fit, contrast.matrix) 
fit2 <- eBayes(fit2)

allDiff1=topTable(fit2,adjust='fdr',coef=1,number=Inf) 
allDiff2=topTable(fit2,adjust='fdr',coef=2,number=Inf) 
allDiff3=topTable(fit2,adjust='fdr',coef=3,number=Inf)

5、差异基因注释分析

library(ggstatsplot);
library(cowplot);
library(clusterProfiler);
library(stringr);
library(dplyr);
library(tidyr);
library(ggplot2);
library(ggstatsplot);
## 不同的阈值,筛选到的差异基因数量就不一样,后面的超几何分布检验结果就大相径庭。
deg <- allDiff1
if(T){
  logFC_t=1.5
  deg$g=ifelse(deg$P.Value>0.05,'stable',
               ifelse( deg$logFC > logFC_t,'UP',
                       ifelse( deg$logFC < -logFC_t,'DOWN','stable') )
  )
  table(deg$g)
  head(deg)
  deg$symbol=rownames(deg)
  library(ggplot2)
  library(clusterProfiler)
  library(org.Mm.eg.db)
  df <- bitr(unique(deg$symbol), fromType = "SYMBOL",
             toType = c( "ENTREZID"),
             OrgDb = org.Mm.eg.db)
  head(df)
  DEG=deg
  head(DEG)
  
  DEG=merge(DEG,df,by.y='SYMBOL',by.x='symbol')
  head(DEG)
  
  save(DEG,file = 'anno_DEG.Rdata')
  gene_up= DEG[DEG$g == 'UP','ENTREZID'] 
  gene_down=DEG[DEG$g == 'DOWN','ENTREZID'] 
}

KEGG分析,超几何分布检验


###这里就拿KEGG数据库举例吧,拿自己判定好的上调基因集进行超几何分布检验,如下
if(T){
  gene_down
  gene_up
  enrichKK <- enrichKEGG(gene         =  gene_up,
                         organism     = 'mmu',
                         #universe     = gene_all,
                         pvalueCutoff = 0.05,
                         qvalueCutoff =0.05)
  head(enrichKK)[,1:6] 
  browseKEGG(enrichKK, 'hsa04512')
  dotplot(enrichKK)
  ggsave("enrichKK.png")
  enrichKK=DOSE::setReadable(enrichKK, OrgDb='org.Mm.eg.db',keyType='ENTREZID')
  enrichKK 
}
##最基础的条形图和点图
#条带图
barplot(enrichKK,showCategory=20)
#气泡图
dotplot(enrichKK)

通路与基因之间的关系可视化

#通路与上调基因之间的关系可视化
###制作genlist三部曲:
## 1.获取基因logFC
DEG_up <- DEG[DEG$g == 'UP',]
geneList <- DEG_up$logFC
## 2.命名
names(geneList) = DEG_up$ENTREZID
## 3.排序很重要
geneList = sort(geneList, decreasing = TRUE)
head(geneList)

cnetplot(enrichKK, categorySize="pvalue", foldChange=geneList,colorEdge = TRUE)
cnetplot(enrichKK, foldChange=geneList, circular = TRUE, colorEdge = TRUE)
ggsave("enrichKK_cnetplot.png")

通路与通路之间的连接展示

#通路与通路之间的连接展示
emapplot(enrichKK)
ggsave("enrichKK_emapplot.png")

热图展现通路与基因之间的关系


#热图展现通路与基因之间的关系
heatplot(enrichKK)
ggsave("enrichKK_heatplot.png")

GO分析重点是ID转换

library(clusterProfiler);
ego_bp_up<-enrichGO(gene       = DEG_up$ENTREZID,
                 OrgDb      = org.Mm.eg.db,
                 keyType    = 'ENTREZID',
                 ont        = "BP",
                 pAdjustMethod = "BH",
                 pvalueCutoff = 0.01,#0.01
                 qvalueCutoff = 0.05)
goplot(ego_up)
ggsave("ego_bp_up_goplot.png")
head(ego)
library(stringr)
barplot(ego_bp_up,showCategory = 16,title="The GO_BP enrichment analysis of all DEGs ")+ 
  scale_size(range=c(2, 12))+
  scale_x_discrete(labels=function(ego_bp) str_wrap(ego_bp,width = 25))
ggsave("ego_bp_up_barplot.png")

参考
RNAseq数据,下载GEO中的FPKM文件后该怎么下游分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容