lavaan
提供了在组之间约束参数的机会。假设我的数据有两个组。假设以下模型:
library(RCurl)
library(lavaan)
x <- getURL("https://gist.githubusercontent.com/aronlindberg/dfa0115f1d80b84ebd48b3ed52f9c5ac/raw/3abf0f280a948d6273a61a75415796cc103f20e7/growth_data.csv")
growth_data <- read.csv(text = x)
model_regressions <- ' i =~ 1*t1 + 1*t2 + 1*t3 + 1*t4 + 1*t5 + 1*t6 + 1*t7 + 1*t8 + 1*t9 + 1*t10 + 1*t11 + 1*t12 + 1*t13+ 1*t14 + 1*t15 + 1*t16 + 1*t17 + 1*t18 + 1*t19 + 1*t20
s =~ 0*t1 + 1*t2 + 2*t3 + 3*t4 + 4*t5 + 5*t6 + 6*t7 + 7*t8 + 8*t9 + 9*t10 + 10*t11 + 11*t12 + 12*t13 + 13*t14 + 14*t15 + 15*t16 + 16*t17 + 17*t18 + 18*t19 + 19*t20
# fixing error-variances
t8 ~~ 0.01*t8
t17 ~~ 0.01*t17
t18 ~~ 0.01*t18
# regressions
s ~ h_index
i ~ h_index'
fit_UNconstrained <- growth(model_regressions, data=growth_data, group = "type")
然后,使用以下命令可以将截距限制在两组之间:
fit_constrained_intercepts <- growth(model_regressions, data=growth_data, group = "type", group.equal = c("intercepts"))
但是,当我将此模型与无约束模型进行比较时,自由度和Chi2的差为零(0)。这怎么可能?
此外,当我限制其他参数(例如方差)时,例如:
fit_constrained_variances <- growth(model_regressions, data=growth_data, group = "type", group.equal = c("lv.variances"))
...然后将约束模型与无约束模型进行比较,自由度的差为2,而不是我约束单个参数所期望的1:
fitMeasures(fit_UNconstrained, "df")
fitMeasures(fit_constrained_intercepts, "df")
fitMeasures(fit_constrained_variances, "df")
因此,我的问题是:约束各种参数(尤其是截距和方差)如何影响lavaan的自由度?
最佳答案
为什么限制截距不会改变自由度?
这是由于您正在模拟增长曲线而造成的:当您在growth()
中使用lavaan
函数时,所有截距将自动限制为零!这就是为什么将“无约束”模型与约束截距的模型进行比较时得到相同输出的原因,这些模型实际上是相同的。
要进一步探索这一点,请尝试使用sem()
而不是growth()
来运行模型拟合。我们将仅使用sem()
更好地了解自由度是如何变化的,因为它不会自动自动施加任何约束。让我们再次看一下自由度:
> fitMeasures(fit_UNconstrained, "df")
df
416
> fitMeasures(fit_constrained_intercepts, "df")
df
434
请注意,通过固定截距,我们获得了18个自由度。我将其分解如下:您的模型有20个观察变量(t1:t20),因此我们可能会认为,通过为这些观察变量中的每一个固定截距,我们可以获得20个自由度。但是,我们实际上是在每个潜在变量中将所有截距约束为相同的(在这种情况下,您有两个潜在变量 i 和 s )。我们没有像以前那样拟合20个截距,而是拟合了2个截距(每个潜在变量一个),从而获得18个自由度的净 yield 。
为什么约束方差会使df改变2?
在您的问题中,您提到:
“...自由度的差是2,而不是约束单个参数所期望的1 ...”
不幸的是,这并不完全正确。在SEM模型中,自由度不取决于我们要约束的参数“类型”的数量,而是取决于模型中“自由参数”的总数。
使用
lv.variances
时,实际上是在限制潜在变量的方差。如上所述,您拥有两个潜在变量 i 和的,因此您每个都约束一个参数,从而获得了两个自由度。SEM自由度,进一步说明:
让我们安装一个小的SEM,然后手动计算自由度。由于您正在对增长曲线进行建模,因此我们将使用您自己的增长模型的简化版本。我们将使用三个时间点而不是二十个时间点。
model_regressions <- ' i =~ 1*t1 + 1*t2 + 1*t3
s =~ 0*t1 + 1*t2 + 2*t3'
fit_UNconstrained <- growth(model_regressions, data=growth_data, group = "type")
summary(fit_UNconstrained) # note the use of "summary()" here
我们可以使用以下公式直接计算自由度:自由度=(唯一观测值的数量)-(自由参数的数量)
1. 首先让我们计算唯一观测值的数量:
对于您的增长模型,每组中唯一观测值数量的公式为 k(k + 1)/2 + k ,其中 k 是您拥有的已观察变量的数量。这是由于您对观察到的变量具有 k(k + 1)/2 协方差,而 k 观察到的均值。在这种情况下,您有3个观测变量,因此每组中有3(3 + 1)/2 + 3 = 9个唯一观测值。您也有两组,因此我们实际上总共有(9 * 2)= 18个观测值。
2. 现在进入免费参数。我们适合(每个组):
这给了我们8个自由参数,但是,您又有两组,所以(8 * 2)总共给了我们16个自由参数。
使用上述公式,18-16 = 2个自由度。让我们看看
lavaan
是否同意:> fit_UNconstrained
lavaan 0.6-3 ended normally after 64 iterations
Optimization method NLMINB
Number of free parameters 16
Number of observations per group
Exploration 87
Exploitation 125
Estimator ML
Model Fit Test Statistic 62.079
Degrees of freedom 2
P-value (Chi-square) 0.000
瞧!我希望这会使您更清楚。请记住,如果您选择使用s ~ h_index
等来修复回归,这也会改变您的自由度。通常,您应该使用summary()
来查看要估计的自由参数数量,并且可以使用inspect(..., "sampstat")
来查看您有多少个独特的观测值。我建议尝试一些更简单的SEM结构,以更好地了解它们的工作原理。祝你好运,建模愉快!
关于r - 了解拉凡的自由度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52937569/