教小高改bug

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

 芯片和高通量测序(HTS):

对于基因芯片的差异表达分析而言,由于普遍认为其数据是服从正态分布,因此差异表达分析无非就是用t检验和或者方差分析应用到每一个基因上。目前在基因芯片的分析用的最多的就是limma。

高通量一次性找的基因多,于是就需要对多重试验进行矫正,控制假阳性。高通量测序(HTS)的read count普遍认为是服从泊松分布(当然有其他不同意见),不可能直接用正态分布的t检验和方差分析。

edgeRDEseq2 这两个软件要求输入的文件中所有数值必须要是整数,所以只能用count数据;

limma 包做差异分析要求数据满足正态分布或近似正态分布,如基因芯片TPM 格式的高通量测序数据。高通量测序得到的count数据不符合正态分布而服从泊松分布,对于count 数据来说,用limma包做差异分析,误差较大;

目前 DESeq2 可以处理符合泊松分布的数据,是分析高通量测序的主流。值得一提的是 edgeR 和 limma 是由一个团队开发的,算法有点过时了,DESeq2 目前使用频率较高。 

1.数据处理

配对样本的lncRNA表达矩阵,供配对差异分析用

思路:选出与normal样本匹配的tumor样本,合并为新的表达矩阵

rm(list = ls())
library(stringr)
options(stringsAsFactors = F)
setwd("D:/BioInformationAnalyze/TCGAdata/CRC") # 设置工作目录(需修改)
load("TCGA-COAD_01.1.lncRNA_Expdata_count.Rdata") # 使用count数据

# 挑选出来normal的样本,然后匹配样本名
table(stringr::str_sub(colnames(exp),14,15)) #正常样本个数?
exp_nor <- exp[, str_sub(colnames(exp),14,15) == 11] # 正常样本
exp_tum <- exp[, str_sub(colnames(exp),14,15) != 11] # 肿瘤样本
patient <- str_sub(colnames(exp_nor),1,12) # 有正常样本的病人id(有配对样本的病人id)
table(str_sub(colnames(exp_tum),1,12) %in% str_sub(patient)) # 看看肿瘤样本有重复吗
# 匹配肿瘤样本
exp_tum <- exp_tum[, str_sub(colnames(exp_tum),1,12) %in% str_sub(patient)] # 找到所有配对肿瘤样本
exp_tum <- exp_tum[, str_sort(colnames(exp_tum))] # 配对肿瘤样本排序
exp_tum <- exp_tum[, !duplicated(str_sub(colnames(exp_tum),1,12))] # 排序去重,这样样本有01A和01B可选时,就会留下01A。
# 让正常样本顺序与肿瘤样本顺序一致,这样才方便写配对向量
tmp <- match(str_sub(colnames(exp_tum),1,12), str_sub(colnames(exp_nor),1,12))
exp_nor <- exp_nor[,tmp]
identical(str_sub(colnames(exp_tum),1,12), str_sub(colnames(exp_nor),1,12)) # 确认排序一致
exp_pair <- cbind(exp_nor, exp_tum) # 前一半是正常样本,后一半是肿瘤样本
# 保存
save(exp_pair, file = paste0(cancer_type, "_03.1.lncRNA_Pair.Rdata"))

2.lncRNA配对样本差异分析

library(stringr)
library(ggplotify)
library(patchwork)
library(cowplot)
library(edgeR)

rm(list = ls())
load("TCGA-COAD_01.1.lncRNA_Expdata_count.Rdata") # 表达数据的count数
load("TCGA-COAD_03.1.lncRNA_Pair.Rdata") # 配对样本数据
group_list <- rep(c("normal","tumor"), each = ncol(exp_pair)/2) %>% 
  factor(levels =  c("normal","tumor")) # 设置分组类型
pairinfo <- rep(1:(ncol(exp_pair)/2), times = 2) # 设置配对信息
table(group_list)

# 开始用edgeR差异分析
dge <- DGEList(counts = exp_pair, group = group_list) # 创建EDGList——edgeR存储数据形式,edgeR存储数据在一个叫做DEGList的类似于list的对象中。
dge$samples$lib.size <- colSums(dge$counts)
dge <- calcNormFactors(dge)  #数据标准化,calcNormFactors函数通过查找一组缩放因子来标准化文库的大小

design <- model.matrix( ~ pairinfo + group_list) # 构建分组矩阵
dge <- estimateDisp(dge, design) # 估计离散程度(Estimating dispersions)

fit <- glmQLFit(dge, design) # 广义线性模型 quasi-likelihood (QL) F-test拟合
fit2 <- glmQLFTest(fit)
result <- topTags(fit2) # 从测试对象中提取差异表达最多的基因(或序列标签),按 p 值或logFC排序。

DEG <- topTags(fit2, n = nrow(exp)) 
DEG <- as.data.frame(DEG) # 表中FDR的计算是根据假设检验的P-value进行校正而得到的。
#logFC_cutoff <- with(DEG, mean(abs(logFC)) + 2*sd(abs(logFC))) # 均数+2倍标准差
logFC_cutoff <- 1.5 # 设置logFC阈值
DEG$change <- as.factor(
  ifelse(DEG$FDR < 0.05 & abs(DEG$logFC) > logFC_cutoff,
         ifelse(DEG$logFC > logFC_cutoff ,"UP","DOWN"),"NOT")
) # 标基上下调基因
head(DEG) # 得到排序后的差异基因表

table(DEG$change)
lncRNA_DEG <- DEG
cg <- rownames(DEG)[DEG$change != "NOT"] # change gene:上调和下调基因的基因名
cgexp <- exp_pair[cg,] # 差异基因的表达量
table(head(DEG[cg, "change"], 580))
save(cg, file = paste0(cancer_type, "_03.2.lncRNA_cg.Rdata"))

 画PCA图、热图、火山图

library(ggplot2)
library(tinyarray)
exp_pair[1:4, 1:4]
# PCA图
dat <- log(exp_pair + 1)
pca.plot <- draw_pca(dat, group_list); pca.plot
# 热图、火山图
x <- log2(exp_pair[cg,] + 1)
heatmap.plot <- draw_heatmap(x, group_list, n_cutoff = 2.6, cluster_cols = F) ; heatmap.plot
volcano.plot <- draw_volcano(lncRNA_DEG, logFC_cutoff = 1.5, pkg = 2, symmetry = T, adjust = T) ; volcano.plot

 

posted on 2023-01-31 00:51  小高不高  阅读(1198)  评论(0编辑  收藏  举报