20260910 143546 Crispr 筛选 Hits 鉴定全流程实现详解

20260910_143546_CRISPR_筛选_Hits_鉴定全流程实现详解.md

CRISPR 筛选 Hits 鉴定全流程实现详解

基于 bio-research-suite 技能库中 15 个 CRISPR 筛选相关技能的实际内容编写
涵盖从 sgRNA 库设计 → FASTQ 计数 → QC → 拷贝数校正 → Hit Calling → 通路富集的端到端流程


场景假设

你在研究一种新型靶向抗癌药物 compound-X,作用于某癌症细胞系 HCT116。需要设计并执行一个全基因组 CRISPR-Cas9 敲除筛选,找出:
- 致敏基因(sensitizer):敲除后使细胞对药物更敏感(合成致死)
- 抗性基因(resistance):敲除后使细胞耐受药物

实验设计:药物处理组 vs. 载体对照组,各 2 个生物学重复, brunello 文库(4 条 sgRNA/基因,约 76,000 条 sgRNA),Day 14 收集细胞。


全流程概览

 sgRNA库设计 → FASTQ → 计数 → QC → 拷贝数校正 → Hit Calling → 通路富集 → 可视化
     |           |        |       |         |            |           |          |
  Step 1      Step 2   Step 3  Step 4    Step 5       Step 6      Step 7    Step 8

Step 1: sgRNA 文库设计

涉及技能

技能 功能
bio-crispr-screens-library-design 文库设计全流程(化学体系选择、on-target 打分、control 设计)
bio-genome-engineering-grna-design 单条 gRNA 设计

关键决策:选什么文库

文库 化学体系 每基因 sgRNA 特点
Brunello SpCas9 KO 4 Doench Rule Set 2 打分,on-target 效率高
Avana SpCas9 KO 6 DepMap 使用,更密覆盖
TKOv3 SpCas9 KO 4 加入了增强子靶向 sgRNA
Dolcetto CRISPRi 6 不切割 DNA,适合剂量敏感基因

本场景选择 Brunello 文库(全基因组 KO 筛选标准选择)。

文库 QC 要点

  • Gini 指数 < 0.1(质粒库均匀度)
  • 零计数 sgRNA < 0.5%
  • 每条 sgRNA 覆盖 ≥ 500x 细胞(MOI ≈ 0.3)
  • 非靶向对照(NTC)≥ 500 条
# 检查文库均匀度
import pandas as pd
import numpy as np

def library_qc(counts_df):
    """文库质量控制指标"""
    out = pd.DataFrame(index=counts_df.columns)
    out['n_detected'] = (counts_df > 0).sum()
    out['pct_zero'] = (counts_df == 0).sum() / len(counts_df) * 100
    out['pct_lowcount'] = (counts_df < 30).sum() / len(counts_df) * 100
    out['gini'] = counts_df.apply(gini_coefficient)
    out['median_count'] = counts_df.median()
    out['p90_p10_ratio'] = counts_df.quantile(0.9) / counts_df.quantile(0.1).replace(0, np.nan)
    return out

def gini_coefficient(x):
    """计算 Gini 指数"""
    x = np.sort(x[x > 0])
    n = len(x)
    cumsum = np.cumsum(x)
    return (2 * np.sum((np.arange(1, n+1)) * x) - (n + 1) * cumsum[-1]) / (n * cumsum[-1])

关键陷阱

  • CRISPRi/a 必须用 FANTOM5 CAGE TSS:靶向没有 CAGE 证据的 TSS 会丢失大部分敲低效率
  • Cas9 KO 对旁系同源基因不敏感:42% 组成型表达基因因旁系同源缓冲而无法检出(Dede 2020),需用 Cas12a 多重文库
  • 统计预测的 guide 效率不等于实验效率:Azimuth/DeepSpCas9 打分仅作初筛,仍需实验验证

Step 2: FASTQ 预处理

涉及技能

技能 功能
bio-read-qc-fastp-workflow fastp 一站式预处理
bio-read-qc-quality-reports FastQC + MultiQC
# fastp 预处理
fastp \
    --input_plasmid_R1.fq.gz --input_plasmid_R2.fq.gz \
    --output_Day0_R1.fq.gz --output_Day0_R2.fq.gz \
    --detect_adapter_for_pe \
    --correction \
    --cut_front --cut_tail \
    --thread 16

# 生成质量报告
fastqc *.fq.gz -t 16 -o qc_reports/
multiqc qc_reports/ -o multiqc_report/

关键陷阱

  • fastp 自动接头检测不通用:若使用自定义文库构建 kit,需显式指定 --adapter_sequence
  • CRISPR 文库的 sgRNA 区段通常固定长度:不依赖 fastp 自动 trim,直接在 MAGeCK count 步骤用 --trim-5 AUTO

Step 3: sgRNA 计数

涉及技能

技能 功能
bio-crispr-screens-mageck-analysis MAGeCK count:FASTQ → sgRNA 计数矩阵

MAGeCK count 命令

mageck count \
    --list-seq brunello_library.csv \
    --sample-label Plasmid,Day0,Veh_r1,Veh_r2,Drug_r1,Drug_r2 \
    --fastq Plasmid.fq.gz Day0.fq.gz Veh_r1.fq.gz Veh_r2.fq.gz Drug_r1.fq.gz Drug_r2.fq.gz \
    --norm-method median \
    --output-prefix screen \
    --trim-5 AUTO

文库文件格式(CSV,列顺序固定):

sgRNA,Sequence,Gene
BRCA1_1,ATGGATTTATCTGCTCTTCG,BRCA1
BRCA1_2,CAGCAGATACTTGATGCATC,BRCA1
NTC_0001,GACGCATCGAATCAATAGCC,NonTargeting_0001

输出文件

文件 内容
screen.count.txt 原始计数矩阵
screen.count_normalized.txt 中位数归一化计数
screen.countsummary.txt 每样本 QC(Gini、reads、mapping rate)

归一化方法选择

--norm-method 适用场景 机制 何时失效
median(默认) 标准筛选,<40% sgRNA 变化 缩放到所有 sgRNA 中位数 重度筛选(>40% 变化)时中位数偏移
control 重度筛选,有 ≥500 条 NTC 用 NTC 中位数缩放 必须提供 --control-sgrna ntcs.txt
total 等测序深度假设 缩放到总 reads 对 PCR jackpot 敏感

诊断流程:先用 median 跑一遍,如果 QC 显示 CEGv2 PR-AUC < 0.5 但 Gini 正常,换用 control 重新归一化。


Step 4: 质量控制

涉及技能

技能 功能
bio-crispr-screens-screen-qc 全方位 QC(Gini、replicate correlation、CEGv2 PR-AUC)

六阶段瓶颈检测

阶段 关键指标 合格阈值 不及格后果
质粒库 Gini, skew, %zero Gini < 0.1, skew < 2, zero < 0.5% sgRNA 丢失无法区分
Day-0 感染 文库覆盖, MOI ≥99% guide 检出, MOI 0.3 奠基者效应
筛选 (puro/blast) 存活率, Gini 漂移 30-40% 存活, ΔGini < 0.05 筛选假象
终点 Replicate 相关性 Pearson ≥ 0.8, Spearman > 0.7 噪声主导, FDR 膨胀
生物学信号 CEGv2 PR-AUC > 0.7 at FDR 5% 筛选无信号
拷贝数假象 扩增区富集 sgRNA 切割数与 depletion 无相关 扩增区假阳性
# Replicate 一致性检查
import pandas as pd
import numpy as np
from scipy.stats import pearsonr, spearmanr

def replicate_concordance(counts_df, groups):
    """检查生物学重复的一致性"""
    results = []
    for group_name, samples in groups.items():
        if len(samples) >= 2:
            log_counts = np.log2(counts_df[samples] + 1)
            for i in range(len(samples)):
                for j in range(i+1, len(samples)):
                    r_pearson, p_p = pearsonr(
                        log_counts[samples[i]], log_counts[samples[j]])
                    r_spearman, p_s = spearmanr(
                        log_counts[samples[i]], log_counts[samples[j]])
                    results.append({
                        'group': group_name,
                        'pair': f"{samples[i]} vs {samples[j]}",
                        'pearson_r': r_pearson,
                        'spearman_r': r_spearman
                    })
    return pd.DataFrame(results)

# 使用
groups = {
    'Vehicle': ['Veh_r1', 'Veh_r2'],
    'Drug': ['Drug_r1', 'Drug_r2']
}
concordance = replicate_concordance(counts, groups)
print(concordance)
# 要求: Pearson >= 0.8, Spearman > 0.7

关键陷阱

  • Plasmid Gini > 0.1 → 文库合成或扩增偏差,筛选不可用
  • Endpoint Gini > 0.30 → 需区分是强生物学选择(药物筛选可接受)还是瓶颈效应
  • CEGv2 PR-AUC < 0.7 → 筛选质量不达标,hit 列表不可信

Step 5: 拷贝数校正(癌症细胞系必备)

涉及技能

技能 功能
bio-crispr-screens-copy-number-correction CRISPRcleanR / CERES / Chronos

为什么必须做

机制(Aguirre 2016, Munoz 2016):
1. 局部扩增 → 某区域有 4-50+ 个拷贝
2. 每条 sgRNA 同时切割所有拷贝
3. 多重切割 → DNA 损伤反应 → G2 期阻滞
4. 细胞停滞 → sgRNA 表现为”必需”(假阳性)

影响范围:所有 Cas9-KO 癌症细胞系筛选,普遍性的,不可通过增加测序深度或重复数修复。

典型案例:ERBB2 在 HER2 扩增的 SK-BR-3 中表现为必需(假阳性)

方法选择

可用数据 推荐方法 理由
无匹配 CN 数据 CRISPRcleanR 无监督,仅用基因组位置
单细胞系 + 匹配 CN CRISPRcleanR 或 Chronos Chronos 更严谨
DepMap 规模(1000+ 系) Chronos 群体动力学 + CN + 筛选质量

CRISPRcleanR 预校正(R)

library(CRISPRcleanR)

# 加载文库注释
data(KY_Library_v1.0)

# 归一化 + 计算折变化
norm_counts <- ccr.NormfoldChanges(
    filename = 'counts.txt',
    min_reads = 30,
    EXPname = 'hct116_screen',
    libraryAnnotation = KY_Library_v1.0
)

# 基因组位置校正
cleaned <- ccr.GWclean(
    norm_counts,
    libraryAnnotation = KY_Library_v1.0,
    saveToPath = 'corrected/'
)

# 校正后的计数可用于 MAGeCK 下游分析

关键陷阱

  • CRISPRi/CRISPRa 无需 CN 校正:不切割 DNA,无 DNA 损伤假象
  • CRISPRcleanR 输出的是校正后的计数,兼容任何下游工具(MAGeCK/BAGEL2/drugZ)
  • MYC 扩增的结直肠细胞系(10+ 拷贝)、FGFR1 扩增的头颈鳞癌细胞系均为典型假阳性

Step 6: Hit Calling

涉及技能

技能 功能
bio-crispr-screens-mageck-analysis MAGeCK RRA(两条件)或 MLE(多条件)
bio-crispr-screens-drugz-chemogenomic drugZ(药物筛选专用)
bio-crispr-screens-bagel-essentiality BAGEL2(必需性分类)
bio-crispr-screens-hit-calling 跨方法决策树 + 共识策略

方法选择决策树

实验设计 首选方法 原因
两条件(药物 vs 载体),单细胞系 drugZ 药物筛选专用,双向 Z,对小效应更敏感
多时间点(Day 0→7→14→21) MAGeCK MLE RRA 无法建模多时间点
多细胞系面板 Chronos 联合建模 CN + 筛选质量
必需性分类(Day 0 → 终点) BAGEL2 贝叶斯分类,CEGv2/NEGv1 校准
多筛联合分析 JACKS 共享 sgRNA 效率

本场景:drugZ + MAGeCK RRA 共识策略

为什么用 drugZ 而非 MAGeCK 作为药物筛选首选:
- drugZ 是双向 Z-score,同时检测致敏(synth)和抗性(supp)
- 对小效应(药物筛选典型 10-30% sgRNA 变化)比 RRA 更敏感
- Colic et al. 2019 基准测试:drugZ hits 对预期 DDR 通路富集远超 MAGeCK/STARS/edgeR

drugZ 分析
python drugz.py \
    -i screen.count.txt \
    -o drugz_results.txt \
    -c Veh_r1,Veh_r2 \
    -x Drug_r1,Drug_r2

drugZ 输出列:

列 含义
gene 基因名
sumZ sgRNA 级 Z-score 之和
normZ 归一化后的 per-gene Z
synth_pval / synth_fdr 致敏方向 p 值 / FDR
supp_pval / supp_fdr 抗性方向 p 值 / FDR
MAGeCK RRA 分析(对照验证)
mageck test \
    --count-table screen.count.txt \
    --treatment-id Drug_r1,Drug_r2 \
    --control-id Veh_r1,Veh_r2 \
    --norm-method median \
    --output-prefix drug_vs_veh \
    --gene-lfc-method median \
    --sort-criteria pos

MAGeCK 输出解读:

列 含义 判定标准
neg\|fdr 负选择(depletion)FDR < 0.05 → 敏感基因
neg\|lfc 负选择 log2FC < -1 → 2 倍以上消耗
pos\|fdr 正选择(enrichment)FDR < 0.05 → 抗性基因
pos\|lfc 正选择 log2FC > 1 → 2 倍以上富集
BAGEL2 必需性分析(补充)
# 1. 计算折叠变化
BAGEL.py fc \
    -i screen.count_normalized.txt \
    -o bagel_fc.txt \
    -c Day0 \
    -e Veh_r1,Veh_r2,Drug_r1,Drug_r2

# 2. 计算 Bayes Factor
BAGEL.py bf \
    -i bagel_fc.txt \
    -o bagel_bf.txt \
    -e CEGv2.txt \
    -n NEGv1.txt

# 3. 精确率-召回率曲线
BAGEL.py pr \
    -i bagel_bf.txt \
    -o bagel_pr \
    -e CEGv2.txt \
    -n NEGv1.txt

BAGEL2 校准:BF > 6 ≈ 90% 后验概率,~5% FDR(Hart 2017 惯例)

共识 Hit 调用

import pandas as pd

def consensus_hits(drugz_path, mageck_path, fdr_threshold=0.05):
    """跨方法共识 hit 调用"""
    # drugZ hits
    drugz = pd.read_csv(drugz_path, sep='\t')
    drugz_synth = drugz[drugz['synth_fdr'] < fdr_threshold]['gene'].tolist()
    drugz_supp = drugz[drugz['supp_fdr'] < fdr_threshold]['gene'].tolist()

    # MAGeCK hits
    mageck = pd.read_csv(mageck_path, sep='\t')
    mageck_neg = mageck[mageck['neg|fdr'] < fdr_threshold]['id'].tolist()
    mageck_pos = mageck[mageck['pos|fdr'] < fdr_threshold]['id'].tolist()

    # 共识
    consensus_sensitizer = set(drugz_synth) & set(mageck_neg)  # 敏感基因
    consensus_resistance = set(drugz_supp) & set(mageck_pos)   # 抗性基因

    # 单方法 hits(需正交验证)
    drugz_only_synth = set(drugz_synth) - set(mageck_neg)
    mageck_only_neg = set(mageck_neg) - set(drugz_synth)

    return {
        'consensus_sensitizers': consensus_sensitizer,
        'consensus_resistance': consensus_resistance,
        'drugz_only': drugz_only_synth,
        'mageck_only': mageck_only_neg
    }

跨方法分歧时的处理

分歧模式 可能原因 处理方式
MAGeCK FDR 显著, BAGEL2 不显著 参考集不同;BAGEL2 训练于 CEGv2/NEGv1 必需性判断信 BAGEL2;一般 LFC 信 MAGeCK
MAGeCK 显著, drugZ 不显著 RRA 对小效应不敏感 药物筛选中信 drugZ
MAGeCK 和 Chronos top 100 一致, 100-300 分歧 Chronos 校正了 CN,MAGeCK 没有 癌症细胞系信 Chronos
RRA 和 MLE 在同一数据上分歧 RRA 对离群值更鲁棒;MLE 更敏感 两方法都排名靠前 = 高可信

Step 7: 通路富集

涉及技能

技能 功能
bio-pathway-go-enrichment GO 富集分析
bio-pathway-kegg-pathways KEGG 通路分析
bio-pathway-gsea GSEA(fgsea)

分析方式

library(clusterProfiler)

# 对 hit 基因做 GO 富集
go_result <- enrichGO(
    gene = hit_genes,
    OrgDb = org.Hs.eg.db,
    ont = "BP",
    pAdjustMethod = "BH",
    pvalueCutoff = 0.05,
    qvalueCutoff = 0.2
)

# KEGG 通路富集
kegg_result <- enrichKEGG(
    gene = hit_genes,
    organism = "hsa",
    pAdjustMethod = "BH"
)

# GSEA:用 MAGeCK 排名(neg|score 或 neg|lfc)
library(fgsea)
ranks <- mageck_results$`neg|lfc`
names(ranks) <- mageck_results$id
fgsea_result <- fgsea(
    pathways = kegg_pathways,
    stats = ranks,
    minSize = 15,
    maxSize = 500
)

关键陷阱

  • GSEA 用排序列表,不用 p 值过滤列表:按 log2FC 或 signed -log10(p) 排序所有基因
  • 对 hit 基因做超几何检验时使用背景基因 = 文库中所有基因,不是全基因组

Step 8: 可视化

涉及技能

技能 功能
bio-data-visualization-volcano-and-ma-plots 火山图
bio-data-visualization-heatmaps-clustering 热图
bio-data-visualization-rank-plots 排名图
import matplotlib.pyplot as plt
import numpy as np

def crispr_volcano(gene_summary_path, direction='neg', fdr_threshold=0.05, lfc_threshold=1.0):
    """CRISPR 筛选火山图"""
    df = pd.read_csv(gene_summary_path, sep='\t')
    lfc_col = f'{direction}|lfc'
    fdr_col = f'{direction}|fdr'

    fig, ax = plt.subplots(figsize=(10, 8))
    sig = (df[fdr_col] < fdr_threshold) & (np.abs(df[lfc_col]) > lfc_threshold)

    ax.scatter(df.loc[~sig, lfc_col],
               -np.log10(df.loc[~sig, fdr_col].clip(lower=1e-10)),
               c='lightgray', alpha=0.3, s=8, label='n.s.')
    ax.scatter(df.loc[sig, lfc_col],
               -np.log10(df.loc[sig, fdr_col].clip(lower=1e-10)),
               c='red' if direction == 'neg' else 'blue',
               alpha=0.7, s=20, label=f'FDR<{fdr_threshold}, |LFC|>{lfc_threshold}')

    top = df.loc[sig].nsmallest(20, fdr_col)
    for _, r in top.iterrows():
        ax.annotate(r['id'], (r[lfc_col], -np.log10(max(r[fdr_col], 1e-10))),
                    fontsize=7, ha='center', va='bottom')

    ax.axhline(-np.log10(fdr_threshold), ls='--', c='black', lw=0.5)
    ax.axvline(0, c='gray', lw=0.5)
    ax.axvline(-lfc_threshold, ls=':', c='gray', lw=0.5)
    ax.axvline(lfc_threshold, ls=':', c='gray', lw=0.5)
    ax.set_xlabel(f'{direction} LFC (log2 fold change)')
    ax.set_ylabel('-log10(FDR)')
    ax.legend()
    return fig

全流程总结图

 ┌────────────┐   ┌────────────┐   ┌─────────────────┐
 │  Step 1    │   │  Step 2    │   │   Step 3        │
 │ 文库设计    │──►│ FASTQ 预处理│──►│  MAGeCK count   │
 │ Brunello   │   │ fastp      │   │  FASTQ→计数矩阵  │
 └────────────┘   └────────────┘   └────────┬────────┘
                                            │
                    ┌───────────────────────▼──────────────┐
                    │         Step 4: QC                   │
                    │  Gini / replicate / CEGv2 PR-AUC     │
                    └───────────────┬──────────────────────┘
                                    │
                    ┌───────────────▼──────────────────────┐
                    │    Step 5: 拷贝数校正 (癌症细胞系)    │
                    │    CRISPRcleanR / Chronos             │
                    └───────────────┬──────────────────────┘
                                    │
              ┌─────────────────────▼──────────────────────┐
              │            Step 6: Hit Calling              │
              │  ┌─────────┐  ┌──────────┐  ┌───────────┐  │
              │  │ drugZ   │  │ MAGeCK   │  │ BAGEL2    │  │
              │  │ (药物)  │  │ RRA/MLE  │  │ (必需性)  │  │
              │  └────┬────┘  └────┬─────┘  └─────┬─────┘  │
              │       └─────┬──────┘              │        │
              │         共识 hits                │        │
              └─────────────────┬─────────────────────────┘
                                │
              ┌─────────────────▼──────────────┐
              │     Step 7: 通路富集            │
              │  GO / KEGG / GSEA               │
              └─────────────────┬──────────────┘
                                │
              ┌─────────────────▼──────────────┐
              │     Step 8: 可视化              │
              │  Volcano / Heatmap / Rank plot  │
              └────────────────────────────────┘

涉及技能一览表

步骤 技能 库 主要功能
Step 1 bio-crispr-screens-library-design bio sgRNA 文库设计
Step 1 bio-genome-engineering-grna-design bio gRNA 设计
Step 2 bio-read-qc-fastp-workflow bio fastp 预处理
Step 2 bio-read-qc-quality-reports bio FastQC/MultiQC
Step 3 bio-crispr-screens-mageck-analysis bio MAGeCK count
Step 4 bio-crispr-screens-screen-qc bio 全方位 QC
Step 5 bio-crispr-screens-copy-number-correction bio CN 校正
Step 6 bio-crispr-screens-mageck-analysis bio MAGeCK RRA/MLE
Step 6 bio-crispr-screens-drugz-chemogenomic bio drugZ 药物筛选
Step 6 bio-crispr-screens-bagel-essentiality bio BAGEL2 必需性
Step 6 bio-crispr-screens-hit-calling bio 跨方法决策树
Step 7 bio-pathway-go-enrichment bio GO 富集
Step 7 bio-pathway-kegg-pathways bio KEGG 通路
Step 7 bio-pathway-gsea bio GSEA
Step 8 bio-data-visualization-volcano-and-ma-plots bio 火山图
Step 8 bio-data-visualization-heatmaps-clustering bio 热图
Pipeline bio-workflows-crispr-screen-pipeline bio 端到端流程

量化阈值速查

阈值 值 来源
Hit FDR(基因级) < 0.05 MAGeCK (Li 2014)
Hit LFC 绝对值 > 1(2 倍) 生物学效应大小
中位数归一化适用条件 < 40% sgRNA 变化 中位数假设
文库覆盖 ≥ 500x/sgRNA Joung 2017
MOI ~0.3 低 MOI 确保单插入
Plasmid Gini < 0.1 MAGeCK-VISPR
Endpoint Gini < 0.30 MAGeCK-VISPR
Replicate Pearson ≥ 0.8 MAGeCK-VISPR
CEGv2 PR-AUC > 0.7 Hart 2017
BAGEL2 BF > 6 ≈ 90% posterior Hart 2017
NTC 数量 ≥ 500 归一化可靠性
每基因 sgRNA 数(MLE) ≥ 3 非零 MAGeCK 收敛要求

本文由 AI 生成,基于 bio-research-suite 技能库中 15 个 CRISPR 筛选相关技能的真实内容(SKILL.md)编写。所有命令、参数、阈值均来源于技能文档原文。

AI生成