Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
calcul de probabilites pour la loi normale bivariee
4 participants
Page 1 sur 1
calcul de probabilites pour la loi normale bivariee
Quelqu'un peut-il m'indiquer comment calculer la probabilite suivante
P(a <= X <= b, c <= Y <=d) sachant que X et Y suivent la loi normale bivariee avec m et sigma.
m etant le vecteur des moyennes et sigma la matrice des variances-covariances. m et sigma sont connus.
Merci.
P(a <= X <= b, c <= Y <=d) sachant que X et Y suivent la loi normale bivariee avec m et sigma.
m etant le vecteur des moyennes et sigma la matrice des variances-covariances. m et sigma sont connus.
Merci.
vblover- Nombre de messages : 6
Date d'inscription : 15/04/2011
Re: calcul de probabilites pour la loi normale bivariee
Mathématiquement c'est l'intégrale double de la densité de cette loi normale sur le rectangle [a,b]x[c,d].
Si c'est pour l'évaluer numériquement, tu peux utiliser le logiciel R.
Si c'est pour l'évaluer numériquement, tu peux utiliser le logiciel R.
popotam- Nombre de messages : 371
Date d'inscription : 27/09/2006
Re: calcul de probabilites pour la loi normale bivariee
Merci pour le coup de main. Votre reponse n'est pas assez precise car elle ne prend pas en compte le coefficient de correlation. En tout cas ce que je cherchais c'etait plutot un algorithme pour le programmer et l'integrer dans un programme en vb. C'est chose faite, j'ai trouve une fonction en vba que j'ai due modifier. Merci quand meme
vblover- Nombre de messages : 6
Date d'inscription : 15/04/2011
Re: calcul de probabilites pour la loi normale bivariee
Bonjour,
Cordialement,
A.D.
Ca serait cool d'indiquer quelle est cette fonction et éventuellement le code que vous avez utilisé, peut-être que cela pourrait servir à d'autres qui saitvblover a écrit:C'est chose faite, j'ai trouve une fonction en vba que j'ai due modifier.
Cordialement,
A.D.
Re: calcul de probabilites pour la loi normale bivariee
Pas de probleme. Vous aurez tout ce soir. Salut.
vblover- Nombre de messages : 6
Date d'inscription : 15/04/2011
Re: calcul de probabilites pour la loi normale bivariee
Chose promise, chose due.
La routine main est de moi. Elle fait appel a la fonction bivar. Cette derniere est une transcription en Basic de l'algorithme de Dresner. Cette fonction fait appel a la fonction cumnor qui calcule la probabilite cumulative d'une variable normale d'esperance 0 et de variance 1 (centree et reduite)
' Ici commence le programme VB6
' Chaque ligne qui commence par ' est un commentaire et donc pas prise en compte par vb
Option Explicit
' Programme principal qui appelle la fonction bivar
Sub main()
Dim P11 As Double, P12 As Double, P21 As Double, P22 As Double
Dim X1 As Double, X2 As Double, Y1 As Double, Y2 As Double
Dim prob As Double, Coeff_Corr As Double
'exemple de calcul de la prob (X1 <= X <= X2 et Y1 <= Y <= Y2)
' les valeurs de X1, X2, Y1 et Y2 suivent ci-dessous
X1 = 0.5
X2 = 2#
Y1 = 1
Y2 = 3
Coeff_Corr = 0.5 ' Coefficient de correlation entre X et Y
' bien sur -1 <= coeff_corr <= 1
' Si le coeff = 0 alors X et Y sont Independants
' pour le calcul de la prob (X1 <= X <= X2 et Y1 <= Y <= Y2)
' je calcule P11=Prob(X <=X1 et y <= Y1) et P12= Prob(X <=X1 et y <= Y2)
' P21=Prob(X <=X2 et y <= Y1) et P22=Prob(X <=X2 et y <= Y2)
' Car la methode de Dresner calcule une probabilite du type prob=Prob(X <=x et y <= y) alors nous avons besoin
' de la probabilite Prob(X! <=X <=X2 etY1<=Y <= Y2). Faites un petit dessin vous comprendrez vite pourquoi
' Prob(X! <=X <=X2 etY1<=Y <= Y2)=P22 - P12 - P21 + P11
P11 = BIVAR(X1, Y1, Coeff_Corr)
P12 = BIVAR(X1, Y2, Coeff_Corr)
P21 = BIVAR(X2, Y1, Coeff_Corr)
P22 = BIVAR(X2, Y2, Coeff_Corr)
prob = P22 - P12 - P21 + P11
Debug.Print prob
End Sub
Function BIVAR(X1 As Double, X2 As Double, rho As Double)
Dim sgn1 As Double, sgn2 As Double, delta As Double
Dim rho1 As Double, rho2 As Double, q1 As Double, q2 As Double
9020 If X1 * X2 * rho > 0 Then GoTo 9100
9030 If X1 <= 0 And X2 <= 0 And rho <= 0 Then BIVAR = altbivar(X1, X2, rho): GoTo 9500
9040 If X1 <= 0 And X2 >= 0 And rho >= 0 Then BIVAR = cumnorm(X1) - altbivar(X1, -X2, -rho): GoTo 9500
9050 If X1 >= 0 And X2 <= 0 And rho >= 0 Then BIVAR = cumnorm(X2) - altbivar(-X1, X2, -rho): GoTo 9500
9060 If X1 >= 0 And X2 >= 0 And rho <= 0 Then BIVAR = cumnorm(X1) + cumnorm(X2) - 1 + altbivar(-X1, -X2, rho): GoTo 9500
9100 If X1 < 0 Then sgn1 = -1 Else sgn1 = 1
9110 If X2 < 0 Then sgn2 = -1 Else sgn2 = 1
9120 rho1 = (rho * X1 - X2) * sgn1 / (Sqr(X1 * X1 - 2 * rho * X1 * X2 + X2 * X2))
9130 rho2 = (rho * X2 - X1) * sgn2 / (Sqr(X1 * X1 - 2 * rho * X1 * X2 + X2 * X2))
9140 delta = (1 - sgn1 * sgn2) / 4
9150 If X1 > 0 And rho1 >= 0 Then q1 = 0.5 - altbivar(-X1, 0, -rho1): GoTo 9300
9160 If X1 > 0 And rho1 < 0 Then q1 = cumnorm(X1) - 0.5 + altbivar(-X1, 0, rho1): GoTo 9300
9170 If X1 < 0 And rho1 >= 0 Then q1 = cumnorm(X1) - altbivar(X1, 0, -rho1): GoTo 9300
9180 q1 = altbivar(X1, 0, rho1)
9300 If X2 > 0 And rho2 >= 0 Then q2 = 0.5 - altbivar(-X2, 0, -rho2): GoTo 9400
9310 If X2 > 0 And rho2 < 0 Then q2 = cumnorm(X2) - 0.5 + altbivar(-X2, 0, rho2): GoTo 9400
9320 If X2 < 0 And rho2 >= 0 Then q2 = cumnorm(X2) - altbivar(X2, 0, -rho2): GoTo 9400
9330 q2 = altbivar(X2, 0, rho2)
9400 BIVAR = q1 + q2 - delta
9500 End Function
Function altbivar(X1 As Double, X2 As Double, rho As Double)
Dim a(4) As Double, b(4) As Double, aa As Double, bb As Double
Dim cum As Double, I As Integer, J As Integer
Dim F As Double
If rho > 0.999999 Then rho = 0.999999
If rho < -0.999999 Then rho = -0.999999
9600 a(1) = 0.325303: a(2) = 0.4211071: a(3) = 0.1334425: a(4) = 0.006374323
9610 b(1) = 0.1337764: b(2) = 0.6243247: b(3) = 1.3425378: b(4) = 2.2626645
9620 aa = X1 / (Sqr(2 * (1 - rho * rho))): bb = X2 / (Sqr(2 * (1 - rho * rho)))
9630 cum = 0
9640 For I = 1 To 4
9650 For J = 1 To 4
9660 F = Exp(aa * (2 * b(I) - aa) + bb * (2 * b(J) - bb) + 2 * rho * (b(I) - aa) * (b(J) - bb))
9670 cum = cum + a(I) * a(J) * F
9680 Next J
9690 Next I
9700 altbivar = cum * Sqr(1 - rho * rho) / 3.1415927
End Function
Public Function cumnorm(x As Double) As Double
Dim q As Double, primex As Double, y As Double
Dim alpha As Double, a1 As Double, a2 As Double
Dim a3 As Double, a4 As Double, a5 As Double, dum As Double
' This calculates the cumulative normal function.
alpha = 0.2316419
a1 = 0.31938153
a2 = -0.356563782
a3 = 1.781477937
a4 = -1.821255978
a5 = 1.330274429
q = 1 / (1 + alpha * Abs(x))
primex = 0.3989423 * Exp(-x * x * 0.5)
dum = (a3 + q * (a4 + a5 * q))
primex = primex * (q * (a1 + q * (a2 + q * dum)))
If x < 0 Then
y = primex
Else
y = 1 - primex
End If
cumnorm = y
End Function
La routine main est de moi. Elle fait appel a la fonction bivar. Cette derniere est une transcription en Basic de l'algorithme de Dresner. Cette fonction fait appel a la fonction cumnor qui calcule la probabilite cumulative d'une variable normale d'esperance 0 et de variance 1 (centree et reduite)
' Ici commence le programme VB6
' Chaque ligne qui commence par ' est un commentaire et donc pas prise en compte par vb
Option Explicit
' Programme principal qui appelle la fonction bivar
Sub main()
Dim P11 As Double, P12 As Double, P21 As Double, P22 As Double
Dim X1 As Double, X2 As Double, Y1 As Double, Y2 As Double
Dim prob As Double, Coeff_Corr As Double
'exemple de calcul de la prob (X1 <= X <= X2 et Y1 <= Y <= Y2)
' les valeurs de X1, X2, Y1 et Y2 suivent ci-dessous
X1 = 0.5
X2 = 2#
Y1 = 1
Y2 = 3
Coeff_Corr = 0.5 ' Coefficient de correlation entre X et Y
' bien sur -1 <= coeff_corr <= 1
' Si le coeff = 0 alors X et Y sont Independants
' pour le calcul de la prob (X1 <= X <= X2 et Y1 <= Y <= Y2)
' je calcule P11=Prob(X <=X1 et y <= Y1) et P12= Prob(X <=X1 et y <= Y2)
' P21=Prob(X <=X2 et y <= Y1) et P22=Prob(X <=X2 et y <= Y2)
' Car la methode de Dresner calcule une probabilite du type prob=Prob(X <=x et y <= y) alors nous avons besoin
' de la probabilite Prob(X! <=X <=X2 etY1<=Y <= Y2). Faites un petit dessin vous comprendrez vite pourquoi
' Prob(X! <=X <=X2 etY1<=Y <= Y2)=P22 - P12 - P21 + P11
P11 = BIVAR(X1, Y1, Coeff_Corr)
P12 = BIVAR(X1, Y2, Coeff_Corr)
P21 = BIVAR(X2, Y1, Coeff_Corr)
P22 = BIVAR(X2, Y2, Coeff_Corr)
prob = P22 - P12 - P21 + P11
Debug.Print prob
End Sub
Function BIVAR(X1 As Double, X2 As Double, rho As Double)
Dim sgn1 As Double, sgn2 As Double, delta As Double
Dim rho1 As Double, rho2 As Double, q1 As Double, q2 As Double
9020 If X1 * X2 * rho > 0 Then GoTo 9100
9030 If X1 <= 0 And X2 <= 0 And rho <= 0 Then BIVAR = altbivar(X1, X2, rho): GoTo 9500
9040 If X1 <= 0 And X2 >= 0 And rho >= 0 Then BIVAR = cumnorm(X1) - altbivar(X1, -X2, -rho): GoTo 9500
9050 If X1 >= 0 And X2 <= 0 And rho >= 0 Then BIVAR = cumnorm(X2) - altbivar(-X1, X2, -rho): GoTo 9500
9060 If X1 >= 0 And X2 >= 0 And rho <= 0 Then BIVAR = cumnorm(X1) + cumnorm(X2) - 1 + altbivar(-X1, -X2, rho): GoTo 9500
9100 If X1 < 0 Then sgn1 = -1 Else sgn1 = 1
9110 If X2 < 0 Then sgn2 = -1 Else sgn2 = 1
9120 rho1 = (rho * X1 - X2) * sgn1 / (Sqr(X1 * X1 - 2 * rho * X1 * X2 + X2 * X2))
9130 rho2 = (rho * X2 - X1) * sgn2 / (Sqr(X1 * X1 - 2 * rho * X1 * X2 + X2 * X2))
9140 delta = (1 - sgn1 * sgn2) / 4
9150 If X1 > 0 And rho1 >= 0 Then q1 = 0.5 - altbivar(-X1, 0, -rho1): GoTo 9300
9160 If X1 > 0 And rho1 < 0 Then q1 = cumnorm(X1) - 0.5 + altbivar(-X1, 0, rho1): GoTo 9300
9170 If X1 < 0 And rho1 >= 0 Then q1 = cumnorm(X1) - altbivar(X1, 0, -rho1): GoTo 9300
9180 q1 = altbivar(X1, 0, rho1)
9300 If X2 > 0 And rho2 >= 0 Then q2 = 0.5 - altbivar(-X2, 0, -rho2): GoTo 9400
9310 If X2 > 0 And rho2 < 0 Then q2 = cumnorm(X2) - 0.5 + altbivar(-X2, 0, rho2): GoTo 9400
9320 If X2 < 0 And rho2 >= 0 Then q2 = cumnorm(X2) - altbivar(X2, 0, -rho2): GoTo 9400
9330 q2 = altbivar(X2, 0, rho2)
9400 BIVAR = q1 + q2 - delta
9500 End Function
Function altbivar(X1 As Double, X2 As Double, rho As Double)
Dim a(4) As Double, b(4) As Double, aa As Double, bb As Double
Dim cum As Double, I As Integer, J As Integer
Dim F As Double
If rho > 0.999999 Then rho = 0.999999
If rho < -0.999999 Then rho = -0.999999
9600 a(1) = 0.325303: a(2) = 0.4211071: a(3) = 0.1334425: a(4) = 0.006374323
9610 b(1) = 0.1337764: b(2) = 0.6243247: b(3) = 1.3425378: b(4) = 2.2626645
9620 aa = X1 / (Sqr(2 * (1 - rho * rho))): bb = X2 / (Sqr(2 * (1 - rho * rho)))
9630 cum = 0
9640 For I = 1 To 4
9650 For J = 1 To 4
9660 F = Exp(aa * (2 * b(I) - aa) + bb * (2 * b(J) - bb) + 2 * rho * (b(I) - aa) * (b(J) - bb))
9670 cum = cum + a(I) * a(J) * F
9680 Next J
9690 Next I
9700 altbivar = cum * Sqr(1 - rho * rho) / 3.1415927
End Function
Public Function cumnorm(x As Double) As Double
Dim q As Double, primex As Double, y As Double
Dim alpha As Double, a1 As Double, a2 As Double
Dim a3 As Double, a4 As Double, a5 As Double, dum As Double
' This calculates the cumulative normal function.
alpha = 0.2316419
a1 = 0.31938153
a2 = -0.356563782
a3 = 1.781477937
a4 = -1.821255978
a5 = 1.330274429
q = 1 / (1 + alpha * Abs(x))
primex = 0.3989423 * Exp(-x * x * 0.5)
dum = (a3 + q * (a4 + a5 * q))
primex = primex * (q * (a1 + q * (a2 + q * dum)))
If x < 0 Then
y = primex
Else
y = 1 - primex
End If
cumnorm = y
End Function
Dernière édition par vblover le Dim 24 Avr 2011 - 13:59, édité 1 fois
vblover- Nombre de messages : 6
Date d'inscription : 15/04/2011
Re: calcul de probabilites pour la loi normale bivariee
Merci vblover, c'est très gentil à vous
[Si vous pouviez simplement éditer votre message afin d'y ajouter le code entre les balises "codes", cela serait parfait ]
Bonne soirée.
Cordialement,
A.D.
[Si vous pouviez simplement éditer votre message afin d'y ajouter le code entre les balises "codes", cela serait parfait ]
Bonne soirée.
Cordialement,
A.D.
Re: calcul de probabilites pour la loi normale bivariee
Pardon, je ne crois pas avoir saisi le sens de votre question. Je peux vous expliquer tout point qui vous intéresse mais pour l'instant je n'ai pas compris votre question. Au juste que voulez vous? Et qu'entendez vous par balises. Si vous consentez a afficher votre e mail, je pourrais vous envoyer une explication plus détaillée.
vblover- Nombre de messages : 6
Date d'inscription : 15/04/2011
Re: calcul de probabilites pour la loi normale bivariee
Vblover,
en cliquant sur le nom de l'auteur d'un message, on peut généralement lui envoyer un message privé. Pas besoin d'afficher son adresse.
Cordialement.
en cliquant sur le nom de l'auteur d'un message, on peut généralement lui envoyer un message privé. Pas besoin d'afficher son adresse.
Cordialement.
gg- Nombre de messages : 2174
Date d'inscription : 10/01/2011
Sujets similaires
» Question à propos des probabilités soumies à la loi Normale
» Calcul du quantile de la loi normale centrée réduite
» Transformation de données pour avoir une loi normale
» Loi normale : moyenne +/- x écart type pour 80 % population
» Probabilité d'une somme de plusieurs tirage pour loi normale
» Calcul du quantile de la loi normale centrée réduite
» Transformation de données pour avoir une loi normale
» Loi normale : moyenne +/- x écart type pour 80 % population
» Probabilité d'une somme de plusieurs tirage pour loi normale
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum