如何解决在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。假设每个物种我需要拥有不同的PC。
注意:在我的实际情况下,我将在10年中使用50个州的20个变量,我想应用PCA为每个州建立索引,将20个变量压缩为十年。
解决方法
也许这就是您想要的。要获得理想的结果,您可以嵌套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,-pca)
ggplot() +
geom_point(data = iris_pca_v1,aes(.fittedPC1,.fittedPC2,color = "iris_pca_v1")) +
geom_point(data = iris_pca_v2,color = "iris_pca_grouped")) +
scale_color_manual(values = c(iris_pca_v1 = "black",iris_pca_grouped = "red" )) +
facet_wrap(~Species)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。