4 de febrero de 2012

Random (Selection) Skewers.



Volví de mis vacaciones con algo pesado…

Dos poblaciones sujetas a un escenario idéntico de selección natural pueden diferir en la forma que responden porque difieren en G, la matriz de varianza-coavarianza genética entre los caracteres. La "forma" de G (en general se representa como una pelotita, más o menos deforme, más alargada en la dirección donde hay más variabilidad) puede acelerar o retardar el cambio evolutivo.
Invirtiendo el razonamiento, podemos comparar las Gs de dos poblaciones. Esta es la idea básica de los random (o selection) skewers propuestos por Cheverud (1-aquí una buena descripción). Como no siempre tenemos datos de la selección, la simulamos creando miles de vectores de selección, aplicando cada uno de ellos (skewer se traduce como "brocheta") a ambas matrices G, obteniendo la dos respuestas a la selección y evaluando si estas respuestas difieren en su magnitud y su dirección.

Supongamos que tenemos dos matrices G (G1 y G2), con el mismo número de caracteres N

N<-ncol(G1)

Creamos un vector de largo N extraido de una distribución uniforme

RS1<-runif(n=N)
RS1

Pero necesitamos que contega valores positivos y negativos con el 50% de probabilidad para cada uno

sign<-c(-1,1)
RS2<-vector(length=N)
for (i in 1:N) RS2[i]<-sample(sign, size=1)*RS1[i]
RS2

Y ahora necesitamos que tenga una longitud estándar, específicamente que la suma de sus elementos al cuadrado sume 1.

RS3<-RS2/sqrt((t(RS2)%*%RS2))
RS3

El resto ya es sencillo. Obtenemos las dos respuestas a la selección (dz)

dz1<-G1%*%RS3
dz2<-G2%*%RS3

Comparamos su magnitud

L<-sum(dz1^2)/sum(dz2^2)
L

Comparamos su correlación (el coseno de su ángulo en el hiperespacio fenotípico, ja!)

A<-(t(dz1)%*%dz2)/ sqrt((t(dz1)%*%dz1)*(t(dz2)%*%dz2))
A

Ahora todo en una sola función…

selection.skewers<-function(G1, G2){
N<-ncol(G1)
RS1<-runif(n=N)
sign<-c(-1,1)
RS2<-vector(length=N)
for (i in 1:N) RS2[i]<-sample(sign, size=1)*RS1[i]
RS3<-RS2/sqrt((t(RS2)%*%RS2))
dz1<-G1%*%RS3
dz2<-G2%*%RS3
L<-sum(dz1^2)/sum(dz2^2)
A<-(t(dz1)%*%dz2)/ sqrt((t(dz1)%*%dz1)*(t(dz2)%*%dz2))
res<-c(L, A)
res}

1- Cheverud J.M. y Marroig G. (2007). Comparing covariance matrices: random skewers method compared to the common principal components model. Genetics and Molecular Biology, 30: 461–469.


Licencia Creative Commons
Este obra está bajo una licencia Creative Commons Atribución-NoComercial-CompartirIgual 2.5 Argentina.