library(dplyr)
library(plotly)
library(magrittr)
library(tidyr)
library(caret)
knitr::opts_chunk$set(collapse = TRUE)
Componentes principais são bastante utilizados em modelagem estatística, mas a sua definição matemática rigorosa faz com que a ACP pareça um conceito mais abstrato do que somos capazes de compreender, em particular quando falam “maximizar a variância total” e “diminuir a dimensionalidade”. A primeira reação é um grande “HEIN?”.
Abaixo tem alguns gráficos em 3 dimensões que eu acredito que dê uma boa ilustração sobre o que essas duas afirmativas querem dizer.
O primeiro gráfico é a representação com 100% da informação em três dimensões. O segundo gráfico é como fica a representação do mesmo conjunto de dados, mas com uma dimensão a menos (redução de dimensionalidade).
Ao diminuir uma dimensão, perdemos informação e essa perda é mensurada pela variância explicada pelas dimensões que deixamos para trás.
a <- 1
tetraedro <- data.frame( x = c(a * sqrt(3)/3, - a * sqrt(3)/6, - a * sqrt(3)/6, 0),
y = c(0, - a/2, a/2, 0),
z = c(0, 0, 0, a * sqrt(6)/3),
cor = c("a", "b", "c", "d"),
id = 1:4)
tetraedro_linhas <- combn(x = tetraedro$id, m = 2) %>%
t %>%
as.data.frame.matrix %>%
set_names(c("id1", "id2")) %>%
mutate(id_par = 1:n()) %>%
gather(id_ordem, id, id1, id2) %>%
left_join(tetraedro, by = "id") %>%
arrange(id_ordem)
tetraedro_pc <- prcomp(tetraedro %>% dplyr::select(x, y, z))
summary(tetraedro_pc)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 0.4082 0.4082 0.4082
## Proportion of Variance 0.3333 0.3333 0.3333
## Cumulative Proportion 0.3333 0.6667 1.0000
p1 <- plot_ly(x = ~x, y = ~y, z = ~z, width = "50%", height = "50%") %>%
add_lines(data = tetraedro) %>%
add_markers(data = tetraedro)
p2 <- plot_ly(x = ~PC2, y = ~PC3, z = ~PC3, width = "50%", height = "50%") %>%
add_lines(data = tetraedro_pc %>% predict %>% as.data.frame) %>%
add_markers(data = tetraedro_pc %>% predict %>% as.data.frame)
htmltools::tagList(list(p1, p2))
x <- c()
y <- c()
z <- c()
c <- c()
for (i in 1:62) {
r <- 20 * cos(i / 20)
x <- c(x, r * cos(i))
y <- c(y, r * sin(i))
z <- c(z, i)
c <- c(c, i)
}
data <- data.frame(x, y, z, c)
p1 <- plot_ly(data, x = ~x, y = ~y, z = ~z, type = 'scatter3d', mode = 'lines+markers',
line = list(width = 6, color = ~c, colorscale = 'Viridis'),
marker = list(size = 3.5, color = ~c, colorscale = 'Greens', cmin = -20, cmax = 50))
data2 <- prcomp(data %>% dplyr::select(x, y, z))
summary(data2)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 18.0494 10.1375 9.8547
## Proportion of Variance 0.6198 0.1955 0.1847
## Cumulative Proportion 0.6198 0.8153 1.0000
p2 <- plot_ly(predict(data2) %>% as.data.frame, x = ~PC1, y = ~PC2, z = 1, type = 'scatter3d', mode = 'lines+markers',
line = list(width = 6, color = ~c, colorscale = 'Viridis'),
marker = list(size = 3.5, color = ~c, colorscale = 'Greens', cmin = -20, cmax = 50))
htmltools::tagList(list(p1, p2))