跳转至

featureCounts 基因计数

featureCounts 是 Subread 套件中的读长计数工具,能把比对后的 BAM 文件转化为基因表达矩阵,速度极快(百万级读长秒级处理),是 RNA-seq 分析中从比对到差异分析的关键桥梁。

核心知识点

知识点说明
工具定位将比对后的 reads 分配(assign)到基因/外显子等基因组特征上并计数
所属套件Subread(包含 subread-align、subjunc、featureCounts 等)
最新版本Subread v2.1.1 / Rsubread v2.22.1(2025.04)
核心优势极快(每分钟处理数百万读长)、支持多种注释格式
输入文件BAM/SAM 文件 + 基因注释文件(GTF/GFF/SAF)
输出文件每个基因对应的读长计数表(可直接用于 DESeq2/edgeR)
注释格式GTF(标准格式,Ensembl/GENCODE 提供)或 SAF(简化格式)

安装配置

方法一:Conda 安装(推荐)

# 安装 subread 包(featureCounts 包含在内)
conda install -c bioconda subread  # 安装 subread 套件
featureCounts -v                    # 查看版本

方法二:R 包安装(Rsubread)

# 在 R 中安装 Rsubread
if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")  # 安装 BiocManager
BiocManager::install("Rsubread")     # 安装 Rsubread

方法三:下载预编译包

# 从 SourceForge 下载
wget https://sourceforge.net/projects/subread/files/subread-2.1.1/subread-2.1.1-Linux-x86_64.tar.gz
tar -xzf subread-2.1.1-Linux-x86_64.tar.gz  # 解压
export PATH=$PWD/subread-2.1.1-Linux-x86_64/bin:$PATH  # 添加到 PATH

基本使用

1. 单个样本计数

# 基本用法:对单个 BAM 文件计数
featureCounts \
  -a genes.gtf \               # 基因注释文件(GTF 格式)
  -o counts.txt \               # 输出文件名
  aligned.bam                   # 输入的 BAM 文件

# 输出文件:
# counts.txt          基因计数表
# counts.txt.summary  计数统计摘要(多少 reads 被分配、多少失败等)

2. 双端数据计数(最常用)

# 双端 RNA-seq 数据按片段(fragment)计数
featureCounts \
  -p --countReadPairs \        # -p 表示双端数据,--countReadPairs 按片段计数
  -T 8 \                       # 使用 8 个线程
  -t exon \                    # 按外显子特征计数(默认值)
  -g gene_id \                 # 按 gene_id 汇总(默认值)
  -a genes.gtf \               # GTF 注释文件
  -o counts.txt \              # 输出文件
  sample.sorted.bam            # 输入 BAM

3. 批量多样本计数(一次搞定)

# featureCounts 可以同时处理多个 BAM 文件
# 输出一个包含所有样本的计数矩阵
featureCounts \
  -p --countReadPairs \        # 双端数据
  -T 16 \                      # 16 线程
  -t exon \                    # 特征类型
  -g gene_id \                 # 汇总属性
  -a genes.gtf \               # 注释文件
  -o all_counts.txt \          # 输出计数矩阵
  aligned/*.sorted.bam         # 所有 BAM 文件(通配符)

# 输出是一个大矩阵:行 = 基因,列 = 样本

4. 查看输出结果

# 查看计数统计摘要
cat all_counts.txt.summary    # 每个样本分配成功/失败的读长数

# 查看计数矩阵(跳过注释列,只看计数)
cut -f1,7- all_counts.txt | head  # 第1列是基因名,第7列开始是各样本计数

高级用法

1. 链特异性参数设置

# 根据你的文库建库方式设置链特异性
featureCounts \
  -p --countReadPairs \
  -s 0 \                       # 0=非链特异, 1=正链特异, 2=反链特异(dUTP法)
  -a genes.gtf \
  -o counts.txt \
  sample.bam

# 如何判断用 0、1 还是 2?
# 大多数 Illumina stranded 建库用 -s 2(dUTP 法,如 TruSeq Stranded)
# 如果不确定,可以三种都试,看哪个分配最多
# 或者用 infer_experiment.py(RSeQC 工具)自动判断

2. 处理多重比对读长

# 默认只计数唯一比对的读长
# 如果要包含多重比对读长:
featureCounts \
  -p --countReadPairs \
  -M \                         # 计数多重比对的读长
  --fraction \                 # 按权重分配(1/N,N 是比对位置数)
  -a genes.gtf \
  -o counts_multi.txt \
  sample.bam

3. 在 R 中使用 Rsubread

library(Rsubread)  # 加载 Rsubread 包

# 基本计数
fc <- featureCounts(
  files = c("sample1.bam", "sample2.bam", "sample3.bam"),  # BAM 文件
  annot.ext = "genes.gtf",           # GTF 注释文件
  isGTFAnnotationFile = TRUE,        # 是 GTF 格式
  GTF.featureType = "exon",          # 特征类型
  GTF.attrType = "gene_id",          # 汇总属性
  isPairedEnd = TRUE,                # 双端数据
  countReadPairs = TRUE,             # 按片段计数
  nthreads = 8                       # 线程数
)

# 提取计数矩阵
counts_matrix <- fc$counts           # 计数矩阵
annotation <- fc$annotation          # 基因注释信息
stat <- fc$stat                      # 分配统计

# 查看前几行
head(counts_matrix)

4. 使用 SAF 格式注释

# SAF 格式比 GTF 更简单,只需 5 列
# GeneID  Chr  Start  End  Strand
# 适合自定义区域(如启动子、增强子)

# 创建 SAF 文件示例
echo -e "GeneID\tChr\tStart\tEnd\tStrand" > custom_regions.saf
echo -e "region1\tchr1\t1000\t2000\t+" >> custom_regions.saf
echo -e "region2\tchr1\t5000\t6000\t-" >> custom_regions.saf

# 用 SAF 格式计数
featureCounts \
  -F SAF \                     # 指定 SAF 格式
  -a custom_regions.saf \      # SAF 注释文件
  -o counts_custom.txt \       # 输出
  sample.bam

5. 整理输出给 DESeq2

# 把 featureCounts 输出整理成 DESeq2 可用的格式
# 去掉前 6 列注释,只保留基因名和计数
cut -f1,7- all_counts.txt | tail -n +2 > counts_for_deseq2.txt
# cut -f1,7-  → 提取第1列和第7列以后的列
# tail -n +2  → 去掉第一行(列名注释行)

常见报错与解决

报错信息原因解决方法
Unassigned_NoFeatures 比例很高注释文件和基因组版本不匹配确保 GTF 和参考基因组版本一致
Unassigned_Ambiguity 比例高读长跨越多个基因正常现象,或用 --fracOverlap 0.5 过滤
reads are not paired单端数据用了 -p 参数去掉 -p --countReadPairs
计数全为 0染色体命名不一致(chr1 vs 1)统一 GTF 和 BAM 的染色体命名
WARNING: No features found-t 参数设错了GFF3 可能需要 -t gene 而不是 -t exon
incompatible with the library链特异性参数 -s 设错试试 -s 0, -s 1, -s 2 看哪个分配最多

速查表

# ===== featureCounts 速查表 =====

# 安装
conda install -c bioconda subread     # 安装 subread 套件

# 单端计数
featureCounts -a genes.gtf -o counts.txt sample.bam

# 双端计数(最常用)
featureCounts -p --countReadPairs \
  -T 8 -t exon -g gene_id \
  -a genes.gtf -o counts.txt sample.bam

# 链特异性计数(dUTP 建库)
featureCounts -p --countReadPairs \
  -s 2 -T 8 \
  -a genes.gtf -o counts.txt sample.bam

# 批量多样本
featureCounts -p --countReadPairs \
  -T 16 -a genes.gtf \
  -o all_counts.txt *.sorted.bam

# 多重比对按权重计数
featureCounts -p --countReadPairs \
  -M --fraction \
  -a genes.gtf -o counts.txt sample.bam

# 常用参数
# -p --countReadPairs   双端数据按片段计数
# -T N                  线程数
# -t exon               特征类型(GTF 用 exon,GFF3 可能用 gene)
# -g gene_id            汇总属性
# -s 0/1/2              链特异性(0=无, 1=正链, 2=反链)
# -M                    包含多重比对
# --fraction            多重比对按权重
# -C                    不计数嵌合片段
# --extraAttributes     输出额外属性列
# -F SAF/GTF            注释格式