使用ggplot绘制二元变量逻辑回归曲线异常问题求助
问题排查与解决方案
核心问题原因
- 自变量为二分类因子:你的
ADHD_Control_Group是仅含0、1的二分类因子,逻辑回归针对这类自变量,拟合的是每个类别对应的HrsSleep_Use=1的概率值——两个离散的概率点用线连接自然是直线,不可能出现“曲线状”回归线。曲线逻辑回归要求自变量是连续变量(比如年龄、睡眠时长这类多取值变量)。 - 抖动点分布符合预期:因为x和y都是二分类变量,
geom_jitter只能在x轴的0、1两个位置,y轴的0、1两个位置附近抖动,这是二分类变量可视化的正常表现。
针对性解决方案
方案1:用条形图展示各组概率(更适配二分类自变量的逻辑回归结果)
先计算每组睡眠不足的概率及置信区间,再可视化:
library(dplyr) library(ggplot2) # 计算分组概率与标准误 prob_summary <- final_sleep_data %>% group_by(ADHD_Control_Group) %>% summarise( sleep_prob = mean(HrsSleep_Use), se = sqrt(sleep_prob * (1 - sleep_prob) / n()) ) # 绘制条形图 ggplot(prob_summary, aes(x = as.factor(ADHD_Control_Group), y = sleep_prob)) + geom_col(width = 0.5, fill = "#2E86AB") + geom_errorbar(aes(ymin = sleep_prob - 1.96*se, ymax = sleep_prob + 1.96*se), width = 0.2, color = "#1A374D") + scale_x_discrete(labels = c("ADHD患者", "对照组")) + labs(x = "分组", y = "睡眠不足的概率") + theme_minimal()
方案2:优化现有抖动点+回归直线(保留原可视化框架)
把x转成数值型,调整抖动参数避免点重叠,同时明确轴标签:
ggplot(final_sleep_data, aes(x = as.numeric(ADHD_Control_Group), y = HrsSleep_Use)) + geom_jitter(width = 0.1, height = 0.05, alpha = 0.5) + # 缩小抖动范围+降低透明度 geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE, color = "#FF6B6B") + scale_x_continuous(breaks = c(0, 1), labels = c("ADHD患者", "对照组")) + labs(x = "分组", y = "睡眠不足(1=是,0=否)") + theme_classic()
额外提醒
如果你的原始数据中ADHD_Control_Group原本是连续变量(比如ADHD症状评分),那错误将其转换为二分类因子是问题根源——恢复成连续变量后,再运行原代码就能得到曲线状的逻辑回归线。
内容的提问来源于stack exchange,提问作者Humberto R
相关产品推荐
相关产品推荐

