含分类变量数据的Logistic回归实现报错问题
问题分析与解决方案
错误核心原因
- 你的数据集是聚合后的计数数据,每个
primary_fur_color对应runs_from=0和1的样本计数n,但原代码完全忽略了n的存在,相当于告诉模型每个毛色的0/1结果各只有1个样本,而实际上每个结果对应多个观测。 - 同时将
x和y都设为runs_from(二元0/1变量),每个毛色组仅两个数据点,逻辑回归无法从两个点拟合出有效的回归曲线。 - 管道传递数据后,重复指定
data = Squirrels.Count属于冗余代码,虽不报错但没必要。
修正后的代码
方案1:用权重拟合逻辑回归(推荐)
直接在stat_smooth中加入weight=n参数,让模型识别每个观测的实际样本量:
Squirrels.Count %>% ggplot(aes(x = primary_fur_color, y = runs_from)) + # 用点大小直观展示计数n的多少 geom_point(aes(size = n, color = primary_fur_color)) + stat_smooth(method = "glm", se = TRUE, method.args = list(family = binomial), aes(weight = n))
方案2:先展开原始数据再拟合
如果不想用权重,也可以先将聚合数据展开为原始单条记录的形式,再绘图:
# 展开数据 Squirrels.raw <- Squirrels.Count %>% uncount(n) # 绘图 Squirrels.raw %>% ggplot(aes(x = primary_fur_color, y = runs_from)) + geom_jitter(aes(color = primary_fur_color), width = 0.1, alpha = 0.5) + stat_smooth(method = "glm", se = TRUE, method.args = list(family = binomial))
代码说明
- 方案1的权重参数
weight=n是处理聚合计数数据的标准方式,避免了展开数据的内存开销,尤其适合大样本聚合数据。 - 用
geom_point的size=n可以直观看到每个毛色下0/1结果的样本量差异;如果觉得点重叠,也可以换成geom_jitter添加少量偏移。 - 逻辑回归拟合的是
runs_from=1的概率随primary_fur_color的变化趋势,se=TRUE会显示置信区间。
内容的提问来源于stack exchange,提问作者xsaltea
相关产品推荐
相关产品推荐

