如何在ggplot中绘制二项式GAM平滑曲线?解决变量未找到报错
解决ggplot中添加二项式GAM平滑曲线的报错问题
报错原因
y1未找到的错误源于:你在ggplot主aes中直接定义了y = y1/(y1+y2)(比例值),但使用binomial族的GAM需要原始的成功计数(y1)和失败计数(y2)作为响应变量,stat_smooth计算时无法从主aes的设置中获取到原始计数变量。
解决方案
调整代码结构,将散点的比例计算与GAM模型的变量需求分开处理:
- 主ggplot的
aes仅指定x变量 - 在
geom_point中单独定义散点的y轴位置为比例值 - 在
geom_smooth的formula中直接用cbind(y1, y2)作为二项式响应变量,确保GAM能访问到原始计数数据
修正后的代码如下:
set.seed(42) df <- data.frame(y1 = sample.int(100), y2 = sample.int(100), x = runif(100, 0, 100)) ggplot(data = df, aes(x = x)) + geom_point(aes(y = y1/(y1+y2)), shape = 1) + # 单独设置散点的y轴比例 geom_smooth(method = "gam", method.args = list(family = binomial), formula = cbind(y1, y2) ~ s(x)) # 基于原始计数拟合二项式GAM
关键说明
- 采用
binomial族的GAM时,响应变量必须是二元0/1向量或成功数+失败数的cbind组合,不能直接使用比例值作为响应 - 修正后代码中,散点绘制与GAM拟合共享同一数据集,变量访问逻辑清晰,不会出现找不到变量的问题
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

