2016-04-21 10 views
1

Ich habe Assoziationskartierung abgeleitete P-Werte für SNPs, die über Tausende von Gerüsten in einem nicht-Modellorganismus verstreut sind. Ich möchte den P-Wert jedes SNP auf einer Manhattan-artigen Handlung darstellen. Ich interessiere mich nicht für die Reihenfolge der Gerüste, aber ich möchte die relative Reihenfolge und den Abstand der SNP-Positionen auf ihren jeweiligen Gerüsten beibehalten. Ich möchte nur grob darstellen, wie viele genomische Regionen signifikant mit einem Phänotyp assoziiert sind. Zum Beispiel:Wie kann ich p-Werte für SNPs darstellen, die über Tausende von Gerüsten auf einer einzigen kontinuierlichen Achse verteilt sind?

Meine Daten sieht etwa so aus:

SCAFFOLD POSITION 
1   8967  
1   8986  
1   9002  
1   9025  
1   9064  
2   60995 
2   61091 
2   61642 
2   61898 
2   61921 
2   62034 
2   62133 
2   62202 
2   62219 
2   62220 
3   731894 
3   731907 
3   731962 
3   731999 
3   732000 
3   732050 
3   732076 
3   732097 

Ich möchte ein Perl-Code schreiben, eine dritte Spalte zu erstellen, die den Abstand zwischen SNPs auf dem gleichen Gerüst behält, während willkürlich Gerüste Abstand von eine Nummer (100 im folgenden Beispiel):

SCAFFOLD POSITION CONTINUOUS_AXIS 
1   8967  8967 
1   8986  8986 
1   9002  9002 
1   9025  9025 
1   9064  9064 
2   60995  9164 
2   61091  9260 
2   61642  9811 
2   61898  10067 
2   61921  10090 
2   62034  10203 
2   62133  10302 
2   62202  10371 
2   62219  10388 
2   62220  10389 
3   731894  10489 
3   731907  10502 
3   731962  10557 
3   731999  10594 
3   732000  10595 
3   732050  10645 
3   732076  10671 
3   732097  10692 

Vielen Dank an alle, die eine gute Strategie haben könnten.

Antwort

0

So etwas wie die folgenden funktionieren sollte:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use constant SCAFFOLD_SPACING => 100; 

my ($last_scaffold, $last_position, $continuous_axis, $found_data); 

my $input = './input'; 
open my $fh, "<$input" 
    or die "Unable to open '$input' for reading : $!"; 

print join("\t", qw(SCAFFOLD POSITION CONTINUOUS_AXIS)) . "\n"; # Output Header 
while (<$fh>) { 
    next unless m|\d|; # Skip non-data lines 

    my ($scaffold, $position) = split /\s+/; # Split on whitespace 

    unless ($found_data++) { 
     # Initialize 
     $last_scaffold = $scaffold; # Set to first data value 
     $last_position = $position; # Set to first data value 
     $continuous_axis = $position; # Start continuous axis at first position 
    } 

    my $position_diff = $position - $last_position; 
    my $scaffold_diff = $scaffold - $last_scaffold; 

    if ($scaffold_diff == 0) { 
     $continuous_axis += $position_diff; 
    } else { 
     $continuous_axis += SCAFFOLD_SPACING; 
    } 
    print join("\t", $scaffold, $position, $continuous_axis) . "\n"; 

    # Update 
    $last_scaffold = $scaffold; 
    $last_position = $position; 
} 
+0

Dies tat genau das, was ich hatte gehofft. Vielen Dank! –