Si represento el ADN como valores binarios, ¿cuál es la mejor manera de calcular la distancia entre ellos?
Entonces: A = 00, T = 11, G = 01 y C = 10
La distancia de Hamming entre ATGC y TAAC es 3, sin embargo, sus representaciones binarias dan una respuesta diferente:
Distancia de Hamming de 00110110 y 11000010 = 5.
¿Cuál es la mejor manera de calcular la distancia si las bases de ADN se representan de esta manera?
La mejor manera es elegir una distancia que represente lo que usted quiere en lugar de confiar necesariamente en la distancia de Hamming.
Si simplemente desea una diferencia base por base, calcule eso ( esto puede ayudar), pero también puede querer una diferencia que dependa de la probabilidad de mutar entre diferentes bases, en cuyo caso desea definir una función que traduzca la mutación en un puntuación para cada transferencia, es decir, es posible que desee anotar una desaminación de 5-metilcitosina a timina como la ocurrencia más probable. Expresar las probabilidades relativas de diferentes mutaciones no es un problema fácil, pero hay varias opciones ampliamente utilizadas .
Lo importante es asegurarse de representar la biología subyacente, no asegurarse de tener la implementación más rápida. Primero decida esto, luego el algoritmo que le brinde la mejor velocidad (además, decidir sobre ese algoritmo es un tema para Stack Overflow, no este Stack Exchange).
Esta codificación no tiene sentido ya que los nucleótidos no están en el espacio de Hamming . La distancia de Hamming entre cada dos nucleótidos es constantemente 1, pero en la codificación binaria, varía de 1 a 2.
Soy reacio a responder con código, pero parece que la comunidad decidió que era una pregunta apropiada para Biology.SE. Así que aquí está mi solución.
La idea es "comprimir" los dos bits que representan cada nucleótido, de modo que cada nucleótido aporte 0 o 1 (no más) a la distancia.
Podría usar operaciones binarias para hacer algo como esto (en Java, pero puede aplicar la lógica en cualquier idioma):
int seq1 = 54, seq2 = 194;//ATGC and TAAC
int evenBit = 0xAAAAAAAA, oddBit = 0x55555555;
int pseudoDist = seq1 ^ seq2; //Integer.bitCount(pseudoDist) is 5
int dist = ( (pseudoDist&evenBit)>>1 ) | (pseudoDist&oddBit);
int finalDist = Integer.bitCount(dist);//output 3 not five
La idea es obtener el número total de bits que son diferentes con:
seq1 ^ seq2
Pero todavía no puede contar los bits, porque en su lugar obtendrá la distancia de Hamming, por lo que debe comprimir todos los bits que corresponden al mismo nucleótido al mismo bit usando: (pseudoDist&0xAAAAAAAA>>1)
y pseudoDist&0x55555555
. El primero mantiene los bits en posiciones pares y el segundo los en posiciones impares.
Ahora usas evenBits | oddBits
, y puedes contar los bits.
ATGC
y TAAC
es 3, que es la respuesta correcta.
Remi.b
David
maljam
maljam
macond
macond
macond
macond
macond
macond
David
macond