Проблема генерации оценки загрузки основных компонентов в R - PullRequest
0 голосов
/ 24 апреля 2020

Я завершил PCA в R, используя пример кода из stat quest https://github.com/StatQuest/pca_demo/blob/master/pca_demo.R (с моими собственными данными в нем, фреймом данных под названием "PCA4", который затем назывался PCstats для PCA):

Набор данных

dput (PCA4)

structure(list(X40.45cm = c(0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L), X50.55cm = c(0L, 0L, 0L, 0L, 0L, 
3L, 0L, 0L, 0L, 0L, 32L, 0L, 64L, 96L, 0L, 0L), X60.65cm = c(0L, 
3L, 1L, 64L, 3L, 3L, 0L, 0L, 128L, 0L, 0L, 0L, 352L, 512L, 160L, 
0L), X70.75cm = c(1L, 7L, 0L, 32L, 33L, 7L, 1L, 0L, 256L, 32L, 
0L, 0L, 352L, 544L, 320L, 0L), X80.85cm = c(109L, 1L, 2L, 11L, 
164L, 34L, 2L, 64L, 480L, 32L, 160L, 96L, 352L, 1184L, 224L, 
32L)), .Names = c("X40.45cm", "X50.55cm", "X60.65cm", "X70.75cm", 
"X80.85cm"), class = "data.frame", row.names = c(NA, -16L))

Мои данные состоят из выборок в столбцах, а затем каждая строка представляет собой тип вида и заданное количество найденных в каждом образце. Чтобы завершить PCA, мне пришлось удалить названия видов, но я думаю, что теперь это может помешать моей способности генерировать оценки нагрузки. Код, который я пытаюсь использовать, приведен ниже:

loading_scores <- PCstats$rotation[,1]
species_scores <- abs(loading_scores)
species_score_ranked <- sort(species_scores, decreasing=TRUE)
top_10_species <- names(species_score_ranked[1:10])

top_10_species 
PCstats$rotation[top_10_species,1]

Однако, когда я ввожу это, он просто говорит цифру c (0), а затем NULL.

Я извиняюсь, если это плохо объясняется, я никогда не задавал здесь вопросов, но если вам нужна дополнительная информация или разъяснения, пожалуйста, дайте мне знать - любая помощь будет с благодарностью получена!

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

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

data <-structure(list(X40.45cm = c(0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
                0L, 0L, 0L, 0L, 0L, 0L, 0L), X50.55cm = c(0L, 0L, 0L, 0L, 0L, 
               3L, 0L, 0L, 0L, 0L, 32L, 0L, 64L, 96L, 0L, 0L), 
               X60.65cm = c(0L, 
               3L, 1L, 64L, 3L, 3L, 0L, 0L, 128L, 0L, 0L, 0L, 352L, 512L, 160L, 
               0L), X70.75cm = c(1L, 7L, 0L, 32L, 33L, 7L, 1L, 0L, 256L, 32L, 
               0L, 0L, 352L, 544L, 320L, 0L), X80.85cm = c(109L, 1L, 2L, 11L, 
               164L, 34L, 2L, 64L, 480L, 32L, 160L, 96L, 352L, 1184L, 224L, 
          32L)), .Names = c("X40.45cm", "X50.55cm", "X60.65cm", "X70.75cm", 
          "X80.85cm"), class = "data.frame", row.names = c(NA, -16L))

# add column for species names
Species <- paste("Species",LETTERS[1:16])
data <- cbind(Species,data)
# pca
princomp <- prcomp(data[,2:ncol(data)],scale. = TRUE)
stats <- summary(princomp)
# return factor scores for first principal component
x_result <- princomp$x[,"PC1"]

На данный момент x_result содержит значения коэффициентов для основного компонента 1. Поскольку оценки расположены в порядке исходных наблюдений входного фрейма данных в princomp(), мы можем просто установить смоделированный Имена видов к вектору с names(x_result) и сортировка вектора по убыванию абсолютного значения.

names(x_result) <- Species
x_result[order(abs(x_result),decreasing = TRUE)][1:10]

и выходные данные:

> x_result[order(abs(x_result),decreasing = TRUE)][1:10]
 Species N  Species M  Species B  Species F  Species G  Species C Species I 
-5.8993459 -2.8787001  1.3925053  1.2874129  1.0017446  1.0012497 -0.9691621 
 Species P  Species H  Species J 
 0.9550311  0.9020930  0.8617220  

> 

Коэффициенты печати и результаты загрузки

С пакетом pcaMethods от Bioconductor, мы можем повторить анализ и распечатать пара графиков, иллюстрирующих оценки факторов (наблюдения) и нагрузки (измерения) по первым двум факторам.

Сначала мы устанавливаем Bioconductor и pcaMethods (при необходимости),

if (!requireNamespace("BiocManager", quietly = TRUE))
     install.packages("BiocManager")
BiocManager::install(version = "3.10")
BiocManager::install("pcaMethods")
library(pcaMethods)

Далее, мы проводим анализ с данными, масштабированными до единичной дисперсии и центрированными, и генерируем графики.

speciesPCA <- pca(data[,2:ncol(data)],scale = "uv", center = TRUE)
slplot(speciesPCA, scoresLoadings = c(T,T))

enter image description here

Наконец, мы извлекаем факторные оценки из объекта speciesPCA, добавляем имена строк и печатаем в порядке убывания абсолютного значение PC1. Обратите внимание, что pcaMethods использует объектную модель S4, поэтому нам нужно использовать форму @ оператора извлечения для доступа к элементам внутри объекта.

theScores <- speciesPCA@scores[,1] # get first column PC1 only 
names(theScores) <- Species
theScores[order(abs(theScores),decreasing = TRUE)]

... и выходные данные:

> theScores[order(abs(theScores),decreasing = TRUE)]
 Species N  Species M  Species B  Species F  Species G  Species C  Species I  Species P  Species H  Species J  Species L 
-5.8993459 -2.8787001  1.3925053  1.2874129  1.0017446  1.0012497 -0.9691621  0.9550311  0.9020930  0.8617220  0.8491550 
 Species O  Species A  Species D  Species E  Species K 
-0.8414228  0.8247330  0.6781688  0.6302041  0.2046116 
> 

Обратите внимание, что оценки и порядок соответствуют выводу из prcomp() версии анализа.

0 голосов
/ 24 апреля 2020

Имена не будут работать для top_10_species, так как kind_score_ranked не является фреймом данных. Попробуйте это

loading_scores <- PCstats$rotation[,1]
species_scores <- abs(loading_scores)
species_score_ranked <- sort(species_scores, decreasing=TRUE)
top_10_species <- match(species_score_ranked[1:10],species_scores)

top_10_species
PCstats$rotation[top_10_species,]

Вывод:

Я надеюсь, что это то, что вы ищете.

> PCstats$rotation[top_10_species,]
            PC1         PC2         PC3         PC4         PC5
 [1,] 0.2938804 -0.06715619  0.06862443  0.12857870  0.11781917
 [2,] 0.2932723 -0.08432870  0.02670414 -0.08688880  0.22867875
 [3,] 0.2869432  0.13535231  0.05421256  0.08940930 -0.36614492
 [4,] 0.2851476  0.12618316 -0.13957539 -0.17127002 -0.04163248
 [5,] 0.2849976 -0.14928654 -0.03024884  0.17614136  0.30544938
 [6,] 0.2843594 -0.15278602 -0.03551544  0.17841931 -0.06085204
 [7,] 0.2843594 -0.15278602 -0.03551544  0.17841931 -0.06085204
 [8,] 0.2843594 -0.15278602 -0.03551544  0.17841931 -0.06085204
 [9,] 0.2841340  0.05627504  0.25523009  0.03263271  0.00697634
[10,] 0.2710251 -0.20911054 -0.01754100 -0.56694280  0.01517564
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...