使用R语言censored包进行生存预测时出现特征未找到错误的求助
使用R语言censored包进行生存预测时出现特征未找到错误的求助
你好!我来帮你分析这个问题的原因和解决方案。
问题根源
你遇到的object 'CO-APPLICANT' not found错误,核心原因是列名中的特殊字符(连字符-)在R公式解析时被误当作数学运算符,或者训练数据与预测数据的列名不匹配。
具体来说:
- 当你用
Surv(DURATION, DEFAULT) ~ .拟合模型时,R会自动把数据中的列名代入公式,但CO-APPLICANT里的-会被R解析成减法操作(即CO - APPLICANT),而不是一个单独的变量名。这会导致模型要么拟合时就出错,要么实际没有包含这个特征,但预测时你的applicant数据里却有这个列,从而引发找不到对象的错误。 - 即使你移除
CO-APPLICANT后仍报错,大概率是还有其他列名存在类似的解析问题,或者训练数据和预测数据的列名没有完全对齐。
解决方案
这里提供两种可行的解决办法,你可以根据自己的情况选择:
方案1:重命名列名(推荐)
把包含特殊字符的列名改成R友好的格式(比如用下划线_替代连字符),从根源避免公式解析问题:
# 先修改训练数据的列名 names(train)[names(train) == "CO-APPLICANT"] <- "CO_APPLICANT" # 再修改预测数据的列名 applicant$CO_APPLICANT <- applicant$`CO-APPLICANT` applicant$`CO-APPLICANT` <- NULL # 重新拟合模型 cph_fit <- proportional_hazards() %>% fit(Surv(DURATION, DEFAULT) ~ . , data = train) # 执行预测 predict(cph_fit, applicant, type = "survival", time = 1:30)
方案2:显式在公式中用反引号包裹特殊列名
如果你需要保留原列名,就在拟合模型时显式写出所有变量,并用反引号``包裹带特殊字符的列名,确保R将其识别为单个变量:
# 显式定义公式,用反引号处理特殊列名 cph_fit <- proportional_hazards() %>% fit( Surv(DURATION, DEFAULT) ~ PURPOSE + SEX + RESIDENCE + PROPERTY + CHK_ACCT + HISTORY + AMOUNT + SAV_ACCT + EMPLOYMENT + INSTALL_RATE + `CO-APPLICANT` + GUARANTOR + PRESENT_RESIDENT + AGE + OTHER_INSTALL + NUM_CREDITS + JOB + NUM_DEPENDENTS + TELEPHONE + FOREIGN, data = train ) # 预测时保持列名一致即可 predict(cph_fit, applicant, type = "survival", time = 1:30)
额外检查项
如果移除CO-APPLICANT后仍报错,建议你:
- 仔细核对
train和applicant的所有预测列名,确保拼写、大小写、特殊字符完全一致; - 检查
train数据中是否还有其他带运算符类特殊字符(如+、*、/)的列名,同样按上述方法处理。
备注:内容来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

