Voilà comment vous pouvez faire la même chose que vous faites avec R en Perl utilisant le module Math::SymbolicX::Statistics::Distributions de CPAN:
use strict; use warnings;
use Math::SymbolicX::Statistics::Distributions qw/normal_distribution/;
my $norm = normal_distribution(qw/mean sd/);
print $norm->value(mean => 4, sd => 10, x => 0), "\n";
# curry it with the parameter values
$norm->implement(mean => 4, sd => 10);
print $norm->value(x => 0),"\n"; # prints the same as above
La fonction normal_distribution() à partir de ce module est un générateur de fonctions. $ norm sera un objet Math::Symbolic (:: Operator) que vous pouvez modifier.Par exemple avec mettre en œuvre, qui, dans l'exemple ci-dessus, remplace les deux variables de paramètre par des constantes. Notez cependant, comme l'a souligné Dirk, que vous voulez probablement la fonction cumulative de la distribution normale. Ou plus généralement l'intégrale dans une certaine gamme.
Malheureusement, Math :: Symbolic ne peut pas effectuer d'intégration symboliquement. Par conséquent, vous devrez recourir à l'intégration numérique avec les goûts de Math::Integral::Romberg. (Vous pouvez également rechercher dans le CPAN une implémentation de la fonction d'erreur.) Cela peut être lent, mais c'est toujours facile à faire. Ajoutez ceci à l'extrait ci-dessus:
use Math::Integral::Romberg 'integral';
my ($int_sub) = $norm->to_sub(); # compile to a faster Perl sub
print $int_sub->(0),"\n"; # same number as above
print "p=" . integral($int_sub, -100., 0) . "\n";
# -100 is an arbitrary, small number
Cela devrait vous donner la ~ ,344578258389676 de la réponse de Dirk.
la probabilité d'un point quelconque dans une distribution normale est bien sûr égal à zéro. qu'essayez-vous de calculer? –
@EL: Je ne veux pas dire "any/random" mais un point "donné". – neversaint
normal est continu, donc la probabilité de n'importe quel point (donné ou non) est zéro. Peut-être que vous voulez la densité? (c'est ce que "d" signifie en dnorm.) –