BLUP育种值如何计算准确性

大家好,我是飞哥。

「育种值的准确性是什么呢?为何要计算育种值的准确性呢?」育种值的准确性的大小可以反应育种值计算的准确性如何,如果准确性高,就说明计算育种值时依赖的信息多(比如亲子关系、同胞关系等),结果就可靠。

❝育种值也可以计算可靠性,它是准确性的平方 ❞

另外,对于不同性状或者不同试验的BLUP值的准确性进行比较时,因为方差组分、标准误、BLUP值都不一样,没有一个标准,可以用准确性(accuracy)这个指标进行比较。

数据及结果来源

❝书籍:王金玉, 陈国宏. 《数量遗传与动物育种》. 东南大学出版社, 2004,P200,第四节:单性状BLUP育种值估计 ❞

代码语言:javascript
复制
dat = data.frame(id=c(4,5,6),sire = c(1,3,3),dam=c(2,2,4),y=c(200,170,180))
dat

书中标准差为100,遗传力为1/3,可以计算出:加性方差组分:Va=100^2*(1/3)=3333.33,误差方差组分为:V3=6666.67,因为这里遗传力已知,我们可以设置方差组分固定,进行混合线性求解。

转化为因子:

代码语言:javascript
复制
for( i in 1:3) dat[,i] = as.factor(dat[,i]) # 转化为因子
str(dat)

计算公式

上面公式中:标准误的计算方法是:标准误se(BLUP) = sqrt(CiiVe),这里面dVe就是个体BLUP值的标准误,现在遗传评估软件可以直接得出se。所以准确性的公式为:r = sqrt(1 - (Cii*Ve)/Va) = sqrt( 1 - se^2/Va),可靠性是准确性的平方,所以可靠性的计算为1 - se**2/Va

注意,上面没有考虑近交系数的影响,完整的公式为:

这里的PEV是标准误的平方。

使用asreml软件演示

这里,我们固定方差组分:

代码语言:javascript
复制
va = 3333.33
ve = 6666.66
ped = dat[,1:3]
ainv  = ainverse(ped)

inbreeding = attr(ainv,"inbreeding")
inbreeding

mode = asreml(y ~ 1, random=~ vm(id,ainv),residual = ~ idv(units), start.values = T,data=dat)
vc = mode$vparameters.table
vc[c(1,3),2] = c(va,ve)
vc[c(1,3),3] = c("F","F")
vc

这里,我们可以看到,方差组分设置好了,状态为F,Fixed固定。

「进行混合线性模型求解」

代码语言:javascript
复制
mod1 = asreml(y ~ 1, random=~ vm(id,ainv),residual = ~ idv(units), G.param = vc, R.param = vc,data=dat)
summary(mod1)$varcomp

「进行BLUP值计算:」

代码语言:javascript
复制
summary(mod1,coef=T)$coef.random
代码语言:javascript
复制
inbreeding = attr(ainv,"inbreeding")
inbreeding

这里的:

  • solution: 为BLUP值
  • std.error:为标准误,sqrt(PVE)
  • inbreeding:为近交系数
  • va:为加性方差组分 所以根据公式:

「计算准确性:」

代码语言:javascript
复制
library(tidyverse)
library(learnasreml)
blup = tiqu_blup(summary(mod1,coef=T)$coef.random)
head(blup)
blup %>% mutate(accur = sqrt(1 - std.error^2/((1+inbreeding)*va)),reli = accur^2)

上面,计算了每个个体的BLUP值、准确性和可靠性,结果和书中结果一致。