如何在GAM中可视化自然三次样条(ns)?解决plot无项可绘问题
解决
gam()中使用ns()自然三次样条的可视化问题 你遇到这个报错是因为mgcv包的plot.gam()函数只专门识别它自己定义的平滑项(比如用s()、te()等函数创建的项),而splines包的ns()生成的是普通的参数化样条项,属于线性模型范畴,plot.gam()找不到它认为可绘制的“平滑项”,所以会提示No term to plot。
要实现自然三次样条的可视化,有两种简单的方法:
方法一:手动生成预测值绘图(通用且灵活)
这种方法不受限于mgcv的绘图函数,能直接展示ns()拟合的样条曲线,步骤如下:
- 首先准备用于预测的x1序列数据,覆盖原数据的取值范围:
# 生成x1的序列,步长小一点让曲线更平滑 new_x <- data.frame(x1 = seq(min(dat$x1), max(dat$x1), length.out = 200))
- 用
predict()函数生成拟合值:
# 预测拟合值,type="response"确保是响应尺度的结果 new_x$y_pred <- predict(b1, newdata = new_x, type = "response")
- 用基础绘图或者ggplot2来绘制曲线+原始数据点:
- 基础绘图版本:
# 先画原始数据点 plot(dat$x1, dat$y, pch = 16, col = "gray", main = "自然三次样条拟合(ns())") # 再叠加拟合曲线 lines(new_x$x1, new_x$y_pred, col = "red", lwd = 2)
- ggplot2版本(更美观):
library(ggplot2) ggplot(dat, aes(x = x1, y = y)) + geom_point(color = "gray", alpha = 0.6) + geom_line(data = new_x, aes(y = y_pred), color = "red", linewidth = 1) + labs(title = "自然三次样条拟合(ns())", x = "x1", y = "y") + theme_minimal()
方法二:改用mgcv内置的自然三次样条(如果愿意替换ns())
如果你只是想实现自然三次样条的可视化,也可以直接用mgcv内置的约束三次样条(bs="cs",对应自然三次样条),这样就能直接用plot.gam()绘图:
# 用mgcv的内置自然三次样条拟合 b2 <- gam(y ~ s(x1, bs = "cs"), data = dat) # 直接plot,和你之前用s(x1)的方式一样 plot(b2)
这种方式的好处是能直接利用mgcv绘图函数自带的置信区间展示,不用手动计算。
内容的提问来源于stack exchange,提问作者aisiqisdu
相关产品推荐
相关产品推荐

