Определение соотношения совпадений и несовпадений двух основных цепей?

Возможный дубликат:
Как построить граф генов для последовательности ДНК, скажем, ATGCCGCTGCGC?

Я пытаюсь написать Perl-скрипт, который сравнивает две последовательности ДНК (скажем, по 60 символов в длину) в выравнивании, а затем показывает соотношение совпадений и несовпадений последовательностей друг с другом. Но мне не очень везет. если это поможет, я могу загрузить свой код, но это бесполезно. вот пример того, чего я пытаюсь достичь ниже.

e.g

A T C G T A C
| | | | | | |
T A C G A A C

Таким образом, совпадений в приведенном выше примере будет 4, а несоответствий: 3. Если дать коэффициент 4,3.

Любая помощь приветствуется. благодаря.


person Conor C    schedule 14.08.2012    source источник


Ответы (7)


в общем, пожалуйста, опубликуйте свой код. Это помогает. В любом случае что-то вроде этого должно делать то, что вы просите:

#!/usr/bin/perl -w
use strict;
my $d1='ATCGTAC';
my $d2='TACGAAC';

my @dna1=split(//,$d1);
my @dna2=split(//,$d2);

my $matches=0;
for (my $i=0; $i<=$#dna1; $i++) {
    $matches++ if $dna1[$i] eq $dna2[$i];
}
my $mis=scalar(@dna1)-$matches;
print "Matches/Mismatches: $matches/$mis\n";

Имейте в виду, однако, что соотношение 4 к 3, скорее всего, не 4,3, а ~1,3. Если вы опубликуете некоторую информацию о формате входного файла, я обновлю свой ответ, включив в него строки для анализа последовательности из вашего файла.

person terdon    schedule 14.08.2012
comment
неужели, ой. большое спасибо, чувак. я был на этом некоторое время. :) . Могу я также спросить, как бы я рассчитал соотношение результатов???. - person Conor C; 14.08.2012
comment
@ Conor-c Ну, зависит от того, что вы подразумеваете под соотношением. Обычно x/y = отношение x к y. Вы имеете ввиду процент? - person terdon; 14.08.2012

Обычно я говорю: "Что вы пробовали" и "сначала загрузите свой код", потому что это не кажется очень сложной проблемой. Но давайте попробуем:

создайте два массива, по одному для хранения каждой последовательности:

@sequenceOne = ("A", "T", "C", "G", "T", "A", "C");
@sequenceTwo = ("T", "A", "C", "G", "A", "A", "C");
$myMatch = 0;
$myMissMatch = 0;

for ($i = 0; $i < @sequenceOne; $i++) {
    my $output = "Comparing " . $sequenceOne[$i] . " <=> " . $sequenceTwo[$i];
    if ($sequenceOne[$i] eq $sequenceTwo[$i]) {
        $output .= " MATCH\n";
        $myMatch++;
    } else {
        $myMissMatch++;
        $output .= "\n";
    }
    print $output;
}

print "You have " . $myMatch . " matches.\n";
print "You have " . $myMissMatch . " mismatches\n";
print "The ratio of hits to misses is " . $myMatch . ":" . $myMissMatch . ".\n";

Конечно, вы, вероятно, захотите прочитать последовательность из чего-то еще на лету, а не жестко кодировать массив. Но ты получил идею. С приведенным выше кодом ваш вывод будет:

torgis-MacBook-Pro:platform-tools torgis$ ./dna.pl 
Comparing A <=> T
Comparing T <=> A
Comparing C <=> C MATCH
Comparing G <=> G MATCH
Comparing T <=> A
Comparing A <=> A MATCH
Comparing C <=> C MATCH
You have 4 matches.
You have 3 mismatches
The ratio of hits to misses is 4:3.
person AWT    schedule 14.08.2012

Так много способов сделать это. Вот один.

use strict;
use warnings;

my $seq1 = "ATCGTAC";
my $seq2 = "TACGAAC";

my $len = length $seq1;
my $matches = 0;

for my $i (0..$len-1) {
    $matches++ if substr($seq1, $i, 1) eq substr($seq2, $i, 1);
}

printf "Length: %d  Matches: %d  Ratio: %5.3f\n", $len, $matches, $matches/$len;

exit 0;
person Bill Ruppert    schedule 14.08.2012

Просто возьмите длину одной из строк (мы предполагаем, что длины строк равны, верно?), а затем выполните итерацию, используя substr.

my @strings = ( 'ATCGTAC', 'TACGAAC' );

my $matched;
foreach my $ix ( 0 .. length( $strings[0] ) - 1 ) {
  $matched++
    if   substr( $strings[0], $ix, 1 ) eq substr( $strings[1], $ix, 1 );
}

print "Matches: $matched\n";
print "Mismatches: ", length( $strings[0] ) - $matched, "\n";
person DavidO    schedule 14.08.2012

Я думаю, что substr - это путь, а не разбиение строк на массивы.

Это, вероятно, наиболее удобно, если представлено в виде подпрограммы:

use strict;
use warnings;

print ratio(qw/ ATCGTAC TACGAAC /);

sub ratio {

  my ($aa, $bb) = @_;
  my $total = length $aa;
  my $matches = 0;
  for (0 .. $total-1) {
    $matches++ if substr($aa, $_, 1) eq substr($bb, $_, 1);
  }

  $matches / ($total - $matches);
}

вывод

1.33333333333333
person Borodin    schedule 14.08.2012

Билл Руперт прав, что есть много способов сделать это. Вот еще:

use Modern::Perl;

say compDNAseq( 'ATCGTAC', 'TACGAAC' );

sub compDNAseq {
    my $total = my $i = 0;
    $total += substr( $_[1], $i++, 1 ) eq $1 while $_[0] =~ /(.)/g;
    sprintf '%.2f', $total / ( $i - $total );
}

Вывод:

1.33
person Kenosis    schedule 14.08.2012

Вот подход, который дает NULL, \0, для каждого совпадения в сравнении xor.

#!/usr/bin/perl
use strict;
use warnings;

my $d1='ATCGTAC'; 
my $d2='TACGAAC'; 

my $len = length $d1; # assumes $d1 and $d2 are the same length

my $matches = () = ($d1 ^ $d2) =~ /\0/g;

printf "ratio of %f", $matches / ($len - $matches);

Выход: соотношение 1,333333

person Chris Charley    schedule 14.08.2012