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

潜增长曲线模型路径图自定义:移除截距与添加置信区间

潜增长曲线模型路径图调整方案

问题说明

已用lavaan构建潜增长曲线模型(LGCM)并生成路径图,需完成两项调整:

  • 移除预测变量x1,以及观测变量T0(基线)、T1(第1年)、T2(第2年)、T3(第3年)的截距节点
  • 在路径图中显示带置信区间的参数估计值

原代码如下:

# Load relevant packages
library(lavaan) #for SEM LGCM
library(semTools) # for fit indices 
library(semPlot) # for path diagrams
library(semptools) # for path diagrams
library(tidyverse) # pipelines, exploring and visualizing data

# model
model_fit <- ' 
# intercept with fixed coefficients
  i =~ 1*T0 + 1*T1 + 1*T2 + 1*T3
# slope with fixed coefficients
  s =~ 0*T0 + 1*T1 + 2*T2 + 3*T3

# time invariant covaraites
 # regression of time-invariant covariates on intercept and slope factors
  i ~  x1 + covar1 + covar2 + covar3
  s ~ x1 + covar1 + covar2 + covar3
'

fit <- growth(model_fit, data=LGCM_data, missing="fiml", estimator = "MLR")
summary(fit,fit.measures=TRUE, ci=TRUE)


# Plot   
lgcm_no_covs <- semptools::drop_nodes(
                 object = semPlotModel(fit),
                 nodes = c("covar1", "covar2", "covar3")) 

lgcm_no_covs <- semPaths(lgcm_no_covs, whatLabels = "est",
                    label.norm = "PAL \nBaseline",
                    edge.label.cex = 1.0, label.cex = 2.0,
                    edge.color = "black", edge.label.color = "black",
                    height = 20, width = 12,
                    residuals = FALSE,
                    DoNotPlot= TRUE)  

my_label_list <- list(list(node = "i", to = "Intercept"),
                     list(node = "s", to = "Slope"),
                     list(node = "x1", to = "Predictor"),
                     list(node = "T0", to = "Baseline"),
                     list(node = "T1", to = "Year 1"),
                     list(node = "T2", to = "Year 2"),
                     list(node = "T3", to = "Year 3")
                     )

lgcm_no_covs <- change_node_label(lgcm_no_covs, my_label_list)

plot(lgcm_no_covs)

当前路径图效果:
路径图

解决方案

1. 移除指定节点(x1 + 观测变量截距)

  • 移除x1:在drop_nodes的nodes参数中加入"x1",直接删除该节点
  • 移除观测变量截距:在semPaths中添加intercepts = FALSE参数,关闭观测变量截距节点的显示

2. 显示带置信区间的估计值

semPaths不直接支持显示置信区间,需手动提取参数估计与CI,替换路径标签:

  • 用parameterEstimates(fit, ci=TRUE)提取所有参数的估计值、95%置信区间上下限
  • 匹配semPlotModel中每条边的参数,生成估计值 [下限, 上限]格式的标签
  • 替换原路径标签

修改后完整代码

# Load relevant packages
library(lavaan)
library(semTools)
library(semPlot)
library(semptools)
library(tidyverse)

# 模型拟合
model_fit <- ' 
# 截距因子(固定载荷)
  i =~ 1*T0 + 1*T1 + 1*T2 + 1*T3
# 斜率因子(固定载荷)
  s =~ 0*T0 + 1*T1 + 2*T2 + 3*T3

# 时不变协变量回归
  i ~  x1 + covar1 + covar2 + covar3
  s ~ x1 + covar1 + covar2 + covar3
'

fit <- growth(model_fit, data=LGCM_data, missing="fiml", estimator = "MLR")
summary(fit, fit.measures=TRUE, ci=TRUE)

# 步骤1:移除不需要的节点(covar1-3 + x1)
lgcm_no_covs <- semptools::drop_nodes(
  object = semPlotModel(fit),
  nodes = c("covar1", "covar2", "covar3", "x1")
)

# 步骤2:生成基础路径图框架(关闭截距显示)
lgcm_no_covs <- semPaths(lgcm_no_covs, 
                        whatLabels = "est",
                        intercepts = FALSE,  # 关闭观测变量截距节点
                        label.norm = "PAL \nBaseline",
                        edge.label.cex = 1.0, label.cex = 2.0,
                        edge.color = "black", edge.label.color = "black",
                        height = 20, width = 12,
                        residuals = FALSE,
                        DoNotPlot= TRUE)  

# 修改节点标签
my_label_list <- list(list(node = "i", to = "截距"),
                     list(node = "s", to = "斜率"),
                     list(node = "T0", to = "基线"),
                     list(node = "T1", to = "第1年"),
                     list(node = "T2", to = "第2年"),
                     list(node = "T3", to = "第3年")
                     )
lgcm_no_covs <- change_node_label(lgcm_no_covs, my_label_list)

# 步骤3:提取参数估计与置信区间,替换路径标签
params <- parameterEstimates(fit, ci=TRUE) %>%
  mutate(
    # 生成带CI的标签:保留两位小数
    ci_label = sprintf("%.2f [%.2f, %.2f]", est, ci.lower, ci.upper),
    # 为匹配semPlot的边标识,创建参数对(lhs -> rhs)
    param_pair = paste(lhs, rhs, sep = "->")
  )

# 遍历每条边,替换标签
for (i in seq_along(lgcm_no_covs$edges$label)) {
  # 获取当前边的参数对(注意semPlot的边方向:from -> to)
  edge_pair <- paste(lgcm_no_covs$edges$from, lgcm_no_covs$edges$to, sep = "->")
  # 匹配对应的CI标签
  matched_label <- params$ci_label[params$param_pair == edge_pair]
  # 若匹配到则替换,否则保留原标签(固定载荷等)
  if (length(matched_label) > 0) {
    lgcm_no_covs$edges$label[i] <- matched_label
  }
}

# 绘制最终路径图
plot(lgcm_no_covs)

关键改动说明

  • 在drop_nodes中加入"x1"直接删除该预测变量节点
  • 添加intercepts = FALSE关闭观测变量的截距节点显示
  • 提取参数估计时开启ci=TRUE,生成带置信区间的格式化标签
  • 通过匹配参数对(lhs->rhs)将带CI的标签替换到对应路径上

内容的提问来源于stack exchange,提问作者AEP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:04:52