R语言:移除缺失值并显示分组年龄的逻辑回归曲线
问题解决步骤
一、先处理核心数据问题
你的问题根源在于未清理二元响应变量和因子变量的逻辑回归拟合逻辑不匹配,先完成两步关键预处理:
1. 清理leaveEU变量
leaveEU包含非二元标签(33/44/55/65)和大量缺失值,而逻辑回归要求因变量为二元(0/1),所以先筛选有效样本并编码:
# 仅保留"留欧(1)"和"脱欧(2)"的有效响应,其他值转为缺失值 ESS$leaveEU_binary <- ifelse(ESS$leaveEU %in% c(1,2), ESS$leaveEU, NA) # 编码为二元数值:1代表留欧(目标事件),0代表脱欧 ESS$leaveEU_binary <- ifelse(ESS$leaveEU_binary == 1, 1, 0) # 过滤所有含缺失值的行(去除age_cat和leaveEU_binary的NA样本) ESS_clean <- na.omit(ESS[, c("age_cat", "leaveEU_binary")])
2. 消除缺失值列
cut()函数会将agea为NA的行转为NA,上面的na.omit()已经自动过滤这些样本,解决末尾出现缺失值列的问题。
二、调整绘图逻辑
由于age_cat是分类因子,逻辑回归会为每个组拟合独立概率值,而非连续曲线,你有两种可视化选择:
选项1:展示分组概率的均值与置信区间
如果要直观对比不同年龄组的留欧概率差异,用以下代码:
library(ggplot2) ggplot(ESS_clean, aes(x = age_cat, y = leaveEU_binary)) + geom_jitter(height = 0.05, width = 0.1, alpha = 0.3) + # 降低点透明度避免重叠 stat_summary(fun.data = "mean_cl_boot", color = "#E63946", size = 1) + # 显示均值和置信区间 labs(x = "年龄分组", y = "留欧意愿概率(1=留欧)")
选项2:转为组中值拟合连续曲线
如果想得到类似连续年龄变量的回归曲线,先将因子转为组中值,再拟合逻辑回归:
# 提取每个年龄组的中间值 ESS_clean$age_mid <- sapply(strsplit(as.character(ESS_clean$age_cat), "[(,]"), function(x) mean(as.numeric(x[c(2,3)]))) ggplot(ESS_clean, aes(x = age_mid, y = leaveEU_binary)) + geom_jitter(height = 0.05, width = 1, alpha = 0.3) + stat_smooth(method = "glm", method.args = list(family = "binomial"), color = "#E63946") + labs(x = "年龄组中值", y = "留欧意愿概率(1=留欧)")
原代码失效原因
当x为因子时,stat_smooth(method="glm", family="binomial")会拟合分类逻辑回归,但ggplot不会自动绘制“曲线”——分类变量没有连续x轴来连接分组预测值;同时未清理的大量缺失值会导致绘图时出现额外的缺失值组。
内容的提问来源于stack exchange,提问作者SMRquestion
相关产品推荐
相关产品推荐

