Podstawowy problem to:Porównanie wielu ciągów znaków arbitralnych ze znakami zorientowanymi
Szukam algorytmu do obliczenia maksymalnej oszczędnej odległości między zestawem ciągów. W przypadku odległości rozumiem coś podobnego do Damerau–Levenshtein distance, tj. Minimalną liczbę usunięć, wstawień, podstawień i transpozycji znaków lub bloków sąsiednich znaków. Ale zamiast zwykłych ciągów chcę zbadać ciągi znaków o zorientowanych znakach.
Zatem łańcuch może wyglądać tak:
(A,1) (B,1) (C,1) (D,1)
i możliwych pochodnych mogą być:
(A,1) (C,0) (B,0) (D,1)
(A,1) (C,1) (B,1) (D,1)
(A,1) (B,0) (C,0) (D,1)
Gdzie A,B,C,D
są tożsamość i charakter 1 = forward
i 0 = reverse
.
Tutaj pochodna 1. miałaby odległość 2, ponieważ można wyciąć blok BC i ponownie wkleić go odwrócony (1 cięcie, 1 wklej). Pochodna 2. miałaby również 2, ponieważ można wyciąć C i ponownie wkleić go przed B (1 cięcie, 1 wklej), natomiast numer 3. wymagałoby 4 operacji (2 cięcia, 2 pasty) do przekształcenia. Analogiczne, delecję lub insercję bloków dałoby odległość 1.
Jeżeli można określić (X,0)
i (X,1)
w dwóch różnych zorientowanych znakami nie (X0, X1)
dla wszystkich możliwych X Przykład 3. spowodowałoby odległości 2 ponieważ może wówczas wyciąć blok B1C1
i wstawić blok B0C0
w dwóch etapach.
przykładem prawdziwy świat:
genów w genomie bakterii można uznać za zorientowanych postać (A, 0), (B, 0) ... Dzięki określaniu odległości, sekwencji genomowego orientację Geny homologów w dwóch pokrewnych bakteriach można wykorzystać jako ewolucyjny ślad markerowy. Fakt, że genomy bakterii są cyklicznymi łańcuchami wprowadza dodatkowy warunek graniczny ABC jest równy BCA.
Prawdziwe genomy mają unikatowe geny bez odpowiednika u partnera, co powoduje powstanie znaku właściciela miejsca @. Te elementy zastępujące zmniejszają zawartość informacyjną porównania do niższej granicy, ponieważ np. (A, 1) (B, 1) @ (C, 1) można przekształcić do (A, 1) @@@ (B, 1) @ (C, 1) przez wstawienie bloku @@@. Jednak orientacja przywraca częściowo treść informacji, ponieważ może się okazać, że (A, 1) @@@ (B, 0) @ (C, 1) wskazuje minimalną odległość 3. Jeszcze lepiej byłoby algorytmem porównywania wielu powiązanych sekwencji (genomy) jednocześnie, ponieważ można wtedy znaleźć półprodukty w historii ewolucyjnej, co zwiększa rozdzielczość.
Zdaję sobie sprawę, istnieje kilka pytań już opublikowanych na temat porównania ciągów tekstowych. Ale nie można ich łatwo rozszerzyć, aby uwzględnić orientację. Ponadto istnieje wiele metod radzenia sobie z sekwencjami biologicznymi, w szczególności w przypadku analizy wielu sekwencji.Jednak są one ograniczone do sekwencji makrocząsteczek, które nie istnieją w alternatywnych orientacjach i zwykle wywołują określone wagi dla każdego konkretnego dopasowania postaci.
Jeśli istnieje już biblioteka Pythona, która pozwoliłaby na niezbędne dostosowanie w celu rozwiązania tego problemu, byłoby to fantastyczne. Ale bardzo przydatny mógłby być dowolny odpowiedni algorytm orientacji.