如何向parLapply传入两组对应数据以并行计算AKDE家域
解决ctmm包并行计算KDE家域时模型不匹配的问题
你的问题核心是并行调用akde时,没有将每个遥测对象与对应的M.IID模型一一配对,而是把整个M.IID列表传给了所有任务,导致所有计算都复用了M.IID的第一个模型,结果自然和串行不一致。
修改步骤及代码
- 给并行集群加载依赖包:集群节点默认不会加载ctmm包,必须显式加载,否则会报错。
- 配对数据与对应模型:将
buffalo和M.IID按索引一一配对成新的列表,确保每个遥测数据对应自己的拟合模型。 - 自定义并行处理函数:在
parLapply中使用自定义函数,从配对后的元素中取出数据和模型,调用akde。
修改后的完整代码:
#Loading libraries library(ctmm) library(parallel) #Reading in the example data associated with the ctmm package data("buffalo") #Adding an ID column to all lists for(i in 1:length(buffalo)){ buffalo[[i]][7] <- names(buffalo[i]) names(buffalo[[i]])[7] <- "ID" } #Setting up a cluster for parallel processing no_cores <- detectCores() - 1 cl <- makeCluster(no_cores) # 给集群节点加载ctmm包 clusterEvalQ(cl, library(ctmm)) # 并行拟合IID模型 M.IID <- parLapply(cl, buffalo, ctmm.fit) # 配对每个buffalo数据和对应的M.IID模型 paired_data <- mapply(function(dat, mod) list(data=dat, model=mod), buffalo, M.IID, SIMPLIFY=FALSE) # 并行计算KDE:每个任务处理配对好的数据和模型 KDE <- parLapply(cl, paired_data, function(x) { akde(x$data, CTMM=x$model, units=FALSE) }) # 提取家域结果(简化代码,无需手动逐个索引) summ <- lapply(KDE, summary) HR.values <- sapply(summ, function(s) s[[2]][[2]], simplify=FALSE) names(HR.values) <- names(buffalo) # 停止集群 stopCluster(cl)
关键修改说明
- 集群加载包:
clusterEvalQ(cl, library(ctmm))确保每个并行节点都能找到ctmm的函数,避免akde找不到的错误。 - 配对数据与模型:
mapply将buffalo和M.IID的对应元素打包成列表,保证第i个遥测数据对应第i个拟合模型。 - 自定义并行函数:在
parLapply中传入配对后的列表,函数内部取出对应的数据和模型调用akde,实现一一对应。 - 简化结果提取:用
lapply和sapply替代手动写6个元素的列表,代码更简洁且适配不同数量的遥测对象。
内容的提问来源于stack exchange,提问作者Jason Edelkind
相关产品推荐
相关产品推荐

