R语言survival包concordance函数报x and y are not the same length错误如何解决
报错原因与解决方法
核心报错原因
该报错本质是concordance()函数从测试集提取的生存响应变量(y)和模型输出的风险预测值(x)长度不匹配,常见触发场景有3种:
- 测试集
test中存在模型自变量的缺失值:你用到的BMI_c、BMI_c_2、smoke、Hgb这几个变量只要有任意一个在测试集某行是NA,这行就会被自动从预测结果中剔除,但生存响应变量还是默认取了测试集全量数据,二者长度就会不一致 lspline()函数的适配问题:lspline是第三方包的样条生成函数,在传入新数据集做预测时,可能没有正确识别测试集的Hgb变量生成对应样条项,导致预测矩阵行数和测试集行数不匹配- 数据集拆分逻辑错误:如果代码里的
N和全量数据集mor_survey_com3的实际行数不一致,或者trainsize大于等于全量数据集行数,会导致test数据集行数为0,也会触发长度不匹配报错
解决步骤
可按顺序排查解决:
- 先清理测试集的缺失值,使用无缺失的测试集子集计算C指数
# 筛选出模型所需变量无缺失的测试集行 test_no_na <- na.omit(test[, c("permth_exm", "other_Death", "BMI_c", "BMI_c_2", "smoke", "Hgb")]) # 传入无缺失数据集计算 concordance(object = fit_test_w, newdata = test_no_na)
- 如果上述操作仍报错,可手动对齐预测值和响应变量的长度后计算,避免函数内部自动处理的适配问题
# 生成测试集风险预测值,含缺失的行自动被剔除 pred_risk <- predict(fit_test_w, newdata = test, type = "risk") # 提取对应行的生存响应变量 test_surv <- Surv(test$permth_exm, test$other_Death)[as.integer(names(pred_risk)), ] # 手动传入对齐后的变量计算C指数 concordance(test_surv ~ pred_risk)
- 提前校验数据集拆分逻辑
# 确保N和全量数据集行数一致 N <- nrow(mor_survey_com3) # 确保训练集大小小于全量数据集行数 stopifnot(trainsize < N)
内容的提问来源于stack exchange,提问作者Tao Xueting
相关产品推荐
相关产品推荐

