如何解决pROC包中“Cases and controls must be numeric or ordered”错误?
解决ROC曲线生成时的"Cases and controls must be numeric or ordered"错误
我看到你在复用ROC曲线代码处理新数据集时遇到了这个报错,咱们一步步来定位问题、解决它:
首先,先明确这个错误的核心:pROC包的roc()函数要求传入的**controls和cases参数必须是数值型(numeric)或者有序因子(ordered factor)**。你之前只转换了ta_tp变量,但实际传入函数的是conf3的子集——这才是问题的关键所在。
排查与解决步骤
1. 先检查conf3的变量类型
运行以下代码,确认所有分组里conf3的类型:
# 检查每个子集的conf3类型 str(control$conf3) str(gvnso$conf3) str(pvcont$conf3) str(pvnso$conf3)
如果输出显示是普通因子(Factor)而非numeric或ordered,那这就是触发错误的直接原因。
2. 将conf3转换为合规类型
根据你的数据实际情况,选择以下两种方式之一:
方式一:转换为数值型
如果conf3的取值是可直接转为数字的类别(比如因子水平是"1"/"2"/"3",或者本身是字符型数字):
# 对所有分组的conf3进行转换 control$conf3 <- as.numeric(as.character(control$conf3)) gvnso$conf3 <- as.numeric(as.character(gvnso$conf3)) pvcont$conf3 <- as.numeric(as.character(pvcont$conf3)) pvnso$conf3 <- as.numeric(as.character(pvnso$conf3))
方式二:转换为有序因子
如果conf3是有逻辑顺序的分类变量(比如"低"/"中"/"高"),保留其顺序信息:
# 替换levels为你实际的因子水平顺序 control$conf3 <- ordered(control$conf3, levels = c("低", "中", "高")) gvnso$conf3 <- ordered(gvnso$conf3, levels = c("低", "中", "高")) pvcont$conf3 <- ordered(pvcont$conf3, levels = c("低", "中", "高")) pvnso$conf3 <- ordered(pvnso$conf3, levels = c("低", "中", "高"))
3. 简化代码(可选但推荐)
为了避免重复代码、降低出错概率,你可以用列表批量处理所有分组:
library(pROC) # 一次性生成所有分组的列表 groups <- list( control = subset(thesis_rep_dat, view == 0 & nso == 0), gvnso = subset(thesis_rep_dat, view == 0 & nso == 1), pvcont = subset(thesis_rep_dat, view == 1 & nso == 0), pvnso = subset(thesis_rep_dat, view == 1 & nso == 1) ) # 批量转换变量并创建ROC对象 roc_list <- lapply(groups, function(df) { # 转换conf3为数值型(按需替换为ordered方式) df$conf3 <- as.numeric(as.character(df$conf3)) # 确保ta_tp是数值型 df$ta_tp <- as.numeric(df$ta_tp) # 创建ROC对象 roc(controls = df$conf3[df$ta_tp == 0], cases = df$conf3[df$ta_tp == 1], levels = c(0,1), direction = "<", partial.auc = FALSE) }) # 调用单个ROC对象示例:roc_list$control
4. 额外检查点
如果转换后仍然报错,再确认两个点:
- 每个分组中,
ta_tp==0和ta_tp==1的子集是否都有数据(比如有没有出现某一组全是cases或全是controls的情况),可以用table(control$ta_tp)检查。 - 确保
ta_tp的取值确实是0和1,没有其他异常值。
你遇到的错误信息:
Error in roc.default(controls =control$conf3[gvnso$ta_tp == 0], cases = control$conf3[gvnso$ta_tp == : Cases and controls must be numeric or ordered.
内容的提问来源于stack exchange,提问作者Shaela Jalava
相关产品推荐
相关产品推荐

