分享

搞不懂结构方程模型?一文学会(附代码)

 汉无为 2023-09-08 发布于湖北

R语言结构方程模型代码与理解

引言

结构方程模型(Structural Equation Modeling,简称 SEM)是一种基于概率统计的多变量分析方法,可以用于探究变量间的因果关系。

SEM 可以同时估计测量模型和结构模型,从而可以考虑到测量误差和隐变量的影响。在 SEM 中,测量模型用来描述每个测量变量与其背后的潜在变量之间的关系,而结构模型用来描述潜在变量之间的因果关系。SEM 可以通过最大似然估计、贝叶斯估计等方法求解模型参数,从而得到模型的拟合度和参数估计结果。

总之,SEM是一种判断复杂变量之间的关系、贡献度、相关性的工具。(而不是一种回归模型)

小编以SEM为关键词检索,有很多所谓的“名师”课程,售价往往几千起步,成本非常高啊。

图片

其实SEM本身并不是很复杂,小编总结了代码和原理,希望能运用到大家的实际研究中。

代码

实例1

其中,lavaan用于SEM分析,semPlot用于可视化路径结果,tidyverse用于数据处理

library(lavaan)
library(semPlot)
library(tidyverse)

示例1是一个lavaan包官方例子,https://www.cnblogs.com/squidGuang/p/9054301.html

首先加载数据

data <- HolzingerSwineford1939
data <- data %>% na.omit()
head(data, 10)
图片

数据概念如下:

数据为整体为小学同学的智力测量因素

  • 视觉因子(visual)对应x1,x2,x3

  • 文本因子(textual)对应x4,x5,x6

  • 速度因子(speed)对应x7,x8,x9

图片

总共需要三个步骤:

  1. 根据数据的物理意义把模型的路径写出来
  2. 拟合SEM
  3. 提取结果
#step 1:write the road of model
model <- ' visual  =~ x1 + x2 + x3
           textual =~ x4 + x5 + x6
           speed   =~ x7 + x8 + x9
           mind =~ visual + textual + speed           
'

#step 2: fit sem
fit <-sem(model, data = data)

#step 3: summary result
summary(fit, standardized = TRUE)  

lavaan.version : '0.6.15' optim.method : 'nlminb' optim.converged : TRUE

estimator : 'ML' $estimator.args :

npar : 21 nrow.ceq.jac : 0 nrow.con.jac : 0 $con.jac.rank : 0

ngroups : 1 $nobs : 300

standard** = stat : 85.9448655188601 df : 24 pvalue : 6.68883060050973e-09

$pe : A data.frame: 25 × 11

lhsoprhsexoestsezpvaluestd.lvstd.allstd.nox
visual=~x101.00000000.00000000NANA0.90722880.77746120.7774612
visual=~x200.54708120.098826715.5357633.098769e-080.49632790.42153120.4215312
visual=~x300.72133100.107964336.6811972.369971e-110.65441230.57958330.5795833
textual=~x401.00000000.00000000NANA0.99123740.85187910.8518791
textual=~x501.11041090.0654276616.9715810.000000e+001.10068080.85463530.8546353
textual=~x600.92439020.0554956216.6569930.000000e+000.91629020.83740380.8374038
speed=~x701.00000000.00000000NANA0.62252750.57137850.5713785
speed=~x801.17920970.164307967.1768277.134293e-130.73409050.72735100.7273510
speed=~x901.07570630.149795037.1811886.910028e-130.66965680.66363080.6636308
mind=~visual01.00000000.00000000NANA0.87599040.87599040.8759904
mind=~textual00.65410850.172277273.7968361.465549e-040.52443090.52443090.5244309
mind=~speed00.41766430.116799793.5759003.490256e-040.53319370.53319370.5331937
x1~~x100.53861950.114726544.6948112.668528e-060.53861950.39555410.3955541
x2~~x201.14002480.1021950811.1553790.000000e+001.14002480.82231150.8223115
x3~~x300.84663020.090587149.3460300.000000e+000.84663020.66408330.6640833
x4~~x400.37138850.047945457.7460649.547918e-150.37138850.27430200.2743020
x5~~x500.44717620.058542447.6384962.198242e-140.44717620.26959850.2695985
x6~~x600.35769370.043218018.2764972.220446e-160.35769370.29875490.2987549
x7~~x700.79951040.081594889.7985370.000000e+000.79951040.67352660.6735266
x8~~x800.47972870.074094926.4745159.511703e-110.47972870.47096050.4709605
x9~~x900.56980300.070818068.0460128.881784e-160.56980300.55959420.5595942
visual~~visual00.19147830.175334871.0920722.748015e-010.23264080.23264080.2326408
textual~~textual00.71232270.107784876.6087443.875944e-110.72497220.72497220.7249722
speed~~speed00.27736450.069629843.9834146.793231e-050.71570450.71570450.7157045
mind~~mind00.63158590.187593053.3667877.604938e-041.00000001.00000001.0000000

上面是结果,接下来检验结果准确性,有以下指标

  • RMR 残差均方根 ,RMR 是样本方差和协方差减去对应估计的方差和协方差的平方和,再取平均值的平方根。一般RMR越小,拟合越好,理论上要小于0.08。
  • RMSEA 近似误差均方根,该值也是越小越好,RMSE理论上小于0.06,也可以放宽到0.08。
  • CFI 比较拟合指数,值在0-1之间。CFI 值越大越好,一般在0.9以上模型可接受
  • GFI 拟合优度指数,值在0-1之间,一般GFI 应该等于或大于0.90。
  • PGFI 简效拟合优度指数。它是简效比率(PRATIO,独立模式的自由度与内定模式的自由度的比率)乘以GFI。 PGFI 应该等于或大于0.90,越接近1越好。
  • PNFI 简效拟合优度指数,等于PRATIO乘以 NFI。 PNFI应该等于或大于0.90,越接近1越好。
  • NFI 规范拟合指数,变化范围在0和1间, 当为1的时候标识完全拟合。一般NFI 小于0.90 表示需要重新设置模型。越接近1越好。
  • TLI Tucker-Lewis 系数, 也叫做Bentler-Bonett 非规范拟合指数 (NNFI)。TLI接近1表示拟合良好。
  • Chisqare/df卡方值与自由度的比值,该值越小越好,一般要小于2,放宽到3也是可以接受的。

由于指标众多,也有很多取舍,但是常常使用的重要参考指标为:Chisqare/df,RMSEA ,CFI

fitMeasures(fit,c('chisq','df','pvalue','gfi','cfi','rmr','srmr','rmsea'))
图片

最后作图:

semPaths(fit, #上面跑出来的数据模型
         what = 'std'#图中边的格式,#'path','std','est ','cons '
         layout = 'tree'#图的格式, tree  circle  spring  tree2  circle2
         fade=T, #褪色,按照相关度褪色
         residuals = T, #残差/方差要不要体现在图中,可T和F
         nCharNodes = 0
)
图片
  • 图显示mind强烈依赖于speed并且弱依赖于textual。 speed强烈依赖于X8并且弱依赖于X7。

  • 线之间的值是路径系数。 路径系数是标准化的回归系数,类似于多元回归的β系数。 这些路径系数应具有统计显着性

实例2

本例说明一下SEM中的各种符号的意思

  • ~:表示变量的回归关系

  • ~=:用于表示测量模型,此符号的左侧为潜在变量,右侧为被测变量(即测量新的变量)

  • ~~:表示方差或者协方差(也就是残余相关),当与自己用是为方差(y~~y),

加载数据

library(tidyverse)
data(airquality)
airquality <- airquality %>% na.omit()
head(airquality, 3)
图片

本例使用测量模型,假设ET蒸散发与太阳辐射Solar.R,风速Wind和温度Temp有关,并且具有月份分异

model <- ' # 测量模型
           ET  =~ Solar.R + Wind + Temp + Month
           Prcp =~ Wind + Temp + Month

           #路径模型
           ET ~ Prcp + Wind

           # 残余相关
           Solar.R ~~ Temp
           Solar.R ~~ Month
           Wind ~~ Month
           Temp ~~ Month
'


fit <-sem(model, data = airquality)

summary(fit, standardized = TRUE) 

结果如下

lavaan.version : '0.6.15' optim.method : 'nlminb' optim.converged : TRUE

estimator : 'ML' $estimator.args :

npar : 17 nrow.ceq.jac : 0 nrow.con.jac : 0 $con.jac.rank : 0

ngroups : 1 $nobs : 111

test : 'standard' $stat :$stat.group :refdistr : 'unknown' $pvalue :

$pe : A data.frame: 19 × 11

lhsoprhsexoestsezpvaluestd.lvstd.allstd.nox
ET=~Solar.R01.00000000NANA1.528673e+010.1684659890.168465989
ET=~Wind00.1732629NANANA2.648625e+000.7478502270.747850227
ET=~Temp00.4679231NANANA7.153016e+000.7539852470.753985247
ET=~Month00.0266676NANANA4.076606e-010.2779285970.277928597
Prcp=~Wind01.00000000NANA1.477120e+000.4170709500.417070950
Prcp=~Temp0-10.1965889NANANA-1.506158e+01-1.587611736-1.587611736
Prcp=~Month00.2646602NANANA3.909348e-010.2665255150.266525515
ET~Prcp0-6.7685765NANANA-6.540310e-01-0.654031010-0.654031010
ET~Wind0-3.3932962NANANA-2.219765e-01-0.786163420-0.786163420
Solar.R~~Temp01.4467252NANANA1.446725e+000.0009024250.000902425
Solar.R~~Month0-11.9111148NANANA-1.191111e+01-0.092888874-0.092888874
Wind~~Month00.2261809NANANA2.261809e-010.0280921640.028092164
Temp~~Month06.7520476NANANA6.752048e+000.2627682710.262768271
Solar.R~~Solar.R08000.2045245NANANA8.000205e+030.9716192110.971619211
Wind~~Wind031.5402552NANANA3.154026e+012.5145114352.514511435
Temp~~Temp0-321.2542019NANANA-3.212542e+02-3.569407446-3.569407446
Month~~Month02.0553053NANANA2.055305e+000.9553122190.955312219
ET~~ET00.7635846NANANA3.267591e-030.0032675910.003267591
Prcp~~Prcp02.1818831NANANA1.000000e+001.0000000001.000000000

可视化结果:

semPaths(fit, #上面跑出来的数据模型
         what = 'std'#图中边的格式,#'path','std','est ','cons '
         layout = 'tree'#图的格式, tree  circle  spring  tree2  circle2
         fade = F, #褪色,按照相关度褪色
         residuals = F ,#残差/方差要不要体现在图中,可T和F
         nCharNodes = 0
         
)
图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多