You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:05:14