Многогрупповой CFA с другой спецификацией модели - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу запустить Multigroup CFA. Ниже я использовал хорошо известный набор данных, доступный в lavaan, для создания воспроизводимого примера. Набор данных содержит данные об успеваемости учеников, обучающихся в двух школах. Цель исследования - подтвердить структуру скрытых переменных по группам.

Хотя модель измерения одинакова для групп, я хочу протестировать различные структурные модели между группой 1 (школа = "Пастер") и группой 2 (школа = "Грант-Уайт"). Как я могу это сделать? Один из способов справиться с этим сценарием - использовать purrr::map_if и предварительно указать две структуры. К сожалению, этот подход неэффективен, когда у вас более двух групп или вам необходимо провести дополнительный анализ со значениями загрузки.

Мне интересно, есть ли способ указать эту информацию (например, текстовый ~ speed = NA или что-то) в функции lavaan::cfa.

Спасибо всем, кто поможет!

library(lavaan)
library(magrittr)
library(purrr)
library(dplyr)
library(tidyr)

HS.model <- ' visual =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9 
              visual ~ speed
              textual ~ speed'

fit <- cfa(HS.model, 
           data = HolzingerSwineford1939, 
           group = "school")

summary(fit)

HS.model1 <- 'visual =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9 
              visual ~ speed
              textual ~ speed'

HS.model2 <- ' visual =~ x1 + x2 + x3
              textual =~ x4 + x5 + x6
              speed   =~ x7 + x8 + x9 
              visual ~ speed'

HolzingerSwineford1939 %>% 
  group_by(school) %>% 
  nest() %>% 
  dplyr::mutate(m = data %>% map_if((school == "Pasteur"), function(d) cfa(HS.model1, data = d)),
                m = m %>% map_if((school == "Grant-White"), function(d) cfa(HS.model2, data = d)),
                stdsol = m %>% 
                  map(function(fit) standardizedsolution(fit))) %>% 
  unnest(stdsol) %>% 
  as.data.frame() %>% 
  dplyr::filter(op != "~~") %>% 
  unite(Effect, lhs, op, rhs, sep = "") %>% 
  dplyr::select(school, Effect, est.std) %>% 
  tidyr::spread(school, est.std)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...