##Preparación
#Agrego librerias base que se van a necesitar y voy sumando a medida que surjan nuevas
library(readxl)#lectura
library(ggplot2) #
library(dplyr)#manejo de datos
library(tidyverse)#manejo de datos
library(DT)
library(kableExtra)# hacer tablas bonitas
library(lubridate)#manejo de fechas
library(GGally)
library(moments)
library(reshape2)
library(car)
library(plotly)
library(fmsb)
library(geomtextpath)
library(factoextra)
library(flextable)
library(ggrepel)
library(FactoMineR)
library(ggcorrplot)
library(corrplot)
Sea la matriz de varianzas y covarianzas poblacionales:
\[ \begin{equation} \begin{pmatrix} 3 & 1 & 1\\ 1 & 3 & 1\\ 1 & 1 & 5 \end{pmatrix} \end{equation} \]
Correspondiente al vector aleatorio \(X = (X_1,X_2,X_3)\) de media 0.
mat1 <- matrix(c(3, 1, 1,
1, 3, 1,
1, 1, 5), nrow = 3, byrow = T)
eigen1 <- eigen(mat1)
eigen1[1]
## $values
## [1] 6 3 2
eigen1[2]$vectors
## [,1] [,2] [,3]
## [1,] -0.4082483 -0.5773503 7.071068e-01
## [2,] -0.4082483 -0.5773503 -7.071068e-01
## [3,] -0.8164966 0.5773503 -1.110223e-16
Si mal no entendí esto es la convinación lineal de las variables con cada uno de los autovectores como coeficientes.
eigen1[2]$vectors[1]*mat1[1,] + eigen1[2]$vectors[2]*mat1[2,] + eigen1[2]$vectors[3]*mat1[3,]
## [1] -2.449490 -2.449490 -4.898979
Validemos usando la funcion prcomp de R:
pca1 <- prcomp(mat1, center=TRUE,scale=TRUE)
pca1
## Standard deviations (1, .., p=3):
## [1] 1.224745e+00 1.224745e+00 4.532467e-17
##
## Rotation (n x k) = (3 x 3):
## PC1 PC2 PC3
## [1,] -0.8164966 -2.136625e-17 -0.5773503
## [2,] 0.4082483 7.071068e-01 -0.5773503
## [3,] 0.4082483 -7.071068e-01 -0.5773503
Lo que observamos es que el componente no parece ser el resultado de la combinación lineal. Pero en realidad es LD con el resultado de la función. Y vemos que equivale a \(\lambda*PC_1\)| y esto es correcto ya que \(Av=\lambda v\) que se corresponde a la definición de autovector y autovalor.
NO entiendo porqué tengo que usar scale=TRUE, yo entendía que esto era si usaba la correlacion y no la varianza y covarianza. No entiendo porque dan diferentes y que significa. En particular porque coincide ccuando pongo TRUE, entendía que debía ser al revez
En cuanto a los autovalores deberían darme el porcentaje que explica de los valores originales cada componente principal:
\[\frac{\lambda_1}{\sum_{i=1}^{n} \lambda_i } \]
porc_explic=100*eigen1$values/sum(eigen1$values)
porc_explic
## [1] 54.54545 27.27273 18.18182
Claramente este summary esta mal
summary(pca1)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 1.225 1.225 4.532e-17
## Proportion of Variance 0.500 0.500 0.000e+00
## Cumulative Proportion 0.500 1.000 1.000e+00
Los loadings del primer componente principal son justamente el primer autovector que corresponde al autovalor mas grande, en este caso 6
Esto permite graficar los componentes, lo que hace es agregar un eje x de 1 a 3 (tiene dimensión 3)y luego crea barras para cada coeficiente usando geom_segment
df=data.frame(orden=as.factor(1:3),loadings=eigen1$vectors[,1],y=rep(0,3))
df
## orden loadings y
## 1 1 -0.4082483 0
## 2 2 -0.4082483 0
## 3 3 -0.8164966 0
ggplot(df )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,fill=orden,
color=orden,size=1.5))+ theme(legend.position = "none")
ACá la resolución de la profesora dice que no hay información para hacerlo porque faltan las medias, sin embargo el enunciado indica que tienen media 0. Entiendo que con ese dato si se puede hacer. Dejo la resolución para otro momento.
Considerando los datos de la base chalets.xls, se pide: ### SETUP
chalets <- read_excel("C:/Users/marco/Dropbox/Austral/Analisis_inteligente_de_datos/Clase_03/chalets.xls")
names(chalets) <- c("promotoras","hipoteca","precio_medio","sup_media_cocina")
data_mod <- melt(chalets, id.vars='promotoras',
measure.vars=c("hipoteca","precio_medio","sup_media_cocina"))
ggplot(data_mod) +
geom_boxplot(aes(x=promotoras, y=value, fill=variable,alpha=0.2)) +
theme_minimal()
boxplot(chalets$hipoteca, plot=FALSE)$out
## [1] 37.3
boxplot(chalets$precio_medio, plot=FALSE)$out
## numeric(0)
boxplot(chalets$sup_media_cocina, plot=FALSE)$out
## numeric(0)
Vemos que el únio outlier es el de la hipoteca, las otras dos variables no tienen outliers
ggpairs(chalets, # Data frame
columns = 2:4, # Columns
aes(alpha = 0.5)) # Transparency
chalets2 <- as_tibble(t(colMeans(chalets[2:4])))
chalets2 %>% kbl(caption = "Vector de medias") %>% kable_classic(full_width =F)
| hipoteca | precio_medio | sup_media_cocina |
|---|---|---|
| 19.05 | 1.57 | 9.73 |
covb <- cov(chalets[2:4])
covb %>% kbl(caption = "Matriz de covarianzas") %>% kable_classic(full_width =F)
| hipoteca | precio_medio | sup_media_cocina | |
|---|---|---|---|
| hipoteca | 63.29833 | 5.7450000 | 33.863889 |
| precio_medio | 5.74500 | 0.9934444 | 4.053222 |
| sup_media_cocina | 33.86389 | 4.0532222 | 20.849000 |
``
corb <- cor(chalets[2:4])
corb %>% kbl(caption = "Matriz de correlaciones") %>% kable_classic(full_width =F)
| hipoteca | precio_medio | sup_media_cocina | |
|---|---|---|---|
| hipoteca | 1.0000000 | 0.7244728 | 0.9321763 |
| precio_medio | 0.7244728 | 1.0000000 | 0.8906068 |
| sup_media_cocina | 0.9321763 | 0.8906068 | 1.0000000 |
Si porque las variables esta altamente correlacionadas
pca1 <- prcomp(chalets[2:4], center=TRUE,scale=TRUE)
pca1$rotation %>% kbl(caption = "COnmponente Principal") %>% kable_classic(full_width =F)
| PC1 | PC2 | PC3 | |
|---|---|---|---|
| hipoteca | 0.5687284 | 0.6607949 | -0.4897940 |
| precio_medio | 0.5583782 | -0.7474108 | -0.3599874 |
| sup_media_cocina | 0.6039552 | 0.0687553 | 0.7940471 |
vcont = chalets[2:4]
df1=data.frame(orden=as.factor(colnames(vcont)),loadings=pca1$rotation[,1],y=rep(0,3))
df1
## orden loadings y
## hipoteca hipoteca 0.5687284 0
## precio_medio precio_medio 0.5583782 0
## sup_media_cocina sup_media_cocina 0.6039552 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
summary(pca1)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 1.6435 0.52684 0.14574
## Proportion of Variance 0.9004 0.09252 0.00708
## Cumulative Proportion 0.9004 0.99292 1.00000
Explica el 90% de la varianza por si sóla. Es una componente de tamaño porque todas las barras tienen el mismo signo.
scores=cbind(as.data.frame(summary(pca1)$x),Promotora=1:10)
scores%>%arrange(-PC1)
## PC1 PC2 PC3 Promotora
## 1 3.04473023 0.794448425 -0.076087522 8
## 2 2.31667376 -0.727038298 0.002634479 10
## 3 0.88274681 -0.674929544 0.178597294 7
## 4 0.02157016 -0.195921355 -0.200783631 3
## 5 -0.46084036 0.601313047 -0.095959157 5
## 6 -0.47859083 0.568280112 0.223793952 4
## 7 -0.85599312 -0.040926259 0.067138478 6
## 8 -1.02308426 0.072814352 0.129217853 2
## 9 -1.11892537 -0.390916578 -0.171447361 9
## 10 -2.32828702 -0.007123901 -0.057104384 1
Dado el siguiente conjunto de datos:
\[ X = \begin{equation} \begin{pmatrix} 3 & 6 \\ 5 & 6 \\ 10 & 12 \end{pmatrix} \end{equation} \]
matEj3 <- matrix(data = c(3, 6, 5, 6,10,12), nrow = 3, ncol = 2)
covEj3 <- cov(matEj3)
eigen3 <- eigen(covEj3)
aVal3 <- eigen3$values
aVec3 <- eigen3$vectors
covEj3 %>% kbl(caption = "Matriz de varianzas y covarianzas") %>% kable_classic(full_width =F)
| 2.333333 | 3.666667 |
| 3.666667 | 9.333333 |
aVal3 %>% kbl(caption = "Autovalores") %>% kable_classic(full_width =F)
| x |
|---|
| 10.9023021 |
| 0.7643646 |
aVec3 %>% kbl(caption = "Autovectores") %>% kable_classic(full_width =F)
| 0.3933982 | -0.9193682 |
| 0.9193682 | 0.3933982 |
pca3 <- prcomp(matEj3, center=FALSE,scale=FALSE)
pca3$rotation %>% kbl(caption = "Conmponente Principal") %>% kable_classic(full_width =F)
| PC1 | PC2 |
|---|---|
| -0.4441161 | -0.8959693 |
| -0.8959693 | 0.4441161 |
summary(pca3)$importance[2:3,] %>% kbl(caption = "Proporción explicada") %>% kable_classic(full_width =F)
| PC1 | PC2 | |
|---|---|---|
| Proportion of Variance | 0.99544 | 0.00456 |
| Cumulative Proportion | 0.99544 | 1.00000 |
No entiendo que pide
corEj3 <- cor(matEj3)
eigen3d <- eigen(corEj3)
aVal3d <- eigen3d$values
aVec3d <- eigen3d$vectors
pca3d <- prcomp(matEj3, center=TRUE,scale=TRUE)
No me queda claro que se espera de la interpretación. En este caso no parece haber pesos de variables que distorsionen la representacion de la variabilidad por la escala. En un caso u otro las componentes representan variabilidad similar.
El producto escalar entre ellos tiene que ser 0
aVec3d[,1] %*% aVec3d[,2]
## [,1]
## [1,] 0
No entiendo que pide para graficar
Sea S la matriz de varianzas y covarianzas poblacionales:
mat4 <- matrix(data = c(3, 1, 1, 1,4,0,1,0,2), nrow = 3, ncol = 3)
mat4
## [,1] [,2] [,3]
## [1,] 3 1 1
## [2,] 1 4 0
## [3,] 1 0 2
Correspondiente al vector aleatorio X = (X1,X2,X3)′ donde:
X1 puntuación media obtenida en las asignaturas de econometría X2 puntuación media obtenida en las asignaturas de derecho X3 puntuación media obtenida en asignaturas libres
Los datos corresponden a un conjunto d alumnos de la carrera de economía.
eigen4 <- eigen(mat4)
eigen4
## eigen() decomposition
## $values
## [1] 4.732051 3.000000 1.267949
##
## $vectors
## [,1] [,2] [,3]
## [1,] -0.5773503 0.5773503 0.5773503
## [2,] -0.7886751 -0.5773503 -0.2113249
## [3,] -0.2113249 0.5773503 -0.7886751
Esta es una componente de forma ya que no tiene toda el mismo signo. Pondera de manera similar a las asignaturas libres y la economía y penaliza el saber derecho. Esta componente es fuerte en alumnos con perfiles poco orientados a conocer los aspectos legales.
Que debería haber estudiado derecho y no economía
pca4 <- prcomp(mat4,scale=FALSE)
summary(pca4)
## Importance of components:
## PC1 PC2 PC3
## Standard deviation 2.3154 1.1427 1.37e-16
## Proportion of Variance 0.8041 0.1959 0.00e+00
## Cumulative Proportion 0.8041 1.0000 1.00e+00
Alcanza con las dos primeras componentes Pero me da diferente que en la resolución ¿por qué?
autovalores <- eigen4$values
contribucion<-autovalores/sum(autovalores)
rbind(contribucion,cumsum(contribucion))
## [,1] [,2] [,3]
## contribucion 0.5257834 0.3333333 0.1408832
## 0.5257834 0.8591168 1.0000000
El siguiente conjunto de datos de la tabla 1 se refiere a 20 observaciones de suelo, donde se midió:
x1: contenido de arena, x2: contenido de cieno, x3: contenido de arcilla, x4: contenido de materia orgánica x5: acidez, según PH.
Compare los resultados del Análisis en Componentes Principales para la matriz de covarianza y para la matriz de correlación.
suelos <- read_excel("suelos.xlsx")
suelos <- suelos %>%rename(MatOrg="Materia orgánica")
suelos %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Propiedades del suelo") %>% autofit()
Observación | Arena | Cieno | Arcilla | MatOrg | Acidez |
|---|---|---|---|---|---|
1 | 77.3 | 13.0 | 9.7 | 1.5 | 6.4 |
2 | 82.5 | 10.0 | 7.5 | 1.5 | 6.5 |
3 | 66.9 | 20.6 | 12.5 | 2.3 | 7.0 |
4 | 47.2 | 33.8 | 19.0 | 2.8 | 5.8 |
5 | 65.3 | 20.5 | 14.2 | 1.9 | 6.9 |
6 | 83.3 | 10.0 | 6.7 | 2.2 | 7.0 |
7 | 81.6 | 12.7 | 5.7 | 2.9 | 6.7 |
8 | 47.8 | 36.5 | 15.7 | 2.3 | 7.2 |
9 | 48.6 | 37.1 | 14.3 | 2.1 | 7.2 |
10 | 61.6 | 25.5 | 12.9 | 1.9 | 7.3 |
11 | 58.6 | 26.5 | 14.9 | 2.4 | 6.7 |
12 | 69.3 | 22.3 | 8.4 | 4.0 | 7.0 |
13 | 61.8 | 30.8 | 7.4 | 2.7 | 6.4 |
14 | 67.7 | 25.3 | 7.0 | 4.8 | 7.3 |
15 | 57.2 | 31.2 | 11.6 | 2.4 | 6.5 |
16 | 67.2 | 22.7 | 10.1 | 3.3 | 6.2 |
17 | 59.2 | 31.2 | 9.6 | 2.4 | 6.0 |
18 | 80.2 | 13.2 | 6.6 | 2.0 | 5.8 |
19 | 82.2 | 11.1 | 6.7 | 2.2 | 7.2 |
20 | 69.7 | 20.7 | 9.6 | 3.1 | 5.9 |
pcaSuelos <- prcomp(suelos[,-1],scale=FALSE)
summary(pcaSuelos)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 14.9613 2.8667 0.68736 0.50838 3.368e-15
## Proportion of Variance 0.9616 0.0353 0.00203 0.00111 0.000e+00
## Cumulative Proportion 0.9616 0.9969 0.99889 1.00000 1.000e+00
pcaSuelosEsc <- prcomp(suelos[,-1],scale=TRUE)
summary(pcaSuelosEsc)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 1.6311 1.0713 0.9810 0.47891 4.107e-16
## Proportion of Variance 0.5321 0.2295 0.1925 0.04587 0.000e+00
## Cumulative Proportion 0.5321 0.7616 0.9541 1.00000 1.000e+00
#fviz_screeplot(pcaSuelos, addlabels = TRUE, ylim = c(0,97))
#fviz_pca_ind(pcaSuelos, geom.ind = "point",
# col.ind = "#FC4E07",
# axes = c(1, 2),
# pointsize = 1.5)
fviz_contrib(pcaSuelos, choice = "var", axes = 1, top = 10)
#biplot(pcaSuelos, scale = 0, cex = 0.5, col = c("dodgerblue3", "deeppink3"))
fviz_contrib(pcaSuelosEsc, choice = "var", axes = 1, top = 10)
Si cambian los porcentajes que explica cada variable. La razón detás de
esto es la diferencia de escala entre las variables originales, en el
gráfico de contribuciones de cada variable original, podemos ver como
pesa la variable arena en el caso de la matriz de covarianza. Cuando
escalamos y centramos con la matriz de correlación esto cambia.
pcaSuelos$rotation
## PC1 PC2 PC3 PC4 PC5
## Arena -0.7849449544 -0.223100113 0.02718830 -0.003901445 -5.773503e-01
## Cieno 0.5870812022 -0.560792619 0.08607941 -0.010212850 -5.773503e-01
## Arcilla 0.1978637522 0.783892732 -0.11326771 0.014114294 -5.773503e-01
## MatOrg 0.0068110819 -0.145758773 -0.97995170 0.135656360 7.806256e-18
## Acidez 0.0007907581 -0.002131353 -0.13680723 -0.990595081 -5.681219e-17
pcaSuelosEsc$rotation
## PC1 PC2 PC3 PC4 PC5
## Arena -0.61054577 0.02208448 -0.03234998 -0.17078162 7.723557e-01
## Cieno 0.58144760 -0.14575518 0.10497554 0.53458750 5.864047e-01
## Arcilla 0.53495413 0.28024523 -0.14981128 -0.74380575 2.441235e-01
## MatOrg 0.04931997 -0.83603278 0.40937786 -0.36197582 1.249001e-16
## Acidez 0.02332740 -0.44808426 -0.89325246 0.02786334 2.775558e-17
mmm… son distintos….cambian, no se si el orden…
Otra función que calcula PCA…. en este caso vemos los loadings
suelos.pca.corr <- princomp(suelos[,-1], cor = FALSE,scores=TRUE)
suelos.pca.corr$loadings
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## Arena 0.785 0.223 0.577
## Cieno -0.587 0.561 0.577
## Arcilla -0.198 -0.784 -0.113 0.577
## MatOrg 0.146 -0.980 -0.136
## Acidez -0.137 0.991
##
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## SS loadings 1.0 1.0 1.0 1.0 1.0
## Proportion Var 0.2 0.2 0.2 0.2 0.2
## Cumulative Var 0.2 0.4 0.6 0.8 1.0
suelos.pca.corr <- princomp(suelos[,-1], cor = TRUE,scores=TRUE)
suelos.pca.corr$loadings
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## Arena 0.611 0.171 0.772
## Cieno -0.581 -0.146 -0.105 -0.535 0.586
## Arcilla -0.535 0.280 0.150 0.744 0.244
## MatOrg -0.836 -0.409 0.362
## Acidez -0.448 0.893
##
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## SS loadings 1.0 1.0 1.0 1.0 1.0
## Proportion Var 0.2 0.2 0.2 0.2 0.2
## Cumulative Var 0.2 0.4 0.6 0.8 1.0
Los loadings cambian porque el peso relativo de cada variable cambia en los componentes y los autovectores resultantes en cada caso son diferentes.
Siempre es más robusto trabajar con la matríz de correlaciones para evitar los problemas de escala.
gorriones <- read_excel("gorriones.xlsx")
head(gorriones) %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Primeros valores de gorriones.xlsx") %>% autofit()
pajaro | largototal | extension | cabeza | humero | esternon | sobrevida |
|---|---|---|---|---|---|---|
1 | 156 | 245 | 31.6 | 18.5 | 20.5 | 1 |
2 | 154 | 240 | 30.4 | 17.9 | 19.6 | 1 |
3 | 153 | 240 | 31.0 | 18.4 | 20.6 | 1 |
4 | 153 | 236 | 30.9 | 17.7 | 20.2 | 1 |
5 | 155 | 243 | 31.5 | 18.6 | 20.3 | 1 |
6 | 163 | 247 | 32.0 | 19.0 | 20.9 | 1 |
as.data.frame(cov(scale(gorriones[,-1]))) %>% add_rownames(" ") %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Matriz de varianza y covarianza de matriz estandarizada") %>% autofit()
## Warning: `add_rownames()` was deprecated in dplyr 1.0.0.
## ℹ Please use `tibble::rownames_to_column()` instead.
| largototal | extension | cabeza | humero | esternon | sobrevida |
|---|---|---|---|---|---|---|
largototal | 1.0000000 | 0.73496422 | 0.66181194 | 0.67967207 | 0.60512465 | -0.14334149 |
extension | 0.7349642 | 1.00000000 | 0.67374109 | 0.76947374 | 0.52901381 | -0.05637812 |
cabeza | 0.6618119 | 0.67374109 | 1.00000000 | 0.75601764 | 0.52627007 | -0.02846047 |
humero | 0.6796721 | 0.76947374 | 0.75601764 | 1.00000000 | 0.60717114 | 0.08207124 |
esternon | 0.6051247 | 0.52901381 | 0.52627007 | 0.60717114 | 1.00000000 | -0.01501043 |
sobrevida | -0.1433415 | -0.05637812 | -0.02846047 | 0.08207124 | -0.01501043 | 1.00000000 |
corr <- cor(gorriones[,-1])
as.data.frame(corr) %>% add_rownames(" ") %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Matriz de correlación") %>% autofit()
| largototal | extension | cabeza | humero | esternon | sobrevida |
|---|---|---|---|---|---|---|
largototal | 1.0000000 | 0.73496422 | 0.66181194 | 0.67967207 | 0.60512465 | -0.14334149 |
extension | 0.7349642 | 1.00000000 | 0.67374109 | 0.76947374 | 0.52901381 | -0.05637812 |
cabeza | 0.6618119 | 0.67374109 | 1.00000000 | 0.75601764 | 0.52627007 | -0.02846047 |
humero | 0.6796721 | 0.76947374 | 0.75601764 | 1.00000000 | 0.60717114 | 0.08207124 |
esternon | 0.6051247 | 0.52901381 | 0.52627007 | 0.60717114 | 1.00000000 | -0.01501043 |
sobrevida | -0.1433415 | -0.05637812 | -0.02846047 | 0.08207124 | -0.01501043 | 1.00000000 |
Verificado ### c) Le parece adecuado en este caso un análisis de componentes principales. ¿Qué indica el autovalor para una componente principal? De la tabla de correlaciones se puede ver que hay varias variables con fuerte correlación, en este caso aplica el análisis de componentes principales
ggcorrplot(as.data.frame(corr))
pcaGorr <- prcomp(gorriones[,-1], scale=TRUE)
sumPcaGorr <- summary(pcaGorr)
as.data.frame(sumPcaGorr$importance) %>% add_rownames(" ") %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Importancia de las componentes principales") %>% autofit()
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 |
|---|---|---|---|---|---|---|
Standard deviation | 1.905306 | 1.017443 | 0.7281698 | 0.5927301 | 0.5238423 | 0.4226685 |
Proportion of Variance | 0.605030 | 0.172530 | 0.0883700 | 0.0585500 | 0.0457400 | 0.0297700 |
Cumulative Proportion | 0.605030 | 0.777560 | 0.8659400 | 0.9244900 | 0.9702300 | 1.0000000 |
fviz_screeplot(pcaGorr, addlabels = TRUE, ylim = c(0,97))
En el gráfico se ve que a partir del tercer componente la variabilidad
que explican los siguientes es muy poca, dependiendo el corte que se
desee hacer podemos quedarnos con 3 o cuatro componentes. Si usamoes el
criterio de Kaiser tomariamos todos los componentes
cuyos respectivos autovalores \(\lambda_m \geq
1\) y agregarle \(\lambda_{m+1} \leq
1\) (o \(\lambda_m \geq 0.7\) en
la forma ajustada) si trabajamos con la matriz de correlación
data.frame(Autovalores=eigen(corr)$values) %>% flextable() %>% align_text_col(align = "right") %>% autofit()
Autovalores |
|---|
3.6301899 |
1.0351904 |
0.5302312 |
0.3513290 |
0.2744108 |
0.1786486 |
Sin embargo el test de Kaiser nos dice que hay que tomar sólo las dos primeras si tomamos el criterio de \(\lambda_m \geq 0.7\) y no el de \(\lambda_m \geq 1\) + \(\lambda_{m+1} \leq 1\). En realidad son las que más explican, pero la tercera tiene algo que decir y según el criterio del gráfico debería considerarse
El primer componente principal es el que usa el primer autovector como coordenadas y las variables medidas normalizadas.
as.data.frame(pcaGorr$rotation) %>% add_rownames(" ") %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Componentes principales") %>% autofit()
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 |
|---|---|---|---|---|---|---|
largototal | 0.4557344 | -0.14676423 | 0.014596454 | -0.4843353 | 0.6889628 | 0.24759412 |
extension | 0.4602511 | -0.02017345 | -0.306278675 | -0.4695421 | -0.4431693 | -0.52639011 |
cabeza | 0.4476819 | 0.03012167 | -0.312035697 | 0.6992517 | 0.3256395 | -0.32605721 |
humero | 0.4716751 | 0.16357298 | -0.161512413 | 0.1532915 | -0.4252143 | 0.72137001 |
esternon | 0.3960364 | 0.03011804 | 0.884590279 | 0.1208631 | -0.1285332 | -0.16917277 |
sobrevida | -0.0270888 | 0.97441406 | 0.005274471 | -0.1337548 | 0.1598815 | -0.07939258 |
entonces la primer componente sería:
\[Y_1=0,46*Z_1+0,46*Z_2+0.45*Z_3+0.447*Z_4+0,40*Z_5+-0,03*Z_7\] ### f) ¿Cómo queda expresada la primer componente principal? (en función del autovector correspondiente y de las variables).
¿Cuál sería la diferencia con el punto anterior?
Es el producto vectorial del vector de coordenadas y los valores para el pajaro 11 pero estandarizadas.
gorrScaled=scale(gorriones[,2:7])
data.frame(
PC1= as.vector(pcaGorr$rotation[,1]) %*% as.vector(t(gorrScaled[11,])),
PC2= as.vector(pcaGorr$rotation[,2]) %*% as.vector(t(gorrScaled[11,])),
PC3= as.vector(pcaGorr$rotation[,3]) %*% as.vector(t(gorrScaled[11,]))
)
## PC1 PC2 PC3
## 1 0.3611794 1.193108 1.151008
Acá lo hacemos para todas las componentes
as.vector(gorrScaled[11,]) %*% as.matrix(pcaGorr$rotation)
## PC1 PC2 PC3 PC4 PC5 PC6
## [1,] 0.3611794 1.193108 1.151008 0.01290467 -0.0328486 0.1137724
fviz_pca_biplot(pcaGorr, axes=c(1,2), repel = TRUE)
fviz_pca_biplot(pcaGorr, axes=c(1,3), repel = TRUE)
fviz_pca_biplot(pcaGorr, axes=c(2,3), repel = TRUE)
Agrego la caracterización de las dimensiones para tener como
referencia:
df1=data.frame(orden=as.factor(colnames(gorriones[2:7])),loadings=pcaGorr$rotation[,1],y=rep(0,6))
df1
## orden loadings y
## largototal largototal 0.4557344 0
## extension extension 0.4602511 0
## cabeza cabeza 0.4476819 0
## humero humero 0.4716751 0
## esternon esternon 0.3960364 0
## sobrevida sobrevida -0.0270888 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
df1=data.frame(orden=as.factor(colnames(gorriones[2:7])),loadings=pcaGorr$rotation[,2],y=rep(0,6))
df1
## orden loadings y
## largototal largototal -0.14676423 0
## extension extension -0.02017345 0
## cabeza cabeza 0.03012167 0
## humero humero 0.16357298 0
## esternon esternon 0.03011804 0
## sobrevida sobrevida 0.97441406 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
df1=data.frame(orden=as.factor(colnames(gorriones[2:7])),loadings=pcaGorr$rotation[,3],y=rep(0,6))
df1
## orden loadings y
## largototal largototal 0.014596454 0
## extension extension -0.306278675 0
## cabeza cabeza -0.312035697 0
## humero humero -0.161512413 0
## esternon esternon 0.884590279 0
## sobrevida sobrevida 0.005274471 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
### i) Realice un gráfico donde se observen los
gorriones en los nuevos ejes 1 y 2, y resalte con distinto color el
grupo de los que sobrevivieron.
fviz_pca_ind(pcaGorr, axes=c(1,2), repel = TRUE, habillage = gorriones$sobrevida, addEllipses=TRUE, ellipse.level=0.95)
NO recuerdo esto
Se estudiaron las variables habitualmente monitorizadas por el Servicio Andaluz de Salud, del Sistema Nacional de Salud Español:
Las variables se midieron en un total de 22486 ingresos.
En la siguiente tabla se aprecia la Distribución de los valores obtenidos en las variables listadas por los servicios del hospital de Algeciras( Andalucía,Espana):
hospitales <- read_excel("hospitales.xlsx")
hospitales %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Por servicio del Hospital") %>% autofit()
Servicio | NI | MO | RE | NE | ICM | ES | IF |
|---|---|---|---|---|---|---|---|
Cirugía | 2,158 | 3.8 | 3.4 | 8,567 | 1.17 | 21,879 | 1.05 |
Tocoginecología | 5,146 | 0.3 | 3.1 | 3,782 | 0.52 | 22,068 | 0.87 |
Hematología | 489 | 4.1 | 6.8 | 11,005 | 1.68 | 4,980 | 0.95 |
Cardiología | 677 | 2.2 | 3.9 | 2,161 | 1.30 | 8,587 | 0.83 |
Digestivo | 698 | 5.9 | 3.2 | 9,473 | 1.06 | 7,189 | 1.01 |
Medicina.Interna | 4,171 | 12.5 | 5.5 | 21,563 | 1.04 | 47,909 | 1.02 |
Neumología | 562 | 5.1 | 4.4 | 2,659 | 1.47 | 5,098 | 0.68 |
Otorrinolaringología | 650 | 2.1 | 2.3 | 22,024 | 0.87 | 3,161 | 0.86 |
Oftalmología | 990 | 0.0 | 0.2 | 21,752 | 0.82 | 1,096 | 0.50 |
Pediatría | 3,752 | 0.3 | 2.1 | 8,273 | 0.51 | 12,152 | 1.00 |
Psiquiatría | 622 | 0.0 | 13.3 | 27,000 | 1.37 | 6,776 | 0.60 |
Traumatología | 1,410 | 0.7 | 1.5 | 13,290 | 1.16 | 14,948 | 1.17 |
Urología | 1,161 | 2.0 | 3.9 | 4,767 | 0.79 | 8,959 | 1.01 |
La idea central del ACP es conseguir la simplificación de un conjunto de datos, generalmente cuantitativos, procedentes de un conjunto de variables interrelacionadas. Este objetivo se alcanza obteniendo, a partir de combinaciones lineales de las variables originalmente medidas, un nuevo conjunto de igual número de variables, no correlacionadas, llamadas componentes principales (CP) en las cuales permanece la variabilidad presente en los datos originales, y que al ordenarlas decrecientemente por su varianza, nos permiten explicar el fenómeno de estudio con las primeras CP.
Verificar que las primeras dos componentes principales son:
\[Y_1 = 0,5380NI+0,5126ES+0,4081IF+0,2635MO−0,1561NE−0,2535RE− 0,3511ICM\]
\[Y_2 = 0,5524MO+0,4952RE+0,4696ICM+0,3756ES+0,2867NE+0,05778IF− 0,04908NI\]
pcaHosp <- prcomp(hospitales[2:8],scale=TRUE)
as.data.frame(pcaHosp$rotation) %>% add_rownames(" ") %>% flextable() %>% align_text_col(align = "right") %>% set_caption(caption = "Componentes Principales") %>% autofit()
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | PC7 |
|---|---|---|---|---|---|---|---|
NI | -0.5378660 | 0.04913727 | 0.3242016 | -0.37373922 | 0.11068892 | -0.2466548 | 0.62482590 |
MO | -0.2635670 | -0.55250078 | -0.1945829 | 0.35580106 | 0.43568843 | 0.4638603 | 0.23627863 |
RE | 0.2535153 | -0.49523090 | 0.2053858 | -0.65347352 | -0.24999936 | 0.3964957 | -0.03945712 |
NE | 0.1564391 | -0.28625361 | 0.6486612 | 0.53974190 | -0.37448597 | -0.1241296 | 0.16079516 |
ICM | 0.3510125 | -0.46987734 | -0.4073489 | -0.05946509 | 0.03789260 | -0.6493629 | 0.25184963 |
ES | -0.5125446 | -0.37550358 | 0.1432844 | -0.06146428 | 0.05954697 | -0.3459372 | -0.66990180 |
IF | -0.4081393 | -0.05784453 | -0.4556562 | 0.08978696 | -0.76824634 | 0.1001660 | 0.11898072 |
Esto verifica los componentes indicados.
Acá me entra la duda, en teoría los autovectores calculados sobre la matríz de correlación, deberían aplicarse sobre las variables estandarizadas, sin embargo el enunciado no parece decir eso, perop las coordenadas coinciden….
sumHosp <- summary(pcaHosp)
as.data.frame(sumHosp$importance[2:3,]) %>% add_rownames(" ") %>% flextable()%>% align_text_col(align = "right") %>% set_caption(caption = "Contribución a la explicación de la varianza") %>% autofit()
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | PC7 |
|---|---|---|---|---|---|---|---|
Proportion of Variance | 0.36543 | 0.26128 | 0.17761 | 0.09263 | 0.07313 | 0.02329 | 0.00662 |
Cumulative Proportion | 0.36543 | 0.62671 | 0.80433 | 0.89696 | 0.97009 | 0.99338 | 1.00000 |
Estos son los autovalores correspondientes wl paquete factorMineR con la función PCA los devuelve como parametro, hay que explorar más esa función y ese paquete
eigen(cor(hospitales[2:8]))$values
## [1] 2.55803188 1.82896471 1.24330111 0.64842333 0.51187926 0.16302704 0.04637267
Si seguimos el criterio de Kaiser deberiamos quedarnos con los 4 primeros componentes.
Graficamos entonces estas 4 componentes:
df1=data.frame(orden=as.factor(colnames(hospitales[2:8])),loadings=pcaHosp$rotation[,1],y=rep(0,7))
df1
## orden loadings y
## NI NI -0.5378660 0
## MO MO -0.2635670 0
## RE RE 0.2535153 0
## NE NE 0.1564391 0
## ICM ICM 0.3510125 0
## ES ES -0.5125446 0
## IF IF -0.4081393 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
df1=data.frame(orden=as.factor(colnames(hospitales[2:8])),loadings=pcaHosp$rotation[,2],y=rep(0,7))
df1
## orden loadings y
## NI NI 0.04913727 0
## MO MO -0.55250078 0
## RE RE -0.49523090 0
## NE NE -0.28625361 0
## ICM ICM -0.46987734 0
## ES ES -0.37550358 0
## IF IF -0.05784453 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
df1=data.frame(orden=as.factor(colnames(hospitales[2:8])),loadings=pcaHosp$rotation[,3],y=rep(0,7))
df1
## orden loadings y
## NI NI 0.3242016 0
## MO MO -0.1945829 0
## RE RE 0.2053858 0
## NE NE 0.6486612 0
## ICM ICM -0.4073489 0
## ES ES 0.1432844 0
## IF IF -0.4556562 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
df1=data.frame(orden=as.factor(colnames(hospitales[2:8])),loadings=pcaHosp$rotation[,4],y=rep(0,7))
df1
## orden loadings y
## NI NI -0.37373922 0
## MO MO 0.35580106 0
## RE RE -0.65347352 0
## NE NE 0.53974190 0
## ICM ICM -0.05946509 0
## ES ES -0.06146428 0
## IF IF 0.08978696 0
ggplot(df1 )+geom_segment(aes(x=orden,xend=orden,y=y,yend=loadings,color=orden,
size=1.5))+ theme(legend.position = "none")+xlab("")
### b) Qué porcentaje de variabilidad logra captar cada
una de ellas?. Grafique el scree plot.
fviz_screeplot(pcaHosp, addlabels = TRUE, ylim = c(0,97))
Como se menciono en a) se ve que hay que tomar las 4 primeras
componentes. ### c) Le parece adecuado considerar dos
componentes principales?.
Contestado en a), no me parece que por criterio de kaiser debemos quedarnos con 4. ### d) Hallar la correlación entre las nuevas variables y las originales.
M = cor(hospitales[2:8])
corrplot(M)
Calculo las nuevas variables con las coordenadas de los autovectores aplicadas a las variables medidas estandarizadas
scores <- as.matrix(scale(hospitales[2:8])) %*% as.matrix(pcaHosp$rotation)
M = cor(scores)
corrplot(M)
Y comprobamos que todos los componentes son ortogonales, es decir no tienen correlación entre ellos.
scoresDF <- as.data.frame(scores)
rownames(scoresDF) <- t(hospitales[,1])
scoresDF %>% arrange(desc(PC1)) %>% add_rownames(" ") %>% flextable()%>% align_text_col(align = "right") %>% set_caption(caption = "Contribución a la explicación de la varianza") %>% autofit()
| PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | PC7 |
|---|---|---|---|---|---|---|---|
Psiquiatría | 2.76057321 | -1.6231629 | 1.9285305 | -1.09742354 | -0.67922500 | 0.11665799 | -0.10150040 |
Oftalmología | 1.40860910 | 1.5071016 | 1.5731307 | 1.20064614 | 0.90237445 | -0.34871352 | -0.04600285 |
Hematología | 1.33400207 | -1.2031748 | -1.1750701 | -0.24039451 | -0.32413257 | -0.21748623 | 0.43176271 |
Neumología | 1.24498574 | -0.3514166 | -1.1324201 | -0.29571557 | 1.41133261 | -0.02238495 | 0.07597888 |
Cardiología | 0.74825478 | 0.2827950 | -1.1328585 | -0.46928946 | 0.52066443 | -0.18698332 | -0.29654361 |
Otorrinolaringología | 0.74060858 | 0.5958440 | 0.6600822 | 1.23669366 | -0.44472546 | 0.27391541 | 0.08818028 |
Digestivo | -0.01880633 | -0.1370168 | -0.9785041 | 0.64516064 | -0.03178633 | 0.68378684 | 0.12542941 |
Urología | -0.25447877 | 0.8561591 | -0.6515172 | -0.26878382 | -0.35332359 | 0.69559952 | -0.34428172 |
Traumatología | -0.48509495 | 0.4259097 | -0.7588569 | 0.55304991 | -1.25828398 | -0.70204150 | -0.10250338 |
Cirugía | -0.93469324 | -0.3603612 | -0.6725177 | -0.08385551 | -0.24474072 | -0.37544586 | -0.15126806 |
Pediatría | -1.46747608 | 1.6426120 | 0.5116769 | -0.43635954 | -0.37788176 | 0.21685186 | 0.26895400 |
Tocoginecología | -2.06888710 | 1.4113840 | 0.9217361 | -1.36482965 | 0.40557651 | -0.17200992 | 0.11197511 |
Medicina.Interna | -3.00759700 | -3.0466730 | 0.9065882 | 0.62110125 | 0.47415142 | 0.03825368 | -0.06018035 |
No sabría como interpretar complejidad en base a los datos del ejercicio, pero la primera componente favorece reingresos e indice cardiaco medio, podriamos decir que es esa. O también la componente 2 con signo cambiado donde penaliza los ingresos…. Quedemosnos con esa….yo que se…
En cuanto a los mas demandados probablemente sean los que tengan elevada la \(3^{ra}\) componente.
fviz_pca_biplot(pcaHosp)
*12 y 13 son similares y pero cercanos al promedio. 2 y 10 son similares y 7 y 3 también.