我有一个包含超过10,000个线性混合模型(lme4)公式的列表,已经成功将它们拟合到一组数据中。我使用了lapply()函数以及一个包含tryCatch()函数的自定义函数来拟合这些模型。现在,我想提取所有这些模型的P值和lsmeans值。我成功地提取了P值,但是lsmeans函数遇到了错误。
library(lme4)
library(lmerTest)
library(pbkrtest)
library(lsmeans)
formulaS <- list() #Not going to detail generation of list, generically: 'Yvar~X1*X2+(1|subject)'
dataSET <- X #dataframe with first 3 columns containing fixed and random factors,
# as well as >10,000 columns of variables of interest
modelSeq <- function (x, dat) {
return(tryCatch(lmer(x, data = dat), error=function(e) NULL))
}
modelsOutput <- lapply(formulaS, function(x) modelSeq(x, dat = dataSET))
lsmeans(modelsOutput[[1]], pairwise ~ X1:X2) #recieves error
解决默认值中的错误(L %% V0 %% t(L), L) : Lapack例程dgesv: 系统恰好是奇异的:U[1,1] = 0
我认为这不是模型问题的原因是,如果我单独拟合这些模型,我可以很好地提取lsmeans。是否有任何关于1)为什么我不能提取lsmeans、2)如何高效地提取均值、或3)替代的高效方法的评论。
谢谢!
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
更新与编辑:这是我正在处理的RNAseq数据,具有随时间重复的受试者的多个样本,因此>10,000个模型具有描述实验设计的相同固定和随机效应。响应(基因)是唯一变化的变量。我已经在下面的代码中尝试了更明确地表达这一点。由于混合模型具有身份链接可能不适合这些数据,因此我有以下新包装器。我仍然无法提取平均值。此外,任何关于计算P值的更合适且时间有效的方法的评论都将不胜感激。
library(lme4)
library(blmeco)
library(ggeffects)
formulaS <- list() #Not going to detail generation of list, generically: 'GeneI~TRT*TIME+(1|subject)'
dataSET <- X #dataframe with first 3 columns containing fixed and random factors,
# as well as >10,000 columns of variables of interest (gene TPM)
wrap.glmer.nb <- function (modelForm, dat) {
m <- tryCatch(glmer.nb(formula = modelForm, data = dat), error = function(e) NULL)
if (!is.null(m)) {
m.disp <- tryCatch(dispersion_glmer(m), error = function(e) NULL)
m.wald <- tryCatch(anova(m), error = function(e) NULL)
m.means.c <- tryCatch(ggemmeans(model = m, terms = c('TRT')), error = function(e) NULL)
m.means.e <- tryCatch(ggemmeans(model = m, terms = c('TIME')), error = function(e) NULL)
m.means.cxe <- tryCatch(ggemmeans(model = m, terms = c('TRT', 'TIME')), error = function(e) NULL)
x <- list(m.disp, m.wald, m.means.c, m.means.e, m.means.cxe)
print(paste0('Done with a model at ', Sys.time()))
return(x)
} else{
x <- m
return(x)
}
}
startTime <- Sys.time()
modelOUTPUTS <- lapply(formulaS, function(modelForm) wrap.glmer.nb(modelForm, dat = dataSET))
endTime <- Sys.time()
print(paste('Victory! The analysis took:', endTime - startTime))