Amos链式多重中介分析

父母温暖—>学习动机中的多重中介效应

Posted by Jiawen Wu on May 8, 2019

前言

随着统计方法的发展以及对心理学/教育学领域认识的发展,大家做的模型、使用的方法越来越不友好了!一些面板操作可视化比较好的统计软件也因为更新跟不上时代的步伐(太贵了买不起)而越来越不方便。惜金如命的我,要进入R/Python的时代了。本篇是为在使用Amos的朋友介绍一下在Amos中使用user-defined estimand做多重中介分析的方法。但我的心已经朝着开源的(免费的)地方去了(⁎⁍̴̛ᴗ⁍̴̛⁎)。


中介效应

相信被统计折磨了多年的大家对中介效应并不陌生。如下图所示,如果自变量X通过某一变量M对因变量Y产生一定影响,则称M为X和Y的中介变量或M在X和Y之间起中介作用。

如果所有的模型都像这样简单明了就好了!!而事实是,我们的模型常常是⬇️这样的……

图源来自文章 College students’ attitudes toward chemistry, conceptual knowledge and achievement: structural equation model analysis

一般来说,中介模型可以按下图所示进行分类:

简单而言,简单中介就是上面XMY的样子,并行中介就是多个M并联,链式中介就是多个M串联的模型。

中介效应的检验方法

很多研究的检验还是将多重中介拆分成简单中介进行Sobel Test检验。但是Sobel Test的前提假设是检验参数符合正态分布,中介效应中路径系数ab涉及参数的乘积,因而通常都不满足正态假设。其次Sobel Test要求大样本,小样本的检验力不高。

使用SEM模型能够直接进行多重中介分析,同时处理显变量和潜变量。基于SEM模型的Bootstrap方法,不需要正态假设,也不需要大样本,进行中介效应区间估计时更无需标准误的计算,是当前比较好的方法。

许多文献指出必须使用Mplus软件,Process或者Lisrel才能设置幽灵变量进行基于SEM的Bootstrap多重中介效应检验。其实不然,使用Amos一样也可以自定义参数来做分析。只不过新版本的user-defined estimand脚本变成了VB/C#代码的格式,显得不那么用户友好了。实际上代码也非常简单,下面就用一个例子来介绍一下如何在Amos中进行多重中介效应分析。

父母温暖—>学习动机中的中介效应

当然了,首先是理论模型的构建。

Amos中搭建模型

然后将理论模型在Amos中搭建出来。

检验模型参数,对比标准,发现模型初始拟合效果良好,但是对于结构方程模型的评价不仅限于其拟合度达到标准,还需要考虑模型的适用性与简洁性。因此还需要对模型内在结构的拟合度指标进行检验。

结构方程模型路径的载荷系数估计值达到显著水平是检验模型内在结构的一项重要指标。如果路径系数的标准误过大,则假设的理论模型路径可能不成立。对初始模型所有路径的载荷系数进行分析,在Amos Output中可以看到“父母温暖 —> 对失败的反应”路径不显著(p = .159)。

那么就要对模型进行修改啦,修改完以后上述步骤再做一遍看看效果。最终我确定下来的要进入中介分析步骤的模型如下图所示。

User-defined Estimand

接下来就是我们自定义需要观测的参数了!首先给路径取名字方便调用。

然后在Amos的左下角找到“Not estimating any user-defined estimand.“点击,然后选择”creating a new estimand“

这时候就会弹出一个VB/C#的代码框框,并且Amos已经为我们写好了基本的框架,只要简单修改就可以实现我们希望的功能了。

下面是多重中介效应分析的VB代码示例

v.ParameterValue函数可以帮我们调取路径系数,“Advance”部分的+号打开可以对对象进行命名。方便我们查看结果。

#Region "Header"
Imports System
Imports Microsoft.VisualBasic
Imports AmosEngineLib
Imports AmosEngineLib.AmosEngine
Imports AmosEngineLib.AmosEngine.TMatrixID
Imports MiscAmosTypes
Imports MiscAmosTypes.cDatabaseFormat
#End Region
Public Class CUserValue : Implements IUserValue

	Function Value( groupNumber As Integer, bootstrapSampleNumber As Integer, v As CValue) As Object Implements IUserValue.Value
		' Your code goes here.
		Dim x(9) As Double
		x(0) = v.ParameterValue("a1") * v.ParameterValue("b1")
		x(1) = v.ParameterValue("a2") * v.ParameterValue("b2")
		x(2) = v.ParameterValue("d2") * v.ParameterValue("b3")
		x(3) = v.ParameterValue("a1") * v.ParameterValue("d1") * v.ParameterValue("b2")
		x(4) = v.ParameterValue("a2") * v.ParameterValue("d2") * v.ParameterValue("b3")
		x(5) = v.ParameterValue("a1") * v.ParameterValue("d1") * v.ParameterValue("d2") * v.ParameterValue("b3")
		x(6) = x(0) - x(1)
		x(7) = x(5) + x(3) - x(4) - x(1)
		x(8) = v.GetStandardizedIndirectEffectsElement("P6_Aca","P12_Warmth") / v.GetStandardizedDirectEffectsElement("P6_Aca","P12_Warmth")
		x(9) = v.GetStandardizedIndirectEffectsElement("P6_Aca","P12_Warmth") / v.GetStandardizedTotalEffectsElement("P6_Aca","P12_Warmth")
		Return x
	End Function

#Region "Advanced"
	Function Label( groupNumber As Integer) As Object Implements IUserValue.Label
		' You can replace the following line.
		Dim labels(9) As String
		labels(0) = "sind1a1b1"
		labels(1) = "sind2a2b2"
		labels(2) = "sind3d2b3"
		labels(3) = "lind1a1d1b2"
		labels(4) = "lind2a2d2b3"
		labels(5) = "lind3a1d1d2b3"
		labels(6) = "compare1"
		labels(7) = "compare2"
		labels(8) = "Ind/Dir"
		labels(9) = "Ind/Tot"
		Return labels
	End Function

	Public Sub Initialize() Implements IUserValue.Initialize
	End Sub

	Sub CleanUp() Implements IUserValue.CleanUp
	End Sub
#End Region
End Class

代码写好之后,需要按”Compile”按钮进行编译,如果没有出现错误“Description”框中会保持什么都没有的状态,这时候就可以点关闭对话框的“Close”按钮了(Amos软件中没有保存这种操作,所有的关闭都是保存)。

Bootstrap设置

Amos中的User-defined Estimand是基于Bootstrap设置的。如果没有设置Bootstrap,那么运行的时候就不会用到User-defined Estimand的文件。

设置好后点击运行,我们就可以看到结果啦!

在Estimates -> Scalars -> [User-defined estimand的自定义文件名]
跳到下面Estimates/Bootstap对话框中,就可以看到我们要的估计值、标准误、置信区间上下限估计等信息啦。

我的compare1是“a1b1 - a2b2”,即比较“内化问题”和“亲社会行为”的中介效应,结果显示的是这两种效应的大小在这个模型里没有显著差异。


We must know. We will know.

—— Hilbert