IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Calcul de la loi normale standard par formule et par fonction


Sujet :

Access

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Calcul de la loi normale standard par formule et par fonction
    Bonjour à tous

    Je cherche une explication pour le problème suivant :

    J'ai essayé de calculer, de 2 façons différentes, la Loi Normale Standard d'une valeur par :

    · La formule de la Loi Normale Standard : avec variable z
    · La fonction donnée par EXCEL : Loi.Normale.Standard(z)

    Mais, malheureusement je n'ai pas trouvé le même résultat.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    vous avez probablement trouvé la solution à votre problème mais voici quand même des raisons possibles :
    La Loi.Normale.Standard(z) d'Excel donne l'aire sous la courbe de la loi Normale centrée réduite et non le risque alpha.
    Le risque alpha est égal à : p = 1 - la valeur retournée par Excel dans le cas d'un test unilatéral.

    Pour un test bilatéral multiplier p par 2.

    Ci-joint la plus petite fonction VBA que je connaisse qui calcule comme la fonction Excel, l'aire sous la courbe de la loi Normale centrée réduite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    Public Function airez(z As Double) As Single
       Dim f As Double, u As Double, s As Double, t As Double, s1 As Double
       u = z * z
       If u > 55.5 Then
          airez = IIf(z > 0, 1, 0)
       Else
          s = 0
          t = 1
          f = 3
          Do
             s1 = s
             s = s + t
             t = t * u / f
             f = f + 2
          Loop While s <> s1
          airez = z * s / ((8 * Atn(1) * Exp(u)) ^ 0.5) + 0.5
       End If
    End Function
    Amicalement,

    Philippe

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Java
    J'ai eu besoin d'utiliser ton algorithme dans un projet mais en Java.
    Pour ceux que ça intéresse, voilà l'équivalent donc en Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    	public static double N(double z) {
    	   double f;
    	   double u;
    	   double s;
    	   double t;
    	   double s1;
    	   double res;
     
    	   u = z * z;
    	   if (u > 55.5) {
    		   if (z > 0) {
    			   res = 1;
    		   }
    		   else {
    			   res = 0;
    		   }
    	   }
     
    	   else {
    	      s = 0;
    	      t = 1;
    	      f = 3;
    	      do {
    	         s1 = s;
    	         s = s + t;
    	         t = t * u / f;
    	         f = f + 2;
    	      }while (s != s1);
    	      res = z * s / Math.pow((8 * Math.atan(1) * Math.exp(u)) , 0.5) + 0.5;
    	   }
    	   return res;
    	}

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    pour calculer aussi la loi Normale et son inverse c'est ici.

    Amicalement,

    Philippe

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    je m'intéresse à la fonction de loi normale mais je n'ai pas vraiment compris à quoi correspondent vos variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double f;
    double u;
    double s;
    double t;
    double s1;
    double res;
    ???

    2 - deuxième point, je cherche a savoir comment je pourrai utiliser cette fonction pour générer un ensemble de donnée aléatoire suivant la loi normale ( je ne vois pas de Random dans votre fonction )


    merci pour ces info !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    comment je pourrai utiliser cette fonction pour générer un ensemble de donnée aléatoire suivant la loi normale
    Pour générer des nombres aléatoires distribué selon la loi normale centrée réduite il existe différents algos dont celui de Box-Muller.

    Exemple de code en VBA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    'Retourne un nombre aléatoire à distribution normale centrée réduite (moyenne = 0 et variance = 1)
    Public Function NormalRandom() As Double
       Static stbInitRandom As Boolean, stbNextRandom As Boolean, stdNormalRandom As Double
       If Not stbInitRandom Then  'Initialise le générateur une et une seule fois
          Randomize
          stbInitRandom = True
       End If
       If stbNextRandom Then      'Retourne le deuxième nombre aléatoire généré si non encore utilisé
          NormalRandom = stdNormalRandom
       Else                       'Génère sinon deux nombres aléatoires à distribution normale
          NormalRandom = GenereNormalRandom(stdNormalRandom)
       End If
       stbNextRandom = Not stbNextRandom   'Inverse True <-> False
    End Function
     
    'Fonction appelée par NormalRandom pour retourner deux nombres aléatoires à distribution normale
    'selon la méthode de Box-Muller - Forme polaire
    'Référence : http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
    Private Function GenereNormalRandom(ByRef pz As Double) As Double
       Dim u As Double, v As Double, s As Double
       Do
          u = 2 * Rnd - 1 'nombres aléatoires entre -1 et 1
          v = 2 * Rnd - 1
          s = u ^ 2 + v ^ 2
       Loop While s >= 1
       s = Sqr(-2 * Log(s) / s)
       pz = u * s
       GenereNormalRandom = v * s
    End Function
    Utilisation :
    Placer ce code dans un module standard et appeler la fonction NormalRandom() qui retourne un nombre aléatoire ayant une distribution normale.

    Une petite fonction qui affiche la distribution dans la fenêtre "exécution" de l'éditeur VBA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    'Visuel de la distribution normale des nombres aléatoires
    Public Function VerifNormalRandom()
       Const clNbCat As Long = 12, cdDiv As Double = 4
       Dim i As Long, alCounts(-clNbCat To clNbCat) As Long, lNR As Long, lMax As Long
       For i = 1 To 30000
          lNR = -Fix(-NormalRandom * cdDiv)
          If lNR >= -clNbCat And lNR <= clNbCat Then
             alCounts(lNR) = alCounts(lNR) + 1
             If alCounts(lNR) > lMax Then lMax = alCounts(lNR)
          End If
       Next i
       'Affiche la distribution
       Debug.Print "Distribution des nombres aléatoires" & vbCrLf & "-----------------------------------"
       For i = LBound(alCounts) To UBound(alCounts)
          Debug.Print IIf(Sgn(i) >= 0, " ", "") & Format(i / cdDiv, "0.0#"), String(CDbl(alCounts(i)) / lMax * 60 + 1, "*")
       Next i
    End Function
    Pour démarrer la fonction, mettre le curseur dans le corps de cette fonction puis appuyer sur la touche "F5" pour obtenir normalement ce visuel correspondant à 30 000 nombres générés :




    Sauf erreur...

    Cordialement,

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR XI] formule de calcul d'une loi normale : faisable ou pas avec CR XI ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/04/2014, 12h00
  2. Calcul sur la Loi Normale sous Access
    Par Trini dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/05/2010, 10h29
  3. Loi normale standard
    Par CyBeRoN dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 03/12/2009, 12h49
  4. Réponses: 0
    Dernier message: 05/11/2008, 17h57
  5. Loi normale standard inverse
    Par fafabzh6 dans le forum SAS STAT
    Réponses: 7
    Dernier message: 06/06/2008, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo