На этой странице
Моделирование структурными уравнениями и конфирматорный факторный анализ — методические заметки
Решения, на которых построен модуль моделирования структурными уравнениями и конфирматорного факторного анализа: какие конструкции, методы оценки, значения по умолчанию, пороги, отказы и запасные варианты стоят за каждой карточкой, и подтверждающие их числа. Где это оговорено в заметке, числа получены на смоделированных данных, а в остальных случаях — на наборе-примере (cafe.ru.csv, спецификация лежит рядом). Разделы следуют разделам руководства.
Спецификация модели
Матрицы — проекция поля синтаксиса, а не наоборот. Модель — это разобранный текст: каждая правка в виджетах записывается в текст и считывается обратно из таблицы параметров самого lavaan, поэтому матрицы не могут показать модель, которой в тексте нет. По этой причине при синтаксической ошибке они не очищаются, а замирают: они по-прежнему описывают последний разобранный текст, а правку, сделанную в устаревшей проекции, отбросил бы следующий успешный разбор. По той же причине модуль при загрузке проверяет, что lavaan считывает сгенерированный синтаксис в ту самую таблицу параметров, из которой он был записан. Расхождение означает, что проекция лжёт, и тогда виджеты скрываются, а текст, который и подгоняет lavaan, продолжает работать. Та же проверка в обе стороны выполняется после каждой записи из виджетов, так что расхождение между форматировщиком и lavaan проявляется баннером, а не подогнанной моделью, отличной от той, что на экране.
Имена столбцов, которые не являются идентификаторами lavaan, заменяются псевдонимами, и в тексте модели хранится псевдоним. Кавычек для имён в lavaan нет: обратная кавычка — синтаксическая ошибка, пробел разбивает имя, а a-b разбирается как b. Поэтому заголовок, не являющийся простым идентификатором, переписывается: каждый символ, кроме букв, цифр, _ и ., заменяется на _; если результат не начинается с буквы (или с точки, за которой не следует цифра), в начало добавляется X; к зарезервированному слову R дописывается .; наконец, пока псевдоним не станет уникальным, дописываются _2, _3 и т. д. Поле синтаксиса, автодополнение и диаграмма используют псевдоним, а исходный заголовок по-прежнему распознаётся при вводе. Внутри подгонка работает с позиционными именами, и поэтому переименование в представлении данных можно перенести в текст без повторного чтения модели.
Все генерируемые имена создаются в одном пространстве имён. В lavaan метка — это имя параметра, и метка, записанная дважды, приравнивает два параметра. Метка, совпадающая с именем столбца, в члене ~ читается как столбец, а в выражении := — как параметр. Поэтому и метки путей медиации (a, b, c, …, затем m1, m2, …), и имена определённых параметров (indirect, indirect2, …), и имена взаимодействий (XZ, XZ2, …) подбираются с учётом объединения имён переменных, их псевдонимов, имён факторов, всех меток (на нагрузках, путях, ковариациях и свободных членах) и всех имён :=. Предложенное имя при совпадении сдвигается дальше, а введённое отклоняется: пользователь имел в виду именно это имя, а приравнять два параметра без предупреждения — единственный исход хуже уведомления.
Помощник медиации всегда записывает прямой путь, поскольку a*b — косвенный эффект, только пока этот путь свободен. Без регрессии X→Y lavaan подгоняет c′ = 0, и при такой навязанной полной медиации a*b — общий эффект, а не косвенный. Поэтому помощник добавляет X→Y, если его нет, и рядом со строкой косвенного эффекта записывает direct и total. Если X→Y зафиксирован пользователем или различается между группами, так что его не называет ни одна метка, записывается только строка косвенного эффекта, и уведомление об этом сообщает: включение фиксированного коэффициента в член := незаметно отбросило бы ограничение. По той же причине фиксированный или различающийся по группам путь на косвенном маршруте останавливает помощника.
Общий эффект последовательной цепочки суммирует все маршруты и не задаётся, если медиаторов больше шести. Насыщенная цепочка путей вперёд достигает Y через каждое упорядоченное подмножество медиаторов, а не только через полное, поэтому totalIndirect суммирует все 2^k − 1 произведений, а total добавляет прямой путь. Сумма по одной названной цепочке занизила бы общий эффект. Уже при шести медиаторах в этом выражении 63 члена, и дальше читать его невозможно, поэтому форма называет только цепочку и отсылает к декомпозиции эффектов, которая выводит каждый маршрут отдельной строкой. Насыщенным набор путей вперёд делается как раз для того, чтобы маршруты в обход медиаторов оценивались, а не оказывались фиксированными на нуле из-за пропуска, — сумма := по ним это и предполагает.
Индикаторы-произведения, а не LMS. Латентное взаимодействие подгоняется так, как его умеет подгонять lavaan: как обычная латентная переменная, индикаторы которой — произведения индикаторов двух сомножителей, по Кенни и Джадду (Kenny & Judd, 1984) и Маршу, Вэню и Хау (Marsh, Wen & Hau, 2004), в неограниченном варианте, где нагрузки и дисперсии произведений свободны. Латентные модерируемые структурные уравнения (LMS) и QML оценивают взаимодействие, не образуя произведений, но им нужен вычислительный движок вне lavaan, поэтому они не предлагаются. Конструкция остаётся латентной, а не сводится к произведению шкальных баллов, потому что надёжность произведения примерно равна произведению надёжностей сомножителей: взаимодействие — та оцениваемая величина, которой ошибка измерения вредит сильнее всего, и именно здесь сведение конструктов к баллам обходится дороже всего.
Согласованные пары следуют порядку измерительной матрицы и используются по умолчанию. Марш, Вэнь и Хау составляют пары индикаторов по рангу надёжности. До подгонки надёжность неизвестна, поэтому её заменяет порядок, в котором измерительная матрица перечисляет индикаторы каждого фактора, и другие пары задаются перестановкой индикаторов. При согласованных парах каждый индикатор используется один раз, так что никакие два произведения не имеют общего сомножителя и остаточная ковариация не нужна. Этот вариант потому и выбран по умолчанию. При всех парах два произведения с общим сомножителем ковариируют через него, что бы ни делало взаимодействие, и если оставить эту ковариацию в их остатках, она ляжет на фактор. Поэтому вместе с определением записывается строка ~~ для каждой такой пары. Взаимодействию, как и любой латентной переменной, для идентификации нужны два индикатора-произведения, поэтому схема, дающая меньше, отклоняется.
По умолчанию — двойное центрирование по среднему. Ортогонализация при коллинеарных сомножителях отклоняется. Двойное центрирование по среднему, предложенное Линем, Вэнем, Маршем и Линем (Lin, Wen, Marsh & Lin, 2010), центрирует индикаторы, перемножает их и снова центрирует произведения, так что взаимодействию не нужна структура средних, а средние его индикаторов равны нулю. При простом центрировании средним произведения становится ковариация сомножителей, которую модели приходится учитывать. Ортогонализация по Литтлу, Бовэрду и Видаману (Little, Bovaird & Widaman, 2006) регрессирует каждое исходное произведение на два исходных сомножителя и оставляет остаток, так что произведение по построению не коррелирует ни с одним из них. Если два столбца-сомножителя пары строго коллинеарны, нормальные уравнения вырождены и отделять нечего, поэтому запуск отклоняется с сообщением, предлагающим взамен двойное центрирование.
Столбцы-произведения строятся при запуске модели и в набор данных не попадают. Центрирование должно следовать выборке, доходящей до подгонки: правило преобразования данных центрировало бы по всему столбцу, включая строки, которые затем отбросит построчное удаление, и произведения были бы центрированы по среднему, невидимому для подгонки. Поэтому столбцы вычисляются прямо в данных подгонки по строкам, где есть оба сомножителя, а у строки, где нет хотя бы одного, произведения нет. Проверить можно определение, хранящееся в тексте модели комментарием # @interaction рядом со строкой =~. В таблице параметров XZ =~ XZ.1 + XZ.2 ничем не отличается от фактора, измеряемого двумя несуществующими столбцами, поэтому определение хранится в комментариях, куда разборщик не вмешивается, и сохраняется вместе с ними.
Член, записанный лишь в некоторых блоках group:, переписывается в форму c(...). Многогрупповая таблица параметров указывает каждый член по разу на группу, а в записи c(...), которой виджеты возвращают модель в текст, нельзя сказать «в этой группе отсутствует». Поэтому член, пропущенный в одном блоке, возвращается присутствующим во всех группах, и lavaan может подогнать модель, отличную от описанной блоками. Отклонить такой член проекция не может, не отклонив всю вставку, поэтому она переписывает его и предупреждает: закрываемый баннер называет затронутые инструкции и просит перед запуском проверить число свободных параметров.
Параметры
При порядковых индикаторах подставляется WLSMV, чтобы lavaan не завершался ошибкой. lavaan отвергает несоответствие с обеих сторон: семейство ML и GLS завершаются ошибкой при ordered=, а пять методов наименьших квадратов (WLSMV, ULSMV, DWLS, ULS, WLS) — на непрерывных данных, если не передано ordered = FALSE. Поэтому пара согласуется до вызова: если в модели есть столбец порядкового типа, любой другой метод заменяется на WLSMV, а метод наименьших квадратов на непрерывных столбцах получает ordered = FALSE. Сводка сообщает о замене рядом с методом оценки, поскольку сам lavaan метод никогда не меняет. Область действия — текст модели, а не выбор переменных: одного порядкового столбца достаточно, чтобы перевести всю подгонку в категориальный режим, так что выбранный столбец, который модель не упоминает, не должен попасть в ordered=. Множество порядковых переменных после разбора берётся из таблицы параметров самого lavaan, а до него — из текста.
FIML следует итоговому методу оценки. missing = "ml" — параметр семейства ML, и при любом другом методе lavaan выдаёт ошибку (missing=“ml” is not allowed for estimator “MLM”, а при включённом ordered= — not available in the categorical setting). Из робастных ML его принимает MLR, поэтому, пока выбран FIML, методы MLM, MLMVS и MLMV недоступны, а выбор одного из них переключается на MLR. Запрос FIML при методе наименьших квадратов заменяется попарным удалением, которое это семейство принимает, а при GLS — построчным, принятым в lavaan по умолчанию. Метод оценки сам может быть заменён из-за порядковых индикаторов, так что выбор обычного ML с FIML может закончиться попарным удалением, хотя пользователь не трогал ни один из элементов управления. Поэтому сводка сообщает фактический режим с запрошенным рядом, а строка объёма выборки следует тому же разрешению: при FIML lavaan считает все наблюдения с данными, при построчном удалении — полные.
Переключатель масштабирования переписывает все маркеры, а правка в виджетах — ни одного. Масштабирование факторов — выбор способа идентификации для всей модели, поэтому переключатель заменяет весь набор F ~~ 1*F (для всех латентных переменных, включая факторы второго порядка) и передаёт вместе с ним std.lv = TRUE. В остальном маркеры — состояние, заданное пользователем, а не проекция переключателя: текст может закреплять часть латентных переменных или один фактор второго порядка, и если бы список генерировался заново при каждой записи из виджетов, посторонняя правка переписывала бы идентификацию модели. Поэтому из списка только убираются латентные переменные, которых больше нет, и удалённый фактор не оставляет висячего маркера.
Флажок «Разрешить корреляцию факторов» закрепляет только экзогенные пары и никогда не касается латентного взаимодействия. lavaan автоматически коррелирует только экзогенные латентные переменные (возмущение эндогенного фактора по умолчанию ни с чем не коррелирует), поэтому ортогональной модели нужны 0* на экзогенных парах и больше ничего, а 0*, введённый вне этого множества, сохраняется как написан. На латентное взаимодействие флажок не распространяется: его ковариации с собственными сомножителями построение индикаторов-произведений оценивает, а не предполагает, и их фиксация на нуле сместила бы сам путь взаимодействия.
Структурная модель получает измерение групп без каскада. Групповая переменная при чисто измерительном тексте модели запускает каскад инвариантности, поскольку его уровни (нагрузки, свободные члены, остатки) — ограничения измерения. Как только появляется строка ~, модель подгоняется один раз по всем группам с отмеченными уровнями group.equal, поэтому панель Уравнять между группами появляется только на этом маршруте: каскад выбирает уровни сам, ступень за ступенью, и панель бы проигнорировал. Панель предлагает шесть уровней lavaan, включая regressions — тот, что нужен для структурного сравнения и до которого каскад не доходит. Снятие ограничений через group.partial остаётся за каскадом. Группы передаются как group.label в каноническом порядке уровней, поскольку иначе lavaan упорядочивает их по первому появлению, и опорную группу определял бы порядок строк. Строка размеров групп считает полные наблюдения при построчном удалении, иначе правила достаточности сравнивали бы исходные размеры с n, которого lavaan не видит. Её граница по свободным параметрам — число параметров подгонки, делённое на число групп, то есть доля одной группы, а при приравненной ступени свободных параметров меньше, так что граница консервативна. Для отказа при числе групп меньше двух считаются различные непустые значения столбца. При отключённом визуальном редакторе нет спецификации, из которой можно взять столбцы, поэтому текст модели уходит в sem() как есть, а выбранная групповая переменная отбрасывается с предупреждением.
BCa пробуется только выше границы по числу повторов, а последний запасной вариант — процентильный интервал. Интервалу BCa нужно больше успешных повторов, чем наблюдений, и при меньшем числе lavaan не переходит на запасной вариант, а выдаёт ошибку. Поэтому boot.ci.type = "bca" пробуется, только если повторов больше проанализированного N, затем bca.simple (процентильный интервал с поправкой на смещение), затем perc — вариант, доступный всегда. Если не удаётся и он, ошибка доходит до карточки. Заголовок ДИ называет использованный тип, а каждое стандартизованное решение перебирает варианты независимо, так что стандартизованный столбец может опираться на процентильный интервал, когда нестандартизованный получил BCa, и заголовки это показывают. Число повторов — общая настройка бутстрэпа, которая используется как есть и в модуле не переопределяется. Вместо этого карточка сообщает, во что обходится выбранное число (меньше 1000 повторов, меньше N, нужного для BCa), а подгонка выполняется при настройке зерна бутстрэпа, так что повторный запуск воспроизводит границы.
Робастный метод оценки при бутстрэпе записывается как его базовый метод с собственным критерием, а индексы соответствия берутся из сопутствующей подгонки. При se = "bootstrap" lavaan отвергает любой робастный метод: MLR, MLM, MLMV и MLMVS требуют ML, WLSMV — DWLS, ULSMV — ULS. Поэтому при включённом бутстрэпе каждый из них записывается как базовый метод плюс робастный критерий, который он обозначает: MLR — как ML с yuan.bentler.mplus; MLM, MLMV и MLMVS — как ML с satorra.bentler, scaled.shifted и mean.var.adjusted соответственно и ожидаемой информацией; WLSMV и ULSMV — как DWLS и ULS с scaled.shifted. Тогда все критерии χ² и масштабированные индексы остаются такими, какими их сообщает названный метод, а сэндвич-оценки стандартных ошибок меняются на бутстрэповские, о чём карточка сообщает рядом с методом оценки. Категориальных робастных индексов это всё же касается: при бутстрэпе lavaan принудительно использует наблюдаемую информацию, которую эти индексы обращают, и они сдвигаются в третьем-четвёртом знаке. Поэтому все индексы соответствия берутся из второй подгонки модели без бутстрэпа, с методом, который называет карточка, а бутстрэп-подгонка даёт только стандартные ошибки и интервалы. Заголовок называет метод, который пытались применить, даже если подгонка не удалась. Уровень латентных средних в каскаде инвариантности использует ту же запись, а раньше робастный метод там не срабатывал и без предупреждения переходил на аналитические стандартные ошибки.
Проверка. На шести пунктах удовлетворённости кафе, отмеченных как порядковые, индексы бутстрэп-подгонки WLSMV совпадают с индексами обычной подгонки WLSMV до последнего знака, тогда как одна бутстрэп-подгонка дала бы TLI 1.0117 вместо 1.0112. На HolzingerSwineford1939 из lavaan каждая такая запись метода семейства ML, включая MLR с FIML, в точности воспроизвела меры соответствия своего метода.
Проверка данных
Диагностика проверяет то, что увидит подгонка. Проверки выполняются по столбцам модели (индикаторам и наблюдаемым переменным структурных уравнений), как только числовых среди них два, так что строки объёма выборки, нормальности и выбросов описывают переменные самой подгонки, а не выбор. Пока модели нет, запасной вариант — все выбранные числовые переменные. Нечисловой столбец, упомянутый в модели, исключается, а уведомление его называет: цикл по переменным в R на нём бы оборвался, и прочитанный результат был бы усечённым набором проверок, похожим на чистый запуск. Достаточность объёма выборки оценивается на свободный параметр, если их число известно. Ориентир в 5–10 наблюдений на свободный параметр — тот, что приводится в литературе, а параметров модель всегда оценивает больше, чем в ней переменных, так что число наблюдений на переменную — лишь верхняя граница этого отношения. Число параметров то же, что в сводке, но для многогрупповой модели оно неизвестно, пока не придёт подсчёт lavaan. Проверка факторизуемости (KMO, Бартлетт, детерминант, ранг) пропускается при запуске по модели без латентных переменных, поскольку путевой модели нечего факторизовать, и выполняется на смешанных корреляциях, если проверяемый столбец имеет порядковый тип, — на тех же, что использует для него подгонка.
Правила валидации
Запуск закрыт для того, на чём lavaan бы упал, и сопровождается предупреждением там, где модель плохо соответствовала бы данным. Правила повторяют то, чего подгонка не переживёт: фактор с одним индикатором, фактор второго порядка с одним фактором первого порядка, неизвестное lavaan имя (редактор его уже подчёркивает, но без запрета подгонка запустилась бы и упала внутри lavaan), и латентное взаимодействие, столбцы-произведения которого построить не из чего. Строка =~ взаимодействия остаётся в тексте и после изменений измерительной модели, из-за которых она устарела, и без правила запуск дошёл бы до lavaan со ссылками на несуществующие столбцы. Синтаксическая ошибка закрывает запуск собственным флагом, а не правилом, поскольку запускается текст модели, а неудавшийся разбор не оставляет модели для проверки. Рекомендательные правила взяты у Боллена (Bollen, 1989): фактор идентифицирован сам по себе, только если у него три индикатора или два плюс свободная связь с другой латентной переменной (регрессия, нагрузка второго порядка, свободная ковариация или автоматическая корреляция экзогенных латентных переменных, пока включён флажок Разрешить корреляцию факторов). Поэтому фактор с двумя индикаторами без такой связи даёт предупреждение, а не запрет (его ещё может идентифицировать ограничение пользователя), а точно идентифицируемая модель предупреждает, что её индексы соответствия могут не иметь смысла.
Свободные члены индикаторов и латентные средние, оцениваемые вместе, идентифицируются только между группами. В одной группе наблюдаемые средние — единственные данные об уровне, а свободные члены наблюдаемых переменных вместе с латентными средними — на целый набор параметров больше, чем эти моменты могут определить, поэтому такая пара отклоняется всякий раз, когда в модели есть латентные переменные. У чисто путевой модели латентных средних нет, и правилу не к чему применяться. Каскад инвариантности вместо этого идентифицирует структуру средних через ограничения равенства между группами и на каждой ступени закрепляет meanstructure = TRUE, int.ov.free = TRUE, int.lv.free = FALSE, а не передаёт состояние виджетов: освобождение латентных средних во всех группах или фиксация свободных членов индикаторов изменили бы df каждого уровня. Поэтому для чисто измерительной модели с групповой переменной эта пара даёт предупреждение, а не отказ: на этом маршруте флажки ни на что не влияют.
Проверка df опирается на подсчёт lavaan, а для многогрупповой модели воздерживается. Число свободных параметров и df при каждом разборе берутся из таблицы параметров самого lavaan. Только этот источник согласован с тем, что оценивает sem(), с учётом ограничений ==, повторяющихся меток и структуры средних, а dataPoints выводится из него, поскольку df lavaan уже учитывает моменты, которые исключает fixed.x. До первого разбора пробел заполняет оценка на стороне виджетов, повторяющая умолчания lavaan: по дисперсии на каждую неэкзогенную наблюдаемую переменную и на каждую латентную переменную при маркерном масштабировании, auto.fix.first для первой нагрузки каждого фактора, автоматические ковариации экзогенных латентных переменных, по среднему на моделируемую переменную при структуре средних, повторная метка как ограничение, приравнивающее параметр к первому её появлению, и строки := как производные величины. Эта оценка только одногрупповая: оси групп в ней нет, и ответ всё равно показал бы проверке одногрупповое df многогрупповой модели, поэтому она воздерживается, а после разбора её место занимает подсчёт lavaan с учётом групп.
Результаты
df в строке χ² — это df критерия, а в сводке — df модели. При MLMVS статистика, скорректированная по среднему и дисперсии, сравнивается с дробным df, скорректированным по Сэттертуэйту (df.scaled в lavaan). Это df, по которому оценивался масштабированный критерий, и ему место рядом с ним в ячейке «Подробности». df модели показывает, сколько утверждений делает модель. Это число приводится в отчёте, на нём основано соотношение N:параметр, и стоит оно в строке сводки. Одно число для обоих исказило бы одно из них, поэтому на карточке они разделены.
CFI, TLI, RMSEA и SRMR сравниваются с настройками порогов соответствия, а остальные оцениваемые индексы — с фиксированной шкалой. GFI, AGFI, NFI, RFI и IFI не калибровались на симуляциях Ху и Бентлера (Hu & Bentler, 1999), из которых взяты пороги CFI и TLI, а GFI вдобавок зависит от объёма выборки и размера модели. Привязка к настройке CFI позволила бы намеренному изменению одного индекса незаметно сдвинуть пять других, поэтому для них действуют общепринятые границы 0.95 / 0.90 / 0.85 (отличное, приемлемое и плохое соответствие), и настройка их не затрагивает. У PNFI и PGFI общепринятых диапазонов нет, а информационные критерии ранжируют модели, а не оценивают одну, поэтому ни один из них оценки не получает. Перед отнесением к диапазону значение округляется до отображаемой точности, так что ячейка, где напечатано 0.95, никогда не оценивается как не дотягивающая до 0.95.
Насыщенная модель не оценивается, а RMSEA при df < 50 оценки не получает. При df ≤ 0 модель воспроизводит наблюдаемые моменты по построению, так что каждый индекс оптимален, чего бы модель ни стоила: столбец «Интерпретация» убирается, а примечание сообщает, что оценивать нечего. Числа, вычисленные lavaan, по-прежнему выводятся. Как показали Кенни, Канеко и Мак-Коуч (Kenny, Kaneko & McCoach, 2015), RMSEA и критерий близкого соответствия смещены вверх и неустойчивы в моделях с малым числом степеней свободы, тем более при умеренном N, поэтому при df < 50 и N не больше 200 их оценка остаётся пустой с поясняющим примечанием, а значения выводятся.
Значимость на диаграмме следует стандартизации на экране, а оценка, которую lavaan не смог стандартизовать, рисуется как отсутствующая. Стандартизованный коэффициент проверяется по собственной стандартной ошибке, поэтому пунктир и звёздочки стандартизованного вида опираются на стандартизованное p, а не на нестандартизованное. Иначе путь мог бы быть пунктирным на рисунке и отмеченным звёздочкой в таблице рядом. Там, где standardizedSolution значения не возвращает (случай Хейвуда, индикатор без дисперсии), ребро рисуется нейтральной серой линией постоянной толщины без подписи. Взять исходный коэффициент и окрасить его по стандартизованной шкале значило бы поставить нестандартизованное число на шкалу корреляций. В подсказке ребра приводится нестандартизованное значение с пометкой об этом. У помеченного свободного параметра вместо оценки курсивом стоит метка, поскольку члены строки := находят по рисунку, а оценка есть в таблице.
У каждой стандартизации свои столбцы статистического вывода, а многогрупповая карточка показывает только стандартизованные оценки. Стандартизация меняет масштаб коэффициента, а с ним и его выборочного распределения: standardizedSolution в lavaan возвращает для каждой стандартизованной оценки SE, z, p и ДИ, которые не сводятся к пересчитанным нестандартизованным. Поэтому панель показывает для каждой стандартизации целую группу столбцов, а не один столбец оценки, и стандартизованная оценка никогда не читается рядом с нестандартизованным z: так смешались бы два разных критерия. В многогрупповой подгонке каждая группа и так занимает шесть столбцов. Стандартизованные SE, ДИ, z и p там убираются, поскольку стандартизованное p Вальда в отдельной группе не проверяет различия между группами (это делает скор-тест на карточке инвариантности), а два флажка заменяются переключателем с одним вариантом за раз, чтобы число столбцов оставалось обозримым.
Многогрупповая карточка расширяет таблицы параметров, повторяет матрицы и сохраняет одну таблицу соответствия. Таблица параметров сохраняет по строке на параметр и получает по блоку столбцов на группу, так что группы читаются бок о бок. Параметр := lavaan сообщает один раз для всей модели, без собственной группы, поэтому таблица определённых параметров сохраняет одногрупповой вид, а не помещает значение в блок первой группы. У матрицы (дискриминантная валидность, остаточные корреляции) не осталось измерения столбцов для групп, поэтому она повторяется для каждой группы. Соответствие данным — свойство модели, а не группы, поэтому таблица соответствия остаётся одной. Вклад каждой группы в χ² стоит в «Подробностях» строки χ², поскольку по нему видно, не приходится ли несоответствие на одну группу, а размеры групп указаны над таблицей, поскольку именно по этому n оцениваются правила достаточности. Диаграмма рисуется для каждой группы с общей цветовой шкалой: при отдельных шкалах одинаковые толщина и цвет линии означали бы в каждой группе разное, и сравнение, ради которого панели стоят рядом, потеряло бы смысл.
Определённые параметры без бутстрэпа вычисляются дельта-методом, а интервал декомпозиции — собственный. Без бутстрэп-выборок SE произведения := — это SE дельта-метода (Собел), нормальному эталонному распределению которого произведение коэффициентов не подчиняется, поэтому карточка сообщает об этом под таблицей и советует включить бутстрэп. Доводы приведены в блоке критерий Собела. Декомпозиция эффектов вычисляет собственный интервал по произведениям вдоль маршрутов (процентильный интервал бутстрэп-выборок маршрута при включённом бутстрэпе, иначе интервал дельта-метода) и не берёт интервал lavaan. Поэтому её заголовок не должен наследовать от таблицы оценок пометку BCa или BC: таких интервалов этот блок не вычислял. Её стандартизованные столбцы содержат только точечные оценки, поскольку у standardizedSolution нет строки для величины, которую модель нигде не называла. Бутстрэп-SE вычисляется с делением на число повторов, как в lavaan, так что обе таблицы совпадают там, где сообщают одну и ту же величину.
Декомпозиция перебирает все пары, связанные косвенным маршрутом, и отказывается от циклов и от моделей с числом маршрутов больше 500. Паре, связанной только прямым путём, раскладывать нечего, и строки она не получает. Для пары с хотя бы одним косвенным маршрутом приводятся общий эффект по всем маршрутам, общий косвенный эффект по маршрутам из двух и более шагов, по строке частного эффекта на каждый такой маршрут и прямой путь, если он есть в модели, в порядке Mplus. У нерекурсивной модели нет конечного набора маршрутов (алгоритм Кана находит цикл ещё до начала обхода), поэтому карточка сообщает об этом и отсылает к :=. В плотной модели число маршрутов растёт экспоненциально, а карточка, рисующаяся минутами, хуже явного отказа, поэтому обход останавливается на 500 маршрутах и карточка отказывается. Для отдельного частного эффекта в большой модели остаётся открытым путь через :=. Путь, зафиксированный пользователем, вносит своё закреплённое значение в каждый маршрут, на котором лежит, и не даёт производной.
Диагональ ~~ разделяется на три таблицы. Параметр дисперсии эндогенной латентной переменной — её возмущение, то есть то, что не объясняют её предикторы, а не дисперсия фактора. В таблице дисперсий факторов он преувеличивал бы необъяснённую часть фактора, а в модели второго порядка каждый фактор первого порядка выглядел бы необъяснённой изменчивостью, которую на самом деле объясняет фактор высшего порядка. Поэтому диагональ разбивается по роли переменной (экзогенная латентная, предсказываемая латентная, наблюдаемый индикатор), и каждая часть — отдельная таблица. Отрицательная оценка в любой из них — случай Хейвуда, выделенный красным полужирным, с предупреждением над таблицей. Столбец «Интерпретация», который его называет, появляется, только если такой случай есть, а в многогрупповой подгонке находится внутри блока каждой группы, поскольку дисперсия может стать отрицательной в одной группе и не стать в другой.
R² при порядковых индикаторах — доля дисперсии латентного отклика. При дельта-параметризации WLSMV дисперсия непрерывного отклика за каждым порядковым пунктом фиксирована на 1, поэтому R², который lavaan сообщает для порядкового индикатора, — доля этой латентной дисперсии, объясняемая фактором, а не дисперсии наблюдаемого столбца. Если в подгонке были порядковые индикаторы (lavNames(fit, "ov.ord") не пусто), на это указывают и заголовок раздела, и легенда диаграммы, так что число не примут за обычный R². lavInspect(fit, "rsquare") возвращает общность индикатора и структурный R² эндогенной переменной одним списком, хотя читать их нужно с разными ожиданиями, и столбец «Тип» нужен именно для этого.
Надёжность вычисляется относительно каждого фактора первого порядка как его собственного истинного балла. Без указаний semTools::compRelSEM идёт по модели вверх, так что ω эндогенного фактора или фактора второго порядка вычислялась бы относительно предсказывающего его фактора и проваливалась бы (0.20 при нагрузках индикаторов 0.70–0.80). Поэтому каждый фактор первого порядка указывается как собственный истинный балл, и ω — надёжность собственных индикаторов фактора, что бы его ни предсказывало. Коэффициент compRelSEM — конгенерическая ω, которая в конгенерической модели совпадает с составной надёжностью, поэтому один коэффициент выводится один раз, под заголовком ω. Строка ковариации латентной переменной с наблюдаемой заставляет semTools вернуть провалившуюся ω и AVE, равную NA, для фактора, которому принадлежит этот индикатор (достаточно самого наличия строки, даже зафиксированной на нуле), поэтому для такого фактора обе величины не выводятся, а примечание об этом сообщает. На α это не влияет. У фактора высшего порядка собственных наблюдаемых индикаторов нет, поэтому α, ω и AVE к нему неприменимы. Иерархическая ω — доля общей наблюдаемой дисперсии его индикаторов, которую несёт собственная дисперсия фактора высшего порядка. Эта ω вычисляется по матрицам модели через полные нагрузки и там, где применимы оба способа, воспроизводит число самой compRelSEM. Её диапазоны взяты у Райза, Бонифея и Хэвиленда (Reise, Bonifay & Haviland, 2013): от 0.75 суммарный балл отражает один общий фактор, а ниже 0.50 набор слишком многомерен, чтобы считать его так. У AVE собственное правило с двумя диапазонами и границей 0.50, по Форнеллу и Ларкеру (Fornell & Larcker, 1981): захвачена половина дисперсии индикаторов. Для α и ω действуют общие диапазоны надёжности.
Если нагрузки фактора расходятся по знаку, для расчёта надёжности индикаторы меньшинства обращаются. Обратный пункт, подогнанный как есть, нагружает отрицательно, а при суммировании как есть гасит остальные пункты: α падает ниже нуля, а ω проваливается, хотя фактор измерен хорошо. Поэтому блок надёжности для каждого фактора и каждой группы обращает индикаторы того знака стандартизованных нагрузок, который в меньшинстве, а при равенстве — отрицательные, в том числе у фактора с двумя индикаторами. Это соглашение flip = TRUE из psych::omega(), так что модуль факторного анализа и эта карточка обращают одни и те же пункты одинаково. Фактор, все нагрузки которого одного знака, остаётся как есть, поскольку α и ω не меняются при отражении всех индикаторов сразу. Обращение даёт в точности то же, что повторная подгонка на перекодированных пунктах, но без повторной подгонки. ω проходит через compRelSEM с весом −1 у каждого обращённого индикатора в композите, что отражает и числитель общей дисперсии , и знаменатель наблюдаемой дисперсии. α вычисляется по той же наблюдаемой ковариационной матрице, отражённой как , где — диагональная матрица из ±1, поскольку при неравных весах compRelSEM α вычислять отказывается. Иерархическая ω отражает пункты по знакам стандартизованных полных нагрузок фактора высшего порядка. Индексы соответствия, таблица нагрузок и AVE (квадраты нагрузок) не затрагиваются, а HTMT строится по абсолютным величинам корреляций, так что обращение не может его изменить. Примечание под таблицей называет каждый обращённый индикатор с его нагрузкой, поэтому обращение при нагрузке, близкой к нулю, можно распознать: оно указывает скорее на неверно специфицированный индикатор, чем на обратный.
Проверка. В двухфакторном КФА кафе с медленно как есть (стандартизованная нагрузка −0.59 на Обслуживание) у Обслуживания α 0.670 и ω 0.673 — до девятого знака столько же, сколько при подгонке на копии, где медленно перекодирован в данных. При суммировании как есть те же пункты дали бы α −0.52 и ω 0.21. Еда, нагрузки которой согласованы, остаётся с α 0.711 и ω 0.714. При группировке по филиалу оба филиала совпадают с подгонкой на перекодированных данных (Обслуживание: α 0.596 и 0.693, ω 0.598 и 0.700). Если перекодировать в данных вкус и свежесть, однофакторная модель по вкус, свежесть, цена, приветливо и быстро нагружает эти два пункта против трёх других и обращает их: α 0.678 и ω 0.664, как на исходных пунктах. Двухиндикаторный фактор цена + свежесть на той же копии даёт равенство знаков, поэтому обращается отрицательно нагружающая свежесть: α 0.550 и ω 0.652, как на исходных пунктах. Фактор второго порядка над Едой и Обслуживанием обращает медленно по его полной нагрузке (−0.45), и иерархическая ω равна 0.485 и при исходном, и при перекодированном медленно.
Индексы модификации отбираются от 3.84, выделяются полужирным от 10, а их множественность указывается. 3.84 — это χ²(1) при α = 0.05, то есть снижение χ², которого освобождение одного параметра должно достичь, чтобы оказаться значимым по собственному критерию. Кандидата lavaan возвращает для каждого фиксированного параметра, а на стороне R остаются только те, что выше этого значения. 10 — правило практической значимости Клайна (Kline, 2016). Оно служит для выделения полужирным, а не вторым фильтром, и каждый список показывает 20 наибольших значений с указанием общего числа, если список обрезан. Проверен каждый фиксированный параметр, так что порог одиночной проверки оптимистичен, и примечание под заголовком сообщает, сколько их было, один раз, а не под каждым списком. Списки определяются оператором и видом модели. Структурная модель держит все пары ~~ в одном списке и добавляет пути ~, ненужные карточке чисто измерительной модели, а карточка режима КФА отделяет остаточные ковариации от ковариаций факторов, чтобы список «прочих» без кнопки не поглотил ту единственную модификацию, которая больше всего нужна ортогональной модели. Кандидат =~, у которого в правой части латентная переменная, — нагрузка высшего порядка, а не перекрёстная нагрузка, и он попадает в список только для чтения, а не применяется как перекрёстная нагрузка.
Остаточные корреляции отмечаются при |z| ≥ 1.96, а по правилу |r| > 0.10 — только если z нет. Остаток 0.10 — это много в выборке из 1000 наблюдений и ничто в выборке из 60, так что фиксированный порог корреляции отмечает шум в малых выборках и пропускает реальное несоответствие в больших. Стандартизованный остаток делит расхождение на его собственную стандартную ошибку, поэтому двусторонний 5%-ный порог означает одно и то же при любом N. Некоторые методы оценки стандартизованных остатков не возвращают, и тогда матрица переходит на общепринятое правило |r| > 0.10, а легенда сообщает об этом и оговаривает, что правило не учитывает объём выборки.
Медиация шаг за шагом
Бутстрэп и FIML сочетаются: каждая бутстрэп-выборка подгоняется с FIML. Обычный бутстрэп lavaan извлекает наблюдения, включая неполные, и заново подгоняет модель на каждой выборке с параметрами исходной подгонки. Поэтому при missing = "ml" каждый повтор вычисляет правдоподобие по имеющимся данным своей бутстрэп-выборки, а не по заполненному набору: интервал отражает неопределённость, которую учитывает FIML, и ничего не импутируется. Цена — одна подгонка FIML на повтор, поэтому сочетание разрешено, а руководство лишь просит следить за числом повторов на большой модели.
Сравнение моделей
Индексы соответствия ранжируются только в общей шкале. Выделение лучшего значения — это ранжирование, а две подгонки находятся в одной шкале, только если они получены на одних и тех же наблюдаемых столбцах, с одним и тем же методом оценки и способом обработки пропусков в том виде, в каком их применил lavaan, с одинаковыми параметрами структуры средних, одним и тем же набором порядковых переменных и одним и тем же числом наблюдений. Модель без одного индикатора подогнана на другом наборе переменных, и её AIC меньше не потому, что она лучше подходит, а потому, что объяснять приходится меньше. Разные наборы наблюдаемых переменных к тому же дают разное n при построчном удалении, а масштабированную статистику нельзя вычитать из немасштабированной. Сравнивается итоговая пара, а не запрошенная: два запроса, которые оба свелись к WLSMV с попарным удалением, дали подгонки в одной шкале. Если хоть одна пара различается, выделение снимается со всей таблицы, а если вложенных пар нет, заключительное примечание называет различия, а не советует AIC и BIC, которые хуже всего сравнимы между разными наборами наблюдений. χ² никогда не ранжируется: он механически падает с добавлением параметров, и наименьшее значение всегда у наименее ограниченной модели. Последнее слово по паре, которую приняло правило вложенности, остаётся за исполнителем: anova() отклоняет пару, если подгонки проанализировали разное число наблюдений, имеют равные степени свободы или одна из них не сошлась.
Групповая переменная входит в общую шкалу, а приравненные уровни распознаёт правило вложенности. χ² многогрупповой подгонки суммирует расхождения каждой группы с её собственными моментами, так что подгонка, сгруппированная по одной переменной, воспроизводит другой набор моментов, чем одногрупповая или сгруппированная по другой переменной: их χ² и информационные критерии лежат в разных шкалах, и Δχ² между ними не проверяет никакого ограничения. Какие уровни Уравнять между группами приравнены в подгонке, — это ограничение, а не шкала, и две подгонки одной модели, различающиеся только этими уровнями, — хрестоматийная вложенная пара: конфигуральная базовая модель против её ограниченного двойника. Таблица параметров, разобранная только из синтаксиса, этого не видит, поскольку параметр group.equal в синтаксис не попадает. Поэтому многогрупповая модель разбирается по своим группам с применением её group.equal и group.partial: таблица параметров lavaan тогда содержит каждый приравненный уровень как сгенерированные строки == между метками отдельных групп, модуль переводит их в ключи параметров с указанием группы, и пару решают собственные проверки правила — на подмножество, на сохранённые ограничения и на степени свободы. Равенство через общую метку читается так же и в одногрупповой модели, так что a*x2 + a*x3 тоже распознаётся как ограничение. Одногрупповая подгонка флажки игнорирует: скрытая панель сохраняет их состояние, но до lavaan эти уровни не доходили.
Проверка. На структурной модели кафе, сгруппированной по филиал, конфигуральная подгонка содержит подгонку с приравненными структурными путями, а та — подгонку с приравненными нагрузками и путями. Подгонка, освобождающая одну нагрузку при приравненных нагрузках, лежит между конфигуральной и полностью приравненной. Подгонка с приравненными нагрузками и свободными членами образует пару с конфигуральной, но не с подгонкой с приравненными структурными путями, а одногрупповая подгонка пары не образует ни с одной. Δdf каждой проверенной пары совпадает с Δdf самих повторных подгонок.
Вложенность — это совпадение параметров плюс одна перепараметризация: объединённые факторы. Две модели образуют пару для критерия разности хи-квадрат, если пространство параметров одной содержится в пространстве другой, и модуль определяет это по именам в двух таблицах параметров: свободные параметры ограниченной модели — подмножество свободных параметров свободной, она сохраняет все фиксированные значения и все равенства свободной модели, и lavaan даёт ей строго больше степеней свободы. Понятое буквально, это правило отвергает самое частое сравнение в КФА — однофакторную модель против многофакторной на тех же пунктах, — потому что G =~ x1 + x2 и F1 =~ x1 — разные имена того, что после объединения является одной и той же нагрузкой. Но модели вложены: k-факторный КФА с корреляциями факторов, фиксированными на 1, имеет в точности ту же подразумеваемую ковариационную структуру, что и КФА, объединяющий эти факторы, при любом соглашении о масштабе, так что критерий отношения правдоподобия сравнивает два настоящих пространства параметров, как показывает Боллен (Bollen, 1989, гл. 7). Поэтому модуль распознаёт за именами одну эквивалентность. Если обе модели — простые КФА на одном наборе индикаторов (каждый индикатор ровно на одном факторе, без регрессий, без фиксированных или приравненных нагрузок, без остаточных ковариаций, которых нет в другой модели, без строк ~~ или свободных членов с фактором, без факторов высшего порядка) и каждый фактор свободной модели целиком лежит внутри одного фактора ограниченной, ограниченная модель считается свободной с корреляциями объединяемых факторов, фиксированными на 1, и столбец «Примечание» об этом сообщает. Объединение трёх факторов в один фиксирует две корреляции и приравнивает корреляции, которые объединяемые факторы имели с остальными. Собственные степени свободы lavaan учитывают и то и другое, так что Δdf верно без подсчёта на стороне модуля. Другие привычные пары не распознаются: фактор второго порядка против коррелирующих факторов первого порядка накладывает на ковариационную матрицу факторов ограничение пропорциональности, а не фиксированное значение, а бифакторная модель вообще не вложена в модель с коррелирующими факторами. Такие пары отклоняются, если они не записаны в одних и тех же именах параметров, и корректным путём остаётся ручная перепараметризация: F1 ~~ 1*F2 фиксирует ковариацию, которая равна корреляции только при масштабировании Фиксированная дисперсия (дисперсия фактора = 1), поэтому записывайте ограниченную модель при таком масштабировании или фиксируйте и дисперсии.
Δχ² оценивается на основном уровне значимости, а p точного соответствия каждой модели — на уровне для проверки допущений. Нулевая гипотеза критерия разности — что более ограниченная модель подходит не хуже свободной, а какую из двух оставить, решает гипотеза исследователя, а не проверка допущения, поэтому его p оценивается там же, где p таблиц результатов. Строка p в таблице индексов — собственный критерий χ² точного соответствия каждой модели с обратной нулевой гипотезой, и она оценивается на уровне значимости для проверки допущений, как в таблице соответствия одной модели. При робастном методе оценки разность вычисляет anova(): он передаёт вызов lavTestLRT из lavaan и, если у подгонок есть масштабированная статистика, возвращает масштабированный критерий разности Саторры — Бентлера, поэтому результат не равен разности двух масштабированных χ², напечатанных выше.
ΔCFI и ΔRMSEA выделяются вместе, по диапазону Чена для n подгонок. Δχ² растёт с объёмом выборки сам по себе, и практические индексы служат противовесом, тем более что обе подгонки уже есть. Правило то же, что на карточке инвариантности, — направленное и с подтверждением: пара выделяется, только если ограниченная модель хуже по обоим индексам, то есть ΔCFI не выше −0.010, а ΔRMSEA не ниже 0.015 при числе наблюдений больше 300 и −0.005 и 0.010 при 300 и меньше. Эти границы предложил Чен (Chen, 2007), и сдвиг одного индекса в одиночку свидетельством не считается. ΔSRMR здесь не вычисляется, так что подтверждение даёт только RMSEA, а выделение — пометка рядом с критерием, а не заключение. У проверенной пары по построению одно n, и диапазон выбирается по нему.
Для сравнения модели подгоняются заново без бутстрэпа. Карточка показывает индексы соответствия и критерии отношения правдоподобия, зависящие только от точечных оценок. Бутстрэп-выборки сдвинули бы лишь стандартные ошибки и доверительные интервалы, которых карточка не показывает, ценой бутстрэпа на каждую модель в очереди.
Конфирматорный факторный анализ
Диагностика данных
KMO и критерий Бартлетта при вырожденной матрице не выводятся. Оба вычисляются через обратную корреляционную матрицу. Если solve() не срабатывает, KMO() из psych возвращает ровно 0.5 для каждой переменной (заглушку, неотличимую без её флага от настоящего значения), а статистика Бартлетта, построенная на −log|R|, расходится по мере того, как детерминант стремится к нулю, и потому гарантированно значима именно по той причине, по которой модель нельзя подогнать. Любая из них поставила бы бессмысленное число рядом с рангом, который всё объясняет, поэтому обе выводятся как Ненадёжно (сингулярная матрица): KMO — всякий раз, когда обращение не удалось или какая-то пара коррелирует идеально, критерий Бартлетта — ещё и тогда, когда матрица не положительно определена или какая-то переменная точно воспроизводится другими. Рекомендации следуют тому же правилу: ни строки о низком KMO, ни строки о незначимом критерии Бартлетта для матрицы, которую проверки ранга уже отбраковали.
Расстояния для выбросов по умолчанию робастные, а классический запасной вариант сравнивается с точным нулевым распределением. Классическое расстояние Махаланобиса отсчитывается от среднего и ковариации, которые раздувают сами выбросы, поэтому сгруппированные выбросы маскируют друг друга. Минимальный определитель ковариации Руссеу (Rousseeuw, 1984), вычисляемый через MASS::cov.rob, оценивает центр и разброс по самой плотной половине наблюдений, при зерне воспроизводимости. MCD нужен запас наблюдений над переменными и невырожденный разброс в каждом столбце, поэтому он запускается, только если полных наблюдений более чем вдвое больше, чем переменных. Если это условие не выполнено, если подгонка MCD завершается ошибкой или его матрица разброса вырождена, его заменяет классическая оценка, названная на карточке вместе с причиной. Порог зависит от метода. Квантиль 0.999 распределения χ² — асимптотическое нулевое распределение робастного расстояния, центр и разброс которого не зависят от измеряемой строки. Классическое же расстояние ограничено сверху величиной (n − 1)²/n, которая при любом числе индикаторов, встречающемся в модели, ниже этого квантиля, поэтому его сравнивают с точным нулевым масштабированным бета-распределением Уилкса (Wilks, 1963). Таблица наблюдений ограничена 50 наибольшими расстояниями, поскольку робастный запуск может отметить большую долю выборки.
Одномерные границы — |асимметрия| > 2 и |избыточный эксцесс| > 7 по G1 и G2. Это значения, за которыми, по данным Уэста, Финча и Каррана (West, Finch & Curran, 1995), χ² и стандартные ошибки ML начинают искажаться. Они сформулированы для выборочных оценок с поправкой на смещение, поэтому диагностика использует те же G1 и G2, что и остальное приложение, а не формы для генеральной совокупности, и асимметрия столбца здесь совпадает с асимметрией в модуле описательной статистики. У постоянного столбца формы нет, и им занимается проверка дисперсии.
Почти нулевая дисперсия определяется по правилу caret. Столбец отмечается, если он постоянен или если самое частое значение встречается в 19 раз чаще второго, а различных значений меньше 10%. Эти пороги — значения по умолчанию caret::nearZeroVar, описанные Куном и Джонсоном (Kuhn & Johnson, 2013). Только оба условия вместе выделяют столбец, почти постоянный, а не просто скошенный или грубый, и таблица выводит оба числа, чтобы отметку можно было проверить.
Предупреждение о пропусках срабатывает и по всей таблице, и по отдельной переменной. Число полных наблюдений при построчном удалении, по которому оцениваются строки объёма выборки, определяет худшая переменная, а не среднее, так что таблица, пустая на 2%, может всё равно потерять пятую часть наблюдений из-за одного индикатора. Поэтому рекомендация выдаётся, если таблица пуста больше чем на 5% или какая-либо переменная — больше чем на 20%, и таблица по переменным выделяет второй случай полужирным.
Результаты для одной группы
Ячейки p критерия χ² и критерия близкого соответствия оцениваются на уровне значимости для проверки допущений. Во всех текстах по МСУ χ² модели приводится на уровне 0.05 и читается рядом с индексами соответствия, а не как заключение. Это и было доводом оставить его ячейку на основном уровне. И всё же он оценивается на уровне значимости для проверки допущений, потому что его нулевая гипотеза — точное соответствие — обратная. Если пользователь снизит основной уровень до 0.01 ради путей, невыделенное p = 0.03 вводило бы в заблуждение, тихо сообщая «модель подходит», а исключение для одной таблицы пришлось бы документировать так же тщательно, как правило, которое оно нарушает. p критерия близкого соответствия RMSEA (нулевая гипотеза: RMSEA ≤ 0.05) — критерий того же рода и оценивается на том же уровне. Строка p на карточке сравнения моделей — тот же критерий χ² для каждой модели и следует тому же правилу.
Проверка измерительной инвариантности
Δχ² каждого шага инвариантности оценивается на уровне значимости для проверки допущений. Его нулевая гипотеза — что ограничение выполняется. Предпочтение ΔCFI перед критерием разности χ², которое отдают Чеунг и Ренсволд (Cheung & Rensvold, 2002) и Чен (Chen, 2007), касается выбора критерия, а не α: Δχ², если он вообще входит в заключение, — проверка допущения, и оценивается он там же, где остальные такие проверки, а вместе с ним и структурный уровень, решаемый одним Δχ². При робастном методе оценки разность вычисляет anova(): он передаёт вызов lavTestLRT из lavaan и, если у подгонок есть масштабированная статистика, возвращает масштабированный критерий разности Саторры — Бентлера, поэтому результат не равен разности двух масштабированных χ², напечатанных в таблице.
Уровень не пройден, только если критерий Δχ² и практические критерии согласны, а практические критерии направленные и требуют подтверждения. Критерий разности χ² с ростом выборки становится чувствителен к незначительным различиям, а ΔCFI, ΔRMSEA и ΔSRMR — нет, поэтому ни одной из двух сторон не позволено провалить уровень в одиночку: если отвергают обе, заключение — Не пройдено, если одна — Неоднозначно. Практические критерии взяты у Чена (Chen, 2007): ΔCFI — основной и считается нарушенным, только если его подтверждает ΔRMSEA или ΔSRMR, поскольку ΔSRMR на уровнях свободных членов и остатков шумит, и отметка по любому одному из трёх позволила бы ему в одиночку забраковать действительно инвариантную модель. Учитывается только ухудшение: ограниченная модель, которая случайно подходит лучше, не свидетельствует против инвариантности. Чен приводит один диапазон для общего N больше 300 (ΔCFI −0.010, ΔRMSEA 0.015, ΔSRMR 0.030 для нагрузок и 0.010 для свободных членов, порогов и остатков) и более строгий для N не больше 300 (−0.005, 0.010, 0.025 и 0.005), а при заметно неравных размерах групп советует более строгий диапазон и при большом N. Модуль считает размеры заметно неравными, если наибольшая группа более чем вдвое больше наименьшей, каким бы ни был общий объём. Примечание на карточке называет действующий диапазон и N, по которому он выбран. Чеунг и Ренсволд (Cheung & Rensvold, 2002) цитируются рядом с предложенным ими порогом ΔCFI, а не рядом с критерием χ².
Структурный уровень оценивается только по Δχ² и не выдвигает кандидатов на освобождение. Пороги Чена охватывают нагрузки и семейство свободных членов, порогов и остатков. Опубликованных порогов ΔCFI, ΔRMSEA или ΔSRMR для латентных дисперсий и ковариаций нет, а заимствование диапазона остатков выдало бы произвольное число за критерий. Поэтому диапазона у этого уровня нет, его значения Δ выводятся для справки без собственного заключения, и он может быть пройден или не пройден, но никогда не бывает Неоднозначно. Кандидатов для частичной инвариантности он тоже не предлагает: латентная дисперсия, различающаяся между группами, — это содержательный вывод о конструктах, достойный отчёта, а не мешающий параметр, который освобождают по пути к более высокому уровню.
Несошедшийся уровень считается неудавшимся. Подгонка, упёршаяся в предел итераций, — обычный объект lavaan с полным набором индексов соответствия, так что все последующие потребители (сравнение Δ, скор-тесты, латентные средние) прочли бы её так, будто она сошлась. Исполнитель отвергает её прямо там, где она подгоняется: уровень называется в сообщении, исключается из сравнений, и каскад на нём останавливается, как и на уровне, который lavaan не смог подогнать вовсе.
Бутстрэпом оценивается только уровень латентных средних. Больше ничего из того, что сообщает каскад, от стандартной ошибки не зависит: χ², критерий Δχ², CFI, RMSEA, SRMR и скор-тесты — точечные оценки, а lavTestScore при неаналитической ковариационной матрице в любом случае переходит на обычный скор-тест. Бутстрэп каждого уровня к тому же давал бы lavaan ковариационную матрицу неполного ранга всякий раз, когда повторов меньше, чем свободных параметров, а lavaan сообщает об этом как о неидентифицируемой модели: при обычном числе повторов такое предупреждение возвращал каждый уровень. Стандартная ошибка читается только в таблице латентных средних и только на одном уровне, поэтому с бутстрэп-ошибками заново подгоняется только он, при зерне бутстрэпа.
Порядковые индикаторы получают каскад semTools с идентификацией Ву и Эстабрука. lavaan фиксирует свободные члены порядковых индикаторов на 0, поэтому каскад, построенный вручную и приравнивающий свободные члены, ничего не ограничивает, а только освобождает латентные средние: у его «скалярной» модели степеней свободы меньше, чем у метрической, в которую она должна быть вложена, и критерий разности χ² просто не работает. Поэтому уровни генерирует semTools::measEq.syntax() с идентификацией Ву и Эстабрука (Wu & Estabrook, 2016) и тета-параметризацией, при которых уровни вложены корректно. Идентификация задаётся фиксированными латентными дисперсиями при любом масштабировании модели, поскольку при маркерном масштабировании латентные средние перестают быть идентифицированными, как только свободные члены фиксируются для задания шкалы пунктов. У бинарного пункта один порог, идентифицируемый только вместе с его нагрузкой, поэтому пороговый уровень вставляется, только если у какого-то пункта больше двух категорий, а набор из одних бинарных пунктов приравнивает пороги и нагрузки за один шаг, названный по обоим и проверяемый скор-тестами для обоих видов параметров. Его скалярный уровень устроен по-своему, а строгий и структурный уровни отбрасываются. Генератор заново создаёт все параметры, так что определение :=, ограничение == или фиксированный либо помеченный модификатор модели ни в одну подгонку каскада не попадает, и каждая такая строка перечисляется на карточке, а не исчезает незаметно.
Бинарный каскад берёт латентные средние со скалярного уровня, который приравнивает и остаточные дисперсии. Как показали Ву и Эстабрук (Wu & Estabrook, 2016, утверждение 6), для бинарных пунктов одни лишь равные пороги и нагрузки эквивалентны конфигуральной модели. Метрический уровень, который генерирует measEq.syntax, при тета-параметризации вдобавок фиксирует остаточные дисперсии на 1 во всех группах, и это делает его их моделью из утверждения 12: она проверяема, свободные члены латентных откликов в ней оцениваются во всех группах, кроме первой, но латентные средние каждой группы фиксированы на 0. Приравнивание одних свободных членов, очевидный следующий шаг, даёт их модель из утверждения 11, которая снова освобождает остаточные дисперсии: у неё меньше степеней свободы, чем у метрического уровня, она в него не вложена и при проверке оказалась слабо идентифицированной. Поэтому скалярный уровень приравнивает пороги, нагрузки, свободные члены и остаточные дисперсии вместе, будучи вложен в метрический с дополнительными степенями свободы для G групп, J пунктов и m факторов, и освобождает латентные средние во всех группах, кроме опорной. В отчёте он описан как приравнивающий свободные члены, поскольку остаточные дисперсии были равны уже на метрическом уровне. Строгий и структурный уровни по-прежнему отбрасываются.
Проверка. На смоделированных бинарных данных (шесть пунктов на двух факторах, две группы, сдвиг первого фактора на 0.5 SD) скалярный уровень подогнан при df 24 против 20 у метрического, Δχ² 3.1 при 4 df (p = 0.54), и сдвиг оценён в 0.621 (SE 0.127). В 60 повторах при n 300 на группу среднее составило 0.477 для сдвинутого фактора и 0.002 для другого при покрытии 95%, а скалярный уровень отвергался в 8% случаев на уровне 0.05.
Нагрузки высшего порядка остаются свободными между группами. lavaan применяет group.equal = "loadings" и к строкам =~, где латентная переменная нагружает на латентную, так что метрический уровень модели второго порядка приравнял бы и нагрузки высшего порядка и проверял бы больше, чем измерительную инвариантность, которая определяется по нагрузкам индикаторов на факторы. Непрерывный каскад освобождает их через group.partial на каждом уровне и называет на карточке. Маркерная нагрузка остаётся фиксированной, иначе у фактора высшего порядка не было бы шкалы в группах после первой.
Кандидаты ранжируются по скор-тесту на ограниченном уровне, а не по исходной разности. Разность оценок между группами зависит от шкалы: 0.1 — много для стандартизованной нагрузки и пустяк для свободного члена пункта со шкалой от 1 до 7. Взятая из конфигуральной подгонки, она к тому же впитывает любой разрыв латентных средних в свободные члены и вовсе не может затронуть маркерную нагрузку, так что выдвигает инвариантные параметры. lavTestScore на собственной ограниченной подгонке уровня показывает, насколько улучшилось бы соответствие при снятии одного равенства, и это сопоставимо между нагрузками, свободными членами, порогами и остаточными дисперсиями. Параметр, приравненный между более чем двумя группами, несёт несколько ограничений и проверяется на их совместное снятие. Столбцы по группам рядом — справочные и взяты с предыдущего уровня, где параметр ещё был свободен: на ограниченном уровне они были бы одинаковыми, а в порядковом каскаде — константами идентификации, 0 в каждой ячейке свободного члена и 1 в каждой ячейке остаточной дисперсии.
Порядковые скалярный и строгий уровни подгоняются заново в форме, которую может прочесть скор-тест. lavTestScore проверяет только ограничения == подгонки, а measEq.syntax не приравнивает через == ни свободные члены латентных откликов на скалярном уровне, ни остаточные дисперсии на строгом: при идентификации Ву и Эстабрука он фиксирует их в каждой группе на опорных значениях, 0 и 1. В сгенерированном виде эти уровни не дают скор-тесту ничего снять. Поэтому в каждой группе после первой каждая такая фиксированная строка освобождается и закрепляется на прежнем значении ограничением ==. Модель та же, с тем же числом параметров, χ², степенями свободы и индексами соответствия, но её ограничения скор-тест снять может, причём параметр, охватывающий несколько групп, — при стольких же степенях свободы, сколько у повторной подгонки, которая его освобождает. modindices здесь не замена, поскольку игнорирует ограничения равенства, как и lavTestScore(add = …), который сливает добавленную строку с фиксированной, уже имеющейся в модели, и возвращает пустой критерий. Переписывается только класс параметров самого уровня: бинарный скалярный уровень сохраняет остаточные дисперсии равными 1, как на метрическом, а свободные члены непрерывного пункта, которые lavaan и так приравнивает через ==, остаются как есть.
Проверка. На смоделированных порядковых данных (2 фактора × 3 пункта, n 300 на группу, свободный член одного пункта сдвинут в группах после первой) сдвинутый пункт оказывался первым в 60 повторах из 60 на бинарных и четырёхкатегориальных наборах с 2 и 3 группами, а его скор-тест отличался от немасштабированного Δχ² освобождающей его повторной подгонки не больше чем на 0.42. На нулевых наборах p ниже 0.05 дали 2 проверки пунктов из 180. На одном наборе с 3 группами и 4 категориями скор-тест дал 13.92 против 13.88 у повторной подгонки.
Ожидаемое изменение вычисляется только для выдвинутых кандидатов. Скор-тест показывает, улучшит ли снятие ограничения соответствие, но не насколько различается параметр, а это зависит от объёма выборки. Ожидаемое изменение параметра, предложенное Сарисом, Саторрой и Сёрбомом (Saris, Satorra & Sörbom, 1987), даёт величину в единицах самого параметра, а его влияние на латентные средние, по Оберски (Oberski, 2014), показывает, важно ли различие для того сравнения, ради которого и существует каскад. Ожидаемое изменение каждого кандидата требует собственного вызова lavTestScore (несколько секунд на модели с тремя группами), поэтому его вычисляют только для кандидатов с p ниже уровня значимости. При числе групп больше двух таким вызовом служит совместная проверка кандидата. Столбец латентного среднего выводится там, где подгонка уровня оценивает латентные средние, и только для параметра, измеряющего один фактор.
Проверка. На том же наборе с 3 группами ожидаемое изменение сдвинутого свободного члена составило 0.431 и 0.430 против 0.381 и 0.379 у повторной подгонки, а ожидаемые средние фактора — 0.195 и 0.207 против 0.201 и 0.214.
Кандидаты освобождаются по одному. Каждый скор-тест в таблице вычисляется на полностью ограниченном уровне, то есть показывает, что даст снятие его ограничения, пока выполняются все остальные, включая ограничение на параметр, который действительно различается. Поэтому один неинвариантный параметр завышает статистики соседей: на скалярном уровне латентное среднее впитывает часть сдвига одного свободного члена, и другие свободные члены того же фактора выглядят сдвинутыми в обратную сторону. Освобождение параметра с наивысшим рангом и повторное ранжирование убирают это перетекание, а освобождение всего отмеченного за один проход освобождает и инвариантные параметры и ослабляет сравнение, ради которого существует каскад. Карточка предупреждает об этом над таблицами, а кнопки Применить всё же позволяют освободить несколько параметров сразу, если у пользователя есть содержательная причина.
Проверка. На смоделированных порядковых данных (3 группы, 4 категории, n 300 на группу, один свободный член сдвинут в группах 2 и 3) соседние по фактору пункты достигали p < 0.05 в 33–73% повторов. Освобождение одного сдвинутого пункта и повторное ранжирование снизили наибольшую из статистик соседних пунктов с χ² 15.1 до 2.4.
У каждого фактора остаются два инвариантных индикатора, если только уровень не приравнивает одни остаточные дисперсии. Шкала фактора сопоставима между группами, только пока его опорный индикатор и хотя бы ещё один инвариантны на этом уровне. Без этого латентные средние и дисперсии уже не лежат в одной метрике, поэтому применение, после которого у фактора осталось бы меньше двух инвариантных индикаторов, отклоняется. Остаточная дисперсия никак не задаёт шкалу фактора, поэтому на уровне, который приравнивает только остаточные дисперсии, то есть на строгом, их можно освобождать сколько угодно.
Повторный запуск подгоняет модель, на которой выдвинуты параметры, а освобождённые параметры накапливаются. Освобождённый параметр — это имя в таблице параметров этой модели, а group.partial в lavaan без предупреждения игнорирует запись с именем параметра, которого в модели больше нет. Поэтому повторный запуск на том, что к этому времени находится в редакторе, мог бы незаметно проверить другую модель, освободив меньше, чем заявлено. Вместо этого повторный запуск воспроизводит собственные синтаксис, параметры и групповую переменную карточки. Параметр, освобождённый на одном уровне, остаётся свободным на всех следующих, поскольку каждый из них вложен в уровень, где он был освобождён.
Латентные средние сравниваются относительно канонической опорной группы и по умолчанию — по объединённому SD. Если не указано иное, lavaan упорядочивает группы по первому появлению в данных, поэтому каскад передаёт уровни групповой переменной в их собственном порядке, и опорной группой оказывается первый уровень при любом порядке строк: пересортировка файла не может поменять знак всех различий. Средние берутся со скалярного уровня, первого, который их идентифицирует, и ни с какого другого. Все более ранние уровни, включая бинарный метрический, фиксируют латентные средние каждой группы на 0, так что каскад с неподогнанным скалярным уровнем средних не выводит, вместо того чтобы показать таблицу нулей, которую можно принять за оценки. Все уровни вплоть до скалярного должны выполняться: равные свободные члены при неравных нагрузках оставляют шкалы несоизмеримыми, поэтому карточка предупреждает, если какой-то уровень не пройден. Стандартизованное различие делится на латентное SD, объединённое по группам с весами n − 1 каждой группы, по Хэнкоку (Hancock, 2001), что ставит все группы в одну метрику. Собственное SD каждой группы (std.all в lavaan) перестаёт быть общей метрикой, как только латентные дисперсии освобождены, а они свободны на всех уровнях ниже структурного. Отсюда и переключатель, и роль заключения структурного уровня как проверки предположения об объединении.