本方案建立了一个完整的分析流程,用于从原始数据到功能富集分析的批量RNA测序(bulk RNA-seq)研究。
方法文章
* These authors contributed equally
本方案建立了一个完整的分析流程,用于从原始数据到功能富集分析的批量RNA测序(bulk RNA-seq)研究。
非酒精性脂肪肝(NAFL)通常被认为是一种良性疾病;然而,一旦进展为非酒精性脂肪性肝炎(NASH),患者发展为终末期肝病的风险将显著增加。目前许多研究正致力于阐明NAFL向NASH转变的分子机制。高通量测序技术(如批量RNA测序,bulk RNA-seq)通过分析转录组,揭示了与疾病进展相关的分子表达、信号通路激活及其他因素,使研究人员获得了更深入的理解。目前已有大量开源数据可供研究人员分析,以识别潜在的疾病治疗靶点。然而,相关研究受限于缺乏高效且可靠的转录组上游分析流程。本文提供了一种高度可重复且用户友好的上游分析流程及后续差异基因分析流程,以实现对私有或公共数据的标准化处理与深度解析。该流程分为四个步骤:(1)数据质量控制;(2)基因比对;(3)差异基因分析;(4)功能分析。该流程旨在揭示疾病转变的分子机制,并通过批量RNA-seq数据分析,帮助研究人员筛选潜在的药物靶点和治疗策略。
非酒精性脂肪性肝病(NAFLD)是全球最常见的慢性肝病,影响超过四分之一的人口。近几十年来,其发病率显著上升1,2,3。该疾病的负担日益加重,尤其是其更严重的形态——非酒精性脂肪性肝炎(NASH),已成为重大的全球健康挑战,并带来沉重的经济负担4。NAFLD 的第一阶段为非酒精性脂肪肝(NAFL),常伴随炎症和纤维化,可进一步发展为 NASH。后者显著增加了进展为终末期肝病(包括肝硬化和肝细胞癌(HCC))的风险5,6,7。HCC 的发病率和死亡率与 NASH 的增加密切相关8,9,预计到 2030 年,NAFLD/NASH 将成为肝移植的首要指征10。然而,NAFLD 的临床进展具有高度异质性11,严重阻碍了相关药物的研发12,因此,精确探究其涉及的分子机制显得尤为重要。
基于批量RNA测序(bulk RNA-seq)获取细胞组成信息可显著阐明多种疾病的发病机制。近年来,已有大量针对模式生物和人类的批量RNA-seq研究,用于揭示非酒精性脂肪性肝炎(NASH)进展过程中的基因表达差异13,14,15,并识别可用于干预的新治疗靶点。根据批量RNA-seq分析结果,Xiong等人发现肝脏中的非实质细胞(NPCs)参与了细胞外基质形成和细胞黏附等过程,从而促进NASH的进展16。Li等人证明,肝细胞中肝源性Wilms'肿瘤1相关蛋白(WTAP)可调控异位脂质积聚和炎症反应,进而促进NASH的形成17。尽管批量RNA-seq分析是解析NASH机制的有力工具,但其结果对上游数据质量高度敏感。上游实验操作和分析流程的异质性可能严重损害数据的可靠性,从而掩盖真实的生物学信息,并干扰后续分析的准确性。因此,建立一套标准化的上游分析流程至关重要。
与单细胞RNA测序(scRNA-seq)相比,批量RNA测序(bulk RNA-seq)在实验设计和实际应用中具有若干显著优势。尽管scRNA-seq能够在单细胞水平上识别细胞异质性,并实现对细胞类型特异性转录特征的精确分析,但其成本高昂、数据处理复杂,且在检测低丰度转录本方面灵敏度有限18。相比之下,bulk RNA-seq具有更高的测序深度、更低的成本以及更高的样本通量,因此特别适用于群体水平的差异基因表达分析和分子机制的探索19。因此,在标准化分析流程的指导下,bulk RNA-seq仍然是研究复杂疾病分子基础的一种高效、经济且稳健的方法。
本方案专为源自人类组织且RNA完整性较高(RIN ≥ 7.0)并具有足够输入量RNA(每样本≥ 500 ng)的批量RNA测序(bulk RNA-seq)数据集设计。为确保比对和定量步骤的可靠执行,建议使用配备至少10核CPU、32 GB内存以及不少于200 GB可用磁盘空间的本地工作站。在满足上述要求的基础上,本方案提供了一套高效且易于使用的分析流程,包含详细的操作说明和标准化的参数配置,以满足研究人员分析大规模转录组数据的需求。
访问受限。请登录或开始试用以查看此内容。
为演示目的,本研究使用Lan Bai等人生成的公开可用数据集PRJNA1023502,以展示上游和下游分析的每一步流程20。由于该数据集来源于开放获取的NCBI SRA数据库,因此无需额外的许可或伦理审批。请参见材料表以确认所有必需的软件及R包版本。公开可用数据集PRJNA1023502包含6个非NASH、6个NAFL和6个NASH肝组织RNA-seq样本。在本实验方案中,该数据集用于演示批量RNA-seq工作流程的全部步骤,包括从SRA数据库获取数据、质量控制(fastp)、比对(HISAT2)、定量(featureCounts),以及下游的差异表达分析和功能富集分析。
1. SRA 工具包安装
2. 公共数据下载
3. 基因计数矩阵的生成
REFERENCE=~/reference/human/GRCh38/GRCh38.primary_assembly.genome.fa
GTF=~/reference/human/GRCh38/gencode.v44.annotation.gtf
INDEX=~/reference/human/GRCh38/GRCh38_index
FASTQ_DIR=~/SRA_tutorial/fastq
OUT_FASTP=~/RNAseq/fastp
OUT_HISAT2=~/RNAseq/hisat2
OUT_COUNTS=~/RNAseq/counts
mkdir -p $FASTQ_DIR $OUT_FASTP $OUT_HISAT2 $OUT_COUNTS
for f in SRR*; do [[ ! $f =~ \.sra$ ]] && mv "$f" "$f.sra"; done
for f in SRR*; do [[ ! $f =~ \.sra$ ]] && mv "$f" "$f.sra"; donefor f in SRR*; do [[ ! $f =~ \.sra$ ]] && mv "$f" "$f.sra"; donefor f in *.sra; do fasterq-dump "$f" --split-files -O $FASTQ_DIR -e 20; donehisat2-build $REFERENCE $INDEXfor fq in $FASTQ_DIR/*.fastq; do
sample=$(basename "$fq" .fastq)
for fq1 in $FASTQ_DIR/*_1.fastq; do
sample=$(basename "$fq1" _1.fastq)
fq2=$FASTQ_DIR/${sample}_2.fastqfastp \
-i "${fq}" \
-o $OUT_FASTP/${sample}.clean.fastq \
-h $OUT_FASTP/${sample}.html \
-j $OUT_FASTP/${sample}.json \
-w 20fastp \
-i "${fq}" \ -I "$fq2" \
-o $OUT_FASTP/${sample}_1.clean.fastq \
-O $OUT_FASTP/${sample}_2.clean.fastq \
-h $OUT_FASTP/${sample}.html \
-j $OUT_FASTP/${sample}.json \
-w 20hisat2 -p 20 \ -x $INDEX \-U $OUT_FASTP/${sample}.clean.fastq \
-S $OUT_HISAT2/${sample}.samhisat2 -p 20 \-x $INDEX \-1 $OUT_FASTP/${sample}_1.clean.fastq \
-2 $OUT_FASTP/${sample}_2.clean.fastq \
-S $OUT_HISAT2/${sample}.samsamtools view -@ 20 -bS $OUT_HISAT2/${sample}.sam \
| samtools sort -@ 20 -o $OUT_HISAT2/${sample}.sorted.bam
samtools index $OUT_HISAT2/${sample}.sorted.bam
donefeatureCounts -T 20 -p -s 0 \
-a $GTF \
-o $OUT_COUNTS /${sample}.counts.txt \
$OUT_HISAT2/${sample}.sorted.bam
Donecut -f1 $(ls $OUT_COUNTS/*.counts.txt | head -1) > all_counts.txtfor f in $OUT_COUNTS/*.counts.txt; do
cut -f7 "$f" | paste all_counts.txt - > tmp && mv tmp
all_counts.txt
donesamples=$(ls *.counts.txt | sed 's/.counts.txt//' | paste -sd "\t")
echo -e "Geneid\t$samples" | cat - all_counts.txt > counts_matrix.txtawk '$3=="exon"{match($0,/gene_id "([^"]+)"/,a); if(a[1]!=""){len=$5-$4+1; gene_len[a[1]]+=len}} END{print "GENE_ID\tLENGTH"; for(g in gene_len) print g"\t"gene_len[g]}' \$GTF > gene_length.txt4. 原始计数矩阵处理与基因注释
mart <- useMart("ensembl", dataset = "hsapiens_gene_ensembl")
id_map <- getBM(attributes = c("ensembl_gene_id", "hgnc_symbol"),
filters = "ensembl_gene_id",
values = exprSet$GeneID,
mart = mart)
exprSet <- exprSet %>%
left_join(id_map, by = c("GeneID" = "ensembl_gene_id")) %>%
filter(!is.na(hgnc_symbol), hgnc_symbol != "") %>%
distinct(hgnc_symbol, .keep_all = TRUE) %>%
column_to_rownames("hgnc_symbol")5. 基因表达定量
注意:详细脚本请参见补充文件 1。
counts <- read.csv("output/clean_counts_SRA.csv", header=TRUE, row.names=1)
gene_len <- read.delim("data/gene_length.txt", header=FALSE, col.names=c("gene_symbol","length"))
gene_len <- gene_len %>% distinct(gene_symbol, .keep_all=TRUE)
rownames(gene_len) <- gene_len$gene_symbol
gene_len <- gene_len[match(rownames(counts), gene_len$gene_symbol),]
length_bp <- gene_len$length
fpkm <- (counts / length_bp) * 1e9 / colSums(counts)
write.csv(fpkm, "output/clean_fpkm_SRA.csv")
tpm <- (counts / length_bp) / colSums(counts / length_bp) * 1e6
write.csv(tpm, "output/clean_tpm_SRA.csv")6. 样本聚类与差异可视化
gene.pca <- PCA(exprSet, ncp = 2, scale.unit = TRUE, graph = FALSE)
ggplot(pca_sample, aes(x = Dim.1, y = Dim.2)) +
geom_point(aes(color = group)) +
labs(x = paste('PC1:', pca_eig1, '%'),
y = paste('PC2:', pca_eig2, '%'))7. 差异表达分析与结果可视化
注意:详细脚本请参见补充文件 1。
dds <- DESeq(DESeqDataSetFromMatrix(countData = exprSet, colData = colData, design = ~group)); sizeFactors(dds); res <- results(dds); dds <- dds[rowSums(counts(dds)) > 1,]
dd1 <- results(dds, contrast = contrast, alpha = 0.05)
dd2 <- lfcShrink(dds, contrast = contrast, res = dd1, type = "ashr")ggplot(data = data, aes(x = log2FoldChange, y = -log10(padj))) +
geom_point(aes(color = group), alpha = 1, size = 1.2) +
geom_hline(yintercept = -log10(0.05), lty = 4) +
geom_vline(xintercept = c(-0.5, 0.5), lty = 4) +
geom_text_repel(data = subset(data, abs(log2FoldChange) >= 1.5 & padj < 0.05),
aes(label = gene_id))8. 进行功能富集分析与可视化
注意:详细脚本请参见补充文件1。
EGG <- enrichKEGG(gene = gene$ENTREZID, organism = 'hsa',
pvalueCutoff = 0.05, qvalueCutoff = 0.05)
ggplot(symboldata, aes(richFactor, Description)) +
geom_point(aes(color = p.adjust, size = Count))ego <- enrichGO(gene = gene$ENTREZID, OrgDb = "org.Hs.eg.db", ont = "ALL",
pvalueCutoff = 0.05, qvalueCutoff = 0.05, pAdjustMethod = "BH")
ggplot(df) +
ggforce::geom_link(aes(x = 0, y = Description, xend = -log10(p.adjust),
yend = Description, color = ONTOLOGY), n = 500, show.legend = FALSE) +
facet_wrap(~ONTOLOGY, scales = "free", ncol = 1)genelist <- sort(res$log2FoldChange, decreasing = TRUE)
names(genelist) <- rownames(res)
hallmarks <- read.gmt('resource/h.all.v2023.2.Hs.symbols.gmt')
y <- GSEA(genelist, TERM2GENE = hallmarks, pvalueCutoff = 0.05)
gsearesult <- yd %>% arrange(desc(NES)) %>% slice_head(n = 10)
ggplot(gsearesult, aes(x = logFC, y = Description, fill = -log10(pvalue))) +
geom_density_ridges(alpha = 0.8, scale = 0.8) +
geom_point(aes(size = abs(NES), x = -0.4, color = NES)) +
scale_fill_distiller(palette = 'Spectral') +
scale_color_distiller(palette = 'Reds') +
scale_size_continuous(range = c(2, 6))访问受限。请登录或开始试用以查看此内容。
批量RNA测序的上游分析流程如图1A所示。该流程在Linux平台上依次执行以下关键步骤:首先,使用fastp对原始测序数据进行严格的质控,以去除低质量读段和接头序列;随后,HISAT2将高质量读段比对至参考基因组,并由Samtools转换和排序比对文件;最后,FeatureCounts进行基因水平的定量分析,生成基因表达矩阵,为下游分析提供高质量输入数据。所得表达矩阵的后续处理与统计分析在R环境中进行,相关流程及所需软件包如图1B所示。分析所用数据来自一项已发表的研究,包括6个非NASH样本、6个NAFL样本和6个NASH样本20(图1C)。非NASH对照样本来自不符合肝移植标准且无NAFLD或NASH的个体。
需要注意的是,由于 Bai 等人公开提供的数据未包含明确的批次信息(例如测序批次或文库制备日期),也未提供显著差异表达基因的可下载列表,本研究无法直...
访问受限。请登录或开始试用以查看此内容。
大规模RNA测序数据分析是一项跨学科任务,涉及基因组学、生物信息学、统计学和计算机科学的整合。一个完整的分析流程包括多个上游和下游步骤,如原始数据预处理、质量控制、序列比对、基因水平定量、数据标准化、差异表达分析以及生物学解释。在这些步骤中,将原始测序读段准确转化为高质量的基因表达矩阵尤为关键,因为在上游处理过程中引入的任何错误都可能传递至所有下游的生物学结论中。因此,建立透明且标准化的上游分析流程对于提高转录组学研究的可重复性至关重要。
本方案提供了一种简化的、完全基于脚本的工作流程,整合了多种广泛使用的工具,如 fastp(用于读段修剪和质量控制)、HISAT2(用于可变剪接感知的比对)以及 featureCounts(用于基因水平的定量)。这些工具已在成熟的 RNA-seq 分析框架中得到广泛应用——包括源自 Tuxedo 的分析流程和普遍采用的实验方案流程——并经过了对准确性与效率的严格验证21,22。在这些基础方法的基础上,该工作流程通过引入明确的文件处理...
访问受限。请登录或开始试用以查看此内容。
作者声明不存在利益冲突。
作者感谢本研究中所使用的公开数据库的维护人员。
访问受限。请登录或开始试用以查看此内容。
| 姓名 | 公司 | 目录编号 | 评论 |
|---|---|---|---|
| biomaRt | Bioconductor | 2.64.0 | 来自 Ensembl 的基因注释 |
| clusterProfiler | Bioconductor | 4.16.0 | 功能富集分析 |
| DESeq2 | Bioconductor | 1.48.1 | 差异表达分析 |
| FactoMineR | AgroParisTech | 2.11.0 | 主成分分析和多变量分析 |
| fastp | OpenGene | 1.0.1 | FASTQ 数据的质量控制与过滤 |
| FeatureCounts | Bioinformatics Division, The Walter and Eliza Hall Institute of Medical Research | 2.0.0 | 对映射到每个基因的读段进行计数,用于基因表达定量 |
| ggplot2 | Posit | 3.5.2 | 数据可视化 |
| ggrepel | Kamil Slowikowski | 0.9.6 | 避免重叠的文本标签 |
| ggridges | Claus O. Wilke | 0.5.6 | 绘制山脊图 |
| HISAT2 | Johns Hopkins University | 2.2.1 | 将过滤后的高质量读段比对至参考基因组 |
| R | R Core Team | 4.5.0 | 用于数据计算、分析和可视化的环境 |
| RColorBrewer | Erich Neuwirth | 1.1.3 | 绘图用配色方案 |
| samtools | Large Scale Genomics work stream | 1.22.0 | 转换和处理 SAM 文件以实现高效检索与访问 |
| SRA Toolkit | National Center for Biotechnology Information | 3.2.1 | 从 NCBI SRA 数据库获取并预处理原始测序数据 |
访问受限。请登录或开始试用以查看此内容。
申请许可以重复使用本 JoVE 文章的文本或图表
申请许可