我发现了Pedersen等人的Hierarchical GAM pre-print(和GH repo)。对功能响应中的群体间变异建模非常有帮助,但我遇到了绊脚石。
我有一些时间序列数据(时间计数),具有以下基本期望:
在这里,我尝试用一个人为设计的例子来说明,因为我担心我的描述不足。我模拟了两个“固定”组/治疗的20个重复(年度)时间序列。在控件中(trt == 0),年度变化很小。在治疗中(trt == 1),反应形式存在系统性趋势。
library(reshape)
library(dplyr)
library(ggplot2)
set.seed(2020)
n_yr <- 20
n_trt <- 2
n_x <- 10
dat <- tibble(yr = rep(seq(0, n_yr - 1), n_trt)) %>%
expand.grid.df(tibble(x = rep(seq(0, 1, length.out = 10), n_trt),
tweak = c(rep(0, 15), rep(0.02, 5)),
trt = rep(0:1, each = n_x)), .) %>%
mutate(e = rnorm(n_x * n_yr * n_trt, 0, 0.3),
y = 3 + 9 * (x - tweak * yr) - 1 * (x - tweak * yr)^2 - 10 * (x - tweak * yr)^3 + e,
fyr = factor(yr),
ftrt = factor(trt),
fty = factor(interaction(trt,yr)))
ggplot(dat, aes(x, y)) + geom_line(aes(group = yr, colour = yr)) +
facet_grid(trt ~ .) + theme_bw() +
scale_colour_gradient("Year", low = "#2166ac", high = "#b2182b")
什么是合适的机制来捕获感兴趣的功能性反应,以及模拟各组间反应的年际变化?
我最好的猜测是为我的“全局”平滑建模一个因子平滑的交互作用(将处理用作by
变量)。但是,然后如何对这些单独的平滑度的年度偏差建模呢?
仅通过一次全球响应就获得按年平滑的因子分解(fs
; ?factor.smooth.interaction
)似乎是不够的:
library(mgcv)
m <- gam(y ~ s(x, by = ftrt, k = 5) + ftrt + s(x, fyr, bs = "fs", k = 5, m = 1),
data = dat, method = "REML")
plot(m, pages = 1)
按治疗年份进行fs
交互似乎更合适:
# Different smoothing parameters by treatment
m1 <- gam(y ~ s(x, by = ftrt, k = 5) + ftrt + s(x, fty, bs = "fs", k = 5, m = 1),
data = dat, method = "REML")
p <- plot(m1, pages = 1)
下面的图更好地说明了两次治疗之间从治疗平滑度开始的年度偏差的差异,以及治疗组这些装置形状的“趋势”:
df <- data.frame(p[[3]],
fty = rep(levels(dat$fty), each = 100),
trt = rep(rep(0:1, each = 100), 20),
yr = rep(0:19, each = 200))
ggplot(df, aes(x, fit, group = fty)) +
geom_line(aes(color = yr)) +
scale_colour_gradient("Year", low = "#2166ac", high = "#b2182b") +
facet_grid(trt ~ .) + theme_bw()
所以我的问题:
s(x, by = ftrt)
)与某种总体平稳(s(x)
)相比,基数平滑度是否合适?