gpt4 book ai didi

r - 在 metafor 中拟合具有 200 个效果大小的多元(多级)模型(rma.mv 和 optimParallel)失败

转载 作者:行者123 更新时间:2023-12-04 03:53:04 26 4
gpt4 key购买 nike

我有一个 the following data structure ,大约研究 i = 50,实验 j = 75,条件 k = 200。
在第 k 级,我有相关的度量。对于大约 20 个研究(25 个实验和 65 个条件),我有主题级别的数据并计算了方差-协方差矩阵。对于其余部分,我根据估计的相关性(针对受试者和条件)计算了方差-协方差矩阵。最后,我有一个完整的 k x k 方差-协方差矩阵 V。
为了尊重数据的多级结构,我使用 让每个研究中每个实验中的每个条件都具有唯一的协方差。非结构化 方差-协方差矩阵 ( see Details - Specifying Random Effects )。请注意,我不是 100% 肯定这个推理,或者一般推理是/反对多级模型中的方差-协方差假设结构。所以我很高兴收到一些关于这个的想法/文献......
我现在想进行多变量(多级)随机效应模型:

rma.mv(
yi = yk
, V = V
, random = list(~ exp_j | stu_i,
~ con_k | exp_j)
, struct = "UN"
, method = "REML"
, test = "t" ## slightly mimics knha
, data = dat
, slab = con_k
, control=list(optimizer="optimParallel", ncpus=32)
)
当在完整的数据集上运行时,计算会在几分钟内达到 128GB(!) 的 RAM,并且在某些时候 R 只是终止并没有错误消息。
1)这与我拥有的数据量有关吗?
使用原始数据的子集(即 i = 20、j = 25 和 k = 65,我只是在没有估计方差-协方差矩阵的情况下抓取数据)运行相同的模型工作正常,并且达到了大约 20GB 的 RAM。
我看到了 tipps section metafor 包以及 rma.mv() 的优化选项在 notes . 2) 在我的场景中,切换到 Microsoft 的 R Open 或其他算法(没有并行化?!)是否合理?
请注意,上面的模型不是我想要进行的最终模型。还没有版主。附加模型应包括调节器的回归术语。它会变得更加复杂,我想......
我在 x86_64-pc-linux-gnu(64 位)上运行 R 版本 3.6.3(2020-02-29):Ubuntu 18.04.5 LTS。 Metafor 的版本为 2.4-0。
最好的
乔纳斯

最佳答案

可能不是每个研究都有 50 个实验,也不是每个实验都有 200 个条件,但是是的,50 * 75 * 200(即 750,000)行数据将是一个问题。但是,在我解决这个问题之前,让我们先从模型本身开始,这没什么意义。这 50 项研究中有 75 项实验,使用 ~ exp_j | stu_istruct="UN"意味着您正在尝试估计 75 x 75 var-cov 矩阵的方差和协方差。那已经是 2850 个参数了。 ~ con_k | exp_j根据我的计算,part 又增加了 20,000 多个参数。这永远行不通。
根据您的描述,您有一个多层次结构,但研究 1 中的实验 1 所代表的内容与研究 2 中的实验 1 所代表的内容之间没有内在联系。所以这里的实验标识符只是用来区分研究中的不同实验,没有进一步的意义。将此与您有研究 1 中的结果 A 和 B、研究 2 中的结果 A、研究 3 中的结果 B 等的情况进行比较。 “A”在所有研究中实际上代表“A”,而不仅仅是用于区分元素。
另一个问题是~ con_k | exp_j不会自动嵌套在研究中。 rma.mv()函数还允许交叉随机效应,所以如果你想为条件添加随机效应 反过来又嵌套在研究中 那么你应该创建一个新变量,例如 exp.in.study这反射(reflect)了这一点。你可以用 dat$exp.in.study <- paste0(dat$stu_i, ".", dat$exp_j) 做到这一点.那么你可以使用~ con_k | exp.in.stu来反射(reflect)这种嵌套。
但是,根据您的描述,我认为您真正应该使用的是更简单的模型结构,即 random = ~ 1 | stu_i / exp_j / con_k (在这种情况下, struct 参数不相关)。
尽管如此,如果您的数据集有 100,000 多行,那么默认方式 rma.mv()作品将成为一个内存问题,因为在内部,该函数将处理具有此类维度的矩阵。一个简单的解决方案是使用 sparse=TRUE ,在这种情况下,矩阵在内部存储为稀疏结构。您可能甚至不需要任何并行处理,但您可以尝试 if optimizer="optimParallel"会加快速度(但是 ncpus=3 就是你所需要的,因为如果按照上面的建议指定,这实际上是模型将估计的方差分量的数量)。

关于r - 在 metafor 中拟合具有 200 个效果大小的多元(多级)模型(rma.mv 和 optimParallel)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64152030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com