dosresmeta包处理无参照组数据框报错问题求助
解决dosresmeta包无参照组分析的报错问题
问题背景
我们正在开展脓毒性休克患者初始6小时左右液体最优剂量的综述,所有患者均接受治疗,无参照组。使用dosresmeta包自带的alcohol_cvd示例可正常运行:
library(dosresmeta) data("alcohol_cvd") quadr <- dosresmeta(formula = logrr ~ dose + I(dose^2), type = type, id = id, se = se, cases = cases, n = n, data = alcohol_cvd)
问题重现
移除0酒精暴露的研究人群后,运行代码出现报错:
data("alcohol_cvd") alcohol_cvd <- alcohol_cvd[alcohol_cvd$dose != 0, ] quadr <- dosresmeta(formula = logrr ~ dose + I(dose^2), type = type, id = id, se = se, cases = cases, n = n, data = alcohol_cvd)
错误信息:
Error in n[id == j] : object of type 'closure' is not subsettable
尝试添加模拟治疗场景的虚拟参照组后,仍出现相同错误:
data.frame( id = 7, author = 'test', type = 'ci', dose = 0.0, cases = 0, n = 0, logrr = 0, # same error if logrr = 1 se = NA # same error if se = 0 )
解决建议
核心原因
dosresmeta的剂量-反应模型要求每个研究(按id分组)内至少包含一个参照剂量组(通常为dose=0);同时不能设置n=0,因为R语言中n()是内置函数,当数据列n出现0或缺失时,函数会误将其识别为内置函数n(),触发"object of type 'closure' is not subsettable"错误。
修正方案
- 为每个独立研究(每个
id)添加专属的虚拟参照组,确保虚拟组的n为极小正数值(如1),cases设为0,logrr设为0(参照组效应量为0),se设为极小值(如0.001,避免NA引发的问题)。 - 修正后的完整代码:
library(dosresmeta) data("alcohol_cvd") # 移除原数据中的0剂量组 alcohol_cvd <- alcohol_cvd[alcohol_cvd$dose != 0, ] # 为每个id生成对应的虚拟参照组 virtual_refs <- do.call(rbind, lapply(unique(alcohol_cvd$id), function(study_id) { study_author <- unique(alcohol_cvd$author[alcohol_cvd$id == study_id]) data.frame( id = study_id, author = study_author, type = 'ci', dose = 0.0, cases = 0, n = 1, # 必须为正数值,不能为0 logrr = 0, # 参照组效应量固定为0 se = 0.001 # 避免NA,设极小值 ) })) # 合并原数据与虚拟参照组 alcohol_cvd_updated <- rbind(alcohol_cvd, virtual_refs) # 重新拟合剂量-反应模型 quadr <- dosresmeta(formula = logrr ~ dose + I(dose^2), type = type, id = id, se = se, cases = cases, n = n, data = alcohol_cvd_updated)
原理说明
每个研究必须包含参照组,才能让dosresmeta正确计算不同剂量的相对效应;同时避免n=0的设置,消除内置函数n()的命名混淆问题,确保模型正常运行。
内容的提问来源于stack exchange,提问作者Bob Badgett
相关产品推荐
相关产品推荐

