Cousas de Multivariante

Esto es más una prueba de fuego que otra cosa. Básicamente voy a poner aquí unas cosas de PCA (análisis de componentes principales) que me gustan bastante. Esta técnica ya de por si me parece muy útil y fácil de visualizar, quizás justamente porque es una técnica de reducción de la dimensionalidad.

Así que ahí a lo bruto van mis scripts anotados de la clase de hoy:

###########################################
#   ANÁLISIS DE COMPONENTES PRINCIPALES   #
###########################################


# Ejemplo. Se ha examinado a 25 alumnos, aspirantes a ingresar en la Facultad de Mate-
# máticas, de 5 materias diferentes: Geometría Diferencial (cuyo resultado se almacena en
# la variable geodif), Análisis Complejo (ancompl), Álgebra (alg), Análisis Real (anreal) y Es-
# tadística (estad). Las puntuaciones obtenidas figuran en la tabla siguiente y se encuentran
# en el fichero aspirantes.txt.


datos<-read.table("aspirantes.txt",header=T)
head(datos)
##   geodif ancompl alg anreal estad
## 1     36      58  43     36    37
## 2     62      54  50     46    52
## 3     31      42  41     40    29
## 4     76      78  69     66    81
## 5     46      56  52     56    40
## 6     12      42  38     38    28
str(datos)
## 'data.frame':    25 obs. of  5 variables:
##  $ geodif : int  36 62 31 76 46 12 39 30 22 9 ...
##  $ ancompl: int  58 54 42 78 56 42 46 51 32 40 ...
##  $ alg    : int  43 50 41 69 52 38 51 54 43 47 ...
##  $ anreal : int  36 46 40 66 56 38 54 52 28 30 ...
##  $ estad  : int  37 52 29 81 40 28 41 32 22 24 ...
# Manualmente: matriz de covarianzas, luego autovectores

n<-nrow(datos);n # Observaciones
## [1] 25
d<-ncol(datos);d # Dimension en el espacio
## [1] 5
Sc<-cov(datos);Sc # matriz de covarianzas corregida
##           geodif   ancompl       alg   anreal    estad
## geodif  348.7733 181.69167 137.54500 176.8850 233.6583
## ancompl 181.6917 145.75000  91.28333 108.4750 142.5000
## alg     137.5450  91.28333  95.39333 106.1383 135.1833
## anreal  176.8850 108.47500 106.13833 166.9567 167.5500
## estad   233.6583 142.50000 135.18333 167.5500 272.6667
S<-Sc*(n-1)/n;S # Matriz de covarianza muestral
##           geodif ancompl      alg   anreal   estad
## geodif  334.8224 174.424 132.0432 169.8096 224.312
## ancompl 174.4240 139.920  87.6320 104.1360 136.800
## alg     132.0432  87.632  91.5776 101.8928 129.776
## anreal  169.8096 104.136 101.8928 160.2784 160.848
## estad   224.3120 136.800 129.7760 160.8480 261.760
aux <- eigen(S) # Autovalores y autovectores de S
lambda<-aux$values;lambda
## [1] 811.66184  81.63974  43.57261  37.62083  13.86339
v<-aux$vectors;v  # Se multiplicaría así ese componente por el dato de la tabla. 
##            [,1]       [,2]       [,3]        [,4]        [,5]
## [1,] -0.5982782  0.6745404  0.1852556 -0.38597894  0.06131111
## [2,] -0.3607532  0.2450733 -0.2490064  0.82871854 -0.24701742
## [3,] -0.3021774 -0.2140882 -0.2114109  0.13484564  0.89441442
## [4,] -0.3890403 -0.3384022 -0.6999921 -0.37537871 -0.32129949
## [5,] -0.5188995 -0.5697232  0.6074477  0.07178665 -0.17892129
# 5 variables en 5 notas dinstintas, si tengo que resumir las notas de un alumno e una sola lo que me dice es que lo mejor
# sería hacer una ponderación delas notas con estos coeficientes. De esta forma el que sea bueno bajará nota y el que la tenga
# mala la mejorará. Las PCS se calculan desde los datos centrados y por eso se tiende a la media, a "centrar" datos.

# Se reduce de 25 datos 5-Dimensionales a 25 datos unidimensionales. ¿Qué varianza tiene?

lambda
## [1] 811.66184  81.63974  43.57261  37.62083  13.86339
# La varianza coincide con el autovalor. La PCA 1º tendrá 811 de varianza, la segunda, de la segunda columna... 0'74 por la primera
#nota, 0'24 por al segunda, -0'21 por la tercera... 


# FORMA AUTOMÁTICA:

pca<-princomp(datos) # Desviaciones típicas de las PCA que sera lo mismo que
sqrt(lambda)
## [1] 28.489680  9.035471  6.600955  6.133582  3.723358
summary(pca)
## Importance of components:
##                            Comp.1     Comp.2     Comp.3     Comp.4     Comp.5
## Standard deviation     28.4896795 9.03547104 6.60095491 6.13358179 3.72335754
## Proportion of Variance  0.8212222 0.08260135 0.04408584 0.03806395 0.01402668
## Cumulative Proportion   0.8212222 0.90382353 0.94790936 0.98597332 1.00000000
lambda[1]/sum(lambda)
## [1] 0.8212222
lambda[2]/sum(lambda)
## [1] 0.08260135
pca$sdev^2 # Standard Desviation
##    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5 
## 811.66184  81.63974  43.57261  37.62083  13.86339
screeplot(pca) # PCA's representados gráficamente

windows()
screeplot(pca,type="lines")

names(pca)
## [1] "sdev"     "loadings" "center"   "scale"    "n.obs"    "scores"   "call"
plot(pca$scores[,1],pca$scores[,2])
text(pca$scores[,1],pca$scores[,2],1:n)

# Coeficientes de los componentes o autovectores:

loadings(pca)
## 
## Loadings:
##         Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## geodif   0.598  0.675  0.185  0.386       
## ancompl  0.361  0.245 -0.249 -0.829 -0.247
## alg      0.302 -0.214 -0.211 -0.135  0.894
## anreal   0.389 -0.338 -0.700  0.375 -0.321
## estad    0.519 -0.570  0.607        -0.179
## 
##                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
barplot(loadings(pca), beside = TRUE) # Representación coeficientes

pca$scores # Puntuaciones de los individuos en las componentes
##            Comp.1      Comp.2      Comp.3      Comp.4     Comp.5
##  [1,]  -7.5403215  10.2167650   2.5374713  -8.6708997 -4.3011164
##  [2,]  20.3610372  13.3460340   8.9820585   6.4124949 -1.3548711
##  [3,] -19.5031539   6.5552439  -1.6414327   5.0042015 -2.2980498
##  [4,]  65.9652730   1.3136646   5.1988159  -5.2093505 -1.0457668
##  [5,]   9.7780565   6.0680143  -9.1921582   2.9249303 -2.1069944
##  [6,] -33.0739529  -4.3722312  -3.7345190  -2.6038323 -5.3246839
##  [7,]   1.4212177  -0.7833317  -5.7800406   7.8225646 -0.4967347
##  [8,]  -6.7011638  -0.4667798 -13.3936497  -0.3040531  2.6525120
##  [9,] -36.1916160   5.6543609   2.9062814   5.5458471  6.5171961
## [10,] -38.0586178  -3.8266815  -2.5248244  -6.0338259  6.3212284
## [11,]  -1.6837296  -5.9262762  10.1237093  -4.9410716  4.5102357
## [12,]   6.4961788   3.9922267   5.0805842 -10.8805481 -1.3208797
## [13,]  48.6656614   2.5248899  -7.4227003  -6.1976282  3.0745497
## [14,]  12.8648106 -20.9375616   1.3328311  13.8459667  1.2286291
## [15,]  -5.1279619 -14.2990082  -2.9194088   2.7778854 -9.4299722
## [16,]  14.7627376   1.9542134   2.1019732   6.8802981  0.7262472
## [17,]   0.5206666   0.3328352  12.2272438   5.5083908  5.1001830
## [18,] -55.8465116   0.7024956   1.3349377  -4.9981377 -2.2873123
## [19,]   1.2809636  24.1913016   1.8618184   5.1875656 -3.1248129
## [20,]  44.0731110  -1.0133086  -8.2094067  -5.5695807  3.6879677
## [21,]   2.7282968 -15.4819784  13.1612877  -5.6870830 -3.1343155
## [22,] -22.3031608  -2.8413762  -5.9443642  -4.0929718  2.9545412
## [23,]  10.4526967  -7.6936163  -3.2010012  -3.0864389 -0.6469043
## [24,]  28.7147101  -2.0746379  -2.7048913   5.2002364 -0.7510021
## [25,] -42.0552279   2.8647426  -0.1806153   1.1650401  0.8501260
biplot(pca)

# Estos resultados se pueden obtener de forma manual:

n <- nrow(datos)
s <- cov(datos) * (n - 1)/n
auto <- eigen(s)
lambda = auto$values
plot(lambda, type = "l")

v <- auto$vectors

Ta guapo.

Avatar
Juan A. Arias
Investigador Doutoral

Os meus intereses inclúen Bioloxía, Neurociencias, Bioestatística, Neuroimaxe, Aprendizaxe Estatístico e Comunicación Científica.