В этом примере показано, как выполнить факторный анализ с помощью Statistics and Machine Learning Toolbox™.
Многомерные данные часто включают большое количество измеренных переменных, и иногда тех переменных "перекрытие" в том смысле, что группы их могут зависеть. Например, в десятиборье, каждый спортсмен участвует в 10 соревнованиях, но несколько из них могут считаться событиями "скорости", в то время как другие могут считаться событиями "силы" и т.д. Таким образом 10 баллов события конкурента могут считаться в основном зависящими от меньшего набора 3 или 4 типов спортивной способности.
Факторный анализ является способом подобрать модель к многомерным данным, чтобы оценить только этот вид взаимозависимости.
В модели факторного анализа измеренные переменные зависят от меньшего числа ненаблюдаемых (скрытых) факторов. Поскольку каждый фактор может влиять на несколько переменных вместе, они известны как "общие множители". Каждая переменная принята, чтобы зависеть от линейной комбинации общих множителей, и коэффициенты известны как загрузки. Каждая измеренная переменная также включает компонент из-за независимой случайной изменчивости, известной как "определенное отклонение", потому что это характерно для одной переменной.
А именно, факторный анализ принимает, что ковариационная матрица ваших данных имеет форму
SigmaX = Lambda*Lambda' + Psi
где Lambda является матрицей загрузок, и элементы диагонального матричного Psi являются определенными отклонениями. Функциональный factoran
подбирает модель факторного анализа, использующую наибольшее правдоподобие.
120 студентов каждый сдали пять экзаменов, первые две закрывающей математики, следующие два на литературе и всесторонний пятый экзамен. Кажется разумным, что пять классов для данного студента должны быть связаны. Некоторые студенты способны к обоим предметам, некоторые способны к только одному и т.д. Цель этого анализа состоит в том, чтобы определить, существует ли количественное доказательство, что классы студентов на пяти различных экзаменах в основном определяются только двумя типами способности.
Сначала загрузите данные, затем вызовите factoran
и запросите подгонку модели с одним общим множителем.
load examgrades
[Loadings1,specVar1,T,stats] = factoran(grades,1);
factoran
сначала два возвращаемых аргумента являются предполагаемыми загрузками и предполагаемыми определенными отклонениями. От предполагаемых загрузок вы видите, что один общий множитель в этой модели помещает большой положительный вес на все пять переменных, но большую часть веса на пятом, всестороннем экзамене.
Loadings1
Loadings1 = 0.6021 0.6686 0.7704 0.7204 0.9153
Одна интерпретация этой подгонки - то, что студенческая сила думается в терминах их "полной способности", для которой всесторонний экзамен был бы наилучшим имеющимся измерением. Класс студента на более подчинено-специфичном тесте зависел бы от их полной способности, но также и от того, был ли студент силен в той области. Это объяснило бы более низкие загрузки для первых четырех экзаменов.
От предполагаемых определенных отклонений вы видите, что модель указывает, что класс конкретного студента на конкретном тесте варьируется довольно много вне изменения из-за общего множителя.
specVar1
specVar1 = 0.6375 0.5530 0.4065 0.4810 0.1623
Определенное отклонение 1 указало бы, что нет никакого компонента общего множителя в той переменной, в то время как определенное отклонение 0 указало бы, что переменная полностью определяется общими множителями. Эти классы экзамена, кажется, падают где-нибудь промежуточные, несмотря на то, что существует наименьшее количество объема определенного изменения для всестороннего экзамена. Это сопоставимо с интерпретацией, данной выше одного общего множителя в этой модели.
P-значение возвращено в stats
структура отклоняет нулевую гипотезу одного общего множителя, таким образом, мы переоборудуем модель.
stats.p
ans = 0.0332
Затем используйте два общих множителя, чтобы попытаться лучше объяснить баллы экзамена. Больше чем с одним фактором вы могли вращать предполагаемые загрузки, чтобы попытаться сделать их интерпретацию более простой, но в настоящий момент, попросить невращаемое решение.
[Loadings2,specVar2,T,stats] = factoran(grades,2,'rotate','none');
От предполагаемых загрузок вы видите, что первый невращаемый фактор помещает приблизительно равный вес на все пять переменных, в то время как второй фактор контрастирует первые две переменные со вторыми двумя.
Loadings2
Loadings2 = 0.6289 0.3485 0.6992 0.3287 0.7785 -0.2069 0.7246 -0.2070 0.8963 -0.0473
Вы можете интерпретировать эти факторы как "полная способность" и "количественный по сравнению с качественной способностью", расширив интерпретацию подгонки с одним фактором, сделанной ранее.
График переменных, где каждая загрузка является координатой вдоль оси соответствующего фактора, иллюстрирует эту интерпретацию графически. Первые два экзамена имеют положительную загрузку на второй фактор, предлагая, чтобы они зависели от "количественной" способности, в то время как вторые два экзамена, по-видимому, зависят от противоположного. Пятый экзамен имеет только маленькую загрузку на этот второй фактор.
biplot(Loadings2, 'varlabels',num2str((1:5)')); title('Unrotated Solution'); xlabel('Latent Factor 1'); ylabel('Latent Factor 2');
От предполагаемых определенных отклонений вы видите, что эта 2D факторная модель указывает на несколько меньшее количество изменения кроме того из-за общих множителей, чем одна факторная модель. Снова, наименьшее количество количества определенного отклонения происходит для пятого экзамена.
specVar2
specVar2 = 0.4829 0.4031 0.3512 0.4321 0.1944
stats
структура показывает, что существует только одна степень свободы в этой 2D факторной модели.
stats.dfe
ans = 1
Только с пятью измеренными переменными вы не можете подобрать модель больше чем с двумя факторами.
Вы сделали подгонки выше использования необработанных экзаменационных отметок, но иногда у вас может только быть матрица выборочной ковариации, которая обобщает ваши данные. factoran
принимает или ковариационную или корреляционную матрицу, с помощью 'Xtype'
параметр, и дает идентичный результат этому от необработанных данных.
Sigma = cov(grades); [LoadingsCov,specVarCov] = ... factoran(Sigma,2,'Xtype','cov','rotate','none'); LoadingsCov
LoadingsCov = 0.6289 0.3485 0.6992 0.3287 0.7785 -0.2069 0.7246 -0.2070 0.8963 -0.0473
Иногда, предполагаемые загрузки из модели факторного анализа могут дать большой вес на нескольких факторах для некоторых измеренных переменных, мешая интерпретировать то, что представляют те факторы. Цель факторного вращения состоит в том, чтобы найти решение, для которого каждая переменная имеет только небольшое количество больших загрузок, т.е. затронута маленьким рядом факторов, предпочтительно только один.
Если вы думаете о каждой строке матрицы загрузок как координаты точки в M-мерном-пространстве, то каждый фактор соответствует координатной оси. Факторное вращение эквивалентно вращению тех осей и вычислению новых загрузок во вращаемой системе координат. Существуют различные способы сделать это. Некоторые методы оставляют оси ортогональными, в то время как другие являются наклонными методами, которые изменяют углы между ними.
Varimax является одним общим критерием ортогонального вращения. factoran
выполняет varimax вращение по умолчанию, таким образом, вы не должны просить его явным образом.
[LoadingsVM,specVarVM,rotationVM] = factoran(grades,2);
Быстрый чек varimax матрицы вращения возвращен factoran
подтверждает, что это ортогонально. Varimax, в действительности, вращает факторные оси в фигуре выше, но сохраняет их под прямым углом.
rotationVM'*rotationVM
ans = 1.0000 0.0000 0.0000 1.0000
Побочная сюжетная линия этих пяти переменных на вращаемых факторах показывает эффект varimax вращения.
biplot(LoadingsVM, 'varlabels',num2str((1:5)')); title('Varimax Solution'); xlabel('Latent Factor 1'); ylabel('Latent Factor 2');
Varimax твердо вращал оси в попытке сделать все из загрузок близко к нулю или один. Первые два экзамена являются самыми близкими к второй факторной оси, в то время как третье и четвертое являются самыми близкими к первой оси, и пятый экзамен в промежуточном положении. Эти два вращаемых фактора могут, вероятно, быть лучше всего интерпретированы как "количественная способность" и "качественная способность". Однако, потому что ни одна из переменных не около факторной оси, побочная сюжетная линия показывает, что ортогональное вращение не преуспело в том, чтобы обеспечить простой набор факторов.
Поскольку ортогональное вращение было не совсем удовлетворительным, можно попытаться использовать промакс., общий наклонный критерий вращения.
[LoadingsPM,specVarPM,rotationPM] = ... factoran(grades,2,'rotate','promax');
Проверка на промакс. матрице вращения, возвращенной factoran
показывает, что это не ортогонально. Промакс., в действительности, вращает факторные оси в первой фигуре отдельно, позволяя им иметь косой угол между ними.
rotationPM'*rotationPM
ans = 1.9405 -1.3509 -1.3509 1.9405
Побочная сюжетная линия переменных на новых вращаемых факторах показывает эффект промакс. вращения.
biplot(LoadingsPM, 'varlabels',num2str((1:5)')); title('Promax Solution'); xlabel('Latent Factor 1'); ylabel('Latent Factor 2');
Промакс. выполнил нетвердое вращение осей и сделал намного лучшее задание, чем varimax при создании "простой структуры". Первые два экзамена близко к второй факторной оси, в то время как третье и четвертое близко к первой оси, и пятый экзамен находится в промежуточном положении. Это делает интерпретацию этих вращаемых факторов как "количественная способность" и "качественная способность" более точный.
Вместо того, чтобы строить переменные на различных наборах вращаемых осей, возможно наложить вращаемые оси на невращаемой побочной сюжетной линии, чтобы получить лучшее представление о том, как вращаемые и невращаемые решения связаны.
h1 = biplot(Loadings2, 'varlabels',num2str((1:5)')); xlabel('Latent Factor 1'); ylabel('Latent Factor 2'); hold on invRotVM = inv(rotationVM); h2 = line([-invRotVM(1,1) invRotVM(1,1) NaN -invRotVM(2,1) invRotVM(2,1)], ... [-invRotVM(1,2) invRotVM(1,2) NaN -invRotVM(2,2) invRotVM(2,2)],'Color',[1 0 0]); invRotPM = inv(rotationPM); h3 = line([-invRotPM(1,1) invRotPM(1,1) NaN -invRotPM(2,1) invRotPM(2,1)], ... [-invRotPM(1,2) invRotPM(1,2) NaN -invRotPM(2,2) invRotPM(2,2)],'Color',[0 1 0]); hold off axis square lgndHandles = [h1(1) h1(end) h2 h3]; lgndLabels = {'Variables','Unrotated Axes','Varimax Rotated Axes','Promax Rotated Axes'}; legend(lgndHandles, lgndLabels, 'location','northeast', 'fontname','arial narrow');
Иногда, полезно смочь классифицировать наблюдение на основе своих факторных баллов. Например, если вы приняли 2D факторную модель и интерпретацию промакс. вращаемых факторов, вы можете хотеть предсказать, как хорошо студент сделал бы на экзамене математики в будущем.
Поскольку данные являются необработанными классами экзамена, и не только их ковариационной матрицей, у нас может быть factoran
возвратите прогнозы значения каждого из двух вращаемых общих множителей для каждого студента.
[Loadings,specVar,rotation,stats,preds] = ... factoran(grades,2,'rotate','promax','maxit',200); biplot(Loadings, 'varlabels',num2str((1:5)'), 'Scores',preds); title('Predicted Factor Scores for Promax Solution'); xlabel('Ability In Literature'); ylabel('Ability In Mathematics');
Этот график показывает подгонку модели и в терминах исходных переменных (векторы) и в терминах предсказанной музыки к каждому наблюдению (точки). Подгонка предлагает, чтобы, в то время как некоторые студенты преуспевают в одном предмете, но не другом (вторые и четвертые квадранты), большинство студентов сделало или хорошо или плохо и в математике и в литературе (сначала и третьи квадранты). Можно подтвердить это путем рассмотрения предполагаемой корреляционной матрицы этих двух факторов.
inv(rotation'*rotation)
ans = 1.0000 0.6962 0.6962 1.0000
Существует много перекрытия в терминологии и целях между Анализом основных компонентов (PCA) и Факторным анализом (FA). Большая часть литературы по этим двум методам не различает их, и некоторые алгоритмы для того, чтобы подбирать модель FA включают PCA. Оба - методы сокращения размерности, в том смысле, что они могут использоваться, чтобы заменить большой набор наблюдаемых переменных с меньшим набором новых переменных. Они также часто дают подобные результаты. Однако эти два метода отличаются в своих целях и в их базовых моделях. Примерно разговор, необходимо использовать PCA, когда просто необходимо обобщить или аппроксимировать данные с помощью меньшего количества размерностей (чтобы визуализировать его, например), и необходимо использовать FA, когда вам нужна объяснительная модель для корреляций среди ваших данных.