GWAS pheno.txt格式解释

最后发布时间 : 2026-06-26 10:30:10 浏览量 :

是的,FIDIID 必须与 .fam 文件中的前两列一致,PLINK 就是通过这两个字段来匹配样本的。

你给出的 .fam 文件类似于:

FID IID       PID MID SEX PHENO
1   XJSCZ002  0   0   1   -9
2   XJSCZ003  0   0   2   -9
3   XJSCZ004  0   0   2   -9
4   XJSCZ006  0   0   1   -9
5   XJSCZ005  0   0   2   -9
6   SYSCZ010  0   0   2   -9

那么 pheno.txt 就应该写成:

FID IID       SCZ
1   XJSCZ002  2
2   XJSCZ003  2
3   XJSCZ004  1
4   XJSCZ006  2
5   XJSCZ005  1
6   SYSCZ010  2

这里:

  • 第一列 FID 必须是 1、2、3、4、5、6
  • 第二列 IID 必须是 XJSCZ002、XJSCZ003...
  • PLINK 会根据 (FID, IID) 这一对键进行匹配。

可以把 FID 全部改成样本名吗?

可以,但必须同时修改 .fam 和所有相关文件

例如很多项目都会把 .fam 改成:

XJSCZ002 XJSCZ002 0 0 1 -9
XJSCZ003 XJSCZ003 0 0 2 -9
XJSCZ004 XJSCZ004 0 0 2 -9

对应的 pheno.txt

FID      IID       SCZ
XJSCZ002 XJSCZ002 2
XJSCZ003 XJSCZ003 2
XJSCZ004 XJSCZ004 1

这样也是完全合法的。

如果 FID 不一致会怎么样?

例如 .fam 是:

1 XJSCZ002

pheno.txt 是:

XJSCZ002 XJSCZ002 2

那么 (FID, IID) 分别是:

.fam(1, XJSCZ002)
pheno.txt(XJSCZ002, XJSCZ002)

由于 FID 不同,PLINK 会认为这是两个不同的样本,结果就是:

  • 无法匹配到该样本;
  • 该样本的表型会被视为缺失;
  • 在日志中通常会看到大量样本因缺失表型而被排除。

如何检查是否匹配正确?

运行:

plink \
  --bfile 890S \
  --pheno pheno.txt \
  --make-bed \
  --out test

查看 test.log,如果出现类似:

0 phenotype values present after --pheno.

说明没有匹配成功,通常就是 FIDIID 不一致导致的。

对于你目前的 .fam

既然第一列已经是数字 1、2、3...,最简单、最稳妥的做法就是:

  • pheno.txt 第一列也使用 1、2、3...
  • covar.txt 第一列也使用 1、2、3...
  • 第二列保持 XJSCZ002、XJSCZ003...

保证 FIDIID.fam 完全一致,这样 PLINK 能够正确匹配所有样本。


是的,这属于 PLINK 的正常行为

如果你的 .ped 文件第 6 列(PHENOTYPE)是 0,经过:

plink --file 890S --make-bed --out 890S

生成的 .fam 可能会变成:

# ped
1 XJSCZ002 0 0 1 0
2 XJSCZ003 0 0 2 0

# fam
1 XJSCZ002 0 0 1 -9
2 XJSCZ003 0 0 2 -9

这是因为 PLINK 将 0-9 都视为“缺失表型(missing phenotype)”,在某些转换过程中会统一规范化为 -9

为什么会这样?

对于二分类或一般表型,PLINK 的约定是:

含义
1未患病(Control)
2患病(Case)
0缺失(Missing)
-9缺失(Missing)

因此:

0  == Missing
-9 == Missing

两者在大多数情况下没有本质区别,PLINK 内部可能会将它们统一保存为 -9

如果第六列是 0,它不是对照组

很多人容易误以为:

0 = Control
1 = Case

但在 PLINK 中这是错误的。

例如:

1 XJSCZ002 0 0 1 0

这里表示的是:

  • 性别:男(SEX=1
  • 表型:缺失(Missing)

而不是对照组。

如果你运行:

plink --bfile 890S --logistic

这个样本会因为没有表型而被排除。

如果想表示病例和对照,应该怎么写?

推荐直接在 .ped.fam 中填写:

FID IID PID MID SEX PHENO
1   XJSCZ002 0 0 1 2   # Case
2   XJSCZ003 0 0 2 1   # Control
3   XJSCZ004 0 0 1 2   # Case
4   XJSCZ005 0 0 2 1   # Control

对应关系:

1 -> Control
2 -> Case

不要使用 0 表示对照。

如果现在 .fam 全是 -9 怎么办?

这是很常见的情况,说明目前所有样本的表型都是缺失的。有两种处理方式:

方法一:直接修改 .fam 第六列(最简单)

把:

1 XJSCZ002 0 0 1 -9
2 XJSCZ003 0 0 2 -9

改成:

1 XJSCZ002 0 0 1 2
2 XJSCZ003 0 0 2 1

方法二:保留 .fam-9,单独提供 pheno.txt

例如:

FID IID PHENO
1 XJSCZ002 2
2 XJSCZ003 1

然后运行:

plink \
  --bfile 890S \
  --pheno pheno.txt \
  --logistic \
  --out gwas

此时 pheno.txt 中的表型会覆盖 .fam 中的缺失值。

总结

  • .ped 第 6 列写 0,生成 .fam 后变成 -9,这是 PLINK 的正常规范化行为
  • 0-9 都表示缺失表型,不表示对照组。
  • 对于病例-对照 GWAS,应使用 1 = Control2 = Case;如果使用 0,样本会被当作没有表型而不会参与关联分析。

不一定需要,取决于你的使用方式。

情况一:没有表头(最常见,也完全可以)

例如:

1 XJSCZ002 2
2 XJSCZ003 2
3 XJSCZ004 1
4 XJSCZ006 2

直接运行:

plink \
  --bfile 890S \
  --pheno pheno.txt \
  --logistic \
  --out gwas

PLINK 会默认认为:

  • 第 1 列:FID
  • 第 2 列:IID
  • 第 3 列:表型

这种写法没有任何问题。


情况二:有表头(推荐)

例如:

FID IID SCZ
1 XJSCZ002 2
2 XJSCZ003 2
3 XJSCZ004 1
4 XJSCZ006 2

如果有多个表型,还可以写成:

FID IID SCZ BMI AGE
1 XJSCZ002 2 23.5 45
2 XJSCZ003 1 21.8 38
3 XJSCZ004 2 26.1 41

然后指定要使用哪一列:

plink \
  --bfile 890S \
  --pheno pheno.txt \
  --pheno-name SCZ \
  --logistic \
  --out gwas

这里 --pheno-name SCZ 就是根据表头找到 SCZ 这一列。


情况三:有表头但不使用 --pheno-name

如果只有一个表型列,例如:

FID IID PHENO
1 XJSCZ002 2
2 XJSCZ003 1

很多版本的 PLINK 也能够正确识别并跳过表头,直接使用 PHENO 列进行分析。

但是,如果有多个表型列,建议显式使用 --pheno-name 指定列名,避免歧义。


对于你的项目,推荐哪种?

如果只是做一次 SCZ 的病例-对照 GWAS,推荐使用带表头的格式:

FID IID SCZ
1 XJSCZ002 2
2 XJSCZ003 2
3 XJSCZ004 1
4 XJSCZ006 2
5 XJSCZ005 1
6 SYSCZ010 2

并运行:

plink \
  --bfile 890S \
  --pheno pheno.txt \
  --pheno-name SCZ \
  --covar covar.txt \
  --logistic \
  --out gwas

这种方式可读性更好,将来如果增加 BMI、年龄等其他表型列,也不需要修改文件格式,只需调整 --pheno-name 即可。