From 7c621b48031a843453cdada987145d041cdb81ab Mon Sep 17 00:00:00 2001 From: Vincent Danjean <Vincent.Danjean@ens-lyon.org> Date: Thu, 23 Mar 2006 17:31:57 +0000 Subject: [PATCH] Youhou! Ca tourne en quanto anova 1 facteur git-svn-id: svn+ssh://imag/users/huron/danjean/svnroot/claire/altree/trunk@150 cf695345-040a-0410-a956-b889e835fe2e --- altree | 140 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 109 insertions(+), 31 deletions(-) diff --git a/altree b/altree index 3a467a2..fa0f092 100755 --- a/altree +++ b/altree @@ -449,11 +449,11 @@ sub FillQuanti my $moy=Moyenne($present_node->{"quanti"}); $present_node->{"moyenne"}=$moy; - print STDERR $present_node->{"id"}, " " ; - for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) { - print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") "; - } - print STDERR "\n"; +#DEBUG print STDERR $present_node->{"id"}, " " ; +#DEBUG for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) { +#DEBUG print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") "; +#DEBUG } +#DEBUG print STDERR "\n"; } else { my($child); for $child ($present_node->GetChildrenList()) { @@ -463,11 +463,11 @@ sub FillQuanti my $moy=Moyenne($present_node->{"quanti"}); $present_node->{"moyenne"}=$moy; - print STDERR $present_node->{"id"}, " " ; - for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) { - print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") "; - } - print STDERR "\n"; +#DEBUG print STDERR $present_node->{"id"}, " " ; +#DEBUG for (my $i=0; $i< scalar (@{$present_node->{"quanti"}}); $i++) { +#DEBUG print STDERR $present_node->{"quanti"}->[$i]->[0], " (" ,$present_node->{"quanti"}->[$i]->[1], ") "; +#DEBUG } +#DEBUG print STDERR "\n"; } } @@ -1094,11 +1094,11 @@ sub Correspond2ResamplingQuanti push (@valeurs_tot, $valeurs->[0]); } } -#DEBUG print STDERR" TOUTES VAL: "; -#DEBUG foreach my $val (@valeurs_tot) { +#DEBUG print STDERR" TOUTES VAL:\n"; +#DEBUG foreach my $val (@valeurs_tot) { #DEBUG print STDERR $val, " " ; #DEBUG } -#DEBUG print STDERR"\n"; +#DEBUG print STDERR"\n"; #DEBUG print STDERR " NB_VAL_PER_HAPLO "; #DEBUG foreach $haploID (keys %{$nbval_per_haplo}) { #DEBUG print STDERR $haploID, " " ,$nbval_per_haplo->{$haploID}, "\n"; @@ -1117,25 +1117,106 @@ sub ResamplingQuanti for (my $i=0; $i<$nbval_per_haplo->{$haploID}; $i++) { my $nb= scalar (@{$valeurs_tot}); my $alea = int(rand($nb)); # Je récupère bien un nb entre 0 et le dernier élément du tab - print STDERR $alea , " "; + #DEBUG print STDERR "ALEA$haploID ", $alea , " "; $new_correspondance->{$haploID}->[$i]->[0]=$valeurs_tot->[$alea]; $new_correspondance->{$haploID}->[$i]->[1]=$num_haplo; - delete($valeurs_tot->[$alea]); + splice(@{$valeurs_tot}, $alea, 1); } } - print "\n TEST\n"; +#DEBUG print "\n TEST\n"; - foreach my $haploID (keys(%{$new_correspondance})) { - print STDERR $haploID , " " ; - for (my $i=0; $i<scalar(@{$new_correspondance->{$haploID}}); $i++) { - print STDERR $new_correspondance->{$haploID}->[$i]->[0], " "; +#DEBUG foreach my $haploID (keys(%{$new_correspondance})) { +#DEBUG print STDERR $haploID , " " ; +#DEBUG for (my $i=0; $i<scalar(@{$new_correspondance->{$haploID}}); $i++) { +#DEBUG print STDERR $new_correspondance->{$haploID}->[$i]->[0], " "; +#DEBUG } +#DEBUG print STDERR "\n"; +#DEBUG } + return ($new_correspondance); + +} +sub StockeQuanti + +{ + my($ligne_chi2)=shift; + my $racine=shift; + my $test_res; + foreach $test_res (@{$racine->{"res_test"}}) { + # Si on n'a qu'une seule branche, la p-value n'est pas définie + if ($test_res->{"nb_facteurs"} > 1) { + push @{$ligne_chi2}, $test_res->{"F"}; } - print STDERR "\n"; } - return ($new_correspondance); + # Fill a 2*n table: each line containig chi2 and each columns + # corresponding to one repetition + #push (@{$table_of_line}, \@ligne_chi2); +} + +sub AssociationQuanti +{ + my($racine)=shift; + my($correspondance)=shift; + my($prolonge)=shift; + my($sign_util)=shift; + my($valeur_tot, $nbval_per_haplo, $new_correspondance); + ($valeur_tot, $nbval_per_haplo)=Correspond2ResamplingQuanti($correspondance); + ($new_correspondance)=ResamplingQuanti($valeur_tot, $nbval_per_haplo); + + # DEBUG my($haploID); + #foreach $haploID (keys %{$new_correspondance}) { + # print "Haplo: $haploID mal= ",$new_correspondance->{$haploID}->{"case"}, " tem=", $new_correspondance->{$haploID}->{"control"},"\n"; + #} + #print "\n"; + + FillQuanti($racine,$new_correspondance); + ParcoursQuanti($racine->{"children"}, $prolonge, + SplitMode::NOSPLIT, $racine, $sign_util); +} + +sub RepeatAssociationQuanti +{ + my($tree)=shift; + my($correspondance)=shift; + my($prolonge)=shift; + my($nb_permutation)= shift; + my($sign_util)=shift; + + my($racine)=$tree->GetRoot(); + + my($ligne_F)=[]; + print "\n Number of permutation: $nb_permutation\n"; + + my($value_per_line, $test_res); + foreach $test_res (@{$racine->{"res_test"}}) { + # Si on n'a qu'une seule branche, la p-value n'est pas définie + if ($test_res->{"nb_facteurs"} > 1) { + $value_per_line++; + } + } + + # !!! Est_ce que ça serait bien de passer value_per_mine en parametre de stocke_chi2 et de vérifier qu'on a bien le bon nb de valeur par ligne? !!! + + + StockeQuanti($ligne_F, $racine); # F values corresponding to the real data are put to @{$ligne_F} + my($i, $j); + for ($i=0; $i<$nb_permutation; $i++) { + CleanQuanti($tree); + CleanChi2($tree); #marche aussi pour le F + AssociationQuanti($racine, $correspondance, $prolonge, $sign_util); + StockeQuanti($ligne_F, $racine); + } + +#DEBUG for (my($i)=0; $i<scalar @{$ligne_F}; $i++) { +#DEBUG print STDERR $ligne_F->[$i], " "; +#DEBUG print "TOTO\n"; +#DEBUG } + + return($value_per_line, $ligne_F); } + + ########################################################## ################# LOCALISATION ########################### ########################################################## @@ -1815,23 +1896,20 @@ sub main AffichageArbre($racine, \&InfosQuantiNoperm); } } elsif ($permutation>0) { + my($value_per_line, $ligne_test); if ($dataqual == DataQual::QUALI) { AffichageArbre($racine, \&AssociationInfos); - my($value_per_line, $ligne_chi2); - ($value_per_line, $ligne_chi2)=RepeatAssociation + ($value_per_line, $ligne_test)=RepeatAssociation ($tree, $correspondance, $prolonge,$permutation, $sign_util); } else { AffichageArbre($racine, \&InfosQuanti); - my ($valeurs_tot, $nbval_per_haplo); - ($valeurs_tot, $nbval_per_haplo)=Correspond2ResamplingQuanti ($correspondance); - ResamplingQuanti($valeurs_tot, $nbval_per_haplo); + ($value_per_line, $ligne_test)=RepeatAssociationQuanti + ($tree, $correspondance, $prolonge,$permutation, $sign_util); } - my($value_per_line, $ligne_chi2); # TODO A modifier - my($corrected_values); $corrected_values=ALTree::CUtils::double_permutation - ($permutation+1, $value_per_line, $ligne_chi2); - + ($permutation+1, $value_per_line, $ligne_test); +#DEBUG print STDERR "perm= $permutation, val= $value_per_line, ligne= $ligne_test, corr=$corrected_values\n"; print "\n"; print "p_val for each level:\n"; my($i); -- GitLab