大家好,我是邓飞。
最近有小伙伴问了一个问题:
数据中有一些固定因子,比如性别、场年季、胎次等数据,怎么进行表型矫正。

文章中有一个截图,介绍表型数据是通过固定因子矫正后的表型值:

其实GWAS和GS分析,都可以使用固定因子进行表型矫正,就是使用GLM模型,将残差值作为校正后的表型值,进行后续的GWAS分析和GS分析。另外一种更简单的方法,是直接将其作为协变量进行模型的分析。
这两种方法都是一样的,不过现在大都是将其作为协变量直接加入到模型中,因为现在的软件GCTA、GEMMA、rMVP、asreml等软件都支持协变量的加入。
还有一个经常思考的问题:为何要用残差作为矫正后的表型值?
在 GWAS 和 GS 里用残差当作校正表型,核心原因就一句话:把环境、批次、重复等非遗传干扰去掉,只留下真正能反映个体遗传差异的表型信号。剩下的就是残差,它不再包含系统误差,只剩下:随机误差+个体遗传差异。
对于GWAS和GS而言,我们要找的就是遗传差异,所以,我们就把残差作为矫正后的表型值。
写到这里,没有R语言的示例是不完整的,所以,talk is cheap,show me the code:
# 1. 加载数据(你换成自己的数据)
# 数据必须包含:表型、性别、胎次、场年季
set.seed(123)
data <- data.frame(
个体ID = 1:200,
表型值 = rnorm(200, 10, 3), # 你的真实表型
性别 = factor(sample(c("公","母"), 200, replace=T)),
胎次 = factor(sample(c("1","2","3","4"), 200, replace=T)),
场年季 = factor(sample(c("场1-2022-春","场2-2023-秋"), 200, replace=T))
)
# 2. 构建校正模型:去掉 性别 + 胎次 + 场年季
# 固定效应模型 GLM
model <- lm(表型值 ~ 性别 + 胎次 + 场年季, data = data)
# 3. 提取残差 → 这就是【校正后的表型值】
data$校正表型 <- residuals(model)
# 查看结果
head(data[,c("个体ID","表型值","校正表型","性别","胎次","场年季")])容易翻车的点:这里的胎次虽然是1-2-3-4,但是要将其作为factor才可以。