基于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
相关产品推荐
相关产品推荐

