lapply生成的nlme::gls模型传入piecewiseSEM的psem运行报错
问题原因
报错根源是lapply匿名函数生成的gls模型对象中,保存的调用语句(call)里的data参数指向匿名函数的临时变量i,函数运行结束后临时变量对应的环境销毁,piecewiseSEM的psem函数解析模型调用提取数据时无法识别该变量,最终触发类型错误。
直接赋值生成的model3、model4不存在这个问题:它们的调用语句中data参数指向全局环境中存在的empty_list[[1]],psem可以正常解析提取数据。
解决方法
修改lapply内的拟合逻辑,在模型生成后手动修正调用语句中的data参数为实际数据集即可,修改后的建模代码如下:
# 修正后的lapply建模代码 model1 <- lapply(empty_list, FUN = function(i) { mod <- nlme::gls(disp ~ wt, correlation = corHaversine(form=~lon+lat,mimic="corSpher"), data = i) # 手动修正call中的data参数为实际数据集 mod$call$data <- i return(mod) }) model2 <- lapply(empty_list, FUN = function(i) { mod <- nlme::gls(wt ~ hp, correlation = corHaversine(form=~lon+lat,mimic="corSpher"), data = i) mod$call$data <- i return(mod) }) # 后续psem调用可正常运行 model1.2 <- psem(model1[[1]], model2[[1]], data = empty_list[[1]]) summary(model1.2, .progressBar = F, standardize = "scale")
该方案同样适配后续对接parLapply实现并行计算的需求,仅需在并行节点的拟合逻辑中加入修正call的步骤即可正常运行。
内容的提问来源于stack exchange,提问作者antR
相关产品推荐
相关产品推荐

