基于 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
| 技能 |
功能 |
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 筛选标准选择)。
- 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 打分仅作初筛,仍需实验验证
| 技能 |
功能 |
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
| 技能 |
功能 |
bio-crispr-screens-mageck-analysis |
MAGeCK count:FASTQ → sgRNA 计数矩阵 |
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 重新归一化。
| 技能 |
功能 |
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 列表不可信
| 技能 |
功能 |
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 + 筛选质量 |
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 扩增的头颈鳞癌细胞系均为典型假阳性
| 技能 |
功能 |
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 作为药物筛选首选:
- drugZ 是双向 Z-score,同时检测致敏(synth)和抗性(supp)
- 对小效应(药物筛选典型 10-30% sgRNA 变化)比 RRA 更敏感
- Colic et al. 2019 基准测试:drugZ hits 对预期 DDR 通路富集远超 MAGeCK/STARS/edgeR
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 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 倍以上富集 |
# 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 惯例)
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 更敏感 |
两方法都排名靠前 = 高可信 |
| 技能 |
功能 |
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 基因做超几何检验时使用背景基因 = 文库中所有基因,不是全基因组
| 技能 |
功能 |
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生成