来源:吐西瓜皮怎么吃西瓜
本文约1000字,建议阅读5分钟
本文较为详细地介绍了结构方程模型分析的两个主流 R 包—lavaan 和piecewiseSEM。
首先声明,本文内容并非原创,采自石亚飞发表在生态学杂志的文章—《基于R的结构方程模型在生态学中的应用》,本文较为详细地介绍了结构方程模型分析的两个主流 R 包—lavaan 和piecewiseSEM。然后本文就作者提供的代码和数据就lavaan包进行简单复现,走一下文章流程,以便之后自己有需要的时候回头阅读以及为各位想进行结构方程模型制作的朋友推荐该文。
为什么复现lavaan包呢,因为之前自己用这个包做过SEM,觉得自主性和功能都挺强的,以下为相关代码:
# 加载包
library(ape)
install.packages("TH.data")
library(caper)
library(nlme)
library(lavaan)
# 读取数据
kelp <- read.csv("kelp.csv")
str(kelp) # 查看数据格式
# -Inf转换缺失值
kelp$max_Max.OV[which(kelp$max_Max.OV == -Inf)] = NA
# 响应变量的对数变换
kelp$kelp <- log(kelp$kelp + 1)
kelp$prev.kelp <- log(kelp$prev.kelp + 1)
kelp[, 18:23] <- log(kelp[, 18:23] + 1)
# 移除缺失值
vars <- c("SITE", "TRANSECT", "YEAR", "max_Max.OV", "prev.kelp", "habitat", "spring_canopy_150", "kelp",
"algae_richness", "sessile_invert_richness", "mobile_richness", "richness", "consumer_richness", "linkdensity")
kelp <- kelp[, vars]
kelp <- na.omit(kelp)
# 创建交互项
kelp$wave_kelp_int <- kelp$max_Max.OV * kelp$prev.kelp
# 建模
sem.model1 <- sem(
model = '
spring_canopy_150 ~ max_Max.OV + prev.kelp + wave_kelp_int
kelp ~ max_Max.OV + prev.kelp + spring_canopy_150
richness ~ kelp + prev.kelp + spring_canopy_150
linkdensity ~ richness + kelp + prev.kelp + spring_canopy_150
',
data = kelp)
# 展示结果
summary(sem.model1, standardized = T, rsq = T, modindices=TRUE)
# 调整模型
sem.model2 <- sem(
model = '
spring_canopy_150 ~ max_Max.OV + prev.kelp + wave_kelp_int
kelp ~ max_Max.OV + prev.kelp + spring_canopy_150
richness ~ kelp + prev.kelp + spring_canopy_150 + wave_kelp_int
linkdensity ~ richness + kelp + prev.kelp + spring_canopy_150',
data = kelp)
# 展示结果
summary(sem.model2, standardized = T, rsq = T, modindices=TRUE)
# 筛选更优模型
anova(sem.model1, sem.model2)
具体的内容解释在原文中有,大家可以查阅原文献。
值得注意的是,结构方程模型对于数据量的要求比较大,以下表格可供参考:
具体内容大家可以在知网下载该文《基于R的结构方程模型在生态学中的应用》,介绍的很详细,阅读完以后对这个会有较好的理解。作者提供的代码和文档链接地址可以点击阅读原文跳转或者复制文献中给的地址进入。原始生成的图其实并不好看,所以大家还是需要自己进行绘图的,R主要是计算一下最终的结果。
祝一切安好!
参考文献:
[1] 石亚飞, 石善恒, 黄晓敏. 基于R的结构方程模型在生态学中的应用[J]. 生态学杂志, 2022, 41(5): 1015–1023.