Chapter 4 路径分析

路径分析指仅包含外显变量的多重因变量的复杂回归模型,不涉及潜在变量的定义。

当模型结构过于复杂时,容易出现自由度\(df \leq 0\)的情况,此时拟合指数是无法计算的;而当模型为非饱和模型时,存在嵌套结构的模型可以通过卡方差异进行检验。

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

4.1 模型界定

4.1是路径模型的界定。

路径分析的模型界定

Figure 4.1: 路径分析的模型界定

该模型都是外生变量,共有9个,因此测量数据数为\(9 \times 10 / 2=45\)个。

待估参数为\(15+7+9+2=33\)个,分别为:

  • 外源观测变量\(X_1\)\(X_6\)之间的\(15\)个相关系数。
  • 外源观测变量\(X_1\)\(X_7\)\(7\)个方差。
  • \(9\)个路径系数。
  • \(2\)个解释残差。

4.2 参数估计

4.2.1 变量描述

我们首先看一下变量的分布情况,见表4.1

dat <- read_csv("data/ch07.csv")
datasummary_skim(dat,
                 title = "组织行为研究调查数据的变量描述统计",
                 fmt = fmt_sprintf("%.2f"))
Table 4.1: 组织行为研究调查数据的变量描述统计
Unique (#) Missing (%) Mean SD Min Median Max
OUTCOME 9 0 4.22 0.63 2.00 4.33 5.00
COMMIT 22 0 9.49 1.59 4.00 9.67 12.00
VALUE 15 0 4.27 0.81 1.00 4.33 6.00
JOBSTYLE 15 0 4.18 0.95 1.00 4.33 6.00
TEAMWORK 14 0 4.33 0.83 1.33 4.33 6.00
LEADERSH 12 0 4.87 0.77 2.00 5.00 6.00
LEARNING 14 0 4.71 0.88 1.67 5.00 6.00
ENVIRONM 14 0 4.43 0.88 1.00 4.33 6.00
TENURE 106 0 9.12 9.23 0.08 4.00 32.00

4.2.2 参数估计设定

  • 首先,我们设定structure model部分。其中,组织承诺COMMIT\(7\)个变量解释;员工绩效被\(2\)个变量解释。
  • 如果模型设定就只有structure model部分,那么lavaan会自动为所有外生变量添加相关系数估计,那这样的话和图4.1相比,我们就多了年资TENURE和其他\(6\)个外生变量的相关系数需要估计。因此,这里增加了correlation部分,需要手动设置哪些相关系数需要估计,以及哪些相关系数需要为0。
  • 最后,我们可以定义感兴趣的间接效应或总体效应进行检验。
mod1 <-'
#part1:set the structure model
  COMMIT~ a1*VALUE+a2*JOBSTYLE+a3*TEAMWORK+a4*LEADERSH
          +a5*LEARNING+a6*ENVIRONM+a7*TENURE
  OUTCOME~c*TENURE+b*COMMIT
#part2:set the correlation
  VALUE    ~~ JOBSTYLE 
  VALUE    ~~ TEAMWORK 
  VALUE    ~~ LEADERSH 
  VALUE    ~~ LEARNING
  VALUE    ~~ ENVIRONM 
  JOBSTYLE ~~ TEAMWORK 
  JOBSTYLE ~~ LEADERSH 
  JOBSTYLE ~~ LEARNING 
  JOBSTYLE ~~ ENVIRONM 
  TEAMWORK ~~ LEADERSH 
  TEAMWORK ~~ LEARNING 
  TEAMWORK ~~ ENVIRONM
  LEADERSH ~~ LEARNING 
  LEADERSH ~~ ENVIRONM 
  LEARNING ~~ ENVIRONM 
  # fix
  TENURE   ~~ 0*VALUE 
  TENURE   ~~ 0*JOBSTYLE 
  TENURE   ~~ 0*TEAMWORK 
  TENURE   ~~ 0*LEADERSH 
  TENURE   ~~ 0*LEARNING
  TENURE   ~~ 0*ENVIRONM
#part3:define indirect effect (a*b)
  a1b := a1*b
  a2b := a2*b
  a3b := a3*b
  a4b := a4*b
  a5b := a5*b
  a6b := a6*b
  a7b := a7*b
#part4:define total effect of COMMIT
  total := c + a7b'

4.2.3 结果展示

mod1_fit <- sem(mod1, data = dat)
mod1_res <- summary(mod1_fit, standard = T)
print(mod1_res)
## lavaan 0.6.15 ended normally after 43 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        33
## 
##   Number of observations                           281
## 
## Model Test User Model:
##                                                       
##   Test statistic                                27.106
##   Degrees of freedom                                12
##   P-value (Chi-square)                           0.007
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   COMMIT ~                                                              
##     VALUE     (a1)    0.428    0.116    3.687    0.000    0.428    0.218
##     JOBSTYLE  (a2)    0.242    0.100    2.409    0.016    0.242    0.146
##     TEAMWORK  (a3)    0.106    0.118    0.895    0.371    0.106    0.056
##     LEADERSH  (a4)    0.108    0.119    0.912    0.362    0.108    0.053
##     LEARNING  (a5)    0.363    0.115    3.159    0.002    0.363    0.203
##     ENVIRONM  (a6)    0.276    0.106    2.611    0.009    0.276    0.153
##     TENURE    (a7)    0.022    0.008    2.816    0.005    0.022    0.129
##   OUTCOME ~                                                             
##     TENURE     (c)    0.011    0.004    2.964    0.003    0.011    0.157
##     COMMIT     (b)    0.172    0.021    8.135    0.000    0.172    0.430
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   VALUE ~~                                                              
##     JOBSTYLE          0.367    0.051    7.244    0.000    0.367    0.479
##     TEAMWORK          0.271    0.043    6.288    0.000    0.271    0.405
##     LEADERSH          0.206    0.039    5.274    0.000    0.206    0.331
##     LEARNING          0.344    0.047    7.328    0.000    0.344    0.486
##     ENVIRONM          0.369    0.047    7.782    0.000    0.369    0.524
##   JOBSTYLE ~~                                                           
##     TEAMWORK          0.420    0.053    7.853    0.000    0.420    0.530
##     LEADERSH          0.328    0.048    6.829    0.000    0.328    0.446
##     LEARNING          0.461    0.057    8.078    0.000    0.461    0.550
##     ENVIRONM          0.269    0.052    5.149    0.000    0.269    0.323
##   TEAMWORK ~~                                                           
##     LEADERSH          0.318    0.043    7.443    0.000    0.318    0.496
##     LEARNING          0.390    0.049    7.884    0.000    0.390    0.533
##     ENVIRONM          0.368    0.049    7.571    0.000    0.368    0.506
##   LEADERSH ~~                                                           
##     LEARNING          0.386    0.047    8.259    0.000    0.386    0.566
##     ENVIRONM          0.249    0.043    5.800    0.000    0.249    0.369
##   LEARNING ~~                                                           
##     ENVIRONM          0.332    0.050    6.626    0.000    0.332    0.430
##   VALUE ~~                                                              
##     TENURE            0.000                               0.000    0.000
##   JOBSTYLE ~~                                                           
##     TENURE            0.000                               0.000    0.000
##   TEAMWORK ~~                                                           
##     TENURE            0.000                               0.000    0.000
##   LEADERSH ~~                                                           
##     TENURE            0.000                               0.000    0.000
##   LEARNING ~~                                                           
##     TENURE            0.000                               0.000    0.000
##   ENVIRONM ~~                                                           
##     TENURE            0.000                               0.000    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .COMMIT            1.456    0.123   11.853    0.000    1.456    0.586
##    .OUTCOME           0.305    0.026   11.853    0.000    0.305    0.773
##     VALUE             0.647    0.055   11.853    0.000    0.647    1.000
##     JOBSTYLE          0.907    0.077   11.853    0.000    0.907    1.000
##     TEAMWORK          0.691    0.058   11.853    0.000    0.691    1.000
##     LEADERSH          0.598    0.050   11.853    0.000    0.598    1.000
##     LEARNING          0.776    0.065   11.853    0.000    0.776    1.000
##     ENVIRONM          0.765    0.065   11.853    0.000    0.765    1.000
##     TENURE           84.834    7.157   11.853    0.000   84.834    1.000
## 
## Defined Parameters:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     a1b               0.073    0.022    3.358    0.001    0.073    0.094
##     a2b               0.041    0.018    2.310    0.021    0.041    0.063
##     a3b               0.018    0.020    0.889    0.374    0.018    0.024
##     a4b               0.019    0.021    0.906    0.365    0.019    0.023
##     a5b               0.062    0.021    2.945    0.003    0.062    0.087
##     a6b               0.047    0.019    2.486    0.013    0.047    0.066
##     a7b               0.004    0.001    2.661    0.008    0.004    0.055
##     total             0.014    0.004    3.787    0.000    0.014    0.212

4.2是基于完全标准化解Std.all的路径图:

semPaths(mod1_fit, 
         what = "std", 
         fade = F, # 关闭路径颜色渐变
         rotation = 2,
         edge.color = "darkgrey",
         esize = 3,
         asize = 3,
         curve = 2,
         edge.label.cex = 1.1)
路径分析的结果

Figure 4.2: 路径分析的结果

4.3 路径分析与简单线性回归的关系

路径分析的路径系数主要有非标准化Estimate和标准化Std.all两种形式。事实上,基于简单的线性回归,也可以输出这两种形式的结果。

标准化形式Std.all如表4.2所示:

formula1 <- 'COMMIT~VALUE+JOBSTYLE+TEAMWORK+LEADERSH+LEARNING+ENVIRONM+TENURE'
formula2 <- 'OUTCOME~TENURE+COMMIT'


models <- list(
  "COMMIT(est)" = lm(formula1, data = dat),
  "COMMIT(std)"      = lm(str_c(formula1, "-1"), data = dat |> mutate_all(.funs = scale)),
  "OUTCOME(est)" = lm(formula2, data = dat),
  "OUTCOME(std)"      = lm(str_c(formula2, "-1"), data = dat |> mutate_all(.funs = scale))
)

modelsummary(models,  
              estimate = "{estimate}{stars}",
              statistic = c("({std.error})"),
              notes = list('+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001'), # footer
              gof_map = c("nobs"),
              title = "基于线性回归的路径系数估计",
              coef_omit = "Intercept") # 不展示截距项
Table 4.2: 基于线性回归的路径系数估计
 COMMIT(est)  COMMIT(std) OUTCOME(est) OUTCOME(std)
VALUE 0.428*** 0.216***
(0.118) (0.060)
JOBSTYLE 0.242* 0.145*
(0.102) (0.061)
TEAMWORK 0.106 0.055
(0.120) (0.063)
LEADERSH 0.108 0.053
(0.120) (0.058)
LEARNING 0.363** 0.201**
(0.117) (0.065)
ENVIRONM 0.276* 0.152*
(0.108) (0.059)
TENURE 0.022** 0.128** 0.011** 0.156**
(0.008) (0.046) (0.004) (0.053)
COMMIT 0.172*** 0.431***
(0.021) (0.053)
Num.Obs. 281 281 281 281
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

4.4 直接与间接效应

SEM可以非常直接对各种直接、间接乃至总体效用量的显著性水平进行检验,因而有越来越多的研究舍弃传统的回归分析,改以SEM取向进行路径分析。

4.3给出了七个外生变量对OUTCOME的效应量,其中,第一行到第七行是分别通过COMMIT产生的间接效应,第八行是TENURE的总效应量。

mod1_res$pe |>
  filter(op == ":=") |>
  select(lhs, op, rhs, est, se, z, std.all, pvalue) |>
  mutate(across(where(is.numeric), ~round(., 3))) |>
  knitr::kable(caption = "路径分析的部分复杂效应量")
Table 4.3: 路径分析的部分复杂效应量
lhs op rhs est se z std.all pvalue
a1b := a1*b 0.073 0.022 3.358 0.094 0.001
a2b := a2*b 0.041 0.018 2.310 0.063 0.021
a3b := a3*b 0.018 0.020 0.889 0.024 0.374
a4b := a4*b 0.019 0.021 0.906 0.023 0.365
a5b := a5*b 0.062 0.021 2.945 0.087 0.003
a6b := a6*b 0.047 0.019 2.486 0.066 0.013
a7b := a7*b 0.004 0.001 2.661 0.055 0.008
total := c+a7b 0.014 0.004 3.787 0.212 0.000

4.5 模型修饰

原书216页图7.10计算的模型修饰指数(MI),如表4.4所示。

modificationIndices(mod1_fit) |>
  select(1:5) |>
  arrange(desc(mi)) |>
  head(3) |>
  knitr::kable(caption = "排名前三的模型修饰指数")
Table 4.4: 排名前三的模型修饰指数
lhs op rhs mi epc
COMMIT ~ OUTCOME 15.228311 -0.7996494
OUTCOME ~ LEARNING 13.062723 0.1582997
OUTCOME ~ LEADERSH 9.169932 0.1404273

最后选择的模型修饰是增加一条由“学习成长”到“员工绩效”的直接效应,估计后的路径图如图4.3所示。

mod2 <- '#part1:set the structure model
  COMMIT~ a1*VALUE+a2*JOBSTYLE+a3*TEAMWORK+a4*LEADERSH
          +a5*LEARNING+a6*ENVIRONM+a7*TENURE
  OUTCOME~c*TENURE+b*COMMIT + d*LEARNING
#part2:set the correlation
  VALUE    ~~ JOBSTYLE 
  VALUE    ~~ TEAMWORK 
  VALUE    ~~ LEADERSH 
  VALUE    ~~ LEARNING
  VALUE    ~~ ENVIRONM 
  JOBSTYLE ~~ TEAMWORK 
  JOBSTYLE ~~ LEADERSH 
  JOBSTYLE ~~ LEARNING 
  JOBSTYLE ~~ ENVIRONM 
  TEAMWORK ~~ LEADERSH 
  TEAMWORK ~~ LEARNING 
  TEAMWORK ~~ ENVIRONM
  LEADERSH ~~ LEARNING 
  LEADERSH ~~ ENVIRONM 
  LEARNING ~~ ENVIRONM 
  # fix
  TENURE   ~~ 0*VALUE 
  TENURE   ~~ 0*JOBSTYLE 
  TENURE   ~~ 0*TEAMWORK 
  TENURE   ~~ 0*LEADERSH 
  TENURE   ~~ 0*LEARNING
  TENURE   ~~ 0*ENVIRONM
#part3:define indirect effect (a*b)
  a1b := a1*b
  a2b := a2*b
  a3b := a3*b
  a4b := a4*b
  a5b := a5*b
  a6b := a6*b
  a7b := a7*b
#part4:define total effect of COMMIT
  total := c + a7b'

mod2_fit <- sem(mod2, data = dat)
semPaths(mod2_fit, 
         what = "std", 
         fade = F, # 关闭路径颜色渐变
         rotation = 2,
         edge.color = "darkgrey",
         esize = 3,
         asize = 3,
         curve = 2,
         edge.label.cex = 1.1)
修饰模型的路径分析结果

Figure 4.3: 修饰模型的路径分析结果

由于模型1嵌套于模型2之中,可以使用嵌套模型的卡方差异检验,检查修饰带来的拟合程度增幅是否具有显著意义:

anova(mod1_fit, mod2_fit)
## 
## Chi-Squared Difference Test
## 
##          Df    AIC    BIC  Chisq Chisq diff   RMSEA Df diff Pr(>Chisq)    
## mod2_fit 11 7098.7 7222.4 13.714                                          
## mod1_fit 12 7110.1 7230.1 27.106     13.391 0.20999       1  0.0002528 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1