Sommer套件:mmer与MEMMA

时间:2019-04-09 09:06:33

标签: r genetics

美好的一天,我正在执行四倍体物种的基因组预测(GBLUP)。去年,在进行更改之前,我开始使用sommer。那时,您可以将 mmer 函数与 ZETA 参数一起使用以指定随机项的协方差。现在有了 random〜vs(...)

的规范

我将此与使用 ZETA 参数的 MEMMA 函数进行了比较,据我所知,它在mmer内部使用。但是由于某种原因,我得到了不同的答案,例如

    library(devtools)
    install_github("covaruber/sommer")
    library(sommer)
     install.packages("AGHmatrix")
    library(AGHmatrix) 



    data(DT_polyploid)
     # ####=========================================####
     # ####### convert markers to numeric format
     # ####=========================================####
      numo <- atcg1234(data=GT, ploidy=4);

     # ###=========================================####
     # ###### plants with both genotypes and phenotypes
     # ###=========================================####
      common <- intersect(DT$Name,rownames(numo$M))
     #
     # ###=========================================####
     # ### get the markers and phenotypes for such inds
     # ###=========================================####
     marks <- numo$M[common,]; marks[1:5,1:5]
      DT2 <- DT[match(common,DT$Name),];

     # ###=========================================#### 

     G.A <- Gmatrix(marks, method="VanRaden", ploidy=4, missingValue=NA, impute.method = TRUE)
     G.D <- Gmatrix(marks, method="Endelman", ploidy=4, missingValue=NA, impute.method = TRUE)    

     T.pheno <- DT2[,c(1,9)]
     T.pheno$Name <- as.factor(T.pheno$Name)
     T.pheno$Name2 <- T.pheno$Name

    set.seed(1892) 
    rrn <- sample(1:187, 50, replace = F)
    T.pheno$sucrose[rrn] <- NA

    ans.A <-  mmer(sucrose ~ 1,
                   random=~vs(Name, Gu=G.A),
                   rcov = ~units,
                   data=T.pheno)


    cor(ans.A$U$`u:Name`$sucrose[which(is.na(T.pheno$sucrose))], 
        DT2$sucrose[which(is.na(T.pheno$sucrose))], use = "pairwise")
  

[1] 0.2205831

然后使用MEMMA应用相同的分析

Z1 <- diag(length(T.pheno$sucrose))
Z2 <- diag(length(T.pheno$sucrose))

ETA.A <- list(list(Z=Z1, K=G.A) )
ETA.AD <- list(list(Z=Z1, K=G.A), list(Z=Z2, K=G.D) )


ans.A <- MEMMA(Y=T.pheno$sucrose, ZETA=ETA.A)

cor(ans.A$fitted.y[which(is.na(T.pheno$sucrose))], 
    DT2$sucrose[which(is.na(T.pheno$sucrose))], use = "pairwise")
  

[1] 0.2778689

为什么有区别?为了增加优势和上位矩阵,我发现MEMMA中的公式更容易且不易出错,当然,我对更高的预测准确性感到鼓舞。其次,MEMMA函数提供了相同规模的拟合值,因此可与观察值相比较。但是,MEMMA的运行速度很慢...仍然需要对准确性的差异做出解释。以下是包含优势的mmer和MEMMA的代码和结果。

ans.AD <-  mmer(sucrose ~ 1,
                random= ~ vs(Name, Gu=G.A) + vs(Name2, Gu=G.D),
                rcov = ~ units,
                data=T.pheno)

cor(ans.AD$U$`u:Name`$sucrose[which(is.na(T.pheno$sucrose))], 
    DT2$sucrose[which(is.na(T.pheno$sucrose))], use = "pairwise")


ans.AD <- MEMMA(Y=T.pheno$sucrose, ZETA=ETA.AD)

cor(ans.AD$fitted.y[which(is.na(T.pheno$sucrose))], 
    DT2$sucrose[which(is.na(T.pheno$sucrose))], use = "pairwise")
  

[1] 0.2357571(占主导地位)

     

[1] 0.2785493(MEMMA具有优势)

谢谢您的时间

1 个答案:

答案 0 :(得分:0)

为什么MEMMA函数不是mmer函数的一部分,而只能作为备用函数使用,原因如下:

1)当您移至错误以外的多个随机效应时,方差分量估计不正确

2)无法在残差中使用特殊的协方差结构(同样是超过1 vc的问题)

3)除了最简单的情况外,该算法估计VC的速度也很慢。

现在,牛顿-拉夫逊(NR)和平均信息(AI)(mmer()函数中可用的唯一方法)给出的结果与MEMMA不同的原因必须与以下事实有关:与一个vc相比,MEMMA的REML估计通常超出参数空间。此算法最初是为错误旁边的vc设计的。我实际上会说NR和AI最有可能为您提供正确的vc值。

此外,仅仅因为一个值可以为MEMMA带来更好的结果,并不意味着在200次迭代中这是正确的。我将执行一些交叉验证,看看是否成立。即使它成立,NR / AI也不太可能超出参数空间,从而为您提供正确的值。

关于适合的值插槽。 MEMMA仍返回拟合值

y.hat = Xb + Zu

mmer()函数的结果所拟合的值槽的形式为:

y.hat = Xb

如果要以原始比例进行预测,则必须通过构建Xb和Zu来自己构建它们,或者可以使用可用的prepare()函数。

还要向您展示基于这种准确性使用哪种算法是非常主观的,您可以尝试相同的示例,但是现在在mmer()函数中指定参数na.method.Y =“ include”并看看功率放大器如何升至0.27。教训,从我的角度来看,PA的微小变化并不重要。在我看来,PA升高5个单位(0.05)的论文是错误的,但只是我的拙见。

我希望这会有所帮助。

干杯, 爱德华多