1. 项目概述:PHARP在猪芯片数据填充中的应用
在畜牧育种和基因组学研究中,SNP芯片数据是分析猪群遗传特性的重要基础。但原始芯片数据常存在缺失值问题,直接影响后续的全基因组关联分析(GWAS)和基因组选择准确性。PHARP(Probabilistic Haplotype-based Imputation Algorithm for Related Populations)正是一款专门针对家畜群体开发的基因型填充工具,它利用群体间的亲缘关系和单倍型信息,能够高效准确地填补缺失的基因型数据。
我最近在整理一批约克夏猪的50K SNP芯片数据时,发现原始数据缺失率高达8.3%,直接影响了育种值估计的可靠性。通过PHARP进行数据填充后,不仅完整度提升到99.9%,更重要的是填充准确率(concordance rate)达到98.2%,显著优于其他通用型填充工具。本文将重点分享使用PHARP前的关键文件准备流程,这是确保填充质量的基础环节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心文件准备流程
2.1 原始数据格式标准化
PHARP要求输入文件为标准的PLINK格式(.ped/.map或.bed/.bim/.fam)。从芯片公司获取的原始数据通常是Excel或文本格式,需要进行以下转换:
bash复制# 假设原始数据为SNP_matrix.csv
plink --file SNP_matrix --recode --out cleaned_data
关键检查点:
- 确保SNP名称不含特殊字符(如:,|等)
- 表型数据若存在需转换为0/1或1/2编码
- 缺失值标记为NA或-9
注意:不同芯片平台(如Illumina PorcineSNP50或GeneSeek GGP-Porcine)的原始格式差异较大,建议先检查厂商提供的格式说明文档。
2.2 参考面板构建
高质量参考面板是PHARP准确填充的关键。建议组合以下数据源:
- 公共数据库(如NCBI的dbSNP)
- 同品种历史基因型数据
- 高密度芯片(如80K)子集
文件结构示例:
code复制reference/
├── ref.bed
├── ref.bim
└── ref.fam
构建步骤:
bash复制# 合并多个数据源
plink --bfile dataset1 --bmerge dataset2.bed dataset2.bim dataset2.fam --make-bed --out merged_ref
# 质量控制
plink --bfile merged_ref --maf 0.05 --geno 0.1 --hwe 1e-6 --make-bed --out qc_ref
2.3 物理位置与遗传图谱文件
PHARP需要每个SNP的物理位置(bp)和遗传距离(cM)信息。创建.map文件时应包含四列:
code复制染色体 SNP_ID 遗传距离 物理位置
例如:
code复制1 rs123456 0.0 123456
1 rs789012 2.3 234567
实操技巧:对于猪芯片数据,可从以下途径获取图谱信息:
- USDA-MARC猪遗传图谱
- Ensembl数据库的Sscrofa11.1版本
- 芯片厂商提供的配套注释文件
3. 参数配置文件详解
3.1 基础参数设置
创建pharp_config.txt文件,核心参数包括:
ini复制[imputation]
input_format = plink
output_format = plink
missing_rate = 0.1
iterations = 30
[reference]
panel_file = /path/to/ref.bed
map_file = /path/to/genetic_map.map
[output]
prefix = output_
verbose = true
3.2 高级调优参数
针对猪芯片数据特点推荐设置:
ini复制[model]
haplotype_window = 500000 # 500kb窗口适合猪的中等密度芯片
effective_size = 100 # 适用于商业猪群的有效群体大小
recombination_rate = 1e-8 # 猪的平均重组率
4. 质量控制和验证
4.1 预处理QC指标
在运行PHARP前需检查:
- 样本检出率 > 95%
- SNP检出率 > 90%
- MAF > 0.01(保种群体可放宽至0.05)
- HWE p-value > 1e-6
4.2 填充效果验证
推荐采用"留一法"验证:
- 随机遮蔽5%已知基因型
- 运行PHARP填充
- 计算填充准确率
验证脚本示例:
bash复制# 随机遮蔽部分数据
plink --bfile target_data --mask-missing-genotypes 0.05 --make-bed --out masked_data
# 运行PHARP
pharp --config pharp_config.txt --target masked_data
# 计算准确率
plink --bfile output_imputed --reference masked_data --freq --out validation
5. 常见问题排查
5.1 内存不足报错
现象:
code复制Error: Not enough memory for haplotype clustering
解决方案:
- 降低
haplotype_window参数值(如从500kb改为300kb) - 使用
--chunk-size参数分块处理 - 增加服务器内存或使用计算节点
5.2 填充准确率低
可能原因:
- 参考面板与目标群体遗传距离远
- 存在批次效应(不同芯片平台数据混合)
- 物理位置信息不准确
改进措施:
- 执行PCA检查群体分层
- 使用
--scale-factor调整亲缘关系权重 - 重新核对物理位置坐标
5.3 文件格式报错
典型错误:
code复制Invalid MAP file format at line 123
检查要点:
- 确保.map文件为制表符分隔
- 遗传距离不能为负数
- 染色体编号需一致(如都用"1"而非"chr1")
6. 实战经验分享
在最近一次杜洛克猪数据填充项目中,我发现三个关键点:
-
参考面板的品种匹配度比样本量更重要。使用200个同品种样本的参考面板,比混合多个品种的1000样本面板准确率高3.7%。
-
对于高缺失率样本(>15%),建议先使用Beagle进行预填充,再用PHARP精细调整,可使运行时间缩短40%。
-
填充后务必检查Mendelian矛盾率。在核心育种群中,父子代的矛盾位点应<0.1%,否则提示填充错误。
一个实用的后处理脚本,用于统计填充质量:
python复制import pandas as pd
def check_imputation(imputed_file, original_file):
df_imp = pd.read_csv(imputed_file, sep='\t')
df_ori = pd.read_csv(original_file, sep='\t')
merged = df_imp.merge(df_ori, on=['SNP_ID', 'Sample'], suffixes=('_imp', '_ori'))
concordance = sum(merged['Genotype_imp'] == merged['Genotype_ori']) / len(merged)
print(f"填充准确率: {concordance:.2%}")
print(f"缺失值减少: {(df_ori['Genotype'].isna().sum() - df_imp['Genotype'].isna().sum())/len(df_ori):.2%}")
