如何在中断时间序列模型中使用marginaleffects的predictions函数
中断时间序列(ITS)模型中marginaleffects包predictions函数的正确用法
问题背景
- 拟合中断时间序列(ITS)回归模型,结果变量为连续型的幸福感指数(Wellbeing Index)
- 关键变量:
T(天数)、D(二元干预变量,0=未开展游泳课,1=开展游泳课)、sex(二分类:male/female)、race(四分类:Green/Blue/Brown/Yellow) - 研究目标:评估游泳课对幸福感的影响,核心关注水平变化(β₂,干预后即时变化)和斜率变化(β₃,干预后时间趋势变化)
数据加载与处理代码
URL <- "https://github.com/DS4PS/pe4ps-textbook/blob/master/data/time-series-example.rds?raw=true" dataTS <- readRDS(gzcon(url(URL))) dataTS$Y <- round(dataTS$Y,1) dataTS$sex <- sample(c("male", "female"), size = NROW(dataTS), replace = TRUE) dataTS$race <- sample(c("Green", "Blue", "Brown", "Yellow"), size = NROW(dataTS), replace = TRUE)
拟合的ITS模型
ts <- lm( Y ~ T + D + T*D + sex + race, data=dataTS )
疑问:predictions函数的两种调用方式选择
需要用marginaleffects包的predictions()完成两个任务:
- 生成预测值
- 绘制Y(幸福感指数)随X(时间)变化的趋势图,可视化干预前后差异
现有两种调用方式:
方式一
predictions(ts, type = "response")
方式二
time_seq_pre <- seq(0, 200, by = 5) time_seq_post <- seq(201, 300, by = 5) pred_grid <- bind_rows( data.frame(T = time_seq_pre, D = 0), data.frame(T = time_seq_post, D = 1) ) |> mutate( sex = "male", race = "Green" ) predictions(ts, newdata = pred_grid, type = "response")
正确用法指导
方式一的局限性:基于原始数据集的每一行生成预测值,仅能得到现有观测的拟合结果。但原始数据中
T和D是对应真实场景的(干预后D=1的行仅对应T≥201),无法生成"干预前假设开展游泳课"或"干预后假设未开展游泳课"的反事实预测,无法直接用于对比干预前后的趋势差异。方式二更匹配你的需求:
- 自定义的
pred_grid明确划分了干预前(T=0~200,D=0)和干预后(T=201~300,D=1)的时间区间,同时固定协变量为特定参考类别(这里选"male"和"Green",也可根据需求替换为均值或其他分组)。 - 基于该网格生成的预测值,能直接对应干预前后的标准趋势线,完全满足可视化干预效果的需求。
- 如果需要展示不同协变量分组的趋势(比如不同性别),只需在
pred_grid中加入对应分组的取值即可。
- 自定义的
补充优化:若要生成所有协变量组合的预测值,可使用
marginaleffects自带的datagrid()函数自动构建网格,示例:
predictions(ts, newdata = datagrid(T = seq(0, 300, 5), D = c(0,1), sex = c("male","female"), race = "Green"))
内容的提问来源于stack exchange,提问作者Eagle Hawk
相关产品推荐
相关产品推荐

