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

Logistic回归二分类性能直方图绘制问题求助(R语言)

问题分析

你的代码核心问题在于基础R的hist()函数的col参数用于给直方图的柱子上色,而非单个数据点。你当前的couleurs向量是每个样本的颜色标记,直接传给col会导致颜色被错误分配(比如柱子会循环使用颜色向量,而非按样本类别对应),因此出现颜色匹配不符合预期的情况。

解决方案

我们需要先将数据按预测类别(VP/FP)分组,再分别绘制直方图并叠加,或者使用更适合分类可视化的ggplot2包来实现。

方法1:基础R实现叠加直方图

先对每个类别提取对应的预测概率,然后依次绘制直方图并指定颜色:

data <- data.frame(y_true = test$MRD, y_pred = predict(m, newdata = test, type = "response"))
seuil <- 0.5  # 两个类别阈值相同,无需分开定义

# 按类别分组提取预测概率
vp0 <- data$y_pred[data$y_true == 0 & data$y_pred < seuil]
fp0 <- data$y_pred[data$y_true == 1 & data$y_pred < seuil]
vp1 <- data$y_pred[data$y_true == 1 & data$y_pred >= seuil]
fp1 <- data$y_pred[data$y_true == 0 & data$y_pred >= seuil]

# 先绘制第一个组的直方图,设置好参数
hist(vp0, 
     col = adjustcolor("green", alpha.f = 0.7),  # 半透明色避免遮挡
     main = "Histogramme des Probabilités Prédites",
     xlab = "Probabilité Prédite",
     ylab = "Nombre de Patients",
     border = "black",
     ylim = c(0, 15),
     breaks = seq(0, 1, by = 0.1))  # 统一分组区间,保证对齐

# 叠加其他组的直方图
hist(fp0, col = adjustcolor("red", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1))
hist(vp1, col = adjustcolor("blue", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1))
hist(fp1, col = adjustcolor("orange", alpha.f = 0.7), add = TRUE, breaks = seq(0, 1, by = 0.1))

# 添加图例
legend("topright", 
       legend = c("VP_0 (MRD阴真阴性)", "FP_0 (MRD阳假阴性)", "VP_1 (MRD阳真阳性)", "FP_1 (MRD阴假阳性)"),
       fill = c("green", "red", "blue", "orange"),
       alpha = 0.7)

方法2:ggplot2实现(更简洁直观)

ggplot2支持直接按分类变量映射颜色,无需手动分组:

library(ggplot2)
library(dplyr)

data <- data.frame(y_true = test$MRD, y_pred = predict(m, newdata = test, type = "response"))
seuil <- 0.5

# 创建分类标签列
data$category <- case_when(
  data$y_true == 0 & data$y_pred < seuil ~ "VP_0 (MRD阴真阴性)",
  data$y_true == 1 & data$y_pred < seuil ~ "FP_0 (MRD阳假阴性)",
  data$y_true == 1 & data$y_pred >= seuil ~ "VP_1 (MRD阳真阳性)",
  data$y_true == 0 & data$y_pred >= seuil ~ "FP_1 (MRD阴假阳性)",
  TRUE ~ "其他"
)

# 绘制直方图
ggplot(data, aes(x = y_pred, fill = category)) +
  geom_histogram(binwidth = 0.1, color = "black", alpha = 0.7, position = "stack") +  # stack为堆叠,也可用dodge并排
  scale_fill_manual(values = c("VP_0 (MRD阴真阴性)" = "green",
                               "FP_0 (MRD阳假阴性)" = "red",
                               "VP_1 (MRD阳真阳性)" = "blue",
                               "FP_1 (MRD阴假阳性)" = "orange")) +
  labs(title = "Histogramme des Probabilités Prédites",
       x = "Probabilité Prédite",
       y = "Nombre de Patients") +
  ylim(0, 15) +
  theme_minimal()
关键说明
  • 基础R方法中必须统一breaks参数,确保所有直方图的分组区间一致,否则叠加会错位。
  • 使用adjustcolor()设置半透明色(alpha.f),可避免不同组的柱子互相遮挡。
  • ggplot2方法更易维护,分类标签和颜色映射直接关联,不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:15:13