Почему ограничение перехватов не меняет степени свободы?
Это связано с тем, что вы моделируете кривые роста: когда вы используете функцию 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 степеней свободы.
Почему ограничение дисперсии изменяет df на 2?
В своем вопросе вы упомянули, что:
"... разница в степенях свободы равна 2а не 1, как я ожидал бы от ограничения одного параметра ... "
К сожалению, это не совсем верно.В моделях SEM степени свободы не зависят от количества «типов» параметров, которые мы ограничиваем, а скорее от общего количества «свободных параметров» в вашей модели.
Когда выиспользуйте lv.variances
, вы фактически ограничиваете дисперсию скрытых переменных.Как упоминалось выше, у вас есть две скрытые переменные, i и s , поэтому вы ограничиваете один параметр каждый, в результате чего вы получаете две степени свободы.
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. Теперь перейдем к свободным параметрам.Мы подбираем (для каждой группы):
- 2 перехвата для всех наблюдаемых переменных (можно рассматривать как 1 перехват для каждой скрытой переменной)
- 3 дисперсии для наблюдаемых переменных
- 2 дисперсии для скрытых переменных
- 1 ковариация между скрытыми переменными
Это дает нам 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, чтобы получить лучшее представление о том, как они работают.Удачи и счастливого моделирования!