GAM绘图基函数叠加(第二部分):随机效应GAMM实现疑问
问题:在含交叉随机效应的GAMM中叠加基函数的实现验证
背景
之前我在Stack Overflow上提问过如何在GAM绘图上叠加基函数,该方案对固定效应模型建模帮助很大。但尝试给带交叉随机效应的GAMM执行相同操作时遇到了阻碍,我参照原思路模拟了包含subject和item交叉随机效应的数据并拟合模型,以下是具体操作,想请大家帮忙判断实现是否正确,若有误该怎么修正。
代码与操作步骤
加载包与设置主题
library(mgcv) library(tidyverse) library(gratia) theme_set(theme_bw())
模拟数据
dat <- data_sim("eg2", seed = 123, n = 1000) cross.dat <- dat %>% mutate(subject = factor(rbinom(n=1000,size=100,prob=.5)), item = factor(rbinom(n=1000,size=50,prob=.5))) cross.dat
数据结构如下:
# A tibble: 1,000 × 6 y f x z subject item <dbl> <dbl> <dbl> <dbl> <fct> <fct> 1 -1.36 0.631 0.288 0.274 49 24 2 -1.75 0.326 0.788 0.594 55 30 3 0.346 0.382 0.409 0.160 55 23 4 0.0416 0.306 0.883 0.853 42 26 5 -4.86 0.234 0.940 0.848 55 18 6 2.51 0.428 0.0456 0.478 55 26 7 0.873 0.374 0.528 0.774 50 26 8 4.90 0.0642 0.892 0.295 52 30 9 1.50 0.134 0.551 0.0656 44 27 10 -0.502 0.392 0.457 0.441 53 26 # … with 990 more rows # ℹ Use `print(n = ...)` to see more rows
拟合GAMM模型
m <- gam( y ~ s(x, bs = "cr") + s(z, bs = "cr") + ti(x, z, bs = "cr") + s(subject, bs = "re") + s(item, bs = "re"), data = cross.dat, method = "REML" ) plot(m, select = 2)
生成数据切片与基函数
ds <- data_slice(m, z = evenly(z, n = 200)) bs <- basis(m, term = "s(z)", data = ds)
计算基函数总和
spl <- bs |> group_by(z) |> summarise(spline = sum(value))
绘图
bs |> ggplot(aes(x = z, y = value, colour = bf, group = bf)) + geom_line(show.legend = FALSE) + geom_line(aes(x = z, y = spline), data = spl, linewidth = 1.5, inherit.aes = FALSE) + labs(y = expression(f(z)), x = "z", title = "Simulated Basis Functions")
疑问
最终生成的绘图看起来接近预期,但我感觉存在问题。请问这个实现是否正确?如果不正确,应该如何修正?
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

