На этой странице

Факторный анализ — методические заметки

Решения, на которых построен модуль факторного анализа: какие оценщики, пороги, отказы и запасные варианты стоят за каждой карточкой, и подтверждающие их числа. Все числа получены на наборе-примере (cafe.ru.csv, спецификация лежит рядом). Разделы следуют разделам руководства.

Требования

Число факторов за границей Ледермана отклоняется, а не подгоняется. Корреляционная матрица p переменных содержит p(p−1)/2 различных чисел, и модель общих факторов тратит этот запас на каждую нагрузку и каждую уникальность. За границей Ледермана модель оценивает больше параметров, чем определяет матрица, поэтому бесконечно много решений подходят одинаково хорошо, и возвращённое решение произвольно. psych::fa() в подгонке не отказывает и возвращает нагрузки при нулевом или отрицательном числе степеней свободы. Поэтому модуль вычисляет границу по числу переменных, делает её верхним пределом трёх полей числа факторов, уменьшает оставшееся значение при смене набора переменных или метода извлечения и отклоняет на шагах 2 и 3 введённое вручную большее значение с сообщением, где назван максимум. У АГК границы нет: компоненты вычисляются из матрицы, а не оцениваются, определены все p компонент, и при p компонентах разложение не теряет информации.

Шаг 1: метод и настройки

Тип «Смешанная» выбирает оценщик для каждой пары по заданным типам переменных и группирует их так же, как сама mixedCor(). Параметр делит выбранные переменные на непрерывные, политомические (три категории и больше) и дихотомические столбцы и передаёт их в psych::mixedCor(): внутри непрерывной группы вычисляется корреляция Пирсона, внутри порядковой — полихорическая, между группами — полисериальная и бисериальная. Если все столбцы порядковые, вызывается одна polychoric(), которая обрабатывает двухкатегориальный пункт точно так же, как tetrachoric(). Группа определяется по типу, заданному в панели данных, и никогда по значениям. Столбец 0/1, импортированный как непрерывный, остаётся с корреляцией Пирсона, поскольку при импорте все числовые столбцы получают непрерывный тип, а вывод дихотомии из двух наблюдаемых значений превратил бы любой индикатор «да/нет» в латентный континуум без ведома пользователя. Те же три вектора индексов используются для бутстрэп-выборок и для нулевой модели параллельного анализа, так что бутстрэп-выборка, в которую случайно не попала редкая категория, не может сменить оценщик пункта только для этого повтора.

Порядковый пункт больше чем с 8 категориями попадает в непрерывную группу, а если порядковых столбцов не осталось, расчёт переходит на корреляции Пирсона и сообщает об этом. polychoric() прерывается, если категорий больше её max.cat, равного 8 (после примерно семи категорий категориальный и непрерывный подходы всё равно сближаются). Поэтому модуль не срывает весь расчёт из-за пункта 0–10 с порядковым типом, а переводит его в непрерывную группу во всех его парах и называет в оповещении, чтобы частично пирсоновскую матрицу не приняли за полностью полихорическую. Если после такого перевода или при заданных типах ни в одной порядковой группе не осталось столбцов, выполняется обычная cor(), и второе оповещение сообщает о переходе, поскольку по самому решению нельзя понять, каким оценщиком оно получено. Оба оповещения прикрепляются к каждой карточке, рассчитанной по матрице: пригодности, шага 3 и сравнения.

Проверка. На данных кафе шесть пунктов с порядковым типом дают полихорическую матрицу (нагрузки 0.79/0.61/0.69 и 0.59/0.73/0.66, φ = 0.39, 48.2% дисперсии). Те же шесть пунктов с непрерывным типом переходят на корреляцию Пирсона с оповещением, а возраст с порядковым типом рядом с пятью пунктами переводится в непрерывные и называется по имени.

Порядковые коды переводятся в ранги 1…k ещё до оценивания. psych перекодирует порядковый столбец сдвигом минимума и функцией tabulate(), которая отбрасывает дробную часть, поэтому кодировка с нецелым шагом доходит до оценщика в виде вымышленных частот ячеек: 0/0.5 даёт тетрахорическую корреляцию с обратным знаком, а 1/1.5/2/2.5 обрывает polychoric() ошибкой «non-conformable arrays». Поэтому модуль сначала заменяет каждый порядковый столбец рангами его различных значений. Если коды уже последовательные целые числа, оценщик не отличит ранги от исходных значений, поскольку учитывает только порядок и частоты.

Максимальное правдоподобие, альфа-факторизация и минимальный ранг останавливаются перед неположительно определённой матрицей, а остальные методы работают со сглаженной. Эти три метода на такой матрице неизменно отказывают (L-BFGS-B needs finite values of 'fn' у максимального правдоподобия, infinite or missing values in 'x' у двух других), поэтому модуль останавливается с названным диагнозом и наименьшим собственным значением ещё до подгонки. Собственное значение должно превысить √ε, а не ноль, поскольку значение, которое выше нуля лишь на ошибку округления, всё равно приводит к сбою fa(fm = "ml"). Карточка шага 2 и проверка шага 3 используют один и тот же порог, так что одна матрица не может пройти одну проверку и не пройти другую. Остальные методы позволяют psych сгладить матрицу и продолжают работу с предупреждением. Матрица, которую polychoric() или mixedCor() сгладили ещё при построении, после этого выглядит положительно определённой, поэтому предупреждение, полученное при построении, переносится в то же оповещение, а не теряется. Сильно неположительно определённая матрица всё же может сорвать один из остальных методов, особенно взвешенный МНК, и тогда ветка после подгонки выдаёт тот же диагноз вместо ошибки R.

Взвешенный χ² по минимальному объёму выборки выполняется с равными весами. Метод minchi из psych взвешивает каждый квадрат остатка числом наблюдений, по которым вычислена его корреляция, и отличается от других подгонок только на матрице, построенной по попарно полным наблюдениям. Модуль работает с полными наблюдениями, поэтому у каждой пары одно и то же число наблюдений, и критерий сводится к критерию наименьших квадратов. Матрица попарных чисел наблюдений всё равно передаётся явно, поскольку без неё fa(), получив корреляционную матрицу, без предупреждения заменяет метод минимальным остатком. Вариант сохранён ради соответствия psych и диалогу сравнения.

Проверка. На пунктах кафе метод воспроизводит минимальный остаток с точностью до 0.01.

Бифакторным вращениям нужны три фактора и извлечение общих факторов, а биквартимин выполняется по критерию Дженнриха — Бентлера. Бифакторная модель — это общий фактор и хотя бы два групповых, поэтому при числе факторов меньше трёх оба вращения вырождаются: GPArotation при двух факторах сразу выдаёт ошибку, а один фактор дал бы обычное решение с подписью «бифакторное». Модуль останавливается до подгонки и на шаге 3, и в сравнении. При АГК семейство недоступно, поскольку моделирует общий фактор наряду со специфической дисперсией переменных, а у компоненты её нет. Косоугольный вариант называется Биквартимин (косоугольный бифакторный), поскольку psych под этим именем выполняет косоугольное бифакторное вращение Дженнриха и Бентлера, а не исходный биквартимин Кэрролла, и из этого следуют и навязываемый общий фактор, и минимум в три фактора. По той же причине к нему не применяется преобразование Шмида — Леймана: его общий фактор второго порядка лёг бы поверх уже навязанного.

При АГК сохраняются косоугольные вращения и сравнение методов извлечения. Невращённые компоненты ортогональны по построению, но ничто не заставляет вращённые оставаться такими. Косоугольное вращение главных компонент — обычная практика (SPSS предлагает прямой облимин и промакс при извлечении главных компонент), поэтому модуль выводит для них матрицу корреляций компонент и структурную матрицу так же, как для факторного решения. Диалог сравнения при АГК доступен, поскольку сопоставление компонентного решения с извлечениями общих факторов — та проверка устойчивости, которой литература требует от такого решения, и конгруэнтность Такера её обеспечивает.

Проверка. Две компоненты кафе показывают конгруэнтность от 0.995 до 0.998 с решением каждого факторного метода.

Каждое вращение модуль выполняет сам по невращённой подгонке, с двадцатью случайными стартами при зерне воспроизводимости. Собственный флаг normalize из psych для большинства предлагаемых методов до вращения не доходит: Promax его игнорирует, а повторная подгонка fa() с несколькими стартами отбрасывает дополнительные аргументы. Поэтому подгонка запрашивается с rotate = "none", а нагрузки модуль вращает сам. На соответствие модели данным это не влияет: все его статистики инвариантны к вращению. Варимакс, кластерное вращение и промакс вызываются напрямую с выключенной собственной нормализацией, а все остальные вращения идут через faRotations() с двадцатью случайными стартами, поскольку у каждого критерия есть локальные оптимумы. Старты генерируются с настройкой Зерно воспроизводимости, так что повторный запуск и каждый коэффициент конгруэнтности, который сравнение вычисляет по нагрузкам, воспроизводимы. Затем знаки и порядок столбцов задаются так же, как в psych, то есть по суммам квадратов, взвешенным Φ для факторного решения, и факторы сохраняют нумерацию psych. Несошедшееся вращение помечается как таковое, а не выдаётся за сошедшееся.

Нормализация Кайзера — масштабирование строк до и после вращения, по умолчанию включённое только для варимакса. Строка нагрузок каждой переменной перед вращением делится на свою длину, а после вращения умножается обратно, так что пункт с низкой общностью влияет на положение осей наравне с хорошо измеренным (нормализация Кайзера). Модуль применяет её сам, а не через psych (по причине, описанной выше), поэтому она действительно работает для любого вращения, в том числе при АГК. Флажок следует соглашению для каждого вращения. Он отмечается при выборе варимакса (SPSS нормализует варимакс, и psych вычислял варимакс с нормализацией независимо от значения флага) и снимается для всех остальных вращений, эталонные реализации которых в GPArotation по умолчанию работают без нормализации. Пока вращение не выполняется (Без вращения или один фактор), флажок недоступен и снят, а восстановление значения по умолчанию при возврате не даёт переходу 3 → 1 → 3 незаметно потерять нормализацию варимакса. Поскольку значение по умолчанию зависит от вращения, две карточки с одинаковыми извлечением и вращением в заголовке могут содержать разные решения. Поэтому, если вращение выполнялось, карточка результатов записывает под числом факторов Нормализация Кайзера: Да или Нет, и экспортированная карточка сохраняет эту настройку.

Проверка. На решении кафе с облимином два состояния различаются в нагрузках не больше чем на 0.02 и меняют φ с 0.41 на 0.39.

Шаг 2: определение числа факторов

Выводы зависят от настройки интерпретации, оповещения — никогда. При выключенной настройке интерпретации строки KMO, детерминанта, наименьшего собственного значения и отношения наблюдений к переменным показывают только числа, а строка критерия Бартлетта — только p-значение. Оповещения под таблицей выводятся при любой настройке: неполный ранг, идеально коррелирующая пара, неположительно определённая матрица, мультиколлинеарность, пара с |r| выше 0.9, квадрат множественной корреляции выше 0.99, сглаживание при построении, переход смешанного оценщика на корреляции Пирсона и перевод переменных в непрерывные, недостаточная KMO, незначимый критерий Бартлетта и малая выборка. Первые два главных вывода и есть решение о том, поддаются ли переменные факторизации вообще, и при выключенной интерпретации только в оповещении они сформулированы явно. Оповещение о KMO появляется при значении ниже 0.5 в том виде, в каком оно выведено, и не выводится, если значение — заглушка: тогда причину называет оповещение о ранге или об идеальной паре. Оповещение о критерии Бартлетта использует уровень значимости для проверки допущений, поскольку критерий проверяет допущение, а не содержательную гипотезу. Оповещения упорядочены так, чтобы оповещение о причине шло раньше оповещений о её симптомах: неполный ранг идёт первым, оповещение о неположительной определённости выводится один раз, а оповещение о мультиколлинеарности не выводится, если детерминант уже объясняют неположительно определённая матрица или идеальная пара.

Вывод критерия Бартлетта не ставится на сингулярной или почти сингулярной матрице, а к его p-значению на ранговой или полихорической матрице добавляется оговорка. Статистика psych::cortest.bartlett() равна −(n−1−(2p+5)/6)ln⁡|R| и расходится, когда детерминант стремится к нулю. Поэтому на сингулярной или почти сингулярной матрице χ² раздувается до заведомой значимости, а p-значение падает до 0 при любых данных. NaN функция возвращает только в более тяжёлом случае, когда детерминант становится отрицательным. Вывод поэтому заменяется на Ненадёжно (сингулярная матрица) при тех же признаках, по которым ненадёжной считается мера KMO, и дополнительно на неположительно определённой или неполноранговой матрице, где solve() ещё срабатывает и собственный сигнальный признак KMO не появляется. Строка легенды объясняет, почему вывода нет. Вторая оговорка статистическая, а не вычислительная: χ² и его эталонное распределение выведены для выборочной матрицы Пирсона, а элементы матрицы Спирмена, полихорической или полисериальной имеют иную выборочную изменчивость. На любой из них p-значение в лучшем случае приближённое, и строка об этом сообщает. Исключение — расчёт с типом Смешанная, перешедший на обычные корреляции Пирсона: его матрица пирсоновская, что бы ни было выбрано в списке.

Для вывода по детерминанту нужен второй признак, не зависящий от числа пунктов. Детерминант корреляционной матрицы геометрически убывает с ростом числа переменных при любых данных: при равномерной r = 0.3 он около 3.1·10⁻⁴ для 30 переменных и 1.2·10⁻⁵ для 40, так что у любого опросника из 40 пунктов, избыточен он или нет, детерминант оказывается ниже фиксированного порога Филда 0.00001. Модуль выводит число и порог, но ставит вывод Обнаружена мультиколлинеарность и показывает оповещение, только если с этим согласна одна из трёх проверок, не зависящих от числа пунктов: неполный ранг (qr()), пара с корреляцией выше 0.9 по модулю или переменная, квадрат множественной корреляции которой с остальными выше 0.99. Иначе стоит Приемлемая, так что крошечный детерминант без оповещения следует понимать как следствие размера матрицы, а не как свидетельство избыточности. Проверка пар выводится в собственном оповещении безусловно, поскольку детерминант оценивает избыточность всей матрицы и не называет переменных, а оповещение о паре указывает два пункта, которые стоит исключить или объединить. К тому же одна почти дублирующая пара в остальном благополучном наборе часто оставляет детерминант заметно выше порога. Шаг 3 повторяет ту же проверку на подогнанном решении. Проверка квадрата множественной корреляции стоит здесь, а не только после шага 3, поскольку пункт, почти полностью восстанавливаемый по остальным, почти наверняка даст случай Хейвуда в извлечённом решении, и назвать его до параллельного анализа дешевле, чем после.

На сингулярной матрице KMO, MSA по переменным и частные корреляции антиобраза не выводятся, а причину называет оповещение о ранге. psych::KMO() обращает корреляционную матрицу и при неудаче solve() возвращает ровно 0.5 для каждой переменной, а в качестве антиобраза — саму корреляционную матрицу. Такие числа неотличимы от настоящего, пусть и очень плохого, измерения. Поэтому модуль сам проверяет в R solve(cor_matrix) и передаёт результат флагом, а идеальная или почти идеальная пара (|r| выше 0.9999) сразу делает меру KMO ненадёжной, поскольку по построению делает матрицу сингулярной. При этих признаках вывод KMO — Ненадёжно (сингулярная матрица), а таблица MSA по переменным и список наибольших пар не выводятся независимо от флажка. Не выполняется и проверка почти полностью предсказуемых переменных, требующая той же обратной матрицы: на сингулярной матрице запасные ветки smc() ошибаются в обе стороны, показывая низкий квадрат множественной корреляции у переменной, которая точно равна сумме пяти других, и отмечая благополучные. Избыточность, охватывающая три переменные и больше (суммарный балл, анализируемый вместе со своими пунктами), оставляет все попарные |r| ниже этого порога, поэтому ранг вычисляется напрямую через qr(). Если он неполный, каждая избыточная переменная называется вместе с переменными, из которых она воспроизводится. Они определяются по весам её столбца на блоке полного ранга и записываются как Total ← Item A, Item B, Item C. Это оповещение идёт первым, поскольку всё остальное на карточке зависит от него.

Наименьшее собственное значение оценивается по порогу предварительной проверки извлечения. Строка использует тот же допуск √ε, что и отказ при неположительно определённой матрице перед подгонкой, а не голый ноль. Поэтому матрица, которая отстоит от сингулярной лишь на ошибку округления, уже здесь получает вывод Матрица не является положительно определённой: при таком значении извлечение всё равно не удастся, а названный диагноз полезнее сообщения оптимизатора R. К тому же одна матрица не может пройти эту карточку и не пройти шаг 3 или перебор в таблице сравнения моделей. Матрица, которую polychoric() или mixedCor() сгладили при построении, после этого выглядит положительно определённой, поэтому об исправлении сообщает отдельное оповещение по флагу, возвращаемому R вместе с матрицей. Оно повторяется над таблицей сравнения моделей и в сравнении методов извлечения.

Нижние границы объёма выборки — 50 наблюдений, затем 5 на переменную, причём абсолютная граница имеет приоритет. Эмпирические правила об объёме выборки для факторного анализа расходятся на порядок, а на самом деле восстановимость решения определяется силой структуры, как показали Мак-Каллум, Уидаман, Чжан и Хонг (MacCallum, Widaman, Zhang & Hong, 1999). Поэтому модуль сравнивает отношение с самыми мягкими границами из литературы, а не с самыми строгими: меньше 50 полных наблюдений — Слишком малая выборка, меньше пяти на переменную — Ниже рекомендуемого 5:1. Выборку, не прошедшую обе проверки, характеризует первый вывод, поскольку жаловаться на соотношение при 30 наблюдениях бессмысленно. Один и тот же фрагмент кода R оценивает число наблюдений и для этой карточки, и для предупреждения шага 3, так что пороги у них не могут разойтись.

Параллельный анализ пропускает две нулевые модели через оценщик наблюдаемой матрицы, и каждое число определяется по 95-му процентилю. Метод Монте-Карло реализован собственным циклом модуля, а не функцией psych::fa.parallel(), которая порождает дочерние процессы. На каждом прогоне строятся два набора данных: многомерные нормальные случайные данные объёма выборки и наблюдаемые данные, в которых каждый столбец независимо перемешан, по Буя и Эйюбоглу (Buja & Eyuboglu, 1992). Перемешивание разрушает корреляции и сохраняет распределение каждого пункта. Оба набора коррелируются тем же оценщиком, которым построена наблюдаемая матрица. При типах «Спирмен» и «Смешанная» случайные столбцы сначала разрезаются по наблюдаемым порогам категорий, так что нулевая модель сохраняет реальную структуру категорий и её совпадающие значения. При факторном методе обе нулевые матрицы перед вычислением собственных значений редуцируются квадратами множественных корреляций, чтобы сравнивать их с редуцированным рядом, с которым работает извлечение, а при АГК — с нередуцированным. Каждое из двух чисел — это количество собственных значений до первого, не превысившего свой 95-й процентиль. Прогоны выполняются с настройкой Зерно воспроизводимости, а средние кривые рисуются бледно и служат лишь фоном. Прогон, завершившийся ошибкой (например, если в полихорической бутстрэп-выборке пропала редкая категория), оставляет свою строку пустой (NA), а не прерывает цикл, и процентили вычисляются по уцелевшим прогонам. Расчёт, незаметно потерявший половину прогонов, иначе выглядел бы точно так же, как полный, поэтому число уцелевших прогонов выводится под рекомендациями всякий раз, когда оно меньше запрошенного.

Проверка. На пунктах кафе редуцированный ряд, с которым работает извлечение, равен 1.73, 0.58, −0.09 против 0.36, 0.21, 0.10 у нулевых моделей.

Критерий Кайзера и эмпирический критерий Кайзера работают по собственным значениям корреляционной матрицы и останавливаются на первом значении, не прошедшем порог. Порог Кайзера — «выше среднего собственного значения», а это 1 только для матрицы с единицами на диагонали. У редуцированного ряда среднее меньше 1, и плоский порог 1 для него гораздо строже, чем задумано правилом. Поэтому число, синяя подсветка строк и пунктирная линия используют нередуцированный ряд, таблица сравнения моделей показывает его рядом с редуцированным как λ (корреляционная матрица), а обе рекомендации при РФА помечены этим уточнением. Число считается по значениям в том виде, в каком они выведены, так что исходное 0.9998, показанное как 1.000, не учитывается и не подсвечивается, и рекомендация не может противоречить таблице. Эмпирический ориентир Бракена и ван Ассена (Braeken & van Assen, 2017) начинается с границы Марченко — Пастура для наибольшего собственного значения случайной корреляционной матрицы, (1+p/n)2, и на каждой следующей позиции масштабируется по дисперсии, которую уже забрали предыдущие собственные значения, (p−∑λ)/(p−j+1), но не опускается ниже кайзеровской единицы. Число факторов — это позиция перед первым собственным значением, не прошедшим свой ориентир, как определено в статье, а не число позиций, прошедших свои ориентиры. Ориентир адаптивен, поэтому поздняя позиция может пройти свой порог после того, как ранняя не прошла, и простой подсчёт завысил бы число.

Проверка. На пунктах кафе порог 1 на редуцированном ряду оставляет один фактор, а на ряду корреляционной матрицы — два. Эмпирические ориентиры равны 1.38, затем 1.00.

Локоть определяется по кривой в том виде, в каком она нарисована, по правилу кластерного модуля. Локоть — правило о форме кривой, а не о её уровне, поэтому он использует ряд, который рисует график (при РФА редуцированный, с отрицательным хвостом), и его точка лежит на этой кривой. Он находится как точка, наиболее удалённая от хорды, соединяющей первое собственное значение с последним. Это то же правило, которое график локтя кластерного модуля применяет к внутрикластерным суммам квадратов. Если кривая изгибается слишком слабо, точка не отмечается. При чёткой структуре излом обычно приходится на первую точку «осыпи» после настоящих факторов, поэтому число, как правило, на единицу больше, чем у параллельного анализа, и подаётся как проверка, а не как рекомендация.

Проверка. На пунктах кафе локоть даёт 3 против 2 у параллельного анализа.

Метод выпуклой оболочки оценивает долю воспроизведённых внедиагональных корреляций для каждого идентифицируемого числа факторов и при АГК не выполняется. Для каждого числа факторов от нуля до границы Ледермана (в пределах проверяемого диапазона берутся подгонки перебора, остальные выполняет собственный цикл метода) соответствие решения равно 1 минус отношение суммы квадратов его внедиагональных остатков к сумме квадратов внедиагональных корреляций. Нулевая модель закреплена в 0, а соответствие сопоставляется со степенями свободы ((p−k)2−p−k)/2, как у Лоренсо-Севы, Тиммерман и Кирса (Lorenzo-Seva, Timmerman & Kiers, 2011). Решения, не улучшающие соответствие по сравнению с более простыми, отбрасываются, затем отбрасывается каждая точка, лежащая на хорде между соседями или под ней, пока не останется выпуклая оболочка. Оставляемое число — вершина, в которой отношение наклона на входе к наклону на выходе максимально. Эта мера соответствия не использует χ², поэтому правило одинаково осмысленно для всех методов РФА в модуле. Кроме того, она учитывает экономность и может остановиться ниже параллельного анализа, если второй фактор реален, но мал. При меньше чем трёх вершинах нет внутренней точки для излома (очень мало переменных или соответствие растёт равномерно), и тогда число не выводится вместе со своей строкой, а не угадывается. При АГК метод не выполняется, поскольку он определён для общих факторов, а соответствие компонентного решения достигает ровно 1 при насыщенном числе компонент, и граница изгибается к одной компоненте при любых данных. Вместе с перебором метод пропускается, если извлечение не может работать с матрицей.

MAP и VSS вычисляются для каждого идентифицируемого числа факторов с варимаксом, а при неудаче альфа-факторизации расчёт повторяется с минимальным остатком. Один вызов psych::VSS() с n = max(2, identifiable_max) (нижняя граница нужна потому, что VSS() не работает при n = 1, верхняя — потому, что число за границей Ледермана не даёт решения, пригодного для подгонки) выдаёт VSS₁, VSS₂ и MAP для каждого числа, которое модель может идентифицировать. Вызов выполняется с rotate = "varimax", поскольку критерий измеряет именно простую структуру, а ветка АГК в vss() всё равно игнорирует аргумент вращения, и с зерном воспроизводимости, чтобы значения не зависели от того, что генерировалось в сессии R до этого. Рекомендации берутся из полного ряда, и таблица выделяет ячейки по тому же ряду, так что оптимум внутри окна никогда не называется рекомендацией, пока график указывает на другой, за его пределами. Равенство MAP проверяется с округлением до четырёх знаков, поскольку у соседних чисел значения обычно различаются уже в третьем. psych заполняет VSS₂ при одном факторе жёстким 0, который означает сложность, недостижимую для решения, а не соответствие, и таблица показывает его как -. VSS() работает не со всеми методами извлечения (fm = "alpha" всегда даёт ошибку), и тогда все три столбца были бы пустыми. MAP от метода извлечения не зависит, поэтому повторный расчёт с минимальным остатком с достаточным основанием восстанавливает три столбца, а легенда называет замену. При АГК повтора нет, поскольку замена на извлечение общих факторов выдала бы диагностику компонент, вычисленную по факторной модели.

Неположительно определённая матрица останавливает максимальное правдоподобие, альфа-факторизацию и минимальный ранг до перебора, подгонка с ошибкой получает пометку Подгонка не удалась, а подгонка, не сошедшаяся за допустимое число итераций, — значок †. Перебор проходит ту же предварительную проверку, что и единичная подгонка шага 3. Эти три метода на такой матрице неизменно отказывают, так что подгонка каждого числа по очереди лишь повторяла бы сообщение оптимизатора psych в каждой строке. Поэтому все строки помечаются Подгонка не выполнялась с подсказкой, называющей единственную причину, а столбцы собственных значений, которым подгонка не нужна, сохраняются. Число, для которого вызов fa() завершился ошибкой, сохраняет свою строку, а подсказка ячейки содержит собственное сообщение R (стандартное «Failed to converge» из psych ничего не добавляет и отбрасывается), поскольку сообщение обычно позволяет отличить избыточно параметризованную модель от вращения, не работающего при таком числе. Метка не указывает причину, поскольку эта ветка не пересекается с настоящей несходимостью. Предел итераций приходит из psych как message(), который обработчик предупреждений не видит, поэтому он перехватывается отдельно и отмечается значком †. Подгонка вернула числа, и строка остаётся сопоставимой, но эти числа относятся к несошедшейся модели, которую иначе нельзя было бы отличить от чистой подгонки.

Ячейка N — элемент управления, переносящий число на шаг 3. Число в каждой подогнанной строке — кнопка в виде ссылки. Её доступное имя остаётся самим числом (с aria-label все строки объявлялись бы одинаково), а действие описано в подсказке. Присвоение числа полю шага 3 не вызывает события изменения, поэтому зависящие от числа параметры вращения обновляются вручную, а всплывающее уведомление подтверждает значение. Строка с ошибкой или пропущенная предварительной проверкой не содержит числа, которое стоило бы переносить, и её ячейка остаётся обычной.

% последнего фактора — собственная доля N-го измерения, а накопленный % — средняя общность. Каждая строка таблицы — отдельное решение, поэтому столбец дисперсии назван по величине, которую содержит (сумма квадратов нагрузок последнего фактора, делённая на p), а не «объяснённая дисперсия», что воспринималось бы как итог строки рядом со столбцом Накопленный %. Накопленный столбец равен ∑h2/p, то есть средней общности решения, поэтому он выводится один раз, в процентах, которые модуль уже использует, и выделяется полужирным от порога общности 0.70. Качество решения на шаге 3 приводит то же число как Средняя общность (h²) для фактически выполненного числа факторов.

Строки с df ≤ 0 выводятся без оценки, а каждый столбец на основе χ² — это расхождение максимального правдоподобия при любом методе извлечения. Модель без остаточных степеней свободы воспроизводит корреляционную матрицу по построению (граница Ледермана — ровно то число, при котором df становится равным 0), поэтому почти идеальный CFI или почти нулевой SRMR в такой строке — арифметика, а не свидетельство хорошего соответствия. Строка сохраняет числа, но теряет выделение и вывод, а строка легенды называет условие. psych::fa() возвращает χ², RMSEA, CFI, TLI, BIC и SABIC для каждого метода извлечения, вычисляя их по функции расхождения максимального правдоподобия в той точке, куда пришло извлечение. Поэтому настоящей статистикой отношения правдоподобия они являются только при ML, а при остальных восьми методах это приближения, систематически преуменьшающие соответствие модели данным. Пороги соответствия применяются к ним без изменений, легенда сообщает, что оценки консервативны, и то же примечание выводится на карточке индексов соответствия шага 3 и в сравнении методов извлечения, где механизм описан подробно. Вывод строки — худший уровень, которого достигает любой из индексов RMSEA, CFI, TLI и SRMR, каждый по значению в том виде, в каком оно выведено, так что ячейка никогда не заявляет соответствие лучше, чем соседние ячейки. При АГК, у которого нет функции расхождения, вывод вместо этого оценивает Накопленный % по порогам 80, 70 и 60 процентов.

EBIC и ESABIC строятся по остаточному χ², поэтому их минимумы могут не совпасть со строкой BIC. BIC и SABIC основаны на χ², следующем из расхождения максимального правдоподобия, то есть из критерия, оптимизируемого ML, тогда как остальные методы по нему лишь оцениваются. psych вычисляет также эмпирический χ² по остаточным корреляциям, которые решение действительно оставляет (сумма их квадратов, масштабированная объёмом выборки), и по нему можно судить о любом методе. EBIC и ESABIC применяют к этой статистике штрафы BIC и BIC с поправкой на объём выборки. Две статистики по-разному учитывают рассогласование, поэтому их минимумы могут оказаться в разных строках, и в таком случае EBIC склоняется к большему числу факторов. Таблица выделяет каждый критерий на его собственном минимуме, а не делает вид, что они совпадают.

Проверка. На пунктах кафе оба критерия выбирают два фактора.

SRMR вычисляется с тем делителем, на который рассчитаны пороги, а две сводки остатков из psych выводятся без оценки. Показатель rms из psych делит сумму квадратов внедиагональных остатков на p(p − 1), удвоенное число пар, поэтому он занижен относительно порогов в шкале lavaan, заложенных в настройках порогов соответствия, и разрыв растёт с p: отношение равно 2(p−1)/(p+1), то есть 1.195 при шести переменных и 1.301 при двенадцати. SRMR модуля суммирует матрицу остатков с обнулённой диагональю и делит на p(p + 1), что в точности воспроизводит fitMeasures(fit, "srmr"), и оценивается только этот столбец остатков. rms и crms (последний делится на число степеней свободы) сохранены, чтобы таблица совпадала с выводом psych::fa(), под названиями, не претендующими на стандарт, которому они не отвечают. Карточка индексов соответствия шага 3 выводит те же три строки по тому же правилу, а при АГК показывает SRMR без оценки, поскольку его пороги — соглашение для модели общих факторов.

Сложность и число неотнесённых переменных оцениваются на копии невращённой подгонки, повёрнутой варимаксом. Перебор подгоняет каждое число с rotate = "none", поскольку столбцам собственных значений и дисперсии нужен собственный порядок столбцов psych. Но сложность Хоффмана и число переменных без выраженной нагрузки — диагностики простой структуры, имеющие смысл только для вращённого решения. Поэтому нагрузки каждой строки перед их вычислением вращаются stats::varimax(normalize = FALSE) (формула Хоффмана в точности воспроизводит собственный result$complexity из psych), и столбцы измеряют ту же величину, что и качество решения на шаге 3 под теми же названиями. Шаг 3 оценивает фактически выбранное вращение, поэтому при варимаксе его числа совпадают с этими, а при косоугольном вращении немного отличаются. Порог выраженной нагрузки — общепринятое значение 0.3 включительно, и он фиксирован: он не следует за порогом отображения нагрузок, который определяет, что показывать, а не нашла ли переменная фактор вообще.

Шаг 3: полный анализ

Однофакторная подгонка выполняется без вращения и так и подписывается, зависящие от вращения параметры отключаются, а не игнорируются. Вращение перераспределяет дисперсию между факторами, и при одном факторе перераспределять нечего, поэтому psych возвращает невращённую подгонку, что бы ни стояло в rotate. Модуль сообщает то же самое везде, где названо вращение: в заголовке основной карточки, в заголовке сравнения методов извлечения и в строке настроек диалога стоит Без вращения, а не значение из списка. Нормализация Кайзера и Корреляции факторов/компонент при числе 1 отключаются, поскольку параметр, принятый и незаметно проигнорированный, на экспортированной карточке ложно описывал бы, как получено решение. Список сохраняет своё значение, так что при увеличении числа факторов вращение восстанавливается без повторного выбора.

При одном факторе метод оценок закреплён на регрессионном, а метод Андерсона — Рубина при косоугольном вращении разрешён с оговоркой под списком, которой нет у оценок Шмида — Леймана. При одном столбце веса всех методов пропорциональны и все четыре дают одинаковые оценки, так что выбор лишь неверно подписал бы столбец, под которым оценки добавляются в данные. Список делается недоступным с примечанием, а не скрывается, чтобы закреплённое значение оставалось видимым. Метод Андерсона — Рубина при косоугольном вращении противоречит модели по построению, на что указывает Грайс (Grice, 2001): оценки некоррелированы, тогда как Φ показывает, что факторы коррелируют. Но некоррелированные предикторы для последующей регрессии — законная причина выбрать этот метод, поэтому сочетание сохранено, под списком выводится оговорка, а корреляции сохранённых оценок выводятся, чтобы противоречие было видно, а не предполагалось. Оговорка появляется только при отмеченном параметре Оценки факторов/компонент: оценки Шмида — Леймана вычисляются по ортогональной иерархии, в которой нет корреляций факторов, так что противоречить методу нечему.

Порог отображения нагрузок действует и на диаграмму путей, которая сохраняет самую сильную групповую нагрузку каждой переменной независимо от её величины. Таблица и диаграмма используют один порог, так что на рисунке никогда нет связи, скрытой в таблице, и наоборот. Самую большую нагрузку каждой переменной на групповой фактор диаграмма сохраняет и ниже порога, бледной пунктирной линией, поскольку переменная совсем без связей выглядит исключённой из модели, а пунктир показывает то, что есть: лучшую из слабых нагрузок. На общий фактор бифакторного или иерархического решения это исключение не распространяется: на g нагружаются почти все переменные, и сохранение его связей ниже порога соединило бы с ним каждую переменную и скрыло бы групповую структуру, ради которой диаграмма и нужна. Значение вне 0–1 исправляется до границы, а пустое поле считается нулём, так что элемент управления не может оказаться в состоянии, которое таблица не сможет отобразить. Порог отсечения самой таблицы начинается с этого значения, а Порог выделения — с 0.6 (соглашение о выраженной нагрузке и обычная граница сильной нагрузки). Оба порога, как и отметка общности 0.40, сравниваются с выведенным значением: исходное 0.5996 выводится как 0.600, и при сравнении исходного значения оно осталось бы не выделенным под легендой «≥ 0.6», а исходное 0.2996, выведенное как 0.300, при пороге 0.3 показывается, а не скрывается. У структурной матрицы свои элементы управления, поскольку это вторая таблица со своим смыслом, но её порог действует только на неё: диаграмма рисует нагрузки, а не корреляции, и следует только таблице нагрузок.

Проверки матрицы выполняются повторно перед подгонкой, ошибки идут первыми, и проверки сохраняются при неудавшемся расчёте. Шаг 3 подгоняет тот набор переменных и тот тип корреляции, которые ему переданы, а они могут отличаться от использованных на карточке пригодности. Поэтому проверки постоянных переменных, соотношения наблюдений и переменных, идеальных пар, положительной определённости, квадрата множественной корреляции, высоких корреляций, ранга и детерминанта повторяются на матрице, которая действительно подгоняется. Детерминант оценивается по тому же правилу подтверждения, что и на шаге 2, а нижние границы выборки — тем же фрагментом кода. Меньше 50 наблюдений остаётся предупреждением, поскольку это делает неустойчивым каждое число на карточке, а низкое соотношение понижено до примечания, поскольку описывает план исследования, а не дефект подгонки. Если извлечение не удалось, оповещения прикрепляются к карточке ошибки, поскольку обычно называют её причину (неполный ранг, идеальная пара, неположительно определённая матрица при максимальном правдоподобии), и без них ошибка осталась бы необъяснённой.

Случаи Хейвуда оцениваются по двум порогам, только в РФА, и там, где извлечение ограничивает уникальность, определяются по ней. Общность 0.999 и выше выводится как предупреждение, а выше 1.0 — как ошибка, причём карточка всё равно выводится, чтобы было видно, о какой переменной речь. АГК исключён, поскольку у компоненты нет уникальности, которую модель могла бы сжать до нуля, а principal() при максимальном числе компонент из-за округления обычно возвращает общности на несколько единиц последнего разряда выше 1, что вызвало бы ошибку на правильном разложении без потерь. psych подгоняет минимальный остаток, максимальное правдоподобие, три критерия наименьших квадратов и взвешенный χ² по минимальному объёму выборки через optim() с нижней границей уникальностей 0.005. Поэтому у этих шести методов случай Хейвуда останавливается на общности 0.995 и не может достичь порога 0.999. Здесь предупреждение вызывает уникальность на границе, в пределах 0.001 от неё, поскольку psych после возврата из optim() пересчитывает уникальности по усечённому спектральному разложению и получает значение чуть ниже 0.005. Факторизация главных осей, альфа-факторизация и минимальный ранг уточняют общности итерациями без ограничений и сохраняют порог по общности. Правило — один фрагмент кода R для шага 3 и для сравнения методов извлечения, так что решение, отмеченное на одной карточке, не может пройти без пометки на другой. Проверка Шмида — Леймана остаётся на пороге по общности, поскольку её общности взяты из иерархической таблицы, а не из уникальностей подгонки.

Проверка. На пунктах кафе при трёх факторах у пункта цена h² равна 0.995, а уникальность — 0.00500 при максимальном правдоподобии и 0.00495 при минимальном остатке, и оба случая отмечены. Сравнение методов извлечения помечает ML, MINRES, ULS и GLS как случаи Хейвуда при трёх факторах и ни один метод при двух.

Вырожденный фактор — это сохранённое собственное значение редуцированной матрицы, оказавшееся на пороге положительной определённости. После подгонки диагональ корреляционной матрицы заменяется общностями, и её первые k собственных значений сравниваются с тем же порогом √ε, что и в предварительной проверке. Каждое значение ниже порога — сохранённый фактор без общей дисперсии. Проверяются только первые k, поскольку последние p − k собственных значений хорошо соответствующего данным решения — остаточный спектр около нуля, и их учёт отмечал бы любое благополучное решение. Порог, а не проверка знака, нужен потому, что не подкреплённый данными фактор оказывается на уровне около 10⁻¹², а не опускается ниже нуля, и проверка знака этого не заметит. Если какая-либо общность равна NA, проверка пропускается, поскольку eigen() выдаёт ошибку на диагонали с NA.

Факторизация главных осей и альфа-факторизация повторяются с единичными общностями, если старт с квадратами множественных корреляций не удался. Сообщение psych «imaginary eigen value condition» называет исправлением SMC = FALSE, и именно эти два метода отказывают таким образом. Остальные так не отказывают, и повтор для них лишь воспроизвёл бы ту же ошибку в конфигурации, которую никто не запрашивал. Сравнение методов извлечения обходит тот же сбой тем же способом, так что метод, подогнанный там, не отказывает на шаге 3. О повторе сообщается на карточке, поскольку решение, начатое с единичных общностей, — корректная подгонка с другими начальными условиями, чем запрошенные, и именно этим ограничена его сопоставимость с другими методами.

Проверка. На пунктах кафе факторизация главных осей при трёх факторах не удаётся со старта SMC и подгоняется только при повторе.

Интервал RMSEA закреплён на 90%. В fa() передаётся alpha = 0.1, её собственное значение по умолчанию, а не уровень доверия из настроек приложения. Пороги Брауна и Кудека (0.05, 0.08 и 0.10, заложенные в пороги соответствия) разработаны для 90%-ного интервала и применяются к нему, как и любой опубликованный интервал RMSEA, с которым читатель может сравнить свой. Подпись строки называет уровень, чтобы границы в скобках нельзя было принять за 95%-ный интервал. Настройка Уровень доверия управляет бутстрэп-интервалами для нагрузок и коэффициентов омега. Параметр alpha задаёт только интервал и больше ничего в подгонке не меняет.

Остатки выше 0.05 оцениваются по единственному порогу Филда, сохраняются при АГК и не оцениваются при df ≤ 0. Подсчитываются p(p−1)/2 внедиагональных остатков (psych оставляет на диагонали уникальности, поэтому учитываются только пары), и у вывода два уровня, а не четыре, как у индексов соответствия, поскольку правило — один порог: если больше половины остатков по модулю выше 0.05, оставленные факторы не объясняют корреляционную матрицу, по Филду (Field, 2018). Вывод не ставится вместе с остальными при df ≤ 0, где остатки близки к нулю по построению, и сохраняется при АГК, который не выдаёт степеней свободы, так что это единственная оцениваемая строка компонентного решения. Здесь же АГК и РФА расходятся заметнее всего, поскольку компонентное решение воспроизводит диагональ ценой внедиагональных элементов. Матрица при включённом параметре Остаточные корреляции выводит те же остатки поячеечно. Выводится только нижний треугольник, поскольку матрица симметрична, а psych хранит на диагонали уникальности, так что эти ячейки — ровно те неповторяющиеся остатки, которые учитывает подсчёт. Каждая ячейка выше того же порога 0.05 подсвечивается по выведенному значению, так что ячейка со значением 0.05 никогда не окрашивается, как будто превышает порог. Порог для ячеек тот же, что в правиле Филда для всей матрицы, поэтому подсвеченные ячейки — это перечень пар, стоящих за подсчётом.

Проверка. Два фактора кафе не оставляют выше 0.05 ни одного остатка из 15, а две компоненты оставляют 8 из 15.

Раздел индексов соответствия при АГК состоит только из строк остатков и назван по тому, что в нём приводится. principal() заполняет STATISTIC, PVAL, objective и производные от них индексы по расхождению максимального правдоподобия для модели, которую эта функция так не подгоняла, поэтому эти числа не описывают ни один выполненный оценщик. При АГК модуль не выводит χ², RMSEA, CFI, TLI, информационные критерии и целевую функцию, называет раздел Сводка соответствия по остаткам и оценивает только число остатков, поскольку пороги SRMR — соглашение для модели общих факторов. Остаётся единственный вопрос, корректно поставленный для компонентного решения: какую часть корреляционной матрицы оставленные компоненты не воспроизводят. Об этом сообщает примечание под таблицей.

Внедиагональное соответствие вычисляет модуль, поскольку fit.off из psych делит сумму остатков пополам, не деля пополам знаменатель. Показатель fit берётся из psych: 1 минус отношение суммы квадратов остатков к сумме квадратов корреляций, включая диагональ, где преобладают единицы. Поэтому строка названа по матрице, а не по «дисперсии», которой этот показатель не является. Внедиагональная доля пересчитывается как 1−∑residual2/∑r2 только по верхнему треугольнику, поскольку fit.off в том виде, в каком его возвращает psych, показывает половину необъяснённой доли. Вычисление одинаково при АГК и РФА, и именно поэтому по нему их можно сравнивать.

Проверка. На пунктах кафе fit равен 0.78, а внедиагональное соответствие — 0.999 для двух факторов против 0.85 для двух компонент.

Суммы квадратов нагрузок — это строки Vaccounted из psych, которые при косоугольном вращении суммируют произведение паттерна на структуру. colSums(loadings²) неверна, как только факторы коррелируют. psych вычисляет каждый столбец как diag(ΦΛ′Λ), то есть коэффициенты паттерна, взвешенные структурными коэффициентами. Такой столбец учитывает дисперсию, которую фактор делит с коррелирующими с ним факторами, и всё равно в сумме даёт ровно ∑h2, так что итог разбивается на части, а последняя накопленная ячейка равна средней общности при любом вращении. При косоугольном вращении легенда об этом сообщает, поскольку столбцы тогда показывают атрибуцию, а не взаимоисключающие доли. Для однофакторного решения psych опускает накопленные строки и строки объяснённой доли, которые по определению равны 1, и модуль их заполняет, чтобы таблица имела одну форму при любом числе факторов.

Общий фактор бифакторного решения определяется по нагрузкам, а не по положению столбца. psych упорядочивает столбцы по суммам квадратов, что на большинстве данных, но не на всех, ставит общий фактор первым. Поэтому модуль определяет его по нагрузкам. Столбец подходит, если его нагрузка по модулю не меньше 0.20 на всех переменных, кроме не более чем 10% (при меньше чем пятнадцати переменных — кроме одной), и не менее 80% этих значимых нагрузок имеют один знак. Подходящий столбец с наибольшим произведением широты на согласованность знаков подписывается g, а остальные перенумеровываются одинаково в таблице нагрузок, таблице дисперсии, матрице корреляций и на диаграмме путей. Допуск пропорционален, поскольку пара пунктов ниже 0.20 — обычное дело для набора из тридцати пунктов, и фиксированное правило «все, кроме одного» отвергло бы там настоящие бифакторные решения. Если подходящего столбца нет, подписи остаются F1…Fn, и об этом сообщает предупреждение, а не догадка с подписью g. Сортировка таблицы нагрузок Наибольшая нагрузка и группировка на диаграмме путей не учитывают g при поиске максимума по той же причине, что и исключение из порога на диаграмме: у него наибольшая нагрузка почти у каждой переменной, и сортировка по нему свела бы все переменные в одну группу. Поэтому переменные группируются по самому сильному групповому фактору.

Интервалы для нагрузок — процентильные с коррекцией смещения, сопоставляются с выведенным решением по конгруэнтности, приводятся к его знакам и не выводятся, если пригодных повторов меньше 50. На каждом повторе наблюдения выбираются заново, корреляционная матрица заново строится оценщиком расчёта (в том числе с группами типа «Смешанная», из-за чего такие расчёты и медленны) и полностью заново выполняются извлечение, вращение и нормализация, поскольку выборочная изменчивость нагрузки проходит через вращение не меньше, чем через извлечение. Столбцы бутстрэп-выборки могут вернуться в другом порядке или с другим знаком, и при наивном подсчёте нагрузка и её противоположность попали бы в один квантиль. Поэтому столбцы каждого повтора сопоставляются с выведенными по максимальному весовому паросочетанию на конгруэнтности Такера и отражаются так, чтобы совпадать по знаку, и только потом записываются. Интервал — процентильный с коррекцией смещения, то есть процентильные границы, сдвинутые на медианное смещение распределения повторов относительно точечной оценки, что не требует дополнительных подгонок. Это не полный BCa: его член ускорения потребовал бы метода складного ножа, то есть одной подгонки на каждое наблюдение, а вращение, сопоставление и выравнивание знаков, стоящие за каждой оцениваемой величиной, нарушают гладкость, которую этот член предполагает, так что плохо оценённое ускорение могло бы сделать интервал хуже, чем его отсутствие. Пятьдесят пригодных повторов — нижняя граница, ниже которой границы не строятся. Это защита от массового сбоя повторов, а не утверждение о точности (точность границ определяет настройка Повторы бутстрэпа), и оповещение называет эту настройку, если в ней самой задано меньше 50, поскольку тогда сбоев не было. Повтор даёт либо все нагрузки, либо ни одной, поэтому число повторов одно на всю матрицу.

На диаграмме путей АГК стрелки идут от переменных к компонентам, а ошибок нет. В модели общих факторов фактор — латентная причина: он порождает наблюдаемые значения, поэтому стрелка идёт от фактора к переменной, и у каждой переменной есть ошибка для той части, которую не объясняет ни один фактор. Главная компонента — взвешенная сумма своих переменных, она вычисляется по ним, а не порождает их, поэтому диаграмма рисуется формативной (переменная → компонента) и без ошибок. Компонента по построению не оставляет ничего необъяснённым, а ошибка, входящая в переменную, которая сама является причиной, противоречила бы диаграмме. fa.diagram из psych рисует оба вида одинаково, и модуль намеренно отступает от этого. Строка легенды Стрелки идут от переменных к компонентам нужна потому, что экспортированный SVG попадает к читателю без этого пояснения.

Общий фактор рисуется на противоположной стороне, а ошибки переносятся на отводы, чтобы освободить место. На общий фактор g бифакторного решения или решения Шмида — Леймана непосредственно нагружается каждая переменная, поэтому в столбце факторов его веер делил бы один коридор с веерами групповых факторов и пересекал бы каждую их линию. Справа от столбца переменных два веера подходят к переменным с противоположных сторон. Столбец ошибок уступает место отводу под 45° от правого верхнего угла каждой переменной, а связи общего фактора рисуются бледным пунктиром, чтобы его веер отличался от групповых нагрузок. Бифакторному решению, общий фактор которого не удалось определить, выносить нечего, и оно сохраняет обычные столбцы, как обычная РФА, АГК и КФА.

Матрицы антиобраза модуль строит сам, по обратной исходной матрице, и не выводит их, если обратной матрицы не существует. MASS::ginv() от несглаженной корреляционной матрицы даёт матрицу точности Ω. Ковариация антиобраза — это Ω, масштабированная своей диагональю (1/Ωii на диагонали, Ωij/(ΩiiΩjj) вне её), а её стандартизация даёт частные корреляции с обратным знаком по соглашению Image из psych::KMO(). Диагональ этой матрицы модуль затем заменяет MSA Кайзера по переменным, чтобы её можно было сравнивать со шкалой общей KMO. Используется ginv(), а не solve(), поскольку усечённое сингулярное разложение даёт лучше обусловленную обратную на почти сингулярной матрице. Но на матрице, которую solve() отвергает сразу, обе таблицы не выводятся, а выводится предупреждение. Это та же проверка, что на карточке шага 2, поскольку результат псевдообращения там выглядит как частные корреляции и оценивается как они, хотя это вычислительная замена, а не измерение. Берётся исходная, а не сглаженная матрица, чтобы таблицы описывали наблюдаемые корреляции. Поэтому на неопределённой матрице ячейки, которые нельзя вычислить (в том числе отрицательная дисперсия антиобраза), не выводятся обычным числом, а показывают Н/Д с примечанием о причине. Внедиагональные элементы оцениваются по двум неблагоприятным уровням настройки Шкала силы корреляции, тем же, что использует список худших пар на шаге 2, а не по собственным порогам.

Скрытые запасные ветки расчёта оценок в psych обнаруживаются и называются. factor.scores() вместо отказа подставляет более слабый оценщик: регрессионные веса по исправленной матрице, если корреляционную матрицу нельзя обратить, и псевдообратную матрицу, если она сингулярна. Без проверки карточка называла бы метод оценок, который не выполнялся, и оценивала бы его детерминированность по весам другого метода, поэтому модуль определяет подмену по результату и сообщает, что произошло. Сбой расчёта оценок разделяется по методу, который отказал, поскольку обычный совет перейти на регрессию неверен, если отказала сама регрессия: она обращает корреляционную матрицу, и тогда сообщение отсылает к диагностике мультиколлинеарности.

Детерминированность — это ρ Грайса по весам выбранного метода, без возведения в квадрат, в том числе при АГК. R2 из psych для этой строки не годится: factor.scores() перезаписывает значение, специфичное для метода, результатом fsi(), которая не получает весов и потому не может зависеть от метода оценок. Детерминированность, одинаковая при всех методах, характеризовала бы решение, а не оценки в таблице. Модуль вычисляет Rj2=(W⊤S)jj2/(W⊤RW)jj по весам W, по которым построены оценки, структурной матрице S (при косоугольном вращении это матрица паттерна, умноженная справа на Φ) и корреляционной матрице R, как у Грайса (Grice, 2001), и выводит квадратный корень. В этой шкале записаны пороги Горсача и Грайса ≥ 0.80 / ≥ 0.90, и то же число другие программы выводят как «детерминированность фактора», так что значение напрямую сопоставимо с опубликованным. На границах поглощается только шум округления (10⁻⁶): почти сингулярная матрица может дать R², равный 4.7 или −2.3, и если прижать такие значения к 0 или 1, вычислительный сбой выглядел бы как нормальная оценка. Поэтому значение вне диапазона выводится без извлечения корня и красным. Строка выводится и при АГК, поскольку характеризует те оценки, которые действительно запрошены. Компонента — точная взвешенная сумма своих переменных, поэтому регрессионные веса и веса Тен Берге её восстанавливают и дают 1.000, а методы Бартлетта и Андерсона — Рубина навязывают свойство, которого у компоненты нет, и дают чуть меньше. Это реальное различие, и его стоит учесть до сохранения столбцов.

Проверка. На пунктах кафе методы Бартлетта и Андерсона — Рубина дают 0.999 и 0.99 против 1.000 у регрессионных весов и весов Тен Берге.

Корреляции оценок — это корреляции самих сохраняемых столбцов, а не следующие из модели. r.scores из psych равна cov2cor(WᵀRW), то есть корреляциям, которые веса дают на исходной для них матрице. Модуль вместо этого выводит cor(scores), корреляции фактически полученных столбцов. При корреляциях Пирсона они совпадают. При оценщике Спирмена, полихорическом или смешанном они могут различаться: веса берутся из латентной матрицы, а оценки строятся по исходным стандартизованным переменным, так что матрица, следующая из модели, может показывать ровно 0 для метода Андерсона — Рубина, тогда как сохранённые столбцы слабо коррелируют. А последующий анализ работает именно с сохранёнными столбцами. Раздел сохраняется при АГК, и примечание там называет методы, воспроизводящие корреляции компонент (регрессионный и Тен Берге, точно, что проверено измерением), а не рассуждает об отсутствующей у компоненты неопределённости, поскольку при методах Бартлетта и Андерсона — Рубина раздел даёт сведения, которых нет в матрице корреляций над ним.

Преобразование Шмида — Леймана

Преобразование — это собственная повторная подгонка psych::omega(), выполняемая при зерне воспроизводимости, и карточка фиксирует, что было выполнено. Основные нагрузки в преобразование не попадают: omega() получает корреляционную матрицу, число факторов, метод извлечения и вращение и заново извлекает и вращает решение, прежде чем schmid() его преобразует. Однофакторное извлечение по корреляционной матрице факторов первого порядка даёт нагрузки второго порядка. Общая нагрузка каждого пункта равна его нагрузке первого порядка, умноженной на нагрузку второго порядка его фактора, а групповая — нагрузке первого порядка, умноженной на квадратный корень из того, что остаётся. Поэтому иерархия — отдельная подгонка со своими нагрузками, случаями Хейвуда и сходимостью. По этой причине у карточки свой раздел диагностики, а нагрузки первого порядка, с которых она начинается, не совпадают с основной карточкой, если два решения нормализованы по-разному. Вызов выполняется с зерном, поскольку каждое вращение, которое omega() здесь принимает, проходит через случайные старты GPArotation. Два групповых фактора — настоящий предел идентификации, а не вычислительный: одна корреляция факторов определяет две нагрузки второго порядка, только если приравнять их друг к другу (каждая равна √φ), и omega() делает именно это, поэтому карточка предупреждает ровно при двух факторах. Столбец g на уровне пунктов при этом всё равно меняется, поскольку умножается на собственную нагрузку первого порядка каждого пункта.

Проверка. На решении кафе с облимином нагрузка вкус на фактор «Еда» внутри преобразования равна 0.77 против 0.76 на основной карточке с нормализацией, а обе нагрузки второго порядка равны √φ = 0.64.

Ортогональные вращения и квартимин недоступны, поскольку omega() не может их выполнить, биквартимин — поскольку уже навязывает общий фактор, а один фактор — поскольку из него нечего исключать. omega() выдаёт object 'obminfact' not found для каждого ортогонального вращения и для квартимина (это проверено на живом расчёте), поэтому параметр предлагается только при облимине, промаксе, симплимаксе, кластерном вращении, geominQ и bentlerQ. Список один, и его используют и видимость флажка, и проверка на стороне R, так что они не могут разойтись. Биквартимин ошибки не вызывает, но тогда schmid() вращала бы решение первого порядка бифакторным критерием Дженнриха — Бентлера, который навязывает собственный общий фактор, и разложение второго порядка поверх него было бы смешанным. Остальное объясняет заметка к шагу 1. У одного фактора нет группового фактора, из которого можно исключить общий, так что ωh по построению равнялась бы ωt. При числе 1 флажок скрыт, а сторона R отклоняет тот же случай, поскольку программный вызов может обойти панель.

Нормализация Кайзера действует только на основное решение, а schmid() сама нормализует промакс и кластерное вращение. Нормализацию до и после вращения модуль применяет вокруг вращения, которое выполняет сам. schmid() жёстко задаёт свой внутренний вызов fa(), так что флаг до преобразования не доходит, а normalize намеренно не передаётся в omega(), которая приняла бы его и проигнорировала. Вместо этого поведение преобразования определяется вращением: промакс проходит через psych::kaiser(), то есть через ту же нормализацию до и после вращения, а кластерное вращение — через stats::varimax() со значением по умолчанию normalize = TRUE, так что эти два вращения нормализуются всегда. Облимин, симплимакс, geominQ и bentlerQ идут в GPArotation со значением по умолчанию normalize = FALSE, так что эти четыре не нормализуются никогда. Два решения масштабированы одинаково только там, где флажок случайно совпадает с соглашением schmid(), и карточка сообщает о расхождении в обе стороны (нормализация запрошена, но не применена, или применена без запроса), а не позволяет двум по-разному масштабированным матрицам выглядеть сопоставимыми. При значении флажка по умолчанию (снят для всех вращений, кроме варимакса) второе предупреждение срабатывает при промаксе и кластерном вращении.

Невзвешенный МНК, альфа-факторизация и MINCHI внутри преобразования заменяются минимальным остатком, а неудавшееся косоугольное вращение — промаксом, и обе замены определяются по psych и называются на карточке. schmid() принимает более узкий набор методов извлечения, чем fa(): uls и alpha не входят в её набор fm и сразу дают ошибку, а minchi принимается, но незаметно деградирует, поскольку omega() отбрасывает матрицу попарных чисел наблюдений, нужную этому методу. Во всех случаях заменой служит минимальный остаток: он минимизирует почти тот же критерий, что и ULS, и omega() сама переходит на него при неудаче. Одна таблица соответствий передаёт замену в оба вызова omega() (подгонку и её бутстрэп), в заголовок карточки и в ссылку на источник, так что выполненное и заявленное на карточке не могут разойтись. Основное решение сохраняет выбранный метод извлечения. Вращение тоже может деградировать: schmid() оборачивает облимин, geominQ и bentlerQ в try() и при сбое критерия подставляет промакс, сообщая об этом через message(), а не warning(), как и о собственной несходимости. Поэтому модуль перехватывает оба сообщения обработчиком вызова, записывает фактически выполненное вращение и указывает его в заголовке карточки.

Пункты, инвертированные omega(), возвращаются в исходное направление в нагрузках и остаются инвертированными в коэффициентах. omega() выполняется с flip = TRUE: пункт с отрицательной нагрузкой на общий фактор перед оценкой коэффициентов меняет знак, а имя его строки получает в конце -. Так получают и публикуемые значения ωh: если оставить пункт с обратной формулировкой неинвертированным, ωh снизится по причине, не имеющей отношения к надёжности. Поэтому коэффициенты сохраняются для пунктов с изменённым направлением. Нагрузки — нет: модуль восстанавливает исходные знаки каждой инвертированной строки и убирает метку, так что таблица и диаграмма показывают пункты в их собственном направлении и отрицательная нагрузка на g остаётся отрицательной. Инвертированные пункты модуль называет в предупреждении, чтобы читатель знал, для каких пунктов коэффициенты посчитаны с изменённым направлением. Бутстрэп делает то же на каждой бутстрэп-выборке, поскольку omega() может инвертировать разные наборы пунктов, прежде чем описанное ниже сопоставление по конгруэнтности сравнит повтор с исходным решением. ECV — сумма квадратов, и её это в любом случае не затрагивает.

ωh, ωh/ωt и омеги субшкал оцениваются по порогам бифакторной литературы, ωt и ωs — по шкале надёжности, а ωhs не оценивается вовсе. Омега иерархическая получает оценку сильный от 0.80, умеренный от 0.50 и слабый ниже. Это уровни общего фактора, а не вывод о надёжности, поскольку ωh измеряет насыщенность общим фактором, а не надёжность. Омега общая и ωs каждой субшкалы — надёжности баллов, и они оцениваются так же, как все коэффициенты модуля надёжности, так что значение получает здесь оценку Сомнительная или Приемлемая, как и там, и два модуля никогда не оценивают одно число по-разному. Для ωh/ωt литература указывает один порог, 0.80, выше которого суммарный балл можно считать фактически одномерным, по Родригесу, Райзу и Хэвиленду (Rodriguez, Reise and Haviland, 2016). Промежуточного уровня нет, поскольку он не опубликован. ωhs намеренно оставлен без оценки: те же пороги вводят в заблуждение на величине, из которой исключена общая часть. Малое значение здесь свидетельствует о широте охвата общего фактора, а не о дефекте субшкалы, и подпись назвала бы нормальную субшкалу дефектной. Строки субшкал выводятся всегда, а NA (выродившийся групповой фактор) показывается приглушённым —, а не удаляется, поскольку незаметно отсутствующая строка ωhs воспринималась бы как «с этой субшкалой всё в порядке». Значения субшкал берутся из таблицы omega.group функции omega(): её столбец group — это ωhs с исключённым g, а столбец total — ωs, по определениям Родригеса, Райза и Хэвиленда.

Для вывода «Фактическая одномерность» нужны ECV ≥ 0.70 и подтверждение по PUC или ωh, а PUC считается по ключу, полученному из данных. Одного ECV для этого вывода недостаточно, как показали Родригес, Райз и Хэвиленд (Rodriguez, Reise and Haviland, 2016): ECV смещён достаточно мало, чтобы опираться на него одного, только если большинство пар пунктов не загрязнены. Поэтому при PUC выше 0.80 порог — один ECV, ниже этого ωh тоже должна достичь 0.70, а если PUC вычислить нельзя, ECV используется один. Порог 0.70 намеренно выше, чем ECV > 0.60 у Райза, Шайнса, Уидамана и Хэвиленда (Reise, Scheines, Widaman and Haviland, 2013), так что решение, которое некоторые источники назвали бы одномерным, здесь так не помечается, и легенда под декомпозицией об этом сообщает. Ниже порога уровни — умеренная от 0.50 и существенная ниже. PUC — доля из p(p−1)/2 пар пунктов, пункты которых относятся к разным групповым факторам, и её обычно вычисляют по априорному ключу субшкал. У модуля такого ключа нет, поэтому каждый пункт относится к групповому фактору с наибольшей по модулю нагрузкой (при равенстве — к первому), и легенда указывает это отнесение. Каждый ECV (общего фактора и каждого группового) — сумма квадратов соответствующего столбца, делённая на сумму всех таких сумм.

Коэффициент H вычисляется по каждому столбцу преобразованных нагрузок, причём каждый квадрат нагрузки ограничен сверху значением меньше 1. H=(1+(∑iλi21−λi2)−1)−1 по собственным нагрузкам фактора, по Хэнкоку и Мюллеру (Hancock and Mueller, 2001), показывает, насколько хорошо оптимально взвешенная сумма индикаторов восстановила бы фактор, поэтому H понимают как воспроизводимость конструкта, а не как надёжность. Коэффициент вычисляется для g и для каждого группового фактора только по соответствующему столбцу и оценивается только для g (хорошо определённый от 0.80, достаточно определённый от 0.70, слабо определённый ниже), а H групповых факторов выводится без оценки рядом с омегами каждой субшкалы. Нагрузка 1 и больше по модулю сделала бы свой член бесконечным, поэтому λ² сначала ограничивается значением 0.9999, как и в коэффициенте H модуля надёжности. Так случай Хейвуда даёт конечное значение, а не пустой коэффициент.

Декомпозиция дисперсии строится по общей дисперсии, и её итог близок к сумме общностей основного решения, но не обязан с ней совпадать. Итог равен ∑g2+∑F2 по преобразованным нагрузкам, то есть по построению сумме столбца h² иерархической таблицы, так что строки общего и групповых факторов в сумме дают его точно, а каждый процент — доля общей дисперсии, а не числа переменных. Легенда об этом сообщает, поскольку читатель, привыкший к таблице объяснённой дисперсии, ждёт другого знаменателя. schmid() формирует общую нагрузку каждого пункта как fload %*% gload, суммируя по факторам первого порядка до возведения в квадрат. Поэтому у пункта с перекрёстными нагрузками в этот квадрат входят перекрёстные члены, которые групповой остаток fload² (1 − gload²) не воспроизводит, и они совпадают с членами основного решения, только если фактор второго порядка точно воспроизводит корреляции факторов. При простой структуре таких членов нет, а при двух факторах единственная пара нагрузок второго порядка воспроизводит единственную корреляцию, так что итог равен сумме общностей. Разрыв появляется при перекрёстных нагрузках начиная с трёх факторов, сверх того, что меняют отдельная подгонка и её нормализация.

Проверка. Решение кафе удовлетворяет обоим условиям (два фактора, простая структура), и его итог 2.65 равен сумме общностей.

Интервалы для омеги используют тот же бутстрэп, что и нагрузки, а интервалы субшкал перед объединением выравниваются по конгруэнтности. Обе части берут одни и те же бутстрэп-выборки и одну корреляционную матрицу на повтор (при полихорическом или смешанном оценщике её построение составляет основную часть затрат, и при двух отдельных циклах они удвоились бы), а каждый повтор полностью заново выполняет omega() с тем же методом извлечения, вращением и числом факторов, поскольку выборочная изменчивость коэффициента проходит через преобразование не меньше, чем через матрицу. ωh, ωt, ωh/ωt, ECV и H для g — отдельные числа, не зависящие от порядка групповых факторов, и объединяются как есть. ωhs, ωs и H каждого группового фактора привязаны к конкретным групповым факторам, которые от бутстрэп-выборки к бутстрэп-выборке могут меняться местами или знаком. Поэтому групповые столбцы каждого повтора сопоставляются с исходными по максимальному весовому паросочетанию на конгруэнтности Такера (тот же шаг, что и у интервалов нагрузок), и значения субшкал записываются в этом порядке. Само выравнивание — тоже оценка, поэтому примечание под таблицей советует интерпретировать интервалы субшкал осторожнее. Интервал — тот же процентильный с коррекцией смещения, что и у нагрузок, и действует та же нижняя граница в 50 пригодных повторов, но здесь для каждого коэффициента отдельно. Повтор, в котором omega() не удалась, не вносит вклада ни в одну строку, а повтор, потерявший групповой фактор, вносит вклад в общие строки и оставляет NA в строке этой субшкалы. Поэтому у каждого интервала своё число повторов, примечание под таблицей сообщает наименьшее, а — обозначает границу, не выведенную только для этой строки. Строки заголовков у таблицы нет, поэтому уровень указан в примечании, а не над столбцом.

Иерархические оценки — это factor.scores() по преобразованным нагрузкам с корреляционной матрицей в качестве rho, а их детерминированность вычисляется по той же формуле, где структурной матрицей служат нагрузки. Оценки вычисляются выбранным методом по столбцам g и групповых факторов так же, как основные оценки по матрице паттерна, в отдельном блоке, чтобы при сбое расчёта оценок карточка преобразования сохранялась, а сбой сообщался отдельно. Факторы Шмида — Леймана ортогональны, поэтому структурная матрица, нужная для формулы детерминированности, — это сама матрица нагрузок, и у оценок Андерсона — Рубина нет Φ, которой они могли бы противоречить. Именно поэтому оговорка о методе оценок выводится только при включённых основных оценках. Детерминированность выводится здесь, поскольку входит в стандартный набор показателей бифакторной модели, по Райзу, Бонифэю и Хэвиленду (Reise, Bonifay and Haviland, 2013), и поскольку именно здесь эти оценки слабее всего: внутри каждого блока общий столбец по построению почти пропорционален групповому, так что разделяющие их веса определены плохо. По той же причине методы Бартлетта и Андерсона — Рубина на матрице Шмида — Леймана обычно отказывают, и сообщение о сбое разделяется по методу так же, как для основных оценок. Добавляемые столбцы называются SLT_g, SLT_F1… с суффиксом метода, как и основные оценки, так что в наборе данных с обоими наборами видно, какой из них какой.

Проверка. Иерархические оценки кафе имеют детерминированность 0.67, 0.69 и 0.66 против 0.86 и 0.84 у основных регрессионных оценок.

Сравнение методов извлечения

Диалог наследует число факторов, вращение и нормализацию шага 3, проверяет их до открытия и отмечает выполняемый метод извлечения, но не навязывает его. Модальное окно закрывает страницу, так что, пока оно открыто, ни одно из трёх полей недоступно. Сравнение берёт их значения, не показывая полей, поэтому диалог перечисляет их в отдельной строке. По той же причине проверки (хотя бы три числовые переменные, число в пределах границы Ледермана, никакого бифакторного вращения при числе факторов меньше трёх) выполняются кнопкой, открывающей диалог, где всплывающее уведомление ещё можно учесть, и повторно в функции запуска, которую вызывают собственная кнопка диалога и программный вызов без интерфейса. Проверки идут в том же порядке, что и у кнопки Запустить полный анализ, так что обе кнопки называют одну и ту же первую проблему, а не две разные. Граница — граница РФА, что бы ни было выбрано на шаге 1, поскольку каждая сравниваемая строка проходит через fa(), и если при АГК число, принятое шагом 3, превышает эту границу, сообщение уточняет, что предел задаёт сравнение, а не шаг 3. Метод, заданный на шаге 3, при открытии отмечается, а не навязывается: карточка — проверка устойчивости решения, которое выполняет пользователь, и остаётся ею, только если сравнение его включает, но сравнение, намеренно его исключающее, — тоже законный вопрос. ML, PA и MINRES отмечены по умолчанию как три самых распространённых метода, тот же набор, что предлагает кнопка диалога.

Каждая строка — решение шага 3, заново подогнанное другим методом извлечения, с тем же вращением и нормализацией, что и на основной карточке. Каждый метод даёт невращённую подгонку, а его нагрузки вращаются собственным вращением модуля с настройкой Нормализация Кайзера шага 3 (один фактор и Без вращения остаются на пути psych, поскольку вращать нечего). Поэтому строка метода, выполненного на шаге 3, воспроизводит сложность и число неотнесённых переменных основной карточки, а статистики соответствия, инвариантные к вращению, от этого не меняются. Неудавшееся вращение выводится как неудавшаяся строка этого метода и не прерывает сравнение. Сложность и число неотнесённых переменных оцениваются, таким образом, при выбранном вращении, а не на копии с варимаксом, как в таблице сравнения моделей, и совпадают с качеством решения шага 3 для выполненного метода. Накопленный % — это сумма квадратов нагрузок, делённая на p, с учётом Φ при косоугольном вращении, как psych делает для собственного Vaccounted, и потому в точности равен средней общности. Это не сумма собственных значений извлечения, поскольку при альфа-факторизации они относятся к внутренне перемасштабированной матрице psych и были бы в 1.1–1.3 раза больше, чем в любой другой строке, из-за одного лишь масштаба. Сравнение закрепляет np.obs, чтобы MINCHI выполнялся с равными весами, а не деградировал до minres, и загружает Rcsdp для минимального ранга.

Лучшее значение относительно и определяется по выведенному числу, цвет абсолютен, и то и другое не выводится там, где вводило бы в заблуждение. Полужирный отмечает лучший из сравниваемых методов в каждом столбце по значению, округлённому до точности вывода этого столбца, так что выделение никогда не противоречит двум одинаково выведенным числам. Столбцы на основе χ² выделяются так же, как остальные (сама ячейка χ² не выделяется), и легенда объясняет, что значит это выделение, поскольку при всех методах, кроме ML, эти столбцы — приближения критерия, который оптимизирует только ML. Одно выделение показало бы читателю, какой метод лучше всех соответствует данным, но не то, соответствует ли им хоть один. Поэтому RMSEA, CFI, TLI и SRMR дополнительно окрашиваются по порогам соответствия, тем же абсолютным уровням, по которым оценивают шаги 2 и 3. Для строк с df ≤ 0, где модель воспроизводит матрицу по построению, окраска не применяется, точно так же, как таблицы единичного решения не ставят там вывода. Решение со сверхслучаем Хейвуда исключается из выбора лучших значений, а его строка окрашивается красным, поскольку общность больше 1 — не подгонка, а отказ модели. Случай Хейвуда — предостережение: строка окрашивается жёлтым и в выборе участвует, по тем же правилам, что и на шаге 3, так что решение, отмеченное на одной карточке, не может пройти без пометки на другой. Метод, который не удалось подогнать, сохраняет строку с пометкой Подгонка не удалась и сообщением psych при наведении, чтобы несовместимость вращения с числом факторов не приняли за несходимость. Метод, не сошедшийся за допустимое число итераций, помечается значком †, а не удаляется, поскольку нагрузки он вернул, а предел приходит как сообщение, а не предупреждение, и перехватывается собственным обработчиком. Факторизация главных осей и альфа-факторизация повторяются с единичными общностями, если старт SMC не удался, и помечаются звёздочкой: подгонка с другими начальными условиями корректна, но с оговоркой о сопоставимости, а не с проблемой допустимости. Поэтому звёздочка не окрашивает ничего ни в одной таблице.

При АГК компонентное решение подгоняется один раз как опорное для конгруэнтности: без строки индексов соответствия, первым в каждой паре и с сообщением о сбое. Сопоставление компонентного решения с извлечениями общих факторов — та проверка устойчивости, которой литература требует от него (сохраняется ли компонентная структура при извлечении, моделирующем уникальную дисперсию), поэтому диалог доступен при АГК, а отмеченные методы остаются методами общих факторов. Компонентное решение подгоняется через principal() и вращается так же, как извлечения, но не получает строки в таблице индексов соответствия: у компонентной модели нет уникальных дисперсий, поэтому χ², RMSEA, TLI и информационные критерии для неё не определены, а строка прочерков выглядела бы как неудавшаяся подгонка. Оно стоит первым в каждой паре и служит опорным для нумерации столбцов, поскольку это решение, которое пользователь на самом деле выполняет. Если подгонка не удалась, сравнение само выбирает опорное решение, а сообщение psych красным выводится в строке сведений об анализе на карточке: диалог обещал опорное решение, и карточка, похожая на обычное сравнение методов РФА, неверно описывала бы, что сравнивалось. Число факторов ограничено границей Ледермана для РФА, хотя шаг 3 принял больше компонент, поскольку каждая сравниваемая строка — подгонка общих факторов.

Проверка. На пунктах кафе две компоненты показывают конгруэнтность от 0.995 до 0.998 с факторами каждого метода извлечения.

Конгруэнтность вычисляется попарно по точному сопоставлению, нумеруется по одному выравниванию с опорным методом и выводится без знака, с точностью до десяти знаков. Нумерация факторов произвольна: ничто не делает первый фактор одного метода первым фактором другого. Поэтому коэффициенты каждой пары берутся по сопоставлению факторов двух решений с максимальным весом, то есть по тому сопоставлению, на котором определён коэффициент Такера, причём точным назначением, а не жадным поиском ближайшего, способным сопоставить один фактор дважды. Если бы подписи столбцов тоже брались из сопоставления каждой пары, то при трёх и более методах F1 в разных строках обозначал бы разные факторы. Поэтому подписи берутся из одного выравнивания всех решений относительно опорного: компонентного решения, если оно есть, иначе медоида, то есть метода с наибольшей сопоставленной конгруэнтностью со всеми остальными. Переносится только перестановка, а легенда называет опорный метод. Коэффициенты выводятся по модулю, поскольку отражённый фактор — тот же фактор. psych::factor.congruence() так не делает и возвращает коэффициент со знаком, поэтому при сверке может показать большое отрицательное значение там, где таблица показывает большое положительное. Передаётся digits = 10, поскольку по умолчанию psych округляет до двух знаков, и значения попадают ровно на пороги 0.85 и 0.95. Модуль округляет только для вывода и определяет уровень по выведенному значению, так что цвет или вывод никогда не противоречит числу рядом. Вырожденный фактор без нагрузок заставляет factor.congruence() вернуть NaN, что трактуется как отсутствие сходства и не прерывает сопоставление.

Проверка. На пунктах кафе медоидом оказывается факторизация главных осей.

Сводка приводит рядом со средними по парам наихудший отдельный фактор, при АГК разделяется на две части и сохраняет все оговорки усредняемых пар. «Можно считать эквивалентными» — утверждение о факторе, а не о решении, по Лоренсо-Севе и тен Берге (Lorenzo-Seva & ten Berge, 2006). У трёхфакторного сравнения, факторы которого воспроизводятся на уровне 0.99, 0.99 и 0.67, высокое среднее, но один фактор в двух решениях — не один и тот же конструкт. Усреднение его в среднее пары, а затем минимум по средним скрывают это дважды, поэтому наименьший коэффициент, которого достиг отдельный фактор в какой-либо паре, выводится четвёртым показателем и окрашивается так же, как остальные. При компонентном опорном решении пары отвечают на два вопроса: согласуются ли методы извлечения между собой и сохраняется ли при них компонентная структура. Одно среднее по обеим группам определялось бы той, в которой больше пар (при двух методах извлечения — парами с опорным решением, при восьми — парами методов между собой). Поэтому сводка разделена, а при РФА или если подогнать удалось только один метод извлечения остаётся целой, поскольку различать нечего. Каждая пара входит в показатели, какие бы пометки у неё ни были, поэтому пара с решением Хейвуда или недопустимым решением, повтором с SMC = FALSE или несошедшейся подгонкой добавляет своё предостережение прямо в сводку, а не оставляет его легенде под таблицей, до которой читатель, остановившийся на Отлично, не дойдёт. Таблица выводит среднее каждой строки, а не минимум, поскольку роль минимума выполняет четвёртый показатель.

Взаимосвязь настроек

Зависимые параметры появляются вместе с родительским и снимаются, когда их скрывают. При появлении отмечается только флажок корреляций факторов, а бифакторное вращение при АГК сбрасывается, чтобы не оставаться выбранным, но недоступным. У строки Φ в разметке нет атрибута checked, а Φ — главный результат косоугольного решения, так что без отметки при появлении строки он никогда бы не выводился. Флажок отмечается только в момент этого перехода, поскольку последующий выбор числа факторов заново проверяет то же правило и не должен повторно отмечать флажок, снятый пользователем. Вложенные параметры Шмида — Леймана и интервал для нагрузок снимаются, а не просто скрываются, когда выключается родительский параметр, поскольку скрытый, но отмеченный флажок всё равно выполнялся бы, а интервал для нагрузок — самый затратный параметр формы: он заново подгоняет всё решение на каждом повторе. Показать значения на диаграмме сохраняет отметку, поскольку на расчёт не влияет, а его значение по умолчанию должно сохраняться при выключении и включении диаграммы. При АГК бифакторное семейство в списке отключается, а выбранный его член сбрасывается на варимакс вместе с соответствующим значением нормализации по умолчанию, поскольку отключённый, но выбранный вариант дошёл бы до подгонки и был бы там отклонён. Остальные вращения остаются, поскольку principal() возвращает Φ и структурную матрицу для косоугольного вращения. Сброс нормализации Кайзера при смене вращения и переход через один фактор обоснованы выше, закрепление метода оценок при одном факторе — вместе с проверками метода оценок, а повторная публикация предела числа факторов — в разделе «Требования».

Пропущенные данные

Наблюдения исключаются построчно, что бы ни было задано в настройке пропущенных данных, и карточка пригодности показывает, чего это стоило. Каждое число, которое выводит модуль, — разложение одной корреляционной матрицы, поэтому матрица должна быть единой согласованной оценкой. Матрица, собранная попарно, где каждая корреляция вычислена по своим полным наблюдениям, не обязана быть положительно определённой и не имеет единого объёма выборки для статистик соответствия, прогонов параллельного анализа и отношения наблюдений к переменным. Поэтому сторона R прежде всего выполняет na.omit() по выбранным переменным (на шаге 2, шаге 3 и в сравнении методов извлечения), и попарного варианта настройки здесь нет. Построчное удаление и импутация учитываются, поскольку действуют на набор данных до того, как его получит модуль. Глобальное построчное удаление исключает наблюдения по всем переменным, выбранным в окне выбора переменных, то есть отбирает не меньше, чем собственный отбор модуля, а после импутации исключать нечего. Карточка пригодности — единственная, где объём выборки указан рядом с числом строк, исключённых самим модулем, поэтому это число выводится там и больше нигде. Таблицы оценок сопоставляют свои строки с исходными номерами строк, так что добавленный столбец оценок попадает в нужные наблюдения.

Воспроизводимость

Список литературы следует за расчётом, а не за набором возможностей, и называет выполненный критерий, а не пункт списка. Список, называющий каждый метод модуля, был бы бесполезен как абзац о методах, поэтому каждую ссылку добавляет ветка кода, которая выполнялась. psych — всегда. GPArotation — только для вращения, которое psych ему передаёт. Проверка через deparse() на живом расчёте показала, что действительно без него обходятся только Варимакс (stats::varimax) и Кластер (варимакс, затем psych::target.rot, что засчитывается строке пакета). Промакс в их число не входит: и при АГК, и при РФА он выполняется через psych::Promax, которая загружает GPArotation. Преобразование Шмида — Леймана собственного случая не добавляет. Rcsdp — при методе Минимальный ранг, общности которого берутся из решаемой им задачи полуопределённого программирования. MASS — если запрошены матрицы антиобраза, поскольку они построены на его ginv(). Вращение цитируется по критерию, который psych действительно оптимизирует, а не по названию в списке: Эквамакс — это критерий Кроуфорда — Фергюсона при κ=k/(2p), Бифакторное и Биквартимин (косоугольный бифакторный) — оба критерий биквартимин Дженнриха — Бентлера, Кластер — варимакс. Нормализация Кайзера цитируется, только если выполнялась нормализация модуля до и после вращения, что возможно при любом вращении, а не только при варимаксе, как флаг psych. Взвешенный χ² по минимальному объёму выборки не цитирует собственного метода, поскольку у весов psych нет литературы за пределами пакета. Расчёт с типом Смешанная цитирует ровно те оценщики, которые выполнялись на данном наборе столбцов, по группам самого распределения: Пирсона, если есть непрерывный столбец, полихорическую, если есть политомический, тетрахорическую, только если встретились два дихотомических столбца, полисериальную и бисериальную для пар непрерывных и порядковых. Какие из них выполнялись — свойство данных, а не параметра. Правила отбора, индексы соответствия, метод оценок, детерминированность, конгруэнтность Такера и бутстрэп цитируются, только если была построена их карточка, а ориентиры оценок — только при включённой настройке интерпретации. Поэтому у двух расчётов, различающихся одним параметром, разные списки литературы, и список можно вставить как часть раздела о методах.