如何在R中可视化含观测变量的SEM模型交互效应?
问题描述
我正在使用lavaan包拟合包含观测变量的SEM模型,采用FIML(全信息极大似然法)处理缺失数据,模型中包含交互项以检验调节效应,示例代码如下:
library(lavaan) library(car) library(dplyr) data(starwars) sw2 <- starwars %>% mutate( male = Recode(sex, "'male' = 1; NA=NA; else = 0"), human = Recode(species, "'Human' = 1; NA=NA; else = 0"), maleXby = male * birth_year, ) mod <- 'mass ~ height + human + male + birth_year + maleXby' fit <- sem(mod, data = sw2, missing="fiml.x") summary(fit)
我希望绘制类似边际图的交互项图以可视化交互效应,但interactions包不支持lavaan类对象,请问该如何实现?是否有类似interactions的便捷工具包?
解决方案
方法1:提取模型参数手动计算预测值绘图
直接从lavaan模型中提取回归系数,手动计算不同调节水平下的预测值,再用ggplot2完成可视化:
library(ggplot2) # 提取模型回归系数 coefs <- coef(fit) # 设定控制变量的均值(忽略缺失值) height_mean <- mean(sw2$height, na.rm = TRUE) human_mean <- mean(sw2$human, na.rm = TRUE) # 生成自变量birth_year的连续取值序列 birth_vals <- seq(min(sw2$birth_year, na.rm = TRUE), max(sw2$birth_year, na.rm = TRUE), length.out = 100) # 分别计算男性(male=1)和非男性(male=0)的预测体重 pred_male1 <- coefs["height"]*height_mean + coefs["human"]*human_mean + coefs["male"]*1 + coefs["birth_year"]*birth_vals + coefs["maleXby"]*1*birth_vals pred_male0 <- coefs["height"]*height_mean + coefs["human"]*human_mean + coefs["male"]*0 + coefs["birth_year"]*birth_vals + coefs["maleXby"]*0*birth_vals # 整理成绘图用的数据框 pred_df <- data.frame( birth_year = rep(birth_vals, 2), mass = c(pred_male0, pred_male1), male = rep(c("非男性", "男性"), each = 100) ) # 绘制边际效应曲线 ggplot(pred_df, aes(x = birth_year, y = mass, color = male)) + geom_line(linewidth = 1) + labs(x = "出生年份", y = "预测体重", color = "性别") + theme_minimal()
方法2:用semTools包直接探测交互效应
semTools包专门为lavaan提供扩展工具,其中probe2WayMC函数可直接处理模型中的交互项,生成用于可视化的边际效应数据:
library(semTools) # 探测二元交互效应,指定自变量、调节变量和因变量 probe_out <- probe2WayMC(fit, pred = "birth_year", mod = "male", outcome = "mass", modx.values = c(0,1), # 调节变量的取值(male的0/1分类) pred.values = "sd") # 自变量取均值±1标准差 # 提取结果数据并绘图 ggplot(probe_out$preds, aes(x = birth_year, y = mass, color = factor(male))) + geom_line(linewidth = 1) + geom_point(size = 2) + labs(x = "出生年份", y = "预测体重", color = "性别") + theme_minimal()
方法3:用emmeans包计算边际均值
emmeans支持lavaan模型对象,可计算不同调节水平下的边际均值及置信区间,适合带误差范围的可视化:
library(emmeans) # 生成模型的参考网格,指定birth_year的取值序列 emm <- emmeans(fit, ~ birth_year | male, at = list(birth_year = seq(0, 800, 50))) # 转换为数据框并绘制带置信区间的边际效应图 emm_df <- as.data.frame(emm) ggplot(emm_df, aes(x = birth_year, y = emmean, color = factor(male), ymin = lower.CL, ymax = upper.CL)) + geom_line(linewidth = 1) + geom_ribbon(alpha = 0.2, color = NA) + labs(x = "出生年份", y = "边际均值(体重)", color = "性别") + theme_minimal()
内容的提问来源于stack exchange,提问作者tci
相关产品推荐
相关产品推荐

