在 SEM 模型中释放第一个指标后无法估计标准误差 - 为什么会这样?

机器算法验证 结构方程建模
2022-03-24 04:19:24

我是 SEM + 在这个论坛上发帖的新手;如果我有任何不清楚的地方,请告诉我,我会尽力澄清。

背景

我正在做一项 SEM 任务来估计模型的拟合度,将 6 个指标加载到一个潜在变量上。我正在使用以下软件包进行分配:

require(lavaan)

require(semPlot)

我的数据集被加载到一个名为my.df

我指定的模型如下 - 该模型自动将第一个因子加载固定GeneralMotivationx11.0 的值:

my.model1 <- 'GeneralMotivation =~ x1 + x2 + x3 + x4 + x5 + x6'

我知道没有必要这样做,但为了更好地理解 SEM 的工作原理,我还指定了以下模型,释放了第一个指标。

problematicmy.model1 <- 'GeneralMotivation =~ NA*x1 + x2 + x3 + x4 + x5 + x6'

问题

然后我sem在这两个模型上运行,如下图:

my.fit1 <- sem(my.model1, data=my.df)
problematicmy.fit1 <- sem(problematicmy.model1, data=my.df)

lavaan当我使用in上的默认参数指定模型时,模型my.model1的第一个指标固定为 1.0,没有任何问题。问题出现了problematicmy.model1,我看到以下错误:

Warning message: 
In lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats,  :
lavaan WARNING: could not compute standard errors!
lavaan NOTE: this may be a symptom that the model is not identified.

我还附上了违规模型的输出:

lavaan (0.5-17) converged normally after  14 iterations

  Number of observations                           400

  Estimator                                         ML
  Minimum Function Test Statistic              112.214
  Degrees of freedom                                 8
  P-value (Chi-square)                           0.000

Model test baseline model:

  Minimum Function Test Statistic              360.443
  Degrees of freedom                                15
  P-value                                        0.000

User model versus baseline model:

  Comparative Fit Index (CFI)                    0.698
  Tucker-Lewis Index (TLI)                       0.434

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -3181.787
  Loglikelihood unrestricted model (H1)      -3125.680

  Number of free parameters                         13
  Akaike (AIC)                                6389.574
  Bayesian (BIC)                              6441.463
  Sample-size adjusted Bayesian (BIC)         6400.213

Root Mean Square Error of Approximation:

  RMSEA                                          0.180
  90 Percent Confidence Interval          0.152  0.211
  P-value RMSEA <= 0.05                          0.000

Standardized Root Mean Square Residual:

  SRMR                                           0.111

Parameter estimates:

  Information                                 Expected
  Standard Errors                             Standard

                   Estimate  Std.err  Z-value  P(>|z|)   Std.lv  Std.all
Latent variables:
  GeneralMotivation =~
    x1                0.826                               0.765    0.672
    x2                0.571                               0.528    0.534
    x3                0.829                               0.767    0.694
    x4                0.191                               0.176    0.215
    x5                0.301                               0.278    0.308
    x6                0.295                               0.273    0.322

Variances:
    x1                0.709                               0.709    0.548
    x2                0.701                               0.701    0.715
    x3                0.632                               0.632    0.518
    x4                0.640                               0.640    0.954
    x5                0.740                               0.740    0.905
    x6                0.643                               0.643    0.896
    GeneralMotvtn     0.856                               1.000    1.000

我还附上了下面的图形模型problematic.myfit1

违规模型

为理解错误而采取的步骤

我首先想到“好吧,也许模型识别不足”,然后计算了我拥有的信息+要估计的参数数量。

如果我错了,请纠正我:应该有 21 条信息(6 个变量,因此 [(6)(7)]/2 = 21)。

但是,由于 p <.05 对所有事物统计的热爱,我无法理解如果我只是释放第一个指标,为什么模型识别不足x1据我了解,我只估计了总共 13 个参数(观察变量的 6 个残差x1x66 个因子载荷,以及潜在变量的方差GeneralMotivation)。在这种情况下,我的模型不应该被过度识别吗?

我的猜测是

  1. 尽管图形模型没有说明这一点,但我实际上是在估计指标残差(即 等)之间的协x1 ~~ x2方差x1 ~~ x6如果x1固定为 1.0,我实际上是在尝试估计 21 个参数(从 到 的 5 个残差,从x2x6的 10 个残差协方差,从x2x6的 5 个残差方差,从x2-x6的 5 个因子载荷GeneralMotivation以及 的一个方差),使模型只是确定(df = 0)。通过释放,我必须估计另外 7 个参数x2x6GeneralMotivationx1x1x1 ~~ x2x1 ~~ x6GeneralMotivationx1
  2. 问题不在于识别不足,而在于完全不同
  3. SEM 和 RStudio 讨厌我 - 不太可能,但我不排除它。

结束

谁能帮我理解为什么lavaan会弹出错误?如果您需要我提供更多信息,请告诉我。

谢谢!

2个回答

正如 Maarten 指出的那样,您的问题是您没有设置第二个模型的比例。诚然,您观察到的方差/协方差比识别模型所需的要多,但您仍然需要提供一个参考点,从中可以计算其他模型参数(Brown,2015 年)。

您可以使用以下三种方法之一设置比例:

  1. 标记变量:每个潜在变量的一个因子加载固定为 1
  2. 固定因子:每个潜在变量的方差固定为 1
  3. 效果编码:每个潜在变量的因子载荷被限制为平均 1

每种方法的代码(使用lavaan包的HolzingerSwineford1939数据集)如下所示。我创建的潜在变量是荒谬的/拟合不佳的,但它与您的模型具有相同数量的指标,因此该示例有望更适合您的情况。

library(lavaan)

#marker-variable; first factor loading fixed to 1 by default
marker.variable<-'f1=~ x1+x2+x3+x4+x5+x6'
summary(output.marker<-cfa(marker.variable, data=HolzingerSwineford1939), fit.measures=TRUE)

#fixed-factor method; manually free first factor loading/fix latent variance to 1
fixed.factor<-'f1=~ NA*x1+x2+x3+x4+x5+x6
          f1~~1*f1'
summary(output.fixed<-cfa(fixed.factor, data=HolzingerSwineford1939), fit.measures=TRUE)

#effects coding; manually free first loading/constrain loadings to average 1
effects.coding<-'f1=~ NA*x1+a*x1+b*x2+c*x3+d*x4+e*x5+f*x6
          a+b+c+d+e+f==6'
summary(output.effects<-cfa(effects.coding, data=HolzingerSwineford1939), fit.measures=TRUE)

请注意,无论您使用哪种比例设置方法,模型拟合都是相同的;所有三个模型的拟合是χ2(df=9)=103.23, p<.001

您应该使用哪种方法在很大程度上取决于您的数据的性质和您的研究目标。标记变量法是一种高度任意的尺度设置方法。正如 Maarten 所说,您的潜在变量将采用其各自标记变量的单位,因此这种方法仅在您的标记变量特别有意义的范围内提供信息,或者可能代表您的潜在构造的一些“黄金标准”指标。

或者,固定因子方法很容易指定,并且基本上标准化了您的潜在变量(如果您正在检查平均结构,您也可以将潜在均值固定为零)。由于我们一直在对变量进行标准化,因此这是一种高度直观且广泛接受的潜在变量缩放设置形式,尽管由此产生的缩放本质上没有意义。即便如此,它可能是“默认”的最佳方法,除非您有强烈的要求使用其他方法之一。

效果编码是规模设置方法的一个相对较新的方法(参见 Little、Slegers 和 Card,2006 年的详细讨论)。它的最大优势是在您对潜在均值进行建模时。这样做时,您还将项目截距限制为平均 0。这些约束的效果是您的潜在变量将与原始项目的比例完全相同。例如,如果您的指标平均值为“5”,那么您的潜在均值也将为“5”,尽管您的潜在方差会小于您观察到的方差。因为对载荷和截距的约束可能对计算要求更高,尤其是在更复杂的模型中,并且偶尔会导致收敛错误,除非您计划检查潜在均值,否则效果编码可能不值得。

参考

布朗,TA(2015)。应用研究的验证性因素分析(第 2 版)纽约,纽约:吉尔福德出版社。

Little, TD, Slegers, DW, & Card, NA (2006)。在 SEM 和 MACS 模型中识别和缩放潜在变量的非任意方法。结构方程建模13,59-72

想想 GnM 的规模。它是潜在的,因此它没有像米(英寸)、欧元(日元)等那样的自然比例。相反,我们需要通过告诉它何时为 0 以及增加的单位是什么来给它一个比例。在您的原始模型中,当所有指标都为 0 时,您将 GnM 设置为 0,并且通过将 x1 的加载设置为 1,您从 x1 借用了单位。所以 GnM 增加一个单位相当于 x1 增加一个单位。当你设置 x1 的加载免费时,GnM 的单位是什么?我们不知道,所以它是未知的。解决这个问题的常用方法是将 GnM 的方差设置为 1。