多个性状的BLUP计算综合育种值

2022-07-27 19:44:33 浏览数 (3)

大家好,我是飞哥。

最近有老师问如何计算多个育种值的综合育种值,因为选择育种时,需要考虑多个性状,而这些性状单位不一样,怎么合并计算?

这里面其实就是包括两部分内容:

1,多个性状的育种值进行标准化

2,多个性状的育种值赋予权重

为何要进行标准化?

所谓标准化,就是将数据变为平均数为0,方差为1的数据集。将所有性状都标准化,就意味着这些性状的尺度都是一样的,是一个总体,可以进行加减乘除的操作。然后可以对不同的性质设置不同的权重,才可以进行综合育种值的计算。

标准化就是将育种值减去平均育种值,然后除以标准差。公式如下:

为何要对不同性状赋予权重?

因为我们的选择时,不同的性状重要程度不同,我们可以对不同的性状赋予不同的权重,这个权重是我们自己设置的,要求是性状的权重绝对值之和为1。

下面我们用一组数据来介绍一下计算方法,首先模拟一个数据,包括ID,y1,y2,y3三个性状。

代码语言:javascript复制
library(tidyverse)
# 模拟数据
set.seed(123)
dat = data.frame(ID = 1:100,y1=rnorm(100) 10, y2 = rnorm(100) 20, y3=rnorm(100))
head(dat)

第一种计算方法:tidyverse方法

基本逻辑是根据across,批量提取y开头的性状,然后进行标准化,最后使用mutate进行修改。最后将权重对应的性状相乘,相加变为综合育种值。

代码语言:javascript复制
# 标准化
d1 = d1 %>% mutate(across(starts_with("y"),scale))
# 赋予权重
d1 = d1 %>% mutate(index = y1*0.3   y2*0.3   y3*0.4)
head(d1)

第二种方法:比较直观但是麻烦的方法

代码语言:javascript复制
# 传统方法
d2 = dat
head(d2)

d2$y1 = (d2$y1-mean(d2$y1))/(sd(d2$y1))
d2$y2 = (d2$y2-mean(d2$y2))/(sd(d2$y2))
d2$y3 = (d2$y3-mean(d2$y3))/(sd(d2$y3))

d2$index = d2$y1*0.3   d2$y2*0.3   d2$y3*0.4
head(d2)

两者结果是一致的。

注意:

1,如果有些性状是负向选择,比如玉米含水量,猪的百公斤日龄,那就将权重设置为负数。

2,多性状选择时,尽量不要超过5个性状,否则就没有重点,效果也不佳。

3,权重的设置,来源于育种的经验数值,科学的确定权重的大小,需要考虑经济效益。

代码汇总:

代码语言:javascript复制
library(tidyverse)

# 模拟数据
set.seed(123)
dat = data.frame(ID = 1:100,y1=rnorm(100) 10, y2 = rnorm(100) 20, y3=rnorm(100))
head(dat)
d1 = dat

# 标准化
d1 = d1 %>% mutate(across(starts_with("y"),scale))
# 赋予权重
d1 = d1 %>% mutate(index = y1*0.3   y2*0.3   y3*0.4)
head(d1)

# 传统方法
d2 = dat
head(d2)

d2$y1 = (d2$y1-mean(d2$y1))/(sd(d2$y1))
d2$y2 = (d2$y2-mean(d2$y2))/(sd(d2$y2))
d2$y3 = (d2$y3-mean(d2$y3))/(sd(d2$y3))

d2$index = d2$y1*0.3   d2$y2*0.3   d2$y3*0.4
head(d2)

head(d1)

0 人点赞