结构方程模型(SEM)及其R实现


来源:公众号:红皇后学术

参考资料:https://jslefche.github.io/sem_book/

一、基本流程

其实单独的做一个SEM的分析并不难,有很多的R包都可以实现,这个SEM的困难之处在于它不像其它的分析,输入数据之后得到一个结果就完事了。

SEM需要分析人员首先自行建立一个因子之间的关系模型,之后使用SEM对该模型进行分析,根据结果评估模型的效果,之后不断的对模型进行调整,随后重复“调整-评估”这一循环,直至结果满意为止。

了解了这个基本的过程之后,我就觉得我写的这篇推文应该是解决不了SEM分析的痛点了。

首先第一个痛点就是起始模型的建立,这个东西就是非常个性化的东西了,可以说没什么标准,只能由每个分析人员根据研究的实际情况自行摸索。

当然也有一些前期的基本工作,比如通过一些相关性分析、VIF、CCA/RDA等筛选一下用于建模的因子,去除不必要的因子,使得起始模型的建立更简单一些,也可以通过相关性结合研究实际初步评估一下直接作用和间接作用。

第二个痛点就是对模型的调整,每个因子应该放在什么位置,因子之间的关联应该怎么改变,这个东西是真的不知道怎么讲,感觉只能是多尝试。

这两个痛点大体上更多的是凭借研究人员的经验,因人而异、因时而异、因项目而异,所以下面的内容我只会介绍一下SEM的基本原理,以及单个SEM模型分析的结果意义。

当然没有经验的人也可以用“穷尽法”,把所有的可能性都试一遍,最后选择结果最好的,最好不要进行这样的尝试。

我个人觉得只有在特定的项目中,或者是在其它分析结果都不好的时候,我才会考虑使用SEM进行分析,不然我可能压根都不会做这个东西,实在是很费时间还不一定能得到满意的结果,特别是对于因子数据很多的研究

在微生物群落研究中,SEM的目的也是探索对微生物群落形成或变化其主要作用的影响因子,用ggcor做个Mantel和环境因子相关性的组合图也挺香的吧~

二、结构方程模型

常规分析两个变量间是否存在关联时,我们会使用相关性分析,但是相关性只能表明两个变量存在相互关系,但无法得出哪个变量是因?哪个变量是果?

此外,相关性分析只是两个变量数量上的相互关系,而在实际情况中,有些变量可能不是直接与其它变量发生相互作用,而是通过第三个变量间接的与靶标变量关联。

结构方程模型(Structural Equation Modeling,SEM)就是一种将两个或多个结构模型联合起来,以实现对多元关系进行建模的统计框架,其可以解决相关性分析中无法得到的因果关系以及区别直接和间接作用

三、结构方程模型的原理

SEM是数据分析的一种特殊形式,从一个指定了多变量间(假定的)相互关系的模型开始,变量间的关系被形式化为一组方程,用于测试这些变量并量化它们之间的关系。

SEM的本质是分析两个变量的协方差。

方差很好理解,方差估计一个变量中个体分布偏离其平均值的情况。

协方差就是两个变量协同情况下的偏离情况,两个变量的变化规律越协同一致,则其协方差的数值越大

对于一系列变量,我们可以得到一个方差-协方差矩阵,在矩阵中对角线为变量的方差,其余部分为变量的协方差,这个矩阵称为oberseved方差-协方差矩阵。

之后通过最大拟然法建立的SEM模型对这个矩阵进行估计,得到一个model-estimated方差-协方差矩阵,最后将两个矩阵结合得到最终的global oberseved方差-协方差矩阵。

在此过程中我们要评估model-estimated的矩阵与observed矩阵的匹配情况,就是Goodness-of-fit

四、SEM的路径系数

SEM的核心问题就是得到变量之间的回归系数(通常是线性回归),从而推断变量之间的依赖关系。

因为不同变量的数值不同,因此导致不同变量之间的协方差不在同一个水平上,也就无法比较,所以在比较变量间的协方差之前,需要对变量进行标准化,也就是Z转换,将所有变量均转换为均值为零,方差为1的变量,使得不同变量之间的协方差在同一个数量级,因而能够进行相互间的比较

当对变量进行Z转化之后,线性回归系数就与相关系数相等了

而如果不进行标准化,线性回归系数等于两个变量的协方差与解释变量方差的商,此时就与相关系数不相等了。

是否一定需要进行标准化,以及标准化的使用情况我没研究明白。

路径系数的8条规则:

  1. 如果两个变量之间只有相互关系而没有作用方向(没有箭头),称之为外源性变量,此时可以使用双向箭头来表示两个变量相关;

  2. 如果两个变量之间只被一条路径连接,那么这条路径的系数为回归系数;

  3. 如果两个变量之间是间接联系路径,则整个路径的系数为路径中每一个直接路径系数的乘积;

  4. 当一个变量被多个路径连接时,每一个路径的系数都是偏回归系数;

  5. 有箭头指向的变量称为内源性变量,箭头的R2为解释变量对这些内源性变量变化的解释比例;

  6. 两个内源性变量未分析的相关性就是其偏相关性;

  7. 一个变量对另一个变量的总的影响是其直接和间接影响的和;

  8. 模型的总效应与其总的相关性相等。

五、SEM模型匹配

SEM可以分为协方差SEM和分段SEM,在正常的分析中可以选择其中之一进行,但我目前看到的一些好的文章均是两种模型都做。

本文使用R语言的lavann包和piecewisedSEM包讲解一下SEM模型的分析命令。

1.协方差SEM

协方差SEM假定所有变量均具有正态分布,即数据服从多元正态分布,同时该分析还假定所有的变量均为独立的

使用piecewisedSEM包的keeley数据作为示例数据,假定的初始关系为firesev由age决定,同时firesev还决定cover,使用lavaan包进行协方差SEM模型匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library(devtools)
install_github("jslefche/piecewiseSEM@devel",build_vignette=F)
install.packages("lavaan")
library(lavaan)
library(piecewiseSEM)

data(keeley)
keeley_formula <- '
firesev ~ age
cover ~ firesev
'
keeley_sem <- sem(keeley_formula, data = keeley)

summary(keeley_sem, standardize = T, rsq = T)

2.分段SEM

分段SEM中,每组关系都是独立估计的,此过程将整体关系分解为与每个响应对应的简单或多回归,分别对每个响应进行评估,最后合并以生成有关全局SEM的推论。

1
2
3
4
5
6
7
8
9
10
11
12
13
keeley_psem <- psem(
  lm(firesev ~ age, data = keeley),
  lm(cover ~ firesev, data = keeley),
  data = keeley)
keeley_psem
fisherC(keeley_psem)
##   Fisher.C df P.Value
## 1     5.18  2   0.075
AIC(keeley_psem)
## [1] 17.18
BIC(keeley_psem)
## [1] 32.179
summary(keeley_psem, .progressBar = FALSE)

不同于协方差SEM,分段SEM使用Fisher‘s C statistic代替卡方检验,但是同样要求P>0.05

AIC会在给定模型的复杂性与其拟合优度之间进行权衡,可以将AIC值视为对应了模型的准确性,AIC值越小的模型表明越有可能准确地预测新数据,AIC小于2时认为模型效果很好