在sommer包装中处理不同性别

时间:2018-11-04 23:58:19

标签: r mixed-models genetics

我正在尝试找出如何在sommer包中为R指定特定的混合模型。

我测量了一堆男性个体的两个特征,以及一堆女性亲戚的两个特征。目的是估计这四个性状之间及其之间的遗传(共)变异。但是,因为个体不能都是性别,所以我想对模型进行拟合,以便它估计女性特征1和女性特征2之间的残差协方差,以及男性特征1和男性特征2之间的残差协方差,而不是残差协方差。在任何男性和女性特征之间(因为在数据中应该没有关于这些协方差的信息)。在MCMCglmm中,可以使用以下代码完成此操作(假定两个女性特征分别在响应变量矩阵的第1和2列中,并且两个男性特征在第3和4列中):

rcov = ~us(at.level(trait, 1:2)):units + us(at.level(trait, 3:4)):units

但是在sommer中,似乎没有等效的功能:我收到错误消息

Error: On the meantime the only rcov structures available are:
     'rcov=~units' or 'rcov=~at(.):units'.

接下来,我尝试为每个人分配一个数字,并拟合这样的个人级别随机效果:

library(sommer)

# Generate some fake data: 
# 100 males and 100 females
# Two traits are measured on each male, and two traits on each female
# 20 individuals per sex are measured for each of 5 different genotypes 
df <- data.frame(
  sex = rep(c("female", "male"), each = 100),
  female_trait_1 = c(rnorm(100), rep(NA, 100)),
  female_trait_2 = c(rnorm(100), rep(NA, 100)),
  male_trait_1 = c(rep(NA, 100), rnorm(100)),
  male_trait_2 = c(rep(NA, 100), rnorm(100)),
  genotype = rep(rep(1:5, each = 20), 2),
  individual = 1:200
)
df$genotype <- as.factor(df$genotype)
df$individual <- as.factor(df$individual)

sommer_test <- mmer2(

  # four traits as multivariate response
  cbind(female_trait_1, 
        female_trait_2,
        male_trait_1, 
        male_trait_2) ~ 1,

  # Fit the random effect of genotype (to estimate genetic covariance within and between sexes)
  # Try to fit US covariance matrices to specific levels of 'trait' (does not work)
  random =~ 
    us(trait):genotype +
    us(at.levels(trait, c("female_trait_1", "female_trait_2"))):individual +
    us(at.levels(trait, c("male_trait_1", "male_trait_2"))):individual,

  data = df
)
summary(sommer_test)

但是,后者也不起作用-它可以运行,但是针对每个特征的组合(包括我试图避免使用at.levels的男女组合),只对个人的美国矩阵进行了两次拟合)。因此,似乎at.levelsat.level中的MCMCglmm的工作方式不同,因为它似乎无能为力,就像我在这里使用的一样。

我是否缺少某些键,或者目前sommer中缺少此功能?

非常感谢!

1 个答案:

答案 0 :(得分:1)

为了处理sommer中的不同性别,您需要安装sommer> = 3.7。该模型直接处理Gtc参数(在vs函数中),该参数处理应用于方差-协方差组件的约束。值1,2,3对应于正的,无约束的,固定的。

吉恩说,数据结构清楚地表明,所有性状之间的协方差只能针对“基因型”随机效应进行估算:

> unsm(4)
     [,1] [,2] [,3] [,4]
[1,]    1    2    2    2
[2,]    0    1    2    2
[3,]    0    0    1    2
[4,]    0    0    0    1

“个体”并不是特质中完全没有结构的,而是看起来像这样:

> mm <- adiag1(unsm(2),unsm(2));mm
     [,1] [,2] [,3] [,4]
[1,]    1    2    0    0
[2,]    0    1    0    0
[3,]    0    0    1    2
[4,]    0    0    0    1

长话短说,模型如下:

# Generate some fake data: 
# 100 males and 100 females
# Two traits are measured on each male, and two traits on each female
# 20 individuals per sex are measured for each of 5 different genotypes 
set.seed(3434)
df <- data.frame(
  sex = rep(c("female", "male"), each = 100),
  female_trait_1 = c(rnorm(100), rep(NA, 100)),
  female_trait_2 = c(rnorm(100), rep(NA, 100)),
  male_trait_1 = c(rep(NA, 100), rnorm(100)),
  male_trait_2 = c(rep(NA, 100), rnorm(100)),
  genotype = rep(rep(1:5, each = 20), 2),
  individual = 1:200
)
df$genotype <- as.factor(df$genotype)
df$individual <- as.factor(df$individual)

library(sommer)
mm <- adiag1(unsm(2),unsm(2));mm
mix <- mmer(cbind(female_trait_1, 
                  female_trait_2,
                  male_trait_1,
                  male_trait_2) ~ 1,
     random=~vs(genotype,Gtc=unsm(4)) + vs(individual,Gtc=mm),
     rcov=~vs(units), na.method.Y = "include",
     data=df)

mix$sigma
cov2cor(mix$sigma$genotype)
cov2cor(mix$sigma$individual)

您可能希望使用真实数据来获得一些有意义的结果,但这显示了方法。干杯。