Sie sind auf Seite 1von 9

Inférence Statistique Assistée par Ordinateur - 2A

2006/2007

TP 2 : Monte Carlo par Chaines de Markov

1 Application 1 : simulation (non uniforme)


1.1 Simulation d’une loi uniforme
On souhaite simuler une distribution exponentielle à l’aide de la méthode de la fonction de
répartition inverse. On utilisera la procédure runif() (appel de fonction random, pour tirer des
lois U[0, 1] indépendantes).
On rappelle que X ∼ E(λ) si et seulement si sa fonction de répartition s’écrit FX (x) =
1 − e−λx .
distributionExponentielle = function(l,n){ -log(1-runif(n))/l }
On peut vérifier que la loi simulée est effectivement exponentielle.
Vect = distributionExponentielle(1,1000)
hist(Vect, plot=TRUE)

Simulations de la loi exponentielle, n=1000 Simulations de la loi exponentielle, n=1000


0.8

1.0
0.8
0.6

0.6
0.4

0.4
0.2

0.2
0.0

0.0

0 2 4 6 8 0 2 4 6 8

Fig. 1 – Simulations de la loi exponentielle.

1.2 Simulation d’une loi gaussienne


On souhaite désormais simuler un vecteur aléatoire Ãgaussien!Y = (Y1 , Y2 ) à valeurs dans R2
3 1
d’espérance (1, 3) et de matrice de variance-covariance .
1 1

1
On commence par simuler deux variables aléatoires indépendantes suivant une loi normale
centrée réduite à l’aide de l’algorithme de Box-Müller. On transforme ensuite ces variables pour
obtenir une réalisation de Y .
p
L’algorithme de Box-Müller s’écrit de la façon suivante, en notant que X = (−2∗
log(U )) cos(2πV ) suit une loi N (0, 1) si U, V ∼ U[0, 1] indépendantes.
Pour générer une loi normale non-centrée réduite, on utilise le fait que si X ∼ N (0, 1), alors
Y = µ + σX ∼ N (µ, σ 2 ).
L’algorithme pour générer une variable N (µ, σ 2 ) est alors le suivant
BoxMuller <- function(moy,sigma,n){
(sigma*sqrt(-2*log(runif(n)))*cos(2*pi*runif(n))+moy) }

Simulation de la loi normale, n=1000 Simulation de la loi normale, n=1000


0.4

0.4
0.3

0.3
0.2

0.2
0.1

0.1
0.0

0.0

−2 0 2 4 −3 −2 −1 0 1 2 3

Fig. 2 – Simulations de la loi normale N (0, 1).

En dimension supérieure, on utilise le fait que si X ∼ N (0, I), alors Y = µ + AY ∼


N (0, AAt ).
Etant donnée un matrice de variance-covariance Σ, on peut obtenir une matrice racine carrée
A en utilisant l’algorithme de Cholesky.
A = t(chol(sigma))
En dimension 2, on peut noter que la matrice de Cholesky s’obtient simplement.
à !En particu-
1 r
lier, si X = (X1 , X2 ) ∼ N (0, I), alors Y = (Y1 , Y2 ) ∼ N (0, Σr ), où Σr = , i.e. Y est
r 1
un vecteur gaussien à composantes centrées réduites (Xi ∼ N (0, 1)) de corrélation r, où
(
Y1 = X1
√ .
Y2 = rX1 + 1 − r2 X2

L’algorithme générale s’écrit alors


Norm2DBoxMuller <- function(n,mu,sigma){
vecteur=NULL ; A = t(chol(sigma))
for(i in 1 :n){vecteur=c(vecteur, t(A % * % BoxMuller(0,1,2))+mu }

2
vecteur}
On peut simplifier l’écriture en codant directement en matriciel,
Norm2DBoxMuller <- function(n, mu, sigma){
A = t(chol(sigma))
mu0 = matrix(rep(mu),n),ncol=2,byrow=T)
t(A%*%matrix(BoxMuller(0,1,2*n),nrow=2))+mu0 }
Dans le cas qui nous intéresse on appelle alors
Norm2DBoxMuller(1000,c(1,3),matrix(c(3,1,1,1),ncol=2))

Simulation d’un vecteur Gaussien Simulation d’un vecteur Gaussien

3
3

2
2

1
2eme compostante

2eme compostante
1

0
0

−1
−1

−2
−2

−3
−3

−4

−2 0 2 −3 −2 −1 0 1 2 3

1ere composante 1ere composante

Fig. 3 – Simulations d’un vecteur Gaussien (centré réduit).

1.3 Intégration par la Méthode de Monte Carlo


Considérons une variable aléatoire X dont la densité de probabilité est proportionnelle à la
fonction suivante :
3 3
f (x) = (2 + sin2 (x))e−(2+cos (3x)+sin (2x))x 1R+ (x)
curve((2+sin(x)ˆ2)*exp(-(2+cos(3*x)ˆ3+sin(2*x)ˆ3)*x),xlim=c(0,15),ylim=c(0,2))
et pour représenter la borne inférieure
curve(cos(3*x)ˆ3+sin(2*x)ˆ3,xlim=c(-pi,pi),ylim=c(-2,2))
abline(h=-7/4,col=”red”)
Vérifions tout d’abord (graphiquement) que ∀x ∈ [−π, π], cos3 (3x) + sin3 (2x) > − 74 (figure
4).
On peut alors construire un algorithme de génération de réalisation de X par la méthode
d’acceptation-rejet.
AcceptationRejet=function(n){
resultat = NULL
for (i in 1 :n){
Accepte = FALSE

3
Densité f(.) Vérification (graphique) de la minoration

2.0

2
1.5

1
1.0

0
0.5

−1
0.0

−2
0 5 10 15 −3 −2 −1 0 1 2 3

Fig. 4 – Densité f et vérification de la minoration.

while (Accepte == FALSE){


Y = distributionExponentielle(1/4,1)
U = runif(1)
p = (2+sin(Y)ˆ2) * exp( -(2+cos(3*Y)ˆ3+sin(2*Y)ˆ3)*Y)
Mg = 12 * exp(-Y/4)
if (U < p/Mg)
Accepte = TRUE
else
Accepte = FALSE}
resultat = c(resultat,Y) }
resultat}
Il suffit d’appeler un grand nombre de fois cette fonction pour vérifier que l’on a bien simuler
une loi dont la densité est proportionnelle à f .
Vect = AcceptationRejet(1000)
hist(Vect,breaks = 50, plot = TRUE)
On peut alors utiliser ces simulations pour approcher l’espérance et la variance de X, en
considérant mean(Vect) et sd(Vect).
Toujours à l’aide de ces simulations, on peut approcher la fonction de répartition de X aux
points 0.5, 1, 1.5, 5, 10, 15, et ainsi en déduire des approximations des quantiles à 85, 90 et 95
% de la loi de X.
Integration=function(n,z){
Echantillon = AcceptationRejet(n)
PointsSousLimite = 0
for (i in 1 :n){
if (Echantillon[i] < z){

4
PointsSousLimite / n }
On peut alors approcher la fonction de répartition de X au point x en appelant tout simple-
ment Integration(1000,x).
Pour estimer un quantile, on peut utiliser une fonction comme suit,
Quantile=function(n,alpha){
Echantillon = AcceptationRejet(n)
EchantillonTrie = sort(Echantillon)
Limite = EchantillonTrie[n*alpha]
Limite }
On peut alors approcher un quantile de X au niveau p en appelant tout simplement
Quantile(1000,p) (la fonction quantile) (en minuscules) étant la fonction quantile de R.

2 Application 2 : Monte Carlo par chaînes de Markov


2.1 Hastings-Métropolis
Utilisons un algorithme d’Hastings-Métropolis à marche aléatoire équiprobable pour simuler
une loi de Poisson.
Pour cela, rappelons que pour simuler une suite de variables X1 , ..., Xn de loi π, on se donne
une chaîne de Markov de noyau de transition q(·|·), puis on considère l’algorithme suivante
1. sachant Xk = xk , on tire Yk suivant q(·|xk ),
2. on calcule le ratio de Hasting Metropolis,
½ ¾
π(yk )q(xk |yk )
α(xk , xk ) = min 1, ,
π(xk )q(yk |xk )
3. on tire alors U suivant une loi U ([0, 1]),
(
si U ≤ α(xk , xk ), alors Xk+1 = Yk ,
sinon Xk+1 = Xk .
Ce point 3. revient à un alogrithme d’acceptation-rejet, où on accepte Xk+1 = Yk avec probabilité
α(xk , xk ), et on pose Xk+1 = Xk sinon.
Notons que dans l’algorithme initial de Metropolis (1953), seul le cas des noyaux symmétrique
était considéré (i.e. q(y|x) = q(x|y)), et dans ce cas, le ratio a une forme relativement simple
puisque ½ ¾
π(yk )
α(xk , xk ) = min 1, .
π(xk )
On cherche ici à simuler la loi de Poisson,
λx
π(x) = exp(−λ) pour x ∈ N.
x!
On considère ici le cas de la marche aléatoire, dont le noyau de transition est alors donné par
1 1
q(y|x) = δx−1 (y) + δx+1 (y),
2 2
i.e. on passe de x à y = x + 1 avec probabilité 1/2, et de x à y = x − 1 avec probabilité 1/2.
L’algorithme s’écrit alors simplement sous la forme suivante

5
(a) sachant Xk = xk , on pose Yk = xk + 1 avec probabilité 1/2, ou Yk = xk − 1 avec
probabilité 1/2,
(b) on calcule le ratio de Hasting Metropolis,
½ ¾ ½
π(yk ) xk !
α(xk , xk ) = min 1, = min 1, λyk −xk },
π(xk ) yk !

(c) on tire alors U suivant une loi U ([0, 1]),


(
si U ≤ α(xk , xk ), alors Xk+1 = Yk ,
sinon Xk+1 = Xk .

La factorielle peut être obtenue en utilisant la loi gamma, gamma() puisque n! = Γ(n + 1). On
pose alors
fact = function(n){gamma(n+1)}
L’algorithme d’Hastings-Métropolis s’écrit alors
PoissonHastingMetropolis = function(n,lambda, x0){
X = x0 ; xn = x0
for (i in 1 :n){
xnCandidat = xn + (2 * rbinom(1,1,0.5) - 1)
critere = min(1,lambdaˆ(xnCandidat-xn)*fact(xn)/fact(xnCandidat))
if ((runif(1)) < critere){ xn = xnCandidat }
X = c(X,xn)
}
X
}
On appelle Vect = PoissonHastingMetropolis(10000,10,3) puis ont visualize à l’aide de la
commande hist(Vect).
La figure 5 permet de visualiser l’évolution de cette chaîne sur un grand nombre de valeurs. On
peut voir l’impact du choix de la valeur d’initialisation de chaîne à droite.

2.2 Gibbs

On veut déterminer la prévalence1 d’un virus dans des dons de sang répartis sur plusieurs zones
géographiques, à l’aide d’un dosage ELISA. Le test n’étant pas parfait, la proportion θ de tests
ELISA positifs n’est pas la même que la proportion p d’échantillons effectivement contaminés.
On définit deux variables élatoires binaires D et T.
( (
1 si l’échantillon sanguin est infecté 1 si le Tets ELISA est positif
D: et T :
0 sinon 0 sinon
1
Probabilité qu’un échantillon sanguin soit infecté

6
Hasting Metropolis pour une loi de Poisson Hasting Metropolis pour une loi de Poisson

100
8

80
6

60
40
4

20
2

0
0 20 40 60 80 100 0 200 400 600 800 1000

Fig. 5 – Algorithme d’Hasting Metropolis.

Scatterplot(Xk,Xk+1) Histogramme des Xk


0.12
10

0.10
0.08
8
Valeur en k+1

Probabilités

0.06
6

0.04
4

0.02
0.00
2

2 4 6 8 10 0 5 10 15 20

Valeur en k

Fig. 6 – Réalisation Xk .

7
Durant sa mise au point le test ELISA a été pratiqué sur des individus infectés et d’autres sains.
On a alors les informations suivantes :
Sensibilité h = P (T = 1|D = 1) = 99%
Spécificité q = P (T = 0|D = 0) = 97%

Valeur prédictive d’un test positif P (D = 1|T = 1) = 40, 24%


Valeur prédictive d’un test négatif P (D = 0|T = 0) = 99, 98%

Mettre en oeuvre l’échantillonnage de Gibbs pour estimer la prévalence en ce site.


L’idée de l’algorithme, pour générer un couple de variables aléatoires (X, Y ) est de générer
(Xk+1 , Yk+1 ) récursivement, à partir de (X0 , Y0 ), en tirant d’abord Xk+1 sachant Yk , puis Yk+1
sachant Xk+1 ...
Il suffit en pratique de connaître les deux lois conditionnelles, P(X = ·|Y = y) et P(Y = ·|X = x).
Le code est ici le suivant
Prevalence = function(N){
sens = 0.99 ; spec = 0.97
predPos = 0.4024 ; predNeg = 0.9998
D = c(1)
for (i in 2 :N){
dnm = D[i-1]
tn = (rbinom(1,1,1-spec)) * (dnm == 0) + (rbinom(1,1,sens)) * (dnm == 1)
dn = (rbinom(1,1,1-predNeg)) * (tn == 0) + (rbinom(1,1,predPos)) * (tn == 1)
D = c(D,dn)
}
sum(D)/N }
Pour les calculs théoriques, rappelons que
(
P(D = 1) = P(D = 1|T = 0)P(T = 0) + P(D = 1|T = 1)P(T = 1)
P(D = 0) = P(D = 0|T = 0)P(T = 0) + P(D = 0|T = 1)P(T = 1)
(
P(T = 1) = P(T = 1|D = 0)P(D = 0) + P(T = 1|D = 1)P(D = 1)
P(T = 0) = P(T = 0|D = 0)P(D = 0) + P(T = 0|D = 1)P(D = 1)
Aussi,

P(D = 1) = P(D = 1|T = 0)(P(T = 0|D = 0)P(D = 0) + P(T = 0|D = 1)P(D = 1))
+P(D = 1|T = 1)(P(T = 1|D = 0)P(D = 0) + P(T = 1|D = 1) ∗ P(D = 1))

P(D = 1) = P(D = 1|T = 0)(P(T = 0|D = 0)(1 − P(D = 1)) + P(T = 0|D = 1)P(D = 1))
+P(D = 1|T = 1)(P(T = 1|D = 0)(1 − P(D = 1)) + P(T = 1|D = 1)P(D = 1))

8
P(D = 1) = P(D = 1|T = 0)P(T = 0|D = 0) + P(D = 1|T = 1)P(T = 1|D = 0)
+P(D = 1)(P(D = 1|T = 0)(P(T = 0|D = 1) − P(T = 0|D = 0))
+P(D = 1|T = 1)(P(T = 1|D = 1) − P(T = 1|D = 0)))

d’où
(P(D = 1|T = 0)P(T = 0|D = 0) + P(D = 1|T = 1)P(T = 1|D = 0))
P(D = 1) =
(1 − P(D = 1|T = 0)(P(T = 0|D = 1) − P(T = 0|D = 0)) − P(D = 1|T = 1)(P(T = 1|D = 1) −

On peut aussi utiliser l’algorithme de Gibbs pour simuler un couple (X, Y ) de variables gaus-
siennes centrées réduits, de corrélation ρ.
En effet, on connaît alors les deux lois conditionnelles,
(
X|Y = y ∼ N (ρy, 1 − ρ2 ),
y|X = x ∼ N (ρx, 1 − ρ2 ).

On peut alors utiliser successivement le principe de Gibbs pour simuler une chaîne de Markov
(Xn , Yn ), où Yn+1 dépend de Xn+1 , qui dépendra lui même de Yn ,... etc.
Notons que, conditionnellement à X0 , la loi de Xn est une loi N (ρ2n X0 , 1 − ρ4n ). Aussi Xn →
n→∞
N (0, 1).
Aussi, on en déduit que
à !¯ Ãà ! à !!
Xn ¯¯ ρ2n x0 1 − ρ4n ρ(1 − ρ4n )
¯ X0 = x0 ∼ N , ,
Yn ¯ ρ2n+1 x0 ρ(1 − ρ4n ) 1 − ρ4n+2

et donc quand n → ∞
à !¯ Ãà ! à !!
Xn ¯ 0 1 ρ
¯
¯ X0 = x0 → N , .
Yn ¯ 0 ρ 1

Das könnte Ihnen auch gefallen