如何按application绘制不同颜色的逻辑回归曲线及对应方程
解决方法
1. 显示数据点
你当前的ggplot代码仅定义了数据和映射规则,缺少几何图层来渲染数据点。只需在代码后追加geom_point()即可显示原始数据点,还可通过alpha参数调整点的透明度,避免点重叠时影响可读性:
ggplot(data = data, aes(x = Discount, y = Hit, color = as.factor(application))) + geom_point(alpha = 0.7)
2. 添加分类别逻辑回归曲线
要针对每个application类别绘制独立的逻辑回归曲线,使用geom_smooth()方法,指定method="glm"并传入二项分布族参数,ggplot会自动按color(即application)分组拟合模型:
ggplot(data = data, aes(x = Discount, y = Hit, color = as.factor(application))) + geom_point(alpha = 0.7) + geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE)
se=FALSE:关闭置信区间显示,若需要保留可删除该参数。- 上述代码会为每个类别拟合独立的斜率和截距,完全符合“不同类别不同曲线”的需求。
3. 添加回归方程
逻辑回归的方程形式为log(p/(1-p)) = b₀ + b₁*Discount,需为每个application类别单独拟合模型并提取参数,再将方程添加到图中:
完整代码(包含所有步骤)
# 读取数据(若使用本地文件,替换为read.csv("DiscountData.csv", header=T, stringsAsFactors = TRUE)) data <- read.table(text = "Discount Hit application 0.45 1 prize 0.37 1 prize 0.18 0 prize 0.30 0 prize 0.22 1 prize 0.21 1 prize 0.65 1 yellow 0.31 1 yellow 0.22 0 yellow 0.16 0 yellow 0.30 1 yellow 0.20 1 lime 0.12 1 lime 0.23 0 lime 0.31 0 lime 0.18 1 lime 0.19 1 lime 0.23 1 food 0.19 1 food 0.10 0 food 0.32 0 food 0.20 1 food 0.56 1 food", header = TRUE, stringsAsFactors = TRUE) # 加载所需包 library(ggplot2) library(dplyr) # 为每个application类别拟合逻辑回归并提取方程 model_eqs <- data %>% group_by(application) %>% do( equation = { coefs <- round(coef(glm(Hit ~ Discount, data = ., family = binomial)), 2) paste0("log(p/(1-p)) = ", coefs[1], " + ", coefs[2], "*Discount") } ) %>% unnest(equation) %>% select(application, equation) # 绘制图形并添加方程 ggplot(data, aes(x = Discount, y = Hit, color = application)) + geom_point(alpha = 0.7) + geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE) + geom_text( data = model_eqs, aes(x = 0.5, y = 0.2, label = equation), color = "black", size = 3, inherit.aes = FALSE ) + theme_minimal() + labs(x = "Discount", y = "Hit", color = "Application Category")
额外说明
- 若你需要拟合共享斜率、仅截距不同的逻辑回归(对应你原代码中的
fit模型),可将geom_smooth的formula参数设为y ~ x + group,但此设置下曲线是平行的,可能不符合“不同类别不同曲线”的需求。 - 调整
geom_text中的x和y值可改变方程的显示位置,避免遮挡曲线或数据点。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

