Как можно использовать коэффициенты загрузки из PCA для расчета индекса, который можно применить для каждого человека во фрейме данных в R?

Я использую анализ основных компонентов (PCA) на основе ~ 30 переменных, чтобы составить индекс, который классифицирует людей по 3 различным категориям (верхняя, средняя, ​​нижняя) в R.

У меня есть фрейм данных из ~ 2000 человек с 28 двоичными и 2 непрерывными переменными.

Теперь я хотел бы использовать коэффициенты нагрузки из ПК1 для построения индекс, который классифицирует мои 2000 человек по этим 30 переменным в 3 разные группы.

Проблема: Несмотря на обширные исследования, я не смог выяснить, как извлечь коэффициенты нагрузки из PCA_loadings, дать каждому человеку оценку (на основе нагрузок 30 переменных), что впоследствии позволило бы мне ранжировать каждого человека (для дальнейшей классификации). . Имеет ли смысл отображать коэффициенты нагрузки на графике?

  1. Я выполнил следующие шаги:

a) Запустил PCA, используя PCA_outcome <- prcomp(na.omit(df1), scale = T)

б) Извлечены загрузки с помощью PCA_loadings <- PCA_outcome$rotation

в) Удалены все переменные, для которых коэффициенты загрузки были близки к 0.

  1. Я подумал о создании 30 новых переменных, по одной для каждого коэффициента загрузки, которые я бы суммировал для каждой двоичной переменной == 1 (хотя я не уверен, как поступить с непрерывными переменными). Следовательно, я бы присвоил каждому балл. Однако я не знаю, как собрать 30 значений факторов нагрузки в балл для каждого человека.

R-код

df1 <- read.table(text = " 
          educ     call      house  merge_id    school  members       
A           1        0          1      12_3        0      0.9
B           0        0          0      13_3        1      0.8
C           1        1          1      14_3        0      1.1
D           0        0          0      15_3        1      0.8 
E           1        1          1      16_3        3      3.2", header=T)


## Run PCA
PCA_outcome <- prcomp(na.omit(df1), scale = T)

## Extract loadings
PCA_loadings <- PCA_outcome$rotation


## Explanation: A-E are 5 of the 2000 individuals and the variables (education, call, house, school, members) represent my 30 variables (binary and continuous).

Ожидаемые результаты: - Получите ранговый балл для каждого человека - В дальнейшем присвоить каждому индивидууму категорию 1-3.

Обязательно ли использовать PCA? Если вы хотите разделить своих людей на три группы, почему бы не использовать кластерный подход, например, k-средних с k = 3?

Lyngbakr 30.05.2019 17:20

К сожалению, я должен.

msgh 30.05.2019 17:56

Я не уверен, что понимаю ваш вопрос. Если вы хотите получить балл ПК для ПК1 для каждого человека, вы можете использовать PCA_outcome$x[, 1].

Lyngbakr 30.05.2019 20:04

Большое спасибо за ваш ответ @Lyngbakr. Эквивалентна ли оценка ПК индексу? Если да, то как создается эта партитура для ПК? Просто суммируя коэффициенты нагрузки для всех переменных для каждого человека? У меня проблема в том, что фрейм данных, который я использую для запуска PCA, содержит информацию только о домохозяйствах. Однако мне нужно будет объединить каждое домохозяйство с другим набором данных для отдельных лиц (чтобы ранжировать людей в соответствии с оценками их домохозяйств). Таким образом, мне нужен merge_id в моем фрейме данных PCA. Есть ли способ выполнить PCA, сохраняя merge_id в моем фрейме данных (см. Отредактированный df выше).

msgh 30.05.2019 21:21

«Эквивалентна ли оценка ПК индексу?» - под этим я подразумеваю следующее: если бы переменные, выбранные для PCA, указывали на социально-экономический статус людей, дал бы PC мне ранжирование социально-экономического статуса для каждого человека?

msgh 30.05.2019 21:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
740
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен на 100%, что вы спрашиваете, но вот ответ на вопрос, который, я думаю, вы задаете.

Прежде всего, PC1 PCA не обязательно предоставит вам индекс социально-экономического статуса. Как поясняется здесь, PC1 просто «учитывает как можно большую изменчивость данных». PC1 вполне может работать как хороший показатель социально-экономического статуса для вашего набора данных, но вам придется критически изучить нагрузки и посмотреть, имеет ли это смысл. В зависимости от знаков нагрузок может быть так, что очень отрицательному PC1 соответствует очень положительный социально-экономический статус. Как я уже сказал: посмотрите на результаты критически. Объяснение того, как рассчитываются баллы ПК, можно найти здесь. В любом случае, это обсуждение относится к Перекрестная проверка, так что давайте перейдем к коду.

Похоже, вы хотите выполнить PCA, вытащить PC1 и связать его с исходным фреймом данных (и merge_ids). Если это ваша цель, вот решение.

# Create data frame
df <- read.table(text = "educ     call      house  merge_id    school  members       
A           1        0          1      12_3        0      0.9
B           0        0          0      13_3        1      0.8
C           1        1          1      14_3        0      1.1
D           0        0          0      15_3        1      0.8 
E           1        1          1      16_3        3      3.2", header = TRUE)

# Perform PCA
PCA <- prcomp(df[, names(df) != "merge_id"], scale = TRUE, center = TRUE)

# Add PC1
df$PC1 <- PCA$x[, 1]

# Look at new data frame
print(df)
#>   educ call house merge_id school members        PC1
#> A    1    0     1     12_3      0     0.9  0.1000145
#> B    0    0     0     13_3      1     0.8  1.6610864
#> C    1    1     1     14_3      0     1.1 -0.8882381
#> D    0    0     0     15_3      1     0.8  1.6610864
#> E    1    1     1     16_3      3     3.2 -2.5339491

Created on 2019-05-30 by the reprex package (v0.2.1.9000)

Поскольку вы говорите, что имеют использовать PCA, я предполагаю, что это вопрос домашнего задания, поэтому я бы порекомендовал прочитать о PCA, чтобы вы поняли, что он делает и для чего он полезен.

Спасибо! Это именно то, что я искал!

msgh 03.06.2019 23:23

Другие вопросы по теме