You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:38:46