ggplot2中向散点图添加样条回归拟合线时的报错解决
BS样条回归拟合线与置信带添加到散点图的解决方案
问题重现
使用BS样条构建年龄与细菌携带率的回归模型:
fit2 <- lm(percentage ~ bs(Age_midpoint, knots = c(0.177, 1, 1.460, 2.585, 5, 8.75, 37.45)), data = Complete_data) age <- range(Complete_data$Age_midpoint) Age_grid <- seq(from=min(age), to = max(age)) pred2 <- predict(fit2, newdata = list(Age_midpoint = Age_grid), se = T) se_bands = with(pred2, cbind("upper" = fit+2*se.fit, "lower" = fit-2*se.fit))
基础散点图代码:
Fig1 <- ggplot(Complete_data, aes(x= Age_midpoint, y = percentage)) + geom_point(shape=1, aes(size = denominator)) + xlab("Average age") + ylab("Pneumococcal Carriage") + theme_light()
尝试添加拟合线和置信带时触发报错:
Fig1 + geom_line(aes(x = Age_midpoint.grid, y=pred2$fit), color = "red") + geom_ribbon(aes(x = Age_midpoint.grid, ymin=se_bands[, "lower"], ymax = se_bands[, "upper"]), alpha = 0.3) + xlim(age)
错误信息:
Error in geom_line(aes(x = Age_midpoint.grid, y = pred2$fit), color = "red") : ℹ Error occurred in the 2nd layer. Caused by error in `check_aesthetics()`: ! Aesthetics must be either length 1 or the same as the data (403) ✖ Fix the following mappings: `x` and `y`
问题原因
- 代码中错误引用了未定义的变量
Age_midpoint.grid,实际应为Age_grid geom_line和geom_ribbon默认沿用主图的数据集(共403行),但传入的拟合值、置信带向量长度与主数据集不一致,导致美学映射长度不匹配
解决步骤
- 步骤1:将预测结果整理为独立数据框
把年龄网格、拟合值、置信带上下限整合到一个数据框中,方便ggplot调用:
pred_df <- data.frame( Age_midpoint = Age_grid, fit = pred2$fit, lower = se_bands[, "lower"], upper = se_bands[, "upper"] )
- 步骤2:修改ggplot图层代码
在geom_line和geom_ribbon中通过data参数指定预测数据框,确保变量名与映射匹配:
Fig1 + geom_line(data = pred_df, aes(x = Age_midpoint, y = fit), color = "red") + geom_ribbon(data = pred_df, aes(x = Age_midpoint, ymin = lower, ymax = upper), alpha = 0.3) + xlim(age)
执行以上代码后,就能正确将BS样条的拟合线和置信带叠加到散点图中。
内容的提问来源于stack exchange,提问作者Eliza
相关产品推荐
相关产品推荐

