美好的一天,我正在执行四倍体物种的基因组预测(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具有优势)
谢谢您的时间
答案 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)的论文是错误的,但只是我的拙见。
我希望这会有所帮助。
干杯, 爱德华多