R: преобразовать балл PCA в процентили и знак нагрузок - PullRequest
0 голосов
/ 07 июня 2018

Я использую prcomp для предварительной подготовки PCA к набору данных, содержащему 24 переменные состояния здоровья и другие социально-экономические переменные.Цель состоит в том, чтобы получить единый индекс здоровья, который я могу использовать для своих регрессионных анализов.Я использую следующий код:

total_pca <- prcomp(health[,-1], scale. = FALSE, rank. = 1)

data$pca <- total_pca$x

data$PVW <- ecdf(-data$pca)(-data$pca) # Convert into percentile

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

Моя проблемаЯ получаю как положительную, так и отрицательную нагрузку, поэтому могу ли я использовать ту же интерпретацию, что и в статье?Или я должен поменять знак отрицательных?И если да, то как мне это сделать?

Другая проблема заключается в том, что у меня есть разные волны в моих данных, но я где-то читал, что не могу поместить свои данные в разные наборы данных по волнам и делаю отдельные PCA для каждогоодин - это правильно?И если да, то как мне тогда это сделать?

Воспроизводимый пример моих данных:

health <- structure(list(wave = c(1, 2, 4, 5, 1, 5, 5, 4, 4, 1, 1, 1, 4, 2, 4, 2, 4, 6, 2, 4, 5, 1, 4, 1, 1, 2, 1, 2, 5, 2, 2, 4, 2, 1, 4, 4, 4, 1, 4, 2), fairpoor = c(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0), adl = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), mental = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0), heart = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0), blood = c(1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0), stroke = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), diabetes = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), lung = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0), arthritis = c(1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), cancer = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), backjoint = c(1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0), doctor = c(1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), hospital = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0), nursinghome = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), bmi = structure(c(32.1, 28.7, 24.7, 23.5, 25.1, 26.3, 22.8, 26.3, 17.2, 32.2, 21.2, 23.6, 28.3, 35.8, 28.3, 28.7, 28.1, 20.4, 23.7, 22.7, 20.4, 25.5, 29.7, 20.3, 20.8, 23.1, 23.3, 26.3, 34.2, 40.6, 24.9, 27.2, 26.4, 23.5, 32.1, 32.8, 26.0, 23.4, 23.7, 22.8), labels = structure(c(-3, -2, -1), .Names = c("Implausible/ suspected wrong", "Refusal", "Don't know")), class = "labelled"), walking = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), sitting = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), chair = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), stairs = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), kneeling = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), arm = c(0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0), pullpush = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), lifting = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), coin = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("wave", "fairpoor", "adl", "mental", "heart", "blood", "stroke", "diabetes", "lung", "arthritis", "cancer", "backjoint", "doctor", "hospital", "nursinghome", "bmi", "walking", "sitting", "chair", "stairs", "kneeling", "arm", "pullpush", "lifting", "coin"), row.names = c(323L, 1847L, 3731L, 5973L, 244L, 5914L, 6289L, 3847L, 3804L, 75L, 247L, 212L, 3878L, 1858L, 3994L, 2046L, 3920L, 9459L, 1850L, 4000L, 6072L, 253L, 3826L, 148L, 319L, 1855L, 17L, 1849L, 5683L, 1791L, 2002L, 3744L, 2027L, 219L, 4052L, 3837L, 4008L, 127L, 3906L, 1880L), class = "data.frame")

1 Ответ

0 голосов
/ 15 июня 2018

A биплот даст вам лучшую интерпретацию PCA в ваших медицинских данных.

В ваших данных bmi имеетболее высокие значения по величине, чем у всех других переменных, следовательно, будут вносить больший вклад в изменение данных для одного и того же процентного изменения.

Поэтому всегда рекомендуется выполнять масштабирование, чтобы каждая переменная имела одинаковую важность.Также в вашем примере данные, кажется, имеют фиксированные столбцы (0 для всех лиц), поэтому удалены из анализа.

  non_zero_counts <- apply(health, 2, function(x) sum(x != 0))  
  all_zero_col <- which(non_zero_counts == 0)

  # removing columns with all zeroes from PCA
  total_pca <- prcomp(health[,-c(1,all_zero_col)], scale. = TRUE)                        

Коэффициенты основного компонента дают представление о том, как главные компоненты соотносятся с исходными переменными ванализ.

 library(ggbiplot)
 ggbiplot(total_pca) + xlim(-2,2) + ylim(-2,2)

PCA biplot

Как вы можете наблюдать, почти все исходные переменные (кроме диабета, легких) отрицательно коррелируют с PC1.Если высокие оценки состояния / исходные переменные предполагают плохое состояние здоровья , то более высокие оценки PC1 коррелируют с хорошим состоянием здоровья

...