如何在 lavaan 中执行最简单的审核并衡量其对其他变量的影响?

How to perform simplest Moderation in lavaan and measuring its effect to other vars?

如何在 lavaan 中执行最简单的审核并衡量其对其他变量的影响?

您在 r 和 lavaan 中有一个模型 - 如何添加调节项?:

  1. 是否通过添加 ~b + c 使“c”成为主持人术语?
  2. 交互项和适度有什么区别?
  3. lavaan project 没有提供这样的例子,许多人提出类似的问题但没有正确明确的答案。

我在网上找不到明确的答案,就简单的单词和例子而言。

model_sem <- 
  '
a=~ x1 + x2
b=~ z1 + z2
a ~ b
'

Moderation = 测试交互项是否重要(在 Lavaan 中)。除了一些例外,这个简单的事情并没有那么清楚地写到网络上。 see here

当你有两个观察变量(那些包含数据的变量)时,事情就很简单了

假设你有 X 回归到 (->) Y (X~Y) 和 M = 调节变量

注意:带有交互项的简单 lm 语法也是有效的。 例如

summary( lm( Y ~ X + X*Y ) )

在拉万 see here and here:

library(psych)
library(dplyr)
library(lavaan)
library(semTools)

# Note that Centering variables is essential 

# Creating interaction term prior of sem running
myData <- myData %>% mutate(Χ_x_Μ = myData$X * myData$M)

moderation_model <- '
  # Hayes Process model 1
  # regressions
  Y ~ b1*X
  Y ~ b2*M
  Y ~ b3*Χ_x_Μ
  
  # define mean parameter label for centered math for use in simple slopes
  M ~ M.mean*1
  
  # define variance parameter label for centered math for use in simple slopes
  M ~~ M.var*M
  
  # simple slopes for condition effect
  SD.below := b1 + b3*(M.mean - sqrt(M.var))
  mean := b1 + b3*(M.mean)
  SD.above := b1 + b3*(M.mean + sqrt(M.var))
  '

model <- moderation_model 
sem_fit <- lavaan::sem( model, std.lv = TRUE, data = myData, fixed.x = FALSE   )
summary( sem_fit, standardized = TRUE,  rsquare = TRUE )
standardizedSolution( sem_fit, type = "std.all" )

但是,当您愿意时,事情可能会变得很奇怪 交互一阶甚至二阶潜在变量 (ps。在某些情况下是因素)。 因为,Lavaan 不支持这个,很简单。

Steps:

# Create observed Factors by using their items

    df$x1_o  = (df$f11 + df$f12 + df$f13 ) /3
    df$x2_o  = (df$f21 + df$f22 + df$f33 ) /3
    
    df$M_o   = (df$m1 + df$m2 + df$m3 ) /3
    df$Y_o   = (df$y1 + df$y2 ) /3
    df$X_o   = (df$x1_o + df$x2_o ) /3


# Mean Center all your SEM variables

    cn                        = colnames( df )
    df_center                 = df - data.frame( matrix( rep( colMeans( df ), nrow( df ) ), ncol = ncol( df ), byrow = T))  # mean centering
    colnames( df_center )     = cn      

# Make to interact each item of Moderator (M) with the X Variable to test its effect on the Y variable

    prod = df_center$x1_o   * df_center$m1;   df_center$prod11 = prod - mean(prod)
    prod = df_center$x1_o   * df_center$m2;   df_center$prod12 = prod - mean(prod)
    prod = df_center$x1_o   * df_center$m3;   df_center$prod13 = prod - mean(prod)
    prod = df_center$x2_o   * df_center$m1;   df_center$prod11 = prod - mean(prod)
    prod = df_center$x2_o   * df_center$m2;   df_center$prod12 = prod - mean(prod)
    prod = df_center$x2_o   * df_center$m3;   df_center$prod13 = prod - mean(prod)
    head(df_center, 2)

# Make your Lavaan moderated model 
# Note that in defining mean and variance of (M) Moderator, 
# we used the observed factored Moderator (M_o)
# and not the Latent (without values) construct (M).

# This happened cause Lavaan was saying that M.var has no free parameters. 
# So, I did that. If you think something else, please make a comment or a 
# post.  

    moderation_model  <- 
      '
    x1  =  f11 + f12 + 13 
    x2  =  f21 + f22 + f33 
    M   =   m1 + m2 + m3 
    Y   =   y1 + y2 
    X   =   x1 + x2
    
    INT   =~ prod11 + prod12 + prod13 + prod21 + prod22 + prod23 
    
    Y ~  b1 * X
    Y ~  b2 * M
    Y ~  b3 * INT
    
    
     # define mean parameter label for centered math for use in simple slopes
     M_o  ~ M_o.mean*1
      
     # define variance parameter label for centered math for use in simple slopes
     M_o  ~~ M_o.var*M_o 
      
     # simple slopes for condition effect
      SD.below := b1 + b3*(M_o.mean - sqrt(M_o.var))
      mean     := b1 + b3*(M_o.mean)
      SD.above := b1 + b3*(M_o.mean + sqrt(M_o.var))
      
    ' 

# ps. If Lavaan says that there is non-definite matrix cause is negative, 
# please, remove some items from the relevant variable from moderation model. 


# Check if lavaan sem can run it: 


    model <- moderation_model 
    sem_fit <- lavaan::sem( model, std.lv = TRUE, data = df_center, fixed.x = FALSE   )
    summary( sem_fit, standardized = TRUE,  rsquare = TRUE )
    standardizedSolution( sem_fit, type = "std.all" )