Понимание степени свободы в лаве - PullRequest
0 голосов
/ 22 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Почему ограничение перехватов не меняет степени свободы?

Это связано с тем, что вы моделируете кривые роста: когда вы используете функцию 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, чтобы получить лучшее представление о том, как они работают.Удачи и счастливого моделирования!

0 голосов
/ 26 октября 2018

Я думаю, что проблема может быть в том, как определяются степени свободы.Степени свободы регрессионной модели на единицу меньше коэффициентов (иначе называемых «регрессорами»), а не параметров.Когда вы ограничиваете свой перехват, вы не изменяете количество коэффициентов / регрессоров в модели.

...