Section : Statistiques en Scilab
Précédent : Statistiques en Scilab
Suivant : Générateurs pseudo-aléatoires.


Lois discrètes

Nous verrons à la section suivante que le générateur grand permet la simulation des lois discrètes usuelles. Voici une fonction de génération d'une loi discrète quelconque, par la méthode d'inversion.
function e = ech_dist(m,n,x,d) 
//      ech_dist(m,n,x,d) retourne une matrice de taille mXn dont les
//      coefficients sont des realisations independantes de la loi 
//      sur x specifiee par le vecteur d, normalise a 1.

d = d/sum(d);                    // normaliser par la somme
loi=cumsum(d);                   // calculer la fonction de repartition

for i=1:m,
     for j=1:n,
          k=1;
          r=rand(1,1);           // appel de random
          while r>loi(k),        // simulation par inversion
               k=k+1,
          end;
          e(i,j)=x(k);
     end;
end
La fonction suivante nous servira à calculer les fréquences des différentes valeurs apparaissant dans un échantillon.
function [f,v] = freq_emp(ech)
//      freq_emp(ech) Calcule les frequences empiriques des valeurs 
//      differentes de ech. Retourne un vecteur des valeurs differentes 
//      de ech et un vecteur des frequences correspondantes.

taille=size(ech,"*");              // taille de l'echantillon
   
v=[ech(1)];                        // valeurs differentes
for k = 2:taille,                  // parcourir l'echantillon
     if ech(k)~=v then,            // la valeur v(k) est nouvelle
          v = [v,ech(k)];          // la rajouter
     end;
end;
v = gsort(v,"c","i");              // trier les valeurs trouvees
nbval=size(v,"*");                 // nombre de valeurs differentes

effectifs = [];                    // effectifs des valeurs
for k = 1:nbval,                   // parcourir les valeurs
     e = size(find(ech==v(k)),"*");// calculer l'effectif de v(k)
     effectifs = [effectifs,e];    // le rajouter
end;

f=effectifs/sum(effectifs);        // calculer les frequences
Nous supposons que les deux fonctions ech_dist et freq_emp ont été placées dans le fichier lois_discretes.sci. Voici deux exemples d'utilisation.
getf("lois_discretes.sci")
x = ech_dist(1,100,["a","b","c"],[0.5,0.3,0.2])
x = ech_dist(1,1000,["a","b","c"],[0.5,0.3,0.2]);
[f,v] = freq_emp(x)
plot2d3("gnn",[1:3]',f',5,"111","frequences",[0,0,4,1])
x = ech_dist(1,1000,[1:10],ones(1,10));
[f,v] = freq_emp(x)
xbasc()
plot2d3("gnn",v',f',5,"111","frequences",[0,0,11,0.5])


© B. Ycart (2001)