潜增长曲线模型路径图自定义:移除截距与添加置信区间
潜增长曲线模型路径图调整方案
问题说明
已用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
相关产品推荐
相关产品推荐

