#r #dplyr #tidyverse #pca
#r #dplyr #tidyverse #pca
Вопрос:
# Libraries
library(tidyverse)
library(broom)
Я знаю, что tidyverse
это может быть использовано для повышения производительности PCA, вот два примера:
Пример 1:
iris_pca_v1 <- iris %>%
nest() %>%
mutate(
pca = map(data, ~prcomp(.x %>% select(-Species), center = T, scale = T)),
pca_aug = map2(pca, data, ~augment(.x, data = .y))
)
Пример 2:
iris_pca_v2 <- iris %>%
select(-Species) %>%
prcomp(center = T, scale = T)
Но я хотел бы знать, есть ли способ использовать ту же tidyverse
структуру для применения PCA в сгруппированных данных. Предположим, что мне нужно иметь разные компьютеры для каждого вида.
Примечание: В моем реальном случае я работаю с 20 переменными для 50 состояний в течение 10 лет, я хотел бы применить PCA для создания индекса для каждого состояния, сжимая 20 переменных в течение 10 лет.
Ответ №1:
Возможно, это то, что вы ищете. Для достижения желаемого результата вы можете вложить или сгруппировать Species
.
library(tidyverse)
library(broom)
iris_pca_v1 <- iris %>%
nest() %>%
mutate(
pca = map(data, ~prcomp(.x %>% select(-Species), center = T, scale = T)),
pca_aug = map2(pca, data, ~augment(.x, data = .y))
) %>%
unnest(pca_aug) %>%
select(-data, -pca)
#> Warning: `...` must not be empty for ungrouped data frames.
#> Did you want `data = everything()`?
iris_pca_v2 <- iris %>%
nest(data = -Species) %>%
mutate(
pca = map(data, ~ prcomp(.x, center = T, scale = T)),
pca_aug = map2(pca, data, ~augment(.x, data = .y))
) %>%
unnest(pca_aug) %>%
select(-data, -pca)
ggplot()
geom_point(data = iris_pca_v1, aes(.fittedPC1, .fittedPC2, color = "iris_pca_v1"))
geom_point(data = iris_pca_v2, aes(.fittedPC1, .fittedPC2, color = "iris_pca_grouped"))
scale_color_manual(values = c(iris_pca_v1 = "black", iris_pca_grouped = "red" ))
facet_wrap(~Species)
Комментарии:
1. спасительное решение
2. в чем разница между сгруппированным и первым PCA?