Различные результаты при выполнении PCA в R с princomp () и Principal ()

Я пробовал использовать princomp() и principal() для выполнения PCA в R с набором данных USArressts. Однако я получил два разных результата для нагрузок / вращения и оценок.

Во-первых, я центрировал и нормализовал исходный фрейм данных, чтобы было легче сравнивать выходные данные.

library(psych)

trans_func <- function(x){
  x <- (x-mean(x))/sd(x)
  return(x)
}

A <- USArrests
USArrests <- apply(USArrests, 2, trans_func)

princompPCA <- princomp(USArrests, cor = TRUE)
principalPCA <- principal(USArrests, nfactors=4 , scores=TRUE, rotate = "none",scale=TRUE) 

Затем я получил результаты по нагрузкам и баллам, используя следующие команды:

princompPCA$loadings
principalPCA$loadings

Не могли бы вы помочь мне объяснить, почему есть разница? и как мы можем интерпретировать эти результаты?


person user3045597    schedule 16.04.2016    source источник
comment
В принципиальной документации, в отличие от princomp, он возвращает подмножество только лучших n-факторов.   -  person chinsoon12    schedule 16.04.2016
comment
Далее, веса регрессии находятся из обратной корреляционной матрицы, умноженной на нагрузки компонентов. Это приводит к тому, что баллы компонентов являются стандартными баллами (среднее значение = 0, sd = 1) стандартизованных входных данных. Сравнение с оценками princomp показывает эту разницу. princomp по умолчанию не стандартизирует матрицу данных, как и сами компоненты.   -  person chinsoon12    schedule 16.04.2016


Ответы (2)


В самом конце справочного документа ?principal:

«Собственные векторы масштабируются на sqrt собственных значений, чтобы получить нагрузки на компоненты, более типичные для факторного анализа».

Итак, principal возвращает масштабированные нагрузки. Фактически principal производит факторную модель, оцененную методом главных компонент.

person ANuo    schedule 02.10.2016
comment
предположим, что ваша матрица данных названа как 'd'. Затем вы можете вычислить ковариационную матрицу d и выполнить разложение на собственные числа. используя первый столбец собственных векторов, умноженный на sqrt соответствующего собственного значения, вы получите тот же результат, что и 'Principal (d, rotate = none, covar = T)' - person ANuo; 02.10.2016
comment
Так вы говорите, что на самом деле он вычисляет ротационные факторы, а не PCA? - person clancy; 06.12.2019
comment
Есть ли недостатки при использовании этих основных компонентов? - person Nip; 14.09.2020
comment
@clancy это PCA. Факторную модель можно оценить методом PCA. Он вернет уникальную факторную нагрузку. Однако, если вы хотите получить разреженный результат (большинство нагрузок близки к нулю, что удобно для интерпретации) в ваших факторных нагрузках, вы можете применить метод вращения для поворота оси. PCA - это упрощенная версия факторной модели. Если вам наплевать на конкретные факторы. Одним из недостатков использования PCA для оценки факторной модели является то, что оценка факторных нагрузок не изменится при добавлении дополнительных факторов в модель. - person ANuo; 17.09.2020
comment
@Nip Я только что проверил эти функции. Мой ответ большой разницы. Однако я предлагаю, если вы хотите выполнить PCA, лучше использовать princomp. Он возвращает те же результаты, что и собственное разложение. Однако, если вы хотите оценить факторную модель, вам лучше использовать «основную», поскольку она предоставляет больше функций. Я отправлю свое расследование в ответ ниже. - person ANuo; 17.09.2020

Я хотел бы через 4 года дать более точный ответ на этот вопрос. В качестве примера я использую данные радужной оболочки глаза.

data = iris[, 1:4]

Сначала сделайте PCA с помощью собственного разложения

eigen_res = eigen(cov(data))
l = eigen_res$values
q = eigen_res$vectors

Тогда собственный вектор, соответствующий наибольшему собственному значению, - это факторные нагрузки

q[,1]

Мы можем рассматривать это как ссылку или правильный ответ. Теперь проверим результаты с помощью различных r-функций. Во-первых, функцией princomp

res1 = princomp(data)
res1$loadings[,1]
# compare with 
q[,1]

Нет проблем, эта функция фактически просто возвращает те же результаты, что и 'eigen'. Теперь переходим к "основной"

library(psych)
res2 = principal(data, nfactors=4, rotate="none")
# the loadings of the first PC is
res2$loadings[,1]
# compare it with the results by eigendecomposition
sqrt(l[1])*q[,1] # re-scale the eigen vector by sqrt of eigen value

Вы можете обнаружить, что они все еще разные. Проблема в том, что "основная" функция по умолчанию выполняет собственное разложение корреляционной матрицы. Примечание: PCA не инвариантно при изменении масштаба переменных. Если вы измените код как

res2 = principal(data, nfactors=4, rotate="none", cor="cov")
# the loadings of the first PC is
res2$loadings[,1]
# compare it with the results by eigendecomposition
sqrt(l[1])*q[,1] # re-scale the eigen vector by sqrt of eigen value

Теперь вы получите те же результаты, что и «eigen» и «princomp».

Суммировать:

  1. Если вы хотите сделать PCA, вам лучше применить функцию princomp.
  2. PCA - это частный случай факторной модели или упрощенная версия факторной модели. Это просто эквивалентно собственному разложению.
  3. Мы можем применить PCA, чтобы получить приближение факторной модели. Его не волнуют конкретные факторы, например эпсилоны в факторной модели. Итак, если вы измените количество факторов в своей модели, вы получите те же оценки нагрузок. Он отличается от оценки максимального правдоподобия.
  4. Если вы оцениваете факторную модель, вам лучше использовать «главную» функцию, поскольку она предоставляет больше функций, таких как вращение, вычисление оценок различными методами и т. Д.
  5. Изменение масштаба загрузок модели PCA не слишком сильно влияет на результаты. Поскольку вы по-прежнему проецируете данные в одном и том же оптимальном направлении, то есть максимизируете вариации на конечном ПК.
person ANuo    schedule 17.09.2020
comment
Спасибо за ответ. Я также попытался найти разницу между этими двумя функциями при подсчете баллов. В итоге я пришел к следующему выводу: обе эти оценки, за исключением знака, одинаковы. Различия, которые я видел при сравнении оценок Psyx и princomp, заключаются в основном в центрировании и масштабировании данных или самих оценок. В конце концов, я могу спокойно использовать p$scores в качестве входных данных для другого анализа, верно? Я напишу код, который использовал в качестве ответа ниже. - person Nip; 17.09.2020
comment
@Nip Пожалуйста. Да, вы можете рассматривать оценки как новые переменные (извлеченные из исходных данных) и проводить по ним дальнейший анализ данных, например t-тест, ANOVA, регрессию, классификацию и кластерный анализ. Его также можно рассматривать как своего рода метод извлечения признаков. - person ANuo; 23.09.2020