如何在R语言中介模型中纳入时间与个体固定效应?
面板数据中介模型加入个体与时间固定效应的Lavaan实现
核心思路
在Lavaan中实现面板固定效应(个体+时间),核心是控制个体和时间层面的截距差异,常用两种可互换的方式:
- 纳入个体(
id)和时间(year)的虚拟变量(直观直接) - 组均值中心化(适用于个体数量较多的场景,等价于个体固定效应)
方法一:直接纳入虚拟变量(小样本个体首选)
步骤1:数据预处理
将id和year转换为因子类型,让Lavaan自动生成虚拟变量实现固定效应控制:
library(lavaan) library(tibble) set.seed(123) n_obs <- 5 n_ids <- 10 dat <- tibble( id = factor(rep(1:n_ids, each = n_obs)), # 转换为因子,生成个体虚拟变量 year = factor(rep(2010:2014, times = n_ids)), # 转换为因子,生成时间虚拟变量 y = rnorm(n_obs * n_ids, mean = 100, sd = 10), m1 = rnorm(n_obs * n_ids, mean = 50, sd = 5), m2 = rnorm(n_obs * n_ids, mean = 30, sd = 3), m3 = rnorm(n_obs * n_ids, mean = 20, sd = 2), iv = rnorm(n_obs * n_ids, mean = 1000, sd = 53), weight = runif(n_obs * n_ids, min = 0.5, max = 2) )
步骤2:修正中介模型(加入固定效应+补全m3路径)
将id和year作为协变量加入所有内生变量的回归方程,同时补全你提到的第三个中介变量m3的路径:
mediation_model <- ' # 中介变量方程:控制个体+时间固定效应 m1 ~ a * iv + id + year m2 ~ d * iv + id + year m3 ~ f * iv + id + year # 因变量方程:控制个体+时间固定效应,纳入所有中介变量 y ~ c * iv + b * m1 + e * m2 + g * m3 + id + year # 间接效应计算 indirect1 := a * b indirect2 := d * e indirect3 := f * g total_indirect := indirect1 + indirect2 + indirect3 # 总效应与直接效应 total := c + total_indirect direct := c '
步骤3:拟合并查看结果
支持加权拟合(使用你的weight变量):
mediation_results <- sem(mediation_model, data = dat, weights = "weight") summary(mediation_results, fit.measures = TRUE, standardized = TRUE)
方法二:组均值中心化(大样本个体首选)
当个体数量较多时,大量虚拟变量会拖慢拟合速度,可采用组内中心化去除个体层面的均值差异(等价于控制个体固定效应),再结合时间虚拟变量控制时间固定效应:
library(dplyr) # 按id进行组内中心化 dat_centered <- dat %>% group_by(id) %>% mutate( iv_c = iv - mean(iv), m1_c = m1 - mean(m1), m2_c = m2 - mean(m2), m3_c = m3 - mean(m3), y_c = y - mean(y) ) %>% ungroup() # 中心化后的中介模型(控制时间固定效应) mediation_model_centered <- ' m1_c ~ a * iv_c + year m2_c ~ d * iv_c + year m3_c ~ f * iv_c + year y_c ~ c * iv_c + b * m1_c + e * m2_c + g * m3_c + year indirect1 := a * b indirect2 := d * e indirect3 := f * g total_indirect := indirect1 + indirect2 + indirect3 total := c + total_indirect direct := c ' # 拟合模型 mediation_results_centered <- sem(mediation_model_centered, data = dat_centered, weights = "weight") summary(mediation_results_centered, fit.measures = TRUE, standardized = TRUE)
关键说明
- 两种方法的核心都是排除个体和时间层面的非观测异质性,结果应高度一致
- 若不需要加权,可移除
weights = "weight"参数 - 可使用
semPaths(mediation_results)绘制模型路径图(需加载semPlot包)
内容的提问来源于stack exchange,提问作者Adriana Castillo Castillo
相关产品推荐
相关产品推荐

