跳转至

169_适配体SELEX分析

一句话概述

SELEX-seq(系统进化配体指数富集测序)通过高通量测序追踪随机DNA/RNA文库经过多轮筛选后的序列富集动态,利用生物信息学分析序列富集度、结构预测和亲和力排名,加速高亲和力适配体(Aptamer)的发现。


核心知识点总览

知识点说明
SELEX体外筛选高亲和力核酸适配体的方法
高通量SELEX(HT-SELEX)结合NGS追踪每轮筛选的序列变化
序列富集分析比较不同轮次中序列频率变化
基序(Motif)发现找到富集序列中的保守结构元件
二级结构预测预测适配体的折叠结构(茎环/G-四链体等)
亲和力排名基于富集度和结构特征预测结合亲和力
聚类分析将相似序列聚类为家族
应用场景诊断探针、药物递送、生物传感器

各步骤详解

第一步:SELEX-seq实验和数据概述

白话解释: SELEX就像"钓鱼比赛":从10^14种随机DNA序列的"大池塘"里,经过多轮"钓鱼"(与靶蛋白结合→洗掉不结合的→留下结合的→扩增→下一轮),最终能紧紧咬住靶标的序列会越来越多。HT-SELEX在每一轮都做测序,看哪些序列在变多(被富集)——这些就是潜在的高亲和力适配体。

数据结构:

Round0 (初始文库): 10M unique sequences, 均匀分布
Round3: 部分序列开始富集
Round6: 少量序列高度富集
Round10: 若干序列主导(>1% each)


第二步:数据预处理和序列提取

代码示例:

# === 质控和接头去除 ===
# SELEX文库结构: 5'固定区-随机区(N20-N60)-3'固定区
fastp -i round3_R1.fq.gz -I round3_R2.fq.gz \
  -o clean_R1.fq.gz -O clean_R2.fq.gz \
  --adapter_sequence AGATCGGAAGAG

# === 提取随机区 ===
# 已知5'引物(20nt) + 随机区(40nt) + 3'引物(20nt)
cutadapt -g FIXED_5PRIME_SEQUENCE \
  -a FIXED_3PRIME_SEQUENCE \
  -o random_region.fq.gz \
  --discard-untrimmed \
  clean_R1.fq.gz

# === 序列计数和去重 ===
zcat random_region.fq.gz | awk 'NR%4==2' | sort | uniq -c | \
  sort -rn > round3_counts.txt
# 输出: count sequence

# === Python处理 ===
from collections import Counter
from Bio import SeqIO
import pandas as pd

def process_selex_round(fastq_file, primer5="ATCGATCG", primer3="GCTAGCTA"):
    """提取随机区并计数"""
    sequences = Counter()
    for record in SeqIO.parse(fastq_file, "fastq"):
        seq = str(record.seq)
        # 找到引物位置并提取随机区
        start = seq.find(primer5)
        end = seq.find(primer3)
        if start >= 0 and end > start:
            random_region = seq[start+len(primer5):end]
            if 35 <= len(random_region) <= 45:  # 期望40nt
                sequences[random_region] += 1
    return sequences

# 处理各轮次
rounds = {}
for r in range(0, 11):
    rounds[f"Round{r}"] = process_selex_round(f"round{r}_clean.fq")
    print(f"Round{r}: {len(rounds[f'Round{r}'])} unique, {sum(rounds[f'Round{r}'].values())} total")

第三步:富集分析

代码示例:

import numpy as np
import pandas as pd

# === 计算各序列的富集度 ===
def calculate_enrichment(counts_later, counts_earlier, pseudocount=1):
    """计算两轮间的富集倍数"""
    # 归一化为频率
    total_later = sum(counts_later.values())
    total_earlier = sum(counts_earlier.values())

    enrichment = {}
    all_seqs = set(counts_later.keys()) | set(counts_earlier.keys())

    for seq in all_seqs:
        freq_later = (counts_later.get(seq, 0) + pseudocount) / (total_later + pseudocount)
        freq_earlier = (counts_earlier.get(seq, 0) + pseudocount) / (total_earlier + pseudocount)
        enrichment[seq] = freq_later / freq_earlier

    return enrichment

# 计算Round0→Round10的富集
enrichment_0_10 = calculate_enrichment(rounds["Round10"], rounds["Round0"])

# Top富集序列
top_sequences = sorted(enrichment_0_10.items(), key=lambda x: x[1], reverse=True)[:100]

# === 富集动力学追踪 ===
# 追踪top序列在各轮次的频率变化
top_seqs = [s[0] for s in top_sequences[:20]]
dynamics = pd.DataFrame(index=top_seqs)

for round_name, counts in rounds.items():
    total = sum(counts.values())
    dynamics[round_name] = [counts.get(seq, 0)/total for seq in top_seqs]

# 可视化富集曲线
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
for i, seq in enumerate(top_seqs[:5]):
    ax.plot(range(11), dynamics.loc[seq].values, label=f"Seq_{i+1}")
ax.set_xlabel("SELEX Round")
ax.set_ylabel("Frequency")
ax.set_title("Aptamer Enrichment Dynamics")
ax.legend()
plt.savefig("enrichment_dynamics.png", dpi=150)


第四步:结构预测和亲和力排名

代码示例:

import RNA  # ViennaRNA

# === 二级结构预测 ===
def predict_structure(sequence):
    """预测RNA/DNA适配体二级结构"""
    structure, mfe = RNA.fold(sequence)
    return structure, mfe

# 对top适配体预测结构
structural_features = []
for seq in top_seqs[:50]:
    struct, mfe = predict_structure(seq)
    # G-四链体检测
    g4_potential = detect_g_quadruplex(seq)

    structural_features.append({
        'sequence': seq,
        'structure': struct,
        'MFE': mfe,
        'stem_count': struct.count('('),  # 配对碱基数
        'loop_fraction': struct.count('.')/len(struct),
        'G4_potential': g4_potential,
        'GC_content': (seq.count('G')+seq.count('C'))/len(seq)
    })

features_df = pd.DataFrame(structural_features)

# === G-四链体检测 ===
import re
def detect_g_quadruplex(seq):
    """检测G-四链体基序"""
    pattern = r'(G{3,}).{1,7}(G{3,}).{1,7}(G{3,}).{1,7}(G{3,})'
    match = re.search(pattern, seq)
    return match is not None

# === 综合亲和力排名 ===
# 结合富集度和结构特征
features_df['enrichment'] = [enrichment_0_10[s] for s in features_df['sequence']]
features_df['affinity_score'] = (
    0.5 * np.log2(features_df['enrichment']) +
    0.3 * (-features_df['MFE']) +  # 更稳定结构可能更好
    0.2 * features_df['stem_count'] / features_df.sequence.str.len()
)

# 排名
features_df_sorted = features_df.sort_values('affinity_score', ascending=False)
print("Top 10 aptamer candidates:")
print(features_df_sorted[['sequence', 'enrichment', 'MFE', 'affinity_score']].head(10))


第五步:序列聚类和基序发现

代码示例:

from sklearn.cluster import DBSCAN
from Levenshtein import distance as lev_distance
import numpy as np

# === 基于编辑距离的聚类 ===
# 计算距离矩阵
n = len(top_seqs[:100])
dist_matrix = np.zeros((n, n))
for i in range(n):
    for j in range(i+1, n):
        d = lev_distance(top_seqs[i], top_seqs[j])
        dist_matrix[i, j] = d
        dist_matrix[j, i] = d

# DBSCAN聚类
clustering = DBSCAN(eps=5, min_samples=3, metric='precomputed')
clusters = clustering.fit_predict(dist_matrix)
print(f"发现 {len(set(clusters))-1} 个序列家族 (+噪声)")

# === 基序发现(MEME) ===
# 将top序列写入FASTA
with open("top_aptamers.fasta", "w") as f:
    for i, seq in enumerate(top_seqs[:50]):
        f.write(f">aptamer_{i}\n{seq}\n")

# 使用MEME发现保守基序
meme top_aptamers.fasta -dna -oc meme_output/ -nmotifs 5 -minw 6 -maxw 15 -mod zoops

实战命令

# === SELEX-seq完整分析流程 ===
# 1. 质控
for r in 0 3 6 10; do
  fastp -i round${r}.fq.gz -o round${r}_clean.fq.gz
done

# 2. 序列提取和计数
python extract_random_regions.py --rounds 0,3,6,10 --output counts/

# 3. 富集分析
python enrichment_analysis.py --input counts/ --output enrichment/

# 4. 结构预测
python structure_predict.py --top 100 --output structures/

# 5. 基序发现
meme top_aptamers.fa -dna -oc meme_out/ -nmotifs 5

面试常问点

Q1:HT-SELEX与传统SELEX的优势?

A: 传统SELEX需要8-15轮筛选后克隆测序少量序列。HT-SELEX在早期轮次(3-6轮)就可以通过NGS追踪百万级序列的富集动态:(1) 减少筛选轮数(避免过度富集导致多样性丢失);(2) 发现中等亲和力但有独特结构的适配体;(3) 提供富集动力学信息帮助理解选择压力;(4) 可同时识别多个独立的适配体家族。

Q2:如何判断一个序列是否是真正的高亲和力适配体?

A: 多维度评估:(1) 富集度高(相对Round0频率增加>100倍);(2) 富集动力学合理(逐轮递增而非突然出现);(3) 预测结构稳定(负MFE)且有明确的结合口袋结构;(4) 与同家族序列有保守基序(功能性序列元件);(5) 最终需要实验验证:SPR、ITC或滤膜结合实验测定Kd。

Q3:SELEX数据中PCR偏差如何影响结果?

A: PCR会引入两种偏差:(1) GC含量偏差——GC极端的序列扩增效率不同;(2) 结构偏差——强二级结构的序列可能扩增困难。影响:某些序列的富集可能是PCR偏好而非真实结合选择。应对:(1) 使用emulsion PCR或digital PCR减少偏差;(2) 分析中校正GC含量和结构复杂度;(3) 对照实验(无靶标SELEX)排除PCR偏好的序列。

Q4:G-四链体适配体有什么特殊性?

A: G-四链体(G4)是4条G-tract通过Hoogsteen氢键形成的特殊结构,在适配体中常见(如凝血酶适配体TBA)。特点:(1) 结构非常稳定(K+稳定);(2) 序列模式:(G3+N1-7)4;(3) 靶标结合主要通过loop区和G-quartet平面;(4) 分析时需要使用专门的G4结构预测工具(QGRS Mapper)而非普通RNA折叠。


易错点

1. 未正确去除固定区序列

错误: 分析中包含引物序列,导致虚假保守性。 正确做法: 严格提取随机区,去除5'和3'固定序列。

2. 过度筛选导致多样性丢失

错误: 分析Round15的数据,只剩下1-2条高频序列。 正确做法: HT-SELEX的优势是在早期轮次(Round3-6)就可以看到富集趋势。过度筛选会丢失有价值的中等亲和力适配体。

3. 将PCR duplicates当作真实富集

错误: 不区分PCR复制和真实选择导致的频率增加。 正确做法: 使用UMI标记每个原始分子,或分析多个独立PCR重复的一致性。

4. 忽略负选择控制

错误: 不做negative control SELEX。 正确做法: 平行进行无靶标/非特异靶标SELEX,排除非特异富集的序列(如强PCR偏好、强自身结构但无结合的序列)。


补充知识

分析工具

  • AptaSUITE: 综合SELEX-seq分析Java工具
  • APTANI: 适配体鉴定R包
  • FASTAptamer: 适配体序列分析Perl工具
  • Mfold/ViennaRNA: 结构预测
  • QGRS Mapper: G-四链体预测

适配体数据库

  • Aptamer Base: 已知适配体及其靶标数据库
  • SELEX DB: SELEX实验数据汇总