Buenas tardes, estoy trabajando con una matriz de datos que tiene la siguiente estructura:
Using text Syntax Highlighting
Muestra 1 Muestra 2 Muestra3
Gen 1 3.92191 4.03648 4.0114
Gen 2 11.93265 12.4678 11.67605
Gen 3 4.22257 3.99756 4.17728
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Los valores numéricos indican la expresión de cada uno de los genes en cada una de las diferentes muestras, por lo que yo necesito sacar la correlación (r) existente entre la expresión del Gen 1 con el Gen 2, Gen 1 con Gen 3, Gen 2 con Gen 3, por lo que he escrito el siguiente código:
Using perl Syntax Highlighting
#!/usr/bin/perl -w
#ejercicio1.pl
my $arch = $ARGV[0];
open( ARCH, $arch );
my @array = <ARCH>;
close ARCH;
foreach $i (@array) { #cálculo de los valores de X, media y desviación estándar
chomp($i);
@array2 = split( /\t+/, $i );
$sumatoria_x = 0;
for ( $j = 1; $j < @array2; $j++ ) {
$sumatoria_x += $array2[$j];
}
$num_elem = @array2;
$media_x = $sumatoria_x / ( $num_elem - 1 );
#print "$array2[0]\t$media_x\n";
$sumatoria_x = 0;
for ( $k = 1; $k < @array2; $k++ ) {
$sumatoria_x += ( $array2[$k] - $media_x )**2;
}
$des_stnd_x = sqrt( $sumatoria_x / ( $num_elem - 2 ) )
; #le resto dos por la presencia del identificador en la posc. 0 y 1 q indica la fórmula n-1.
#print "$array2[0]\t$media\t$des_stnd_x\n";
foreach $l (@array) { #cálculo de los valores de Y, media y desviación estándar
chomp($l);
@array3 = split( /\t+/, $l );
$sumatoria_y = 0;
for ( $m = 1; $m < @array3; $m++ ) {
$sumatoria_y += $array3[$m];
}
$num_elem = @array3;
$media_y = $sumatoria_y / ( $num_elem - 1 );
#print "$array2[0]\t$media_y\n";
$sumatoria_y = 0;
for ( $n = 1; $n < @array3; $n++ ) {
$sumatoria_y += ( $array3[$n] - $media_y )**2;
}
$des_stnd_y = sqrt( $sumatoria_y / ( $num_elem - 2 ) )
; #le resto dos por la presencia del identificador en la posc. 0 y 1 q indica la fórmula n-1.
#print "$array2[0]\t$media\t$des_stnd_y\n";
$suma_cov = 0;
for ( $o = 1; $o < @array2; $o++ ) { #utilizo una sola variable por que ambos arreglos son del mismo tamaño
$suma_cov += ( $array2[$o] - $media_x ) * ( $array3[$o] - $media_y );
}
$cov = $suma_cov / ( $num_elem - 1 );
$correlacion = $cov / ( $des_stnd_y * $des_stnd_x );
$co = sprintf( "%.2f", $correlacion );
print "$array2[0]\t$array3[0]\t$co\n";
}
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
Este código funciona bien, sin embargo calcula la correlación existente entre
Gen 1-Gen 1, Gen 1-Gen 2, Gen 1-Gen 3,
Gen 2-Gen 1, Gen 2-Gen 2, Gen 2-Gen 3, etc...
Pero como podemos notar el cálculo de la correlación existente entre
Gen 1-Gen 2, es lo mismo que el cálculo entre
Gen 2-Gen 1, es decir, me está repitiendo cálculos.
Es por eso que pido su ayuda para optimizar mi código y evitar estas situaciones.
Gracias...