R语言subset取子集运行svycoxph报替换长度不匹配错误求助
报错原因
这个错误出在survey包的子集处理逻辑上:旧版本survey对svydesign对象做subset筛选时,没有同步更新对象内部存储的抽样概率、权重矩阵的维度,后续运行svycoxph需要调用内部dbeta权重矩阵做计算时,就会出现替换长度和待替换位置数量不匹配的问题。
尤其是你筛选的是单集群(id只指定了~point)的设计对象、且筛选后存在概率值非有限值的条目时,这个bug触发概率极高。
修复方法
按优先级选以下方案即可:
- 优先从原始数据层面筛选,不要在创建完svydesign对象后再做子集操作。这是最稳妥、不会触发内部结构错乱的方案,代码示例:
# 先从原始数据框筛出目标样本 lp1_vital1 <- lp1[lp1$vital == 1, ] # 再基于筛选后的数据创建调查设计对象 design_sub <- svydesign(id = ~point, data = lp1_vital1, weights = ~w1) # 后续直接调用design_sub跑svycoxph就不会报错
- 如果需要保留全样本的设计对象做其他分析,必须在设计对象层面做子集,直接把
survey包更新到最新正式版,新版本已经修复了这个子集维度不匹配的bug,更新后重新运行你的原有代码即可:
install.packages("survey")
- 如果受运行环境限制无法更新包,可以在取子集后手动对齐设计对象内部的矩阵维度,临时修复问题:
design_sub <- subset(design_lp, vital == 1) # 强制对齐概率矩阵维度 design_sub$prob <- design_sub$prob[is.finite(design_sub$prob), , drop = FALSE] design_sub$allprob <- design_sub$allprob[seq_along(design_sub$cluster)]
注意点
- 不要直接用方括号
[ ]对svydesign对象做行筛选,必须用包自带的subset方法,否则更容易出现内部结构错位。 - 如果筛选后子集存在单个观测独占一个集群的情况,也可能触发类似维度报错,这时候需要检查筛选后的数据集群分布,必要时调整设计对象的集群指定参数。
内容的提问来源于stack exchange,提问作者gloriag
相关产品推荐
相关产品推荐

