☰
plink GWAS 数据清洗实战:从二进制文件集到 VCF 导出的完整流程
2026/10/29 17:57:03 网站建设 项目流程

简介:这份文档面向遗传学、生物信息学方向的研究生与科研人员,聚焦GWAS数据预处理环节,帮助读者系统掌握PLINK这一常用工具的操作流程。内容围绕数据管理展开,涵盖二进制文件生成、文本文件转换、等位基因频率计算等核心任务,并详细拆解--make-bed命令的四个执行步骤,包括临时文件自动生成、频率计算与低频变异剔除、最终文件输出及临时文件清理,同时说明--make-just-bim、--make-just-fam等特殊命令的适用场景与使用风险。资源包为单个docx文档,约39KB,结构紧凑,便于随查随用。目前已有1446人学习下载,适合需要快速上手PLINK、理清GWAS数据过滤与格式转换思路的初学者和进阶用户参考。

1. 从一份 docx 作业说起:plink 的 GWAS 数据处理到底在做什么

如果你手头有一份 GWAS 的作业文档,打开一看全是--make-bed、--recode、--split-x这类命令,第一反应大概是:这软件到底在折腾什么文件?其实 plink 在 GWAS 数据处理里的角色非常明确——它负责把测序或芯片产出的原始基因型数据,整理成后续关联分析能直接吃的格式,同时把质量不过关的样本和位点清出去。这份作业流程文档覆盖的正是这条链路:二进制文件集的生成、文本文件集的转换、缺失值编码、性染色体伪常染色体区的处理,以及变异 ID 的补全。适合正在做 GWAS 数据清洗的从业者,也适合第一次接触 plink 需要照着作业流程跑通的学生。它解决的不是分析问题,而是分析之前那堆又脏又乱的格式问题。

2. 二进制文件集:--make-bed 的四步执行链与过滤参数

2.1 为什么 GWAS 数据要先转成 bed/bim/fam

plink 的核心数据格式是二进制文件集,由.bed、.bim、.fam三个文件组成。.bed存基因型矩阵,.bim存变异位点信息,.fam存样本信息。为什么不用纯文本?因为 GWAS 数据动辄几十万位点、几千样本,文本格式读写一次就是几分钟起步,二进制格式能把 I/O 时间压下来一个量级。作业流程里第一步就是--make-bed,把文本文件集转成二进制文件集,同时应用 MAF、HWE 等过滤器。这一步做对了,后面的分析才有干净的数据底子。

2.2 --make-bed 的四步执行顺序

文档里写得很清楚,--make-bed不是一步到位,而是分四步走。以这条命令为例:

plink --file text_fileset --maf 0.05 --make-bed --out binary_fileset

执行逻辑是:

  1. 自动生成临时文件binary_fileset-temporary.bed + .bim + .fam,此时 MAF 过滤还没生效。
  2. 读取临时文件,计算 MAF,把 MAF < 0.05 的变异从当前分析中移除。
  3. 生成最终的binary_fileset.bed + .bim + .fam,被移除的样本和变异不会出现在这个文件集里。
  4. 删除临时文件。

这个顺序很关键。如果你以为 MAF 过滤是在生成最终文件时才做,可能会在中间步骤读到未过滤的数据。--keep-autoconv留下的只是第一步的临时文件,不带过滤结果,别搞混。

2.3 --make-just-bim 和 --make-just-fam 的适用边界

这两个命令是--make-bed的变体,分别只生成.bim或.fam文件。文档里有一句警告:使用时要非常小心,很容易让二进制基因型数据和.bim/.fam索引失同步。我一般只在两种场景下用:一是只需要更新变异注释信息,二是只需要样本清单,且明确知道不会动基因型矩阵。如果你对数据状态有任何不确定,老老实实用--make-bed,别图省事。

2.4 MAF 过滤参数怎么设

--maf 0.05是最常见的起点,意思是次等位基因频率低于 5% 的变异直接剔除。为什么是 0.05?因为低频变异在中小样本量下的统计功效很差,留着只会增加多重检验负担。但这不是铁律。如果你做的是罕见变异关联分析,这个阈值要往下调,比如 0.01 甚至 0.001。作业流程里用 0.05 是教学场景的默认值,实际项目里要根据研究设计和样本量来定。常见做法是先用 0.05 跑一遍看剩下多少位点,再决定要不要放宽。

提示:--make-bed执行过程中会生成临时文件,如果磁盘空间紧张,这一步可能中途失败。跑之前先确认输出目录有足够空间。

3. 文本文件集转换:--recode 的格式矩阵与 VCF 输出

3.1 --recode 的修饰符体系

--recode负责把二进制文件集转回文本格式,或者转成其他软件能读的格式。它的修饰符非常多,文档里列了一长串:01、12、23、A、A-transpose、AD、beagle、bimbam、fastphase、HV、lgen、oxford、structure、transpose、vcf等等。每个修饰符对应一种输出格式,选哪个取决于你下游用什么工具。

比如最基础的:

plink --bfile binary_fileset --recode --out new_text_fileset

这会生成new_text_fileset.ped和new_text_fileset.map,也就是标准的 PED/MAP 文本文件集,可以用--file重新读入。

3.2 01 和 12 编码的区别

12修饰符把 A1 等位基因编码为 1,A2 编码为 2。01则是 A1→0,A2→1。文档里特别提到,当使用01时,plink 会强制你同时指定--{output-}missing-genotype,否则缺失基因型会和 A1 纯合子混淆。这是一个很容易翻车的地方。我一般默认用12,除非下游工具明确要求 0/1 编码。

3.3 VCF 输出的三个变体和参考等位基因问题

vcf、vcf-fid、vcf-iid三个修饰符都生成 VCFv4.2 文件,区别在于样本 ID 的构造方式:

  • vcf:合并 family ID 和 within-family ID,中间加下划线。如果 ID 本身含下划线,会给出警告。
  • vcf-fid:只用 family ID 作为样本 ID。
  • vcf-iid:只用 within-family ID 作为样本 ID。
plink --bfile binary_fileset --recode vcf-iid --out new_vcf

这条命令从binary_fileset生成new_vcf.vcf,同时去掉 family ID。

这里有一个坑:A2 等位基因默认被当作参考等位基因,但会被标记为PR(not based on a real reference genome)。如果你需要参考等位基因真正正确,通常还要加上--a2-allele和--real-ref-alleles。作业流程里没展开这两个参数,但实际做 VCF 导出时绕不开。

3.4 其他常用格式的适用场景

修饰符输出格式典型用途
AD加性+显性成分文件R 语言加载
A加性成分文件不含显性成分
A-transpose变异为主序的加性文件转置矩阵
beagleBEAGLE 3.3 及更早版本的 .dat/.map单倍型分析
bimbamBIMBAM 格式单染色体时用bimbam-1chr
oxfordOxford 格式 .gen/.sample加gen-gz可 gzip 压缩
structureStructure 格式群体结构分析
transpose转置文本文件集用--tfile读入

tab、tabx、spacex控制分隔符:tab尽量用制表符,tabx强制全制表符,spacex强制全空格。这些在格式允许两种分隔符时才生效。

注意:--recode的bgz修饰符只对 VCF 输出做块 gzip 压缩,其他格式的 gzip 压缩目前不支持。

4. 缺失值、性染色体与 Mendel 误差:那些容易翻车的参数

4.1 缺失基因型和表型的输出编码

--output-missing-genotype改缺失基因型的表示字符,--output-missing-phenotype改缺失表型的表示字符串。默认值分别跟--missing-genotype和--missing-phenotype一致。这两个参数不影响--merge和自动转换器,因为那些操作生成的文件可能在同一次运行中被重新加载。如果你确实要在合并时改缺失编码,加上--make-bed。

4.2 --zero-cluster 和 --set-hh-missing 的使用条件

--zero-cluster接收一个文件,第一列是变异 ID,第二列是聚类 ID,把对应基因型调用设为缺失。文档里强调这个参数现在必须和--make-bed一起用,不能搭配其他输出命令,因为 plink 不再把整个基因型矩阵保留在内存里。

--set-hh-missing处理杂合单倍体错误。正常情况下,杂合单倍体和非男性 Y 染色体基因型调用会被记录到plink.hh,所有分析命令把它们当缺失处理,但--make-bed和--recode不会动它们。如果你确实想擦掉这些信息,用--set-hh-missing。但文档里有一句很重要的话:杂合单倍体错误最常见的来源是导入数据没有遵循 plink 的 X 染色体伪常染色体区表示约定。这种情况应该用--split-x解决,而不是--set-hh-missing。

4.3 X 染色体伪常染色体区的 split-x 和 merge-x

plink 倾向于把 X 染色体的伪常染色体区表示为独立的 XY 染色体(人类数值编码 25),这样就不需要特殊处理男性 X 杂合调用。但很多数据不遵循这个约定,导致杂合单倍体错误频发。

--split-x接收伪常染色体区的碱基对位置边界,把区域内所有变异的染色体编码改成 XY。可以用 build code 简写:

  • b36/hg18:边界 2709521 和 …
  • b37/hg19:边界 2699520 和 …
  • b38/hg38:边界 2781479 和 …
plink --bfile binary_fileset --split-x b37 no-fail --make-bed --out split_fileset

默认情况下,如果没有变异被 split 影响,plink 会报错退出。no-fail修饰符强制继续。反过来,--merge-x在数据导出前把所有 XY 变异的染色体编码改回 X。这两个参数都必须和--make-bed一起用。

4.4 Mendel 误差和缺失填充

--set-me-missing配合--make-bed扫描 Mendel 误差,把涉及的基因型设为缺失。--mendel-duos检查只有一个亲本的样本,--mendel-multigen在亲本基因型缺失时引用曾祖父母数据。

--fill-missing-a2把所有缺失调用替换为纯合 A2 调用。文档里有一句很重的警告:对于需要保留缺失信息的场景,这个操作是“information-destroying operation bordering on malpractice”。只有在填充准确性不重要,或者你明确知道所有未包含的变异都是纯合参考匹配时,才用它。和--zero-cluster/--set-hh-missing/--set-me-missing一起用时,--fill-missing-a2总是最后执行。

5. 变异 ID 补全与排错:--set-missing-var-ids 的模板陷阱

5.1 为什么需要合成变异 ID

全外显子组和全基因组测序结果里,大量变异没有标准 ID。直接扔掉太浪费,通常的做法是用染色体和位置信息合成 ID。--set-missing-var-ids就是干这个的,接收一个模板字符串,@代表染色体编码,#代表碱基对位置。模板里必须恰好有一个@和一个#。

5.2 模板字符串的写法与重复 ID 问题

假设.bim文件开头是:

chr1 . 0 10583 A G chr1 . 0 886817 C T chr1 . 0 886817 CATTTT C chrMT . 0 64 T C

用--set-missing-var-ids @:#[b37]会得到:

  • chr1:10583[b37]
  • chr1:886817[b37]
  • 第三个变异会报错,因为它和第二个变异位置相同,生成的 ID 重复。

这种情况在 1000 Genomes Project phase 1 数据里真实存在。解决办法是在模板里加入$1和$2,分别代表 ASCII 排序后的第一和第二个等位基因名:

plink --bfile binary_fileset --set-missing-var-ids @:#[b37]\$1,\$2 --make-bed --out renamed_fileset

在 bash 里$是保留字符,所以需要反斜杠转义。这样第一个变异变成chr1:10583[b37]A,G,第二个变成chr1:886817[b37]C,T,第三个变成chr1:886817[b37]C,CATTTT,第四个变成chrMT:64[b37]C,T。

但即使加了$1和$2,仍然可能遇到少量重复 ID 错误。如果涉及 indel,plink 1 可能根本无法解决,因为哪个等位基因是参考等位基因很关键。这种情况下只能用 shell 脚本在原始 VCF 文件里手动命名变异。文档里也坦承了这个限制,并说 plink 2.0 会扩展--set-missing-var-ids支持基于 REF/ALT 的命名模板。

5.3 常见报错与排查清单

现象原因解决
--make-bed中途失败,临时文件残留磁盘空间不足或权限问题清理输出目录,确认写入权限
--recode 01报错要求指定 missing-genotype01 编码下缺失基因型会和 A1 纯合子混淆加上--output-missing-genotype
--split-x报错说没有变异受影响数据里没有伪常染色体区变异加no-fail修饰符
--set-missing-var-ids报重复 ID位置重叠或 indel 等位基因歧义加$1/$2,或手动命名
--make-just-bim后数据失同步只生成了索引文件,没更新基因型矩阵改用--make-bed重新生成完整文件集
VCF 里参考等位基因标记为 PRA2 默认被当作参考但未验证加--a2-allele和--real-ref-alleles

5.4 一个容易忽略的细节:--set-mixed-mt-missing

线粒体 DNA 存在异质性,plink 1.9 允许“杂合”基因型,把 MT 当二倍体处理。但有些分析方法不接受混合 MT 调用,假设不存在“杂合”MT。--set-mixed-mt-missing配合--make-bed/--recode可以导出混合 MT 调用被擦除的数据集。这个参数在作业流程里没展开,但做线粒体相关分析时会遇到。

6. 把作业流程跑成可复现脚本:参数组合与验证习惯

6.1 一条完整的清洗链路

把前面几章的内容串起来,一个典型的 GWAS 数据清洗流程大概是:

# 第一步:文本转二进制,同时做 MAF 过滤 plink --file raw_text --maf 0.05 --make-bed --out step1_binary # 第二步:拆分 X 染色体伪常染色体区 plink --bfile step1_binary --split-x b37 no-fail --make-bed --out step2_split # 第三步:补全缺失变异 ID plink --bfile step2_split --set-missing-var-ids @:#[b37]\$1,\$2 --make-bed --out step3_renamed # 第四步:导出 VCF 供下游使用 plink --bfile step3_renamed --recode vcf-iid --out final_vcf

每一步都生成独立的文件集,不覆盖上一步的结果。这样如果第三步报重复 ID 错误,你可以从第二步重新跑,不用从头来。我一般会在每一步后面加一个--freq或--missing快速检查,确认样本量和位点数没有异常跳变。

6.2 验证输出是否正确的三个检查点

第一,看.bim文件的行数是否和预期位点数一致。第二,看.fam文件的样本数是否和原始数据匹配。第三,用--recode导出少量位点,肉眼核对基因型编码是否符合预期。这三个检查花不了几分钟,但能挡住大部分低级错误。

6.3 参数组合的优先级

当多个过滤参数同时出现时,plink 有固定的执行顺序。MAF 过滤在--make-bed的第二步执行,HWE 过滤和缺失率过滤的顺序也类似。如果你同时用了--maf、--hwe、--geno、--mind,建议先单独跑一遍看每个过滤器各去掉多少位点,再组合使用。否则一旦最终位点数不对,你很难判断是哪个过滤器的问题。

6.4 一个我踩过的坑

有一次我用--make-just-bim更新变异注释,然后直接拿旧的.bed和.fam去跑分析,结果所有位点的位置都错位了。原因是.bim的行顺序变了,但.bed里的基因型矩阵还是旧顺序。从那以后我每次用--make-just-bim或--make-just-fam之前,都会先备份完整的二进制文件集,跑完之后用--make-bed重新生成一套完整文件,再对比位点数和样本数。这个习惯帮我省了好几次后悔药。

提示:如果你不确定某个参数会不会影响文件同步,最安全的做法是始终用--make-bed生成完整文件集,只在明确知道后果时才用--make-just-bim或--make-just-fam。

6.5 把流程写成可复现脚本

作业流程文档给的是命令清单,但实际项目里我建议把每一步写成一个带注释的 bash 脚本,每个步骤的输出文件用带序号的命名。这样别人拿到你的脚本,改一下输入文件名就能跑。脚本里加上set -e,任何一步失败就停,避免错误累积。最后用md5sum记录每个输出文件的校验值,下次跑的时候对比一下,能快速发现环境或参数变化导致的结果差异。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询