Wenn ich DNA als binäre Werte darstelle, wie kann ich den Abstand zwischen ihnen am besten berechnen?
Also: A = 00, T = 11, G = 01 und C = 10
Die Hamming-Distanz zwischen ATGC und TAAC beträgt 3, ihre binären Darstellungen geben jedoch eine andere Antwort:
Hamming-Distanz von 00110110 und 11000010 = 5.
Was ist die beste Methode zur Entfernungsberechnung, wenn die DNA-Basen auf diese Weise dargestellt werden?
Am besten wählen Sie eine Distanz, die Ihren Vorstellungen entspricht, anstatt sich unbedingt auf die Hamming-Distanz zu verlassen.
Wenn Sie einfach eine Base-by-Base-Differenz wünschen, berechnen Sie diese ( dies kann hilfreich sein), aber Sie möchten möglicherweise auch eine Differenz, die von der Wahrscheinlichkeit der Mutation zwischen verschiedenen Basen abhängt. In diesem Fall möchten Sie eine Funktion definieren, die die Mutation in a übersetzt Bewerten Sie für jeden Transfer, dh Sie möchten vielleicht eine Desaminierung von 5-Methylcytosin zu Thymin als das wahrscheinlichste Ereignis bewerten. Das Ausdrücken der relativen Wahrscheinlichkeiten verschiedener Mutationen ist kein einfaches Problem, aber es gibt eine Reihe weit verbreiteter Optionen .
Wichtig ist, sicherzustellen, dass Sie die zugrunde liegende Biologie repräsentieren, nicht sicherzustellen, dass Sie die schnellste Implementierung haben. Entscheiden Sie sich zuerst dafür und dann für den Algorithmus, der Ihnen die beste Geschwindigkeit bietet (auch die Entscheidung für diesen Algorithmus ist ein Thema für Stack Overflow, nicht für diesen Stack Exchange).
Diese Kodierung macht keinen Sinn, da sich die Nukleotide nicht im Hamming-Raum befinden . Der Hamming-Abstand zwischen jeweils zwei Nukleotiden ist konstant 1, aber bei der binären Codierung variiert er von 1 bis 2.
Ich zögere, mit Code zu antworten, aber es scheint, dass die Community entschieden hat, dass dies eine angemessene Frage für Biology.SE ist. Also hier ist meine Lösung.
Die Idee ist, die zwei Bits, die jedes Nukleotid darstellen, zu "komprimieren", so dass jedes Nukleotid 0 oder 1 (nicht mehr) zum Abstand beiträgt.
Sie könnten binäre Operationen verwenden, um so etwas zu tun (in Java, aber Sie können die Logik in jeder Sprache anwenden):
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
Die Idee ist, die Gesamtzahl der unterschiedlichen Bits zu erhalten mit:
seq1 ^ seq2
(pseudoDist&0xAAAAAAAA>>1)
Aber Sie können die Bits noch nicht einfach zählen, weil Sie stattdessen die Hamming-Distanz erhalten, also müssen Sie alle Bits, die demselben Nukleotid entsprechen, mit: und auf dasselbe Bit komprimieren pseudoDist&0x55555555
. Der erste hält die Bits auf geraden Positionen und der zweite die auf ungeraden Positionen.
Jetzt verwenden Sie evenBits | oddBits
und Sie können die Bits zählen.
ATGC
und TAAC
3 ist, was die richtige Antwort ist.
Remi.b
David
Maljam
Maljam
Macond
Macond
Macond
Macond
Macond
Macond
David
Macond