miércoles, 16 de marzo de 2011

Análisis de Componentes Principales en R.

En esta ocasión me interesa un poco volver a lo básico y general, y alejarme un poco de cosas especificas para la Biología.
So, presento pues la forma básica de realizar el muy conocido "análisis de componentes principales" en R.
Básicamente este análisis reduce la dimensionalidad o cantidad de un conjunto de datos y como resultado se obtiene una serie de datos "virtuales" llamados componentes principales en los cuales esta contenida la mayor cantidad de variación de los datos primarios de entrada ordenados por importancia. 
Como un elemento adicional este análisis puede servir para explorar de una manera rapida (no excesivamente eficiente) como se agrupan las variables utilizadas y/o los individuos evaluados (mas información).


Para explicar rápidamente como realizar este análisis en R, utilizaremos un set de datos de medidas tomadas a varios organismos de distintas poblaciones (misma especie) de tortugas con tres variables (longitud (lon), ancho (anc), y altura (alt) del caparazón). 
Como siempre estos datos se encontraran en formato .CSV (separado por comas)
y debe tener la siguiente apariencia y al que llamaremos "tortugas_ninja.csv":




lon,anc,alt
98,81,38
103,84,38
103,86,42
105,86,42
109,88,44
123,95,46
134,100,48
136,102,49
123,92,50
133,99,51
133,102,51
133,102,51
138,98,51
138,99,51
141,105,53
149,107,55
153,107,56
147,108,57
155,117,60
158,155,62
155,115,63
159,118,63
162,124,61
177,132,67


Manos a la Obra:






>tortugas_ninja <- read.csv("tortugas_ninja.csv",header=T)

#(llamo a R el archivo que cree en formato .CSV (separado por comas) !!se puede crear en excel y guardarlo en formato .csv pero se deben cambiar los ";" por "," y los decimales deben estar separados por "." no por ","en home)


>tortugas_ninja


#(asi puedo ver lo que tiene mi archivo tortugas_ninja y garantizar que no hayan errores en el archivo)


   lon anc alt
1   98  81  38
2  103  84  38
3  103  86  42
4  105  86  42
5  109  88  44
6  123  95  46
7  134 100  48
8  136 102  49
9  123  92  50
10 133  99  51
11 133 102  51
12 133 102  51
13 138  98  51
14 138  99  51
15 141 105  53
16 149 107  55
17 153 107  56
18 147 108  57
19 155 117  60
20 158 155  62
21 155 115  63
22 159 118  63
23 162 124  61
24 177 132  67



>attach (tortugas_ninja)

#(para tomar mis columnas como objetos)


>tortugas.cp <- princomp(tortugas_ninja[,-1], scale = TRUE)

#(realizo mi análisis de componentes principales, el argumento "[,-1]" indica que no se debe tomar la primer columna del set de datos que corresponde a una variable  altamente correlacionada con las demás(longitud) (esto se sabe por previos análisis de correlación entre variables p.ej. un correlograma))


>summary (tortugas.cp)

#(inspecciono mis resultados del análisis de componentes realizado y que tanto explican mis componentes)

Importance of components:
                          Comp.1     Comp.2
Standard deviation     17.898105 3.39881269
Proportion of Variance  0.965194 0.03480607
Cumulative Proportion   0.965194 1.00000000


>plot (tortugas.cp)

#(gráfico las varianzas para los componentes explicativos encontrados)
>biplot(tortugas.cp)

# (realizo mi gráfico de componentes principales)

>loadings(tortugas.cp)

# (cargo los datos de las variables que mis componentes me están explicando)
Loadings:
    Comp.1 Comp.2
anc -0.915  0.404
alt -0.404 -0.915

               Comp.1 Comp.2
SS loadings       1.0    1.0
Proportion Var    0.5    0.5
Cumulative Var    0.5    1.0
>tortugas.cp$scores
# (de este modo obtengo mis scores de los componentes para cada individuo de la muestra inicial, para realizar posteriores análisis con estas nuevas variables)
          Comp.1      Comp.2
 [1,]  26.942316  3.44129819
 [2,]  24.198509  4.65436178
 [3,]  20.751886  1.80466153
 [4,]  20.751886  1.80466153
 [5,]  18.113972  0.78416594
 [6,]  10.903047  1.78544299
 [7,]   5.521326  1.97801099
 [8,]   3.287767  1.87211772
 [9,]  12.029436 -3.08602990
[10,]   5.222865 -1.17015052
[11,]   2.479058  0.04291307
[12,]   2.479058  0.04291307
[13,]   6.137467 -1.57450505
[14,]   5.222865 -1.17015052
[15,]  -1.073458 -0.57322800
[16,]  -3.711372 -1.59372359
[17,]  -4.115726 -2.50832592
[18,]  -5.434683 -3.01857372
[19,] -14.879168 -2.12318993
[20,] -50.442765 11.41307753
[21,] -14.263027 -5.67570597
[22,] -17.006834 -4.46264238
[23,] -21.685739 -0.20731055
[24,] -31.428684 -2.46008828




Y finalmente eso es todo amigos....
Buenos deseos!!!

viernes, 4 de marzo de 2011

Como manejo mis coordenadas? : Array's en R.

Retomando la Morfometrìa......

En el post de toma de landmarkas en R,  pudimos ver como obtener a partir de imágenes y/o fotografías la configuración espacial de un objeto o región X determinada...Pero, después de tener todos nuestros archivos en formato .txt en el que se encuentran almacenadas las configuraciones de los landmarks individuales de cada imagen.. como analizarlos en conjunto para poder hacer comparaciones??

El primer paso es "concatenar" mis archivos en un formato u objeto en R que sea manejable para realizar comparaciones y/o análisis, un tipo de objeto de este tipo es el objeto "array" que es la generalización de una matriz de dos dimensiones al caso multidimensional. (mas información).

Una vez tenemos nuestros datos almacenados en un "array" o varios "array's"; (dependiendo de sí es un "array" por cada especie o por cada sitio o etc... para ser comparados) podemos empezar con los distintos análisis morfometricos.

Entonces, supongamos que hemos tomado 12 landmarks en el ala de 4 individuos de Diachlorus ferrugatus  (Díptera: Tabanidae) y la configuracion geometrica del ala de esta especie sera comparada con la configuración de otras especies del mismo Genero, para ello necesitamos construir un "array" para cada especie. (Como ejemplo, utilizaremos el de la especie mencionada)

Partiríamos de 4 archivos .txt que contienen las coordenadas de los landmarks de los 4 individuos que utilizamos de la misma especie, estos tendrían una apariencia como esta:

Archivo 1 (df1.txt):


"x" "y"
"lan1" 0.987216506531992 4.65296820402765
"lan2" 3.44297896059167 4.30214499630484
"lan3" 3.72363752676992 4.81083864750291
"lan4" 9.33680885033491 4.40739195862168
"lan5" 9.58238509574088 3.98640410935431
"lan6" 8.02122182137436 2.75852288232447
"lan7" 7.56515165133471 2.53048779730464
"lan8" 5.72332981078995 3.44262813738395
"lan9" 6.0916941788989 2.14458226880955
"lan10" 3.98675493256203 2.00425298572042
"lan11" 3.75871984754220 2.33753503305709
"lan12" 3.21494387557185 3.56541626008693

Archivo 2 (df2.txt):


"x" "y"
"lan1" 0.451428571428571 5.23678571428571
"lan2" 3.09428571428571 4.80821428571429
"lan3" 3.29071428571429 5.3975
"lan4" 9.41571428571429 4.93321428571429
"lan5" 9.68357142857143 4.48678571428571
"lan6" 7.84428571428572 3.09392857142857
"lan7" 7.32642857142857 2.84392857142857
"lan8" 5.36214285714286 3.91535714285714
"lan9" 5.88 2.50464285714286
"lan10" 3.79071428571429 2.21892857142857
"lan11" 3.54071428571429 2.55821428571429
"lan12" 2.79071428571429 4.04035714285714

Archivo 3 (df3.txt):

"x" "y"
"lan1" 0.149340776528574 5.28933286531034
"lan2" 2.99908023202552 4.91057002628859
"lan3" 3.17944348870254 5.50576877332276
"lan4" 9.6003754264045 5.07289695729791
"lan5" 9.90699296275545 4.54984351293455
"lan6" 8.04925141898212 3.17908276218918
"lan7" 7.58030695162187 2.98068317984446
"lan8" 5.56023847683922 3.95464476590038
"lan9" 6.02918294419948 2.54781136381961
"lan10" 3.77464223573671 2.27726647880408
"lan11" 3.48606102505347 2.65602931782582
"lan12" 2.72853534700998 4.11697169690970

Archivo 4 (df4.txt):

"x" "y"
"lan1" 0.74741186771418 4.70685628896825
"lan2" 3.18693026280777 4.35330289837498
"lan3" 3.38138462763407 4.90131065379455
"lan4" 9.21501557242309 4.56543493273094
"lan5" 9.46250294583838 4.19420387260801
"lan6" 7.87151268816865 2.95676700553155
"lan7" 7.41189328039739 2.72695730164592
"lan8" 5.50270497119371 3.55780776954011
"lan9" 5.96232437896497 2.33804857199332
"lan10" 3.92939238305364 2.07288352904836
"lan11" 3.68190500963835 2.33804857199332
"lan12" 3.01015356751113 3.62851844765877

En estos archivos se presentan las coordenadas de 12 landmarks tomados en cada uno de los 4 individuos de Diachlorus ferrugatus que utilizamos, es por eso que los archivos se llaman "df1.txt", "df2.txt", "df3.txt" y "df4.txt" (por las iniciales de la especie y el numero del individuo (pero se puede utilizar el nombre que se desee)) respectivamente.
Los diminutivos "lan1" a "lan12" indican el numero del landmark y se presentan las coordenadas en los ejes "x" y "y".
Estos archivos deben estar contenidos en el directorio sobre el cual estamos trabajando en R!!!

Para hacer el array necesitamos un script que puede estar en formato ".txt" o en formato ".R" así (para este caso) o escribir todos los comandos uno por uno!!:

 a<-read.table("df1.txt")
 b<-read.table("df2.txt")
 c<-read.table("df3.txt")
 d<-read.table("df4.txt")
 a<-as.matrix(a)
 b<-as.matrix(b)
 c<-as.matrix(c)
 d<-as.matrix(d)
 Dferrugatus<-array(cbind(a, b, c, d), dim=c(12, 2, 4 ))

#En este Script leemos primero cada uno de de nuestros archivos y les damos nombres: a, b, c y d. :

> a <- read.table ("df1.txt")
> b <- read.table ("df2.txt")
> c <- read.table ("df3.txt")
> d <- read.table ("df4.txt")

#Después los tomamos como matrices:
 
>a<-as.matrix(a)
>b<-as.matrix(b)
>c<-as.matrix(c)
>d<-as.matrix(d)

#Y finalmente construimos el array utilizando la función "cbind" y diciéndole cuales objetos utilizar (a,b,c,d) y dándole las dimensiones del array (12= que es el numero de filas sin contar los encabezados y en este caso es el numero de landmarks), (2= que es el numero de columnas que en este caso es el numero de variables "x" y "y"), y (4= que es el numero de archivos que estamos utilizando que este caso es 4):

>Dferrugatus<-array(cbind(a, b, c, d), dim=c(12, 2, 4 ))

#Podemos revisar nuestro array dandole el nombre de este que en este caso es 
"Dferrugatus":

>Dferrugatus

Y lo que obtendríamos (array) seria algo así: 

, , 1

           [,1]     [,2]
 [1,] 0.9872165 4.652968
 [2,] 3.4429790 4.302145
 [3,] 3.7236375 4.810839
 [4,] 9.3368089 4.407392
 [5,] 9.5823851 3.986404
 [6,] 8.0212218 2.758523
 [7,] 7.5651517 2.530488
 [8,] 5.7233298 3.442628
 [9,] 6.0916942 2.144582
[10,] 3.9867549 2.004253
[11,] 3.7587198 2.337535
[12,] 3.2149439 3.565416

, , 2

           [,1]     [,2]
 [1,] 0.4514286 5.236786
 [2,] 3.0942857 4.808214
 [3,] 3.2907143 5.397500
 [4,] 9.4157143 4.933214
 [5,] 9.6835714 4.486786
 [6,] 7.8442857 3.093929
 [7,] 7.3264286 2.843929
 [8,] 5.3621429 3.915357
 [9,] 5.8800000 2.504643
[10,] 3.7907143 2.218929
[11,] 3.5407143 2.558214
[12,] 2.7907143 4.040357

, , 3

           [,1]     [,2]
 [1,] 0.1493408 5.289333
 [2,] 2.9990802 4.910570
 [3,] 3.1794435 5.505769
 [4,] 9.6003754 5.072897
 [5,] 9.9069930 4.549844
 [6,] 8.0492514 3.179083
 [7,] 7.5803070 2.980683
 [8,] 5.5602385 3.954645
 [9,] 6.0291829 2.547811
[10,] 3.7746422 2.277266
[11,] 3.4860610 2.656029
[12,] 2.7285353 4.116972

, , 4

           [,1]     [,2]
 [1,] 0.7474119 4.706856
 [2,] 3.1869303 4.353303
 [3,] 3.3813846 4.901311
 [4,] 9.2150156 4.565435
 [5,] 9.4625029 4.194204
 [6,] 7.8715127 2.956767
 [7,] 7.4118933 2.726957
 [8,] 5.5027050 3.557808
 [9,] 5.9623244 2.338049
[10,] 3.9293924 2.072884
[11,] 3.6819050 2.338049
[12,] 3.0101536 3.628518


Cabe recordar que estos array no son utilizados solamente para morfometrìa sino para múltiples análisis en R y que su construcción es importante para todo usuario de R!!!!
(mas adelante utilizaremos estos array)

Sean felices y hasta la próxima !!!!