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

基于Cobb-Douglas效用函数计算ROC与AUC的R实现求助

R语言解决方案:Cobb-Douglas效用值计算与AUC分组分析

核心思路

避免expand.grid打乱XY配对的关键是保留原始数据行的完整性,将每个Alpha值与整份df做交叉组合,而非拆分列单独组合。

完整代码实现

先加载所需包,模拟示例数据(可替换为你的真实数据):

# 加载必要包
library(dplyr)
library(tidyr)
library(pROC)

# 模拟初始数据表df(替换为你的真实数据)
set.seed(123)
df <- tibble(
  ID = 1:100,
  X = runif(100, 0, 10),
  Y = runif(100, 0, 10)
)

# 模拟Abs表(替换为你的真实数据)
Abs <- tibble(
  ID = 1:100,
  Abs = sample(c(0, 1), 100, replace = TRUE)
)

# Alpha序列
alpha_seq <- c(0.1, 0.2, 0.3)

1. 正确组合Alpha与原始XY配对

使用tidyr::crossing(),它会保留df的每一行完整结构,同时与每个Alpha值组合,彻底避免XY配对混乱:

# 组合Alpha与原始df,保留ID-X-Y配对
df_alpha <- crossing(df, alpha = alpha_seq)

2. 计算Cobb-Douglas效用值Z

直接在组合后的数据框中按公式计算,若存在X/Y为0的情况,可根据需求添加逻辑处理:

# 计算效用值Z
df_alpha <- df_alpha %>%
  mutate(Z = X^alpha * Y^(1 - alpha))

3. 按Alpha分组计算AUC值

先合并Abs表的分类标签,再按Alpha分组,用pROC包计算每组的ROC曲线与AUC:

# 合并分类标签,按Alpha分组计算AUC
auc_results <- df_alpha %>%
  left_join(Abs, by = "ID") %>%
  group_by(alpha) %>%
  summarise(
    auc_value = auc(roc(Abs, Z)),
    .groups = "drop"
  )

# 查看结果
print(auc_results)

生成AUC与Alpha的关系图

用ggplot2实现可视化:

# ggplot2绘图示例
library(ggplot2)
ggplot(auc_results, aes(x = alpha, y = auc_value)) +
  geom_point(size = 3) +
  geom_line() +
  labs(x = "Alpha值", y = "AUC值", title = "AUC与Alpha的关系") +
  theme_minimal()

为什么之前expand.grid会出错?

如果直接用expand.grid(df, alpha_seq),R会把df的每一列(ID、X、Y)拆成独立向量做笛卡尔积,导致原本配对的X和Y被随机组合,破坏了原始数据的行关联。而crossing()会将整个df作为一个整体,与Alpha序列做交叉,确保每一行的ID-X-Y配对始终完整。

内容的提问来源于stack exchange,提问作者quartztester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:17