大家好,我是飞哥。
最近有老师问如何计算多个育种值的综合育种值,因为选择育种时,需要考虑多个性状,而这些性状单位不一样,怎么合并计算?
这里面其实就是包括两部分内容:
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)