GAM绘图:编辑Y轴以包含截距与不确定性的技术问题
GAM绘图添加截距的问题解答
问题1:仅平移值(不考虑截距不确定性)
- 提取模型截距:直接用
coef(model)[1L]获取模型的截距项。 - 平移估计值:将截距加到
fitted_values()或smooth_estimates()返回的fitted、lower_ci、upper_ci列即可。 - 多模型处理:每个模型的截距独立,需要为每个模型重复提取截距并平移操作。可以封装成函数批量处理:
shift_with_intercept <- function(model, new_data) { fv <- fitted_values(model, data = new_data) intercept <- coef(model)[1L] dplyr::mutate(fv, fitted = fitted + intercept, lower_ci = lower_ci + intercept, upper_ci = upper_ci + intercept ) }
问题2:包含截距估计的不确定性(代码错误修正)
你的代码问题出在**terms参数用法错误和未固定其他协变量的水平**:
terms = c("(Intercept)", "x2")是错误用法:fitted_values()的terms参数仅用于筛选结果中保留的预测变量列,无法指定是否包含截距。data_slice未固定其他协变量:GAM的预测依赖所有协变量,必须将非目标变量(x0、x1、fac、x3、logi)固定到参考水平或代表性值(如均值、基准分类),否则预测值基于默认水平,结果不符合预期。
修正后的代码:
library("gratia") set.seed(3) dat <- gamSim(1,n=1500,dist="normal",scale=20) dat$fac <- as.factor( sample(c("A1", "A2", "A3"), nrow(dat), replace = TRUE) ) dat$logi <- as.logical( sample(c(TRUE, FALSE), nrow(dat), replace = TRUE) ) bs <- "cr"; k <- 12 b <- gam(y ~ x0 + x1 + I(x1^2) + s(x2,bs=bs,k=k) + fac + x3:fac + I(x1*x2) + logi, data=dat) # 固定其他协变量到参考/代表性水平,仅让x2变化 ds <- data_slice(b, x0 = mean(x0), # 连续变量取均值 x1 = mean(x1), fac = levels(fac)[1], # 分类变量取基准水平 x3 = mean(x3), logi = FALSE, # 逻辑变量取基准水平 x2 = evenly(x2)) # 获取完整预测值(包含截距、其他固定变量贡献及所有不确定性) fv <- fitted_values(b, data = ds)
解释:
data_slice明确固定所有非目标变量的水平,确保预测仅反映x2的效应+截距+其他固定变量的贡献。- 不使用
terms参数限制,fitted_values()默认返回完整的线性预测器结果,包含截距的不确定性,此时fitted、lower_ci、upper_ci已经是带有截距和所有固定变量贡献的数值,且包含截距估计的不确定性。
内容的提问来源于stack exchange,提问作者mto23
相关产品推荐
相关产品推荐

