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")
因此,我的问题是:约束各种参数(尤其是截距和方差)如何影响拉瓦尼的自由度?
答案 0 :(得分:8)
这是由于您正在模拟增长曲线而造成的:当您在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个自由度的净增益。
在您的问题中,您提到:
“ ...自由度的差是2,而不是约束单个参数所期望的1 ...”
不幸的是,这不太正确。在SEM模型中,自由度不取决于我们要约束的参数“类型”的数量,而是取决于模型中“自由参数”的总数。
使用lv.variances
时,实际上是在限制潜在变量的方差。如上所述,您有两个潜在变量 i 和 s ,因此,您每个都约束一个参数,导致获得两个度数的自由。
让我们拟合一个小的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
Voila!我希望这会使您更清楚。请记住,如果您选择使用s ~ h_index
等来修正回归,这也会改变您的自由度。通常,您应该使用summary()
来查看要估算的自由参数数量,并且可以使用inspect(..., "sampstat")
来查看您有多少个独特的观测值。
我建议尝试一些更简单的SEM结构,以更好地了解它们的工作原理。祝你好运,建模愉快!
答案 1 :(得分:2)
我认为问题可能来自自由度的确定方式。回归模型的自由度比系数(否则称为“回归器”)小一个,而不是参数。约束截距时,您不会更改模型中的系数/回归数。