C.

Huber Master 2





Le Bootstrap




I PREMIERE PARTIE : COURS


I Le principe 1
1 Illustration 1
2 Elimination du biais 3
II Notations et Remarques 4
3 Notations 4
4 Remarques 5
III Simulations 6

IV Deux applications fondamentales 7
5 Evaluation de la précision d'une estimation 7
6 Réduction du biais 9
7 Intervalle de confiance 12


Exercices 1 6
2 7
3 11
4 11
5 14
6 14


II DEUXIEME PARTIE : EXEMPLES PRATIQUES AVEC SPLUS et R

A. Estimation
1 Exemple 1: durées de rémission: médiane 15
2 Exemple 2 : durées de rémission: variance 20
3 Exemple 3 : maladies coronariennes 21
4 Exemple 4 : intervalle de confiance pour un coefficient de corrélation 25
5 Exemple 5 : courbe ROC 26

B. Tests
1 Exemple 6 : rats traités et témoins 33
2 Exemple 7 : test pour un échantillon 34


III TROISIEME PARTIE : UTILISATION du BOOTSTRAP en R 36

III QUATRIEME PARTIE : CONTRE-EXEMPLE UNIFORME 43

Bootstrap 1
Une m´ethode de r´e´echantillonnage:
le bootstrap.
Catherine Huber
Le terme de r´e´echantillonnage, ou, en anglais, ”bootstrap” , qui ´evoque l’action
de ”se hisser en tirant sur ses propres lacets”, d´esigne un ensemble de m´ethodes qui
consistent `a faire de l’ inf´erence statistique sur de ”nouveaux” ´echantillons tir´es `a par-
tir d’un ´echantillon initial. Disposant d’un ´echantillon destin´e `a donner une certaine
information sur une population, on tire au sort, parmi la sous-population r´eduite `a
cet ´echantillon, un nouvel ´echantillon de mˆeme taille n. Et on r´ep`ete cette op´eration
B fois, o` u B est grand. On analyse ensuite les nouvelles observations ainsi obtenues
pour affiner l’inf´erence faite sur les observations initiales. A priori, on peut avoir des
doutes sur l’efficacit´e d’une telle m´ethode et penser qu’il n’y a aucune am´elioration
`a esp´erer en r´e´echantillonnant `a partir du mˆeme ´echantillon. En effet, aucune infor-
mation suppl´ementaire ne peut ˆetre esp´er´ee, toute l’information ´etant contenue dans
l’´echantillon initial. Cependant, comme on va le voir, ce r´e´echantillonnage, s’il ne ra-
joute aucune information, permet, dans certains cas, d’extraire de l’´echantillon de base
l’information souhait´ee.
Partie I
Le principe.
1 Illustration
Le principe qui sous-tend le bootstrap est tr`es simple et tr`es ancien, et il peut ˆetre
illustr´e par un syst`eme d’emboˆıtement (P. Hall, 1992) tel que celui des poup´ees russes:
1
1 ILLUSTRATION Bootstrap 2
il s’agit d’une poup´ee qui, lorsqu’on l’ouvre, laisse apparaˆıtre une poup´ee identique
mais plus petite (”homoth´etique”), qui `a son tour contient une poup´ee plus petite,
etc... . Imaginons que l’on veuille estimer le nombre r des taches de rousseur de la
premi`ere de ces poup´ees, qui est aussi la plus grande, et que l’on ne puisse pas l’observer.
On suppose qu’on dispose seulement de la seconde, contenue dans la premi`ere, et qui
contient toutes les autres. Soit r
o
le nombre des taches de rousseur de la seconde. On
peut, en premi`ere approximation, estimer r par r
o
. On appelle ’Poup´ee’ la plus grande
poup´ee, non observ´ee, ’poup´ee 0’ celle qui est observ´ee, ’poup´ee 1’ celle qu’on trouve
dans la poup´ee 0, et ainsi de suite pour toutes les poup´ees plus petites que la poup´ee
1, qui sont toutes observables puisque contenues dans la poup´ee 1.
Comme la Poup´ee initiale est plus grande que la poup´ee num´ero 0, on s’attend `a
ce que r soit plus grand que r
o
et dans le rapport de leurs tailles. Cependant, on ne
peut pas observer la premi`ere poup´ee et on ne connaˆıt donc pas sa taille. En revanche,
on peut observer le nombre des taches de rousseur r
1
de la troisi`eme poup´ee. Donc, si
le rapport du nombre des taches de rousseur d’une poup´ee `a la suivante est toujours
le mˆeme, le rapport r
o
/r
1
, qui, lui, est observable, fournira une estimation du rapport
r/r
o
. Cela donne comme estimateur de r :
ˆ r = r
0
r
0
r
1
.
Mais il se peut que le rapport de ces nombres ne soit pas constant, ce que l’on peut
v´erifier en comparant r
o
/r
1
`a r
1
/r
2
par exemple, puisque ces deux quantit´es sont observ-
ables. Si ces deux quantit´es ne sont pas ´egales, r
o
/r
1
ne constitue qu’une approximation
pour la valeur de r/r
0
.
Pour effectuer une correction suppl´ementaire, si on peut supposer que le rapport des
tailles d’une poup´ee `a la suivante, bien que n’´etant plus constant, varie r´eguli`erement,
par exemple les rapports de taille d’une poup´ee `a la suivante sont dans un rapport
constant, c’est `a dire que
r/r
0
r
0
/r
1
=
r
i−1
/r
i
r
i
/r
i+1
,
alors, on peut effectuer une correction suppl´ementaire en observant r
2
sur la poup´ee
suivante et en prenant pour estimateur de r la valeur pr´ec´edente multipli´ee par
(r
0
/r
1
)/(r
1
/r
2
),
ce qui donne :
ˆ r = r
0
(
r
0
r
1
)
2
r
2
r
1
On peut `a nouveau v´erifier si l’hypoth`ese faite sur la variation des rapports est exacte
en consid´erant la poup´ee suivante, et, dans le cas contraire, effectuer une nouvelle
correction.
C.Huber 2
2 ELIMINATION DU BIAIS Bootstrap 3
2 Elimination du biais
L’un des emplois les plus fr´equents du bootstrap est d’´eliminer le biais d’un estimateur
de la mani`ere suivante : Soit T un estimateur de θ, param`etre de la loi F commune
aux X
i
constituant l’observation X = (X
1
, · · · , X
n
)). Son biais est
b(T) = E(T|F) −θ
en notant E( | F) la moyenne (l’esp´erance) pour la loi F, car cette notation sera
commode dans la suite. On estime ce biais par
b

(T) = E(T

|X) −T
o` u T

est calcul´e sur un ´echantillon bootstrap X

issu de l’´echantillon initial X, et
E(T

|X) signifie la moyenne de T

pour la loi empirique d´etermin´ee par X, c’est `a dire
la loi qui attribue la probabilit´e 1/n `a chacune des valeurs observ´ees x
i
, i = 1, · · · , n.
L’estimateur T est ensuite ”corrig´e de son biais” et donc remplac´e par :
T −b

(T) = 2T −E(T

|X)
Comme T −b(T) est sans biais pour θ, T −b

(T) sera presque sans biais. Prenons un
exemple. Supposons que l’on veuille estimer la moyenne µ d’une population pour une
variable al´eatoire dont la fonction de r´epartition est F, inconnue, soit :
µ =

xdF(x)
et que l’on dispose pour cela d’un ´echantillon X = (X
1
, , X
n
) de n observations
ind´ependantes et ´equidistribu´ees selon F. Comme on l’a dit, la loi empirique est celle
qui attribue la probabilit´e 1/n `a chacune des n observations. D´esignons par F
0
sa
fonction de r´epartition, appel´ee fonction de r´epartition empirique:
F
0
(x) =

n
i=1
1{x
i
≤ x}
n
On peut, pour estimer µ, utiliser la mˆeme quantit´e (on dit la mˆeme ’fonctionnelle’)
que ci-dessus, en rempla¸ cant F, qui est inconnue, par la fonction de r´epartition em-
pirique F
0
qui, elle, est connue. On estime donc µ par
ˆ µ =
¯
X =

xdF
0
(x) =

i
X
i
n
qui est la moyenne observ´ee sur l’´echantillon ou moyenne empirique. Dans l’exemple
consid´er´e, on sait que l’estimateur ainsi obtenu est sans biais. Mais supposons main-
tenant que l’on veuille estimer un autre ’param`etre’, c’est ` a dire une autre fonctionnelle
de la loi F , par exemple
C.Huber 3
3 NOTATIONS Bootstrap 4
µ
r
= (

xdF(x))
r
.
On pourra v´erifier que l’estimateur correspondant

µ
r
= (
¯
X)
r
= (

i
X
i
n
)
r
n’est pas sans biais en g´en´eral, sauf si r = 1. Comment peut on le corriger pour qu’il
devienne sans biais ? Pour cela, il faudrait calculer le biais pour le lui retrancher, ou,
si ce n’est pas possible, estimer ce biais. Le biais b vaut
b = E(

µ
r
) −µ
r
= E{[

xdF
0
(x)]
r
− [

xdF(x)]
r
| F}
Comme dans le calcul du biais intervient F qui est inconnue, on peut appliquer `a
nouveau le principe initial et remplacer dans cette expression F par F
0
et donc F
0
par
F
1
obtenu par un nouvel ´echantillonnage `a partir de F
0
, c’est `a dire par ´echantillonnage
`a partir de l’´echantillon.
L’analogie avec les poup´ees russes est la suivante : la population initiale, non ob-
servable, de distribution F correspond `a la grande Poup´ee, et l’´echantillon observ´e, de
distribution F
0
, `a la plus grande des poup´ees observ´ees, la poup´ee num´ero 0. Mais alors
`a quoi correspond la poup´ee num´ero 1 , que l’on d´ecouvre en ouvrant la poup´ee num´ero
0 ? Eh bien, et c’est l`a le principe du bootstrap, on l’obtient en effectuant, `a partir de
l’´echantillon, de loi F
0
, consid´er´e maintenant comme nouvelle population initiale, un
nouvel ´echantillon, de mˆeme taille n , appel´e ´echantillon bootstrap et not´e X

. Comme
on aura en g´en´eral B ´echantillons bootstrap, on les notera X

b
, avec b variant de 1 `a
B quand on aura besoin de les distinguer. On dit que ”on r´e´echantillonne”.
Partie II
Notations et remarques.
3 Notations
L’´echantillon initial est not´e
X = (X
1
, ..., X
n
)
et F
0
la loi empirique associ´ee. Les ´echantillons obtenus par r´e´echantillonnage ou
”r´e´echantillons”, ou ”´echantillons bootstrap” sont not´es
X

= (X

1
, ..., X

n
).
C.Huber 4
4 REMARQUES Bootstrap 5
Les ´echantillons X

sont des ´echantillons fond´es sur F
0
. On notera indiff´eremment:
P(X

j
= X
i
|X) = 1/n , 1 ≤ i, j ≤ n.
ou
P(X

j
= X
i
|F
0
) = 1/n , 1 ≤ i, j ≤ n.
car d`es qu’on connaˆıt X on peut en d´eduire F
0
et r´eciproquement.
4 Remarques
1. Probl`emes param´etriques et non param´etriques:
La loi F
0
associ´ee `a l’´echantillon peut ˆetre, comme dans l’exemple ci-dessus de
l’estimation d’une moyenne, la loi empirique. C’est le cas lorsqu’on a affaire `a un
probl`eme non param´etrique. Mais la loi F
0
peut ˆetre une loi issue d’un mod`ele
param´etrique: les param`etres, qu’on notera λ dans la suite, sont alors estim´es en
employant le mod`ele, en principe par maximum de vraisemblance, et alors F
0
est
la loi appartenant au mod`ele, dont les param`etres sont ceux estim´es `a partir de
l’´echantillon.
2. Param`etres et fonctionnelles :
On a vu que pour estimer une fonctionnelle T(F) de la distribution inconnue
F on rempla¸ cait F, dans le cas non param´etrique, par la loi empirique F
0
as-
soci´ee `a l’´echantillon. Mais si par exemple on veut estimer un param`etre comme
le centre de sym´etrie d’une loi sym´etrique, ce centre de sym´etrie peut corre-
spondre `a plusieurs fonctionnelles diff´erentes: la moyenne, la m´ediane de F et
beaucoup d’autres encore; par exemple les moyennes α-tronqu´ees. Ces derni`eres
sont obtenues en prenant la moyenne des observations qui restent lorsqu’on a ˆot´e
les plus grandes et les plus petites, en proportion α. Il est donc n´ecessaire de dire
pr´ecis´ement quelle est la fonctionnelle que l’on veut estimer.
3. Approximation d’une statistique bootstrap :
Il faut bien distinguer deux ´el´ements diff´erents dans les m´ethodes bootstrap :
• Le principe lui-mˆeme, illustr´e par les poup´ees emboˆıt´ees, et qui consiste `a
remplacer la loi initiale inconnue par une loi associ´ee `a l’´echantillon observ´e,
et toutes les lois d´eriv´ees n´ecessaires. Le (ou les) param`etre(s) d’int´erˆet
est (sont) ainsi remplac´e(s) par une statistique ”bootstrap”, en principe
compl`etement calculable(s).
C.Huber 5
Bootstrap 6
• Le calcul proprement dit de la statistique bootstrap : bien que la statistique
bootstrap soit en principe compl`etement calculable, souvent son calcul ef-
fectif serait trop long. Il s’agit en g´en´eral d’esp´erances fond´ees sur la loi
F
0
et des d´eriv´ees de cette loi. Aussi, Efron a-t-il sugg´er´e de le faire par
une m´ethode de type Monte-Carlo qui consiste `a r´e´echantillonner `a partir de
l’´echantillon initial, obtenant des ´echantillons de mˆeme taille n. Si le nombre
des r´e´echantillonnages est assez grand, on aura une bonne approximation de
l’esp´erance cherch´ee `a cause de la loi des grands nombres.
Partie III
Simulations.
Etant donn´ee une loi de probabilit´e sur IR de fonction de r´epartition F, on peut ”in-
venter” un ´echantillon de n observations d’une variable al´eatoire r´eelle X de loi F en
faisant n tirages ind´ependants issus de la loi F.
En principe, la loi de base que l’on simule est la loi uniforme sur [0 ; 1], qu’on note U
[01]
,
`a partir d’un g´en´erateur de nombres au hasard. Un tel g´en´erateur est inclus dans tous
les langages de programmation et dans tous les logiciels. A partir de cet ´echantillon
uniforme simul´e (U
1
, . . . , U
n
), on peut ensuite construire un ´echantillon simul´e pour
n’importe quelle loi F en remarquant que:
X = F
−1
(U)
a F pour fonction de r´epartition, comme on pourra ais´ement le v´erifier, en particulier
dans le cas o` u F est continue et strictement monotone. On forme la suite:
(X
1
, X
2
, . . . , X
n
) = (F
−1
(U
1
), F
−1
(U
2
), ..., F
−1
(U
n
))
qui est alors un ´echantillon de la loi F.
Exercice 1
Comment g´en´erer un ´echantillon de taille n = 10 d’une variable exponentielle de
param`etre 1 ?
Remarque:
Certaines lois ont des inverses F
−1
qui ne sont pas explicites. C’est vrai en partic-
ulier de la loi normale qu’on a souvent besoin de simuler. Dans ce cas, on proc`ede
autrement. On a remarqu´e en effet, que, si U et V sont deux variables uniformes sur
[0; 1] et ind´ependantes, la variable :
X = cos(2πU)

(−2 log(V ))
C.Huber 6
5 EVALUATION DE LA PR
´
ECISION D’UNE ESTIMATION Bootstrap 7
suit une loi normale standard, N(0, 1).
Exercice 2
Comment simulerait on une loi normale quelconque de moyenne µ et de variance σ
2
?
Le bootstrap consiste donc `a faire une simulation `a partir, non pas de la loi vraie
F, qui n’est en g´en´eral pas connue, mais de la loi empirique F
n
qui a ´et´e observ´ee.
Partie IV
Deux applications fondamentales du bootstrap:
Les deux applications fondamentales du bootstrap sont la r´eduction du biais et la
d´etermination d’intervalles de confiance. Nous allons commencer par pr´esenter un ex-
emple donn´e par Efron, qui est celui qui a le premier mis en valeur les possibilit´es de
cette m´ethode, connue depuis longtemps mais non exploit´ee, notamment `a cause du
temps de calcul qu’elle implique.
5 Evaluation de la pr´ecision d’une estimation
Voici un exemple propos´e par Efron:
A l’origine, le bootstrap a ´et´e employ´e pour ´evaluer la pr´ecision d’un estimateur. Par
exemple, lors d’un petite exp´erimentation sur des souris, on a tir´e au sort parmi 16
souris, 7 qui re¸ coivent le nouveau traitement alors que les 9 autres sont des contrˆoles
les qui re¸ coivent un placebo. Leurs dur´ees de vie sont mesur´ees, en jours, et donnent
les r´esultats suivants :
moyenne ´ecart-type
Trait´ees X 94 197 16 38 99 141 23 86,86 25,24
Contrˆoles Y 52 104 146 10 51 30 40 27 46 56,22 14,14
On a l’impression que le traitement assure une meilleure survie que le placebo, car
les dur´ees moyennes observ´ees sont respectivement : 86,86 et 56,22. Mais les deux
´echantillons sont petits et la pr´ecision de ces deux estimateurs des deux vraies moyennes
certainement tr`es mauvaise. Comment mesurer cette pr´ecision ? Si l’on disposait d’une
C.Huber 7
5 EVALUATION DE LA PR
´
ECISION D’UNE ESTIMATION Bootstrap 8
taille d’´echantillon suffisamment grande pour pouvoir appliquer l’approximation nor-
male, on utiliserait le fait que:
L(X | F) ≈ N(µ,
s
2
n
)
Mais les tailles d’´echantillon sont trop faibles pour cela. De plus, si au lieu de
comparer les moyennes, on comparait les m´edianes, qui sont ici respectivement 94 et
46, que faire pour en estimer la pr´ecision et savoir `a quel point elles sont effectivement
diff´erentes ? Commen¸ cons par consid´erer le cas des souris trait´ees. Eh bien, si le
principe du bootstrap est valable, c’est `a dire si on peut remplacer la loi inconnue F
de X par la loi observ´ee F
0
( sur le 7-´echantillon) et l’´echantillon initial X li´e `a F
0
par
l’´echantillon bootstrap X

et la loi associ´ee F
1
, on a l’identification suivante :
L(X | F) ≈ L(X

| F
0
)
Comme F
0
est connue, la loi de X

s’en d´eduit compl`etement, et donc aussi la loi de
la moyenne de X

. Si on prend les quantiles 0,025 et 0,975 de cette loi, on sait qu’avec
une probabilit´e de 0,95 cette moyenne va rester entre ces deux valeurs. De mˆeme pour
la m´ediane ou n’importe quelle autre statistique. On peut remarquer aussi qu’au lieu
de s’int´eresser aux deux quantiles 0,025 et 0,975 de la moyenne pour voir `a quel point
elle est pr´ecise, on peut vouloir estimer l’´ecart-type de la moyenne, ( ou de la m´ediane,
d’ailleurs). On proc`edera de la mˆeme fa¸ con : par remplacement de l’´ecart-type cherch´e
par l’´ecart-type de la statistique bootstrap. Dans l’´equation (*), le membre de droite
est en principe compl`etement calculable mais en pratique il est en g´en´eral beaucoup
plus simple de r´e´echantillonner un grand nombre de fois :
X
∗1
, X
∗2
, . . . , X
∗B
On r´e´echantillonne B fois . Pour chaque ´echantillon X
∗b
, on calcule la statistique
qui nous int´eresse: soit la moyenne, soit la m´ediane, dans les cas envisag´es ici. On
obtient ainsi une loi empirique pour cette statistique, qui, si B est assez grand, est une
bonne approximation de la vraie loi . L’estimateur bootstrap de l’´ecart-type est donn´e
par
ˆ
s

=

{

B
b=1
(
¯
X

b

¯
¯
X

b
)
2
B − 1
}
et voici ce que donne cette statistique pour diff´erents nombres B de r´e´echantillonnages.
B 50 100 250 500 1000 infini
ˆ
s

(moyenne) 19,72 23,63 22,32 23,79 23,02 23,36
ˆ
s

(m´ediane) 32,21 36,35 34,46 36,72 36,48 37,83
C.Huber 8
6 R
´
EDUCTION DU BIAIS Bootstrap 9
En ce qui concerne la moyenne, on voit que l’´ecart-type bootstrap est proche de
l’estimateur usuel. Pour la m´ediane, on constate qu’elle est plus dispers´ee.
6 R´eduction du biais
Dans l’exemple pr´ec´edent, on estimait une moyenne par la moyenne observ´ee, et on
sait bien que dans ce cas on n’a aucun probl`eme de biais. Par contre dans beaucoup
de cas, mˆeme l’estimateur du maximum de vraisemblance a un biais. On peut utiliser
le bootstrap pour r´eduire ce biais. Supposons que l’on veuille estimer
θ(F) = [

xdF(x)]
r
`a partir d’un ´echantillon auquel est associ´e F
0
. On choisit l’estimateur

θ(F) = θ(F
0
) = [

xdF
0
(x)]
r
Quel est son biais ? Par d´efinition
Biais = E{θ(F) −θ(F
0
) | F }
Comme on ne connaˆıt pas F, on utilise le principe du bootstrap en rempla¸ cant dans
cette ´equation F par F
0
et F
0
par F
1
, o` u F
1
est la loi associ´ee `a un n-´echantillon d’une
variable de loi F
0
:

Biais = E{θ(F
0
) −θ(F
1
) | F
0
}
Donc l’estimateur sans biais de θ s’obtient en retranchant `a θ(F
0
) cet estimateur
de son biais, soit:
Estimateur sans biais de θ = θ(F
0
) −

Biais
Pour obtenir un estimateur sans biais, on doit donc ajouter t `a θ(F
0
) o` u t est d´efini
par
E(θ(F
0
) −θ(F) +t) = 0 (1)
On a donc remplac´e l’´equation initiale qui donne la correction t que l’on devrait
faire pour supprimer le biais de l’estimateur

θ(F
0
) par une ´equation bootstrap qui
donne une correction t

, en principe calculable, et dont on esp`ere qu’elle est une
C.Huber 9
6 R
´
EDUCTION DU BIAIS Bootstrap 10
bonne estimation de t. On remarque que t est un param`etre qui d´epend de F alors
que t

est une statistique d´ependant de F
0
. De cette ´equation se d´eduit la correction
t

= θ(F
0
) −E(θ(F
1
)|F
0
).
On doit donc calculer la quantit´e:
E(θ(F
1
)|F
0
),
et l’estimateur sans biais est alors ´egal `a:
θ(F
0
) +t

= 2θ(F
0
) −E(θ(F
1
)|F
0
).
Prenons un exemple concret : On n’a aucun renseignement sur F, on veut estimer
E(X)
2
et on dispose de 3 observations : x
1
= 1, 2; x
2
= 2, 5; x
3
= 1, 1. Donc
θ(F) =

xdF(x)
2
On est dans un cas non param´etrique. F
0
est donc la f.r. empirique qui donne `a
chacune des trois valeurs ci-dessus la probabilit´e 1/3 et donc
θ(F
0
) = [(1.2 + 2.5 + 1.1)/3]
2
= 2, 560.
F
1
peut prendre 10 valeurs diff´erentes: en effet, quand on tire un ´echantillon de taille
n = 3 de la loi F
0
, tout se passe comme si on tirait trois fois avec remise dans une
urne `a trois boules num´erot´ees 1.1 1.2 et 2.5. Chaque tirage peut ˆetre r´esum´e par le
nombre de fois qu’on a tir´e chacune des trois boules:
Fr´equences probabilit´e θ
1.1 1.2 2.5
3 0 0 (1/3)
3
1.210
2 1 0 (1/3)
2
1.284
2 0 1 (1/3)
2
2.454
1 1 1 2/9 2.560
1 2 0 (1/3)
2
1.361
1 0 2 (1/3)
2
4.134
0 2 1 (1/3)
2
2.667
0 1 2 (1/3)
2
4.271
0 3 0 (1/3)
3
1.440
0 0 3 (1/3)
3
6.250
On en d´eduit E(θ(F
1
)|F
0
) = 1.21/27+1.44/9+2.56/9+... = 2.6955. L’estimateur sans
biais est donc ´egal `a 2 × 2.56 − 2.695 = 2.42(4). On voit clairement sur cet exemple
comment effectuer le calcul explicite d’une statistique bootstrap. Mais on voit aussi
C.Huber 10
6 R
´
EDUCTION DU BIAIS Bootstrap 11
que, mˆeme pour un cas aussi simple o` u la taille n de l’´echantillon est ´egale `a 3, il y a
un grand nombre de tirages possibles pour F
1
.
Exercice 3:
1. Si au lieu de 3 valeurs, on avait observ´e un ´echantillon de taille n = 4, combien
de tirages F
1
distincts peut on faire ?
2. Mˆeme question pour n = 5.
3. Mˆeme question pour n quelconque lorsque l’´echantillon initial consiste en m
valeurs distinctes.
Indication:
Le nombre des configurations distinctes de F
1
est ´egal au nombre de mani`eres distinctes
de r´epartir n boules dans m cases.
Remarque: Comme F
0
est une loi discr`ete, la loi de θ(F
1
) est, elle aussi, discr`ete. On
remarque cependant que, mˆeme avec seulement 3 observations, on obtient pour θ(F
1
)
une loi beaucoup plus ´etal´ee. Ce ph´enom`ene ne fait que s’accentuer quand on augmente
n. En particulier, on pourra constater, apr`es avoir fait l’exercice pr´ec´edent, que le nom-
bre des tirages F
1
possibles lorsqu’on a 10 observations distinctes pour l’´echantillon
initial, est d´ej`a tr`es grand : 92 378. Et le mode a pour probabilit´e 0,00036, ce qui est
tr`es faible. Donc, la loi, sous F
0
d’une fonctionnelle θ(F
1
) , bien qu’elle soit en principe
discr`ete, est en g´en´eral tr`es proche d’une loi continue. On se sert de cette remarque
quand on veut construire des intervalles de confiance.
Exercice 4:
On consid`ere un n-´echantillon (X
1
, . . . , X
n
) d’une loi uniforme sur [0, θ] et on estime
θ par maximum de vraisemblance.
1. Quel est l’estimateur du maximum de vraisemblance de θ ?
2. Cet estimateur est il sans biais ?
3. Comment utiliser la m´ethode du bootstrap pour r´eduire le biais ?
Indication:
La loi initiale est F = U
[0θ]
. F
0
= U
[0,max(X
i
)]
et F
1
= U
[0,max(X
i

)]
C.Huber 11
7 INTERVALLE DE CONFIANCE Bootstrap 12
7 Intervalle de confiance
Soit F la loi inconnue, dont on veut estimer le param`etre θ(F) par un intervalle de
confiance `a 0,95 et F
0
la loi associ´ee `a l’´echantillon observ´e. θ(F
0
) est l’estimateur
de θ(F). Soit F la loi inconnue, dont on veut estimer le param`etre θ(F) par un
intervalle de confiance `a 0,95 et F
0
la loi associ´ee `a l’´echantillon observ´e. θ(F
0
) est
un estimateur de θ(F). Pour obtenir, `a partir de θ(F
0
), un intervalle de confiance (en
g´en´eral asym´etrique) pour θ(F), on a besoin de connaˆıtre la loi de θ(F) − θ(F
0
), sous
F (alors que F est inconnue) ou une approximation pour cette loi. Si c’est le cas, on
prend pour bornes de l’intervalle, en notant t
1
= t
0
.025 et t
2
= t
0
.975 les quantiles
0.025 et 0.975 de cette loi: [θ(F
0
) +t1 ; θ(F
0
) +t
2
]. En effet:
P(θ(F) −θ(F
0
) < t
1
) = 0.025
P(θ(F) −θ(F
0
) > t
2
) = 0.025
P(θ(F
0
) +t
1
≤ θ(F) ≤ θ(F
0
) +t
2
) = 0.95.
Si on ne connaˆıt pas cette loi, et si on n’a pas d’approximation pour celle-ci, ou, tout
simplement si on en dispose mais que les calculs sont tr`es compliqu´es, le bootstrap
permet de lui substituer la loi de θ(F
0
) − θ(F
1
) sous F
0
. Comme F
0
est cette fois
connue, cette loi est, en principe, une loi discr`ete compl`etement calculable. Alors
apparaissent les deux points essentiels du bootstrap:
• La validation du bootstrap : il faut en effet valider cette substitution.
• La loi bootstrap n’est calculable qu’en principe. En r´ealit´e, pour les tailles
d’´echantillon usuelles, le calcul exact serait trop long (voir ci-dessus ce que cela
donne dans le cas n = 3) et on doit donc proc´eder par simulation pour ´evaluer
cette loi bootstrap, ou pour ´evaluer ses param`etres d’int´erˆet pour le probl`eme
consid´er´e.
Supposons que l’on cherche maintenant un intervalle sym´etrique par rapport `a
θ(F
0
), qui est par exemple la moyenne observ´ee s’il s’agit de la moyenne, la m´ediane
observ´ee s’il s’agit de la m´ediane, etc... En utilisant toujours le mˆeme principe du
bootstrap, au lieu de t tel que
P(θ(F
0
) −t ≤ θ(F) ≤ θ(F
0
) +t|F) = 0, 95
C.Huber 12
7 INTERVALLE DE CONFIANCE Bootstrap 13
on va chercher t

tel que
P(θ(F
1
) −t

≤ θ(F
0
) ≤ θ(F
1
) +t

| F
0
) = 0, 95
Dans cette derni`ere expression, F
0
´etant connu, θ(F
0
) est connu. Il s’agit donc de
d´eterminer la loi de θ(F
1
) o` u F
1
est ´echantillonn´e `a partir de F
0
. On pourra par
exemple penser `a l’´echantillon ci-dessus, θ ´etant la m´ediane ou le carr´e de la moyenne,
etc.. . On trouve dans ce cas tr`es facilement la loi de θ(F
1
) car la taille de l’´echantillon
est tr`es faible : n = 3. Lorsque n est plus grand, cela devient compliqu´e et on utilise la
loi des grands nombres: On r´e´echantillonne B fois, en faisant chaque fois n tirages sans
remise dans l’´echantillon initial. On obtient ainsi B nouveaux ´echantillons de taille n:
X

1
, X

2
, . . . , X

B
et B valeurs de la statistique bootstrap θ(F
1
):
(θ(X
∗1
), θ(X
∗2
), . . . , θ(X
∗B
))
Ces valeurs dessinent progressivement la loi de θ(F
1
) et si on pouvait faire tendre
B vers l’infini, on aurait exactement la loi de θ(F
1
). En g´en´eral, on choisit des valeurs
de B de l’ordre de 50 `a 200 (voir Efron, 1993).
Remarque : Nous avons vu que, dans le cas non param´etrique, θ(F
1
) a une loi
discr`ete, et, par cons´equent, une valeur exactement ´egale `a 0,95 n’est g´en´eralement pas
atteignable. Nous avons cependant aussi remarqu´e que, tr`es vite quand n croˆıt, la loi
F
1
se diversifie et les atomes ne portent pas beaucoup de probabilt´e chacun. Par con-
tre, dans le cas d’une loi param´etrique continue, l’´equation ci-dessus peut se r´esoudre
exactement : il n’y a pas de saut de la probabilit´e qui r´egit θ(F
1
).
Exemple:
Prenons la loi exponentielle F = E(λ) de fonction de r´epartition F(x) = exp (−x/λ) et
θ(F) = λ. L’estimateur du maximum de vraisemblance de λ est la moyenne empirique
(on pourra le v´erifier `a titre d’exercice):
ˆ
λ =
¯
X
Donc
F
0
= E(
ˆ
λ) = E(
¯
X)
Notons la moyenne empirique Y/n : la loi de Y est la loi de la somme de n variables
exponentielles de mˆeme param`etre λ et donc c’est une loi gamma Γ(n, λ)(on pourra le
v´erifier ). L’´equation qui donne l’intervalle de confiance bootstrap
P(θ(F1) −t

≤ θ(F
0
) ≤ θ(F
1
) +t

|F
0
) = 0, 95
C.Huber 13
7 INTERVALLE DE CONFIANCE Bootstrap 14
s’´ecrit ici:
P(Y/n −t

≤ X ≤ Y/n +t

| Γ(n, X)) = 0.95
Le deuxi`eme param`etre de la loi gamma est un param`etre d’´echelle. En divisant
tout par ce param`etre, qui est connu puisqu’il est ´egal `a la moyenne observ´ee, on
obtient:
P(|Y

/n − 1| ≤ t

/X | Γ(n, 1)) = 0, 95
o` u Y

suit la loi gamma Γ(n, 1). Une table de la loi gamma suffit donc maintenant
pour calculer t

. Notons g
0,95
le quantile v´erifiant:
P(|Y

/n − 1| ≤ g
0,95
) = 0, 95.
Alors, t

= X
0,95
et l’intervalle de confiance ”bootstrap´e” pour la moyenne d’une loi
exponentielle est finalement:
[
¯
X −g
0,95
×
¯
X;
¯
X −g
0,95
×
¯
X]
Exercice 5: Faire le mˆeme calcul dans le cas o` u la loi exponentielle est remplac´ee
par la loi normale N(µ, σ
2
). On note λ = (µ, σ
2
) et on veut un intervalle de confiance
pour la moyenne, c’est `a dire que θ(F) = µ.
Exercice 6: Bootstrap pour des dur´ees censur´ees
Lorsqu’on a affaire `a des dur´ees de survie censur´ees, les observations se pr´esentent
sous la forme de couples (T
i
, D
i
), T ´etant la dur´ee observ´ee et D l’indicateur de cen-
sure. Deux types de bootstrap peuvent alors ˆetre envisag´es: le bootstrap simple et le
bootstrap ´evident. Le premier consiste `a faire un tirage au hasard dans les couples, le
second `a faire un tirage selon les fonctions de survie de Kaplan-Meier pour la dur´ee de
vie et pour la censure. On essaiera les deux m´ethodes sur un exemple.
C.Huber 14

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 15 Catherine Huber
Exemples pratiques d'utilisation du bootstrap
avec Splus et R.

A. Estimation et intervalles de confiance
1. Estimation de la variance d'une médiane empirique.
2. Intervalle de confiance pour une médiane.
3. Intervalle de confiance pour un coefficient de corrélation.
4. Estimation de l'écart-type d'un estimateur de l'aire sous une courbe ROC
obtenue par régression logistique.
(Receiver Operating Characteristic Curve)
B. Tests et degrés de signification
5. Degré de signification d'un test de comparaison de deux échantillons
6. Degré de signification d'un test d'adéquation pour un échantillon.


A. Estimation et intervalles de confiance

Exemple 1 : la médiane. Estimation de sa variance et Intervalle de confiance.

Pour comprendre le bootstrap, nous allons commencer par un exemple très simple.
Supposons que nous ayons un vecteur y de n = 47 observations de la durée de rémission
d'une leucémie, en semaines :

remove(objects(patt="*"))
y<-
c(12,9.5,5,7.9,15.2,7.0,7.6,8.2,7.1,13.4,6.9,11.3,6.3,11.9,5.8
,2.8,7.8,27.7,20.4,9.2,10.5,3.2,11.2,6.4,1.7,8.6,3.3,9.9,19.1,
7.7,1.2,6.6,2.2,6.1,3.8,9.7,3.7,12.3,12.2,11.6,12.4,32.4,6.7,7
.4,53.8,29.1,28.9)
yord<-sort(y)
yord
1.2 1.7 2.2 2.8 3.2 3.3 3.7 3.8 5.0 5.8 6.1 6.3
6.4 6.6 6.7 6.9 7.0
7.1 7.4 7.6 7.7 7.8 7.9 8.2 8.6 9.2 9.5 9.7 9.9
10.5 11.2 11.3 11.6 11.9
12.0 12.2 12.3 12.4 13.4 15.2 19.1 20.4 27.7 28.9 29.1 32.4
53.8
median(y)
# 8.2
var(y)
# 92.31192
summary(y)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 1.2 6.35 8.2 11.16 12.1 53.8

Nous venons d'obtenir la médiane observée de y. Si maintenant nous voulons estimer la
variance de cet estimateur de la médiane de Y, nous ne disposons pas comme pour la
moyenne d'un estimateur simple de cette variance. Nous allons donc construire un
estimateur bootstrap de cette variance comme suit :

0. Choisir une initialisation de l'aléa.
1. Tirer un échantillon de taille n = 47 de y, avec remise.
2. Calculer la médiane de l'échantillon ainsi obtenu.
3. Stocker la médiane de l'échantillon Bootstrap dans un vecteur appelé boot.
4. Retourner en 1.

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 16 Catherine Huber

Effectuons le en Splus:

set.seed(1)
ystar<-sample(y, size=47,replace=T)
ystar
mstar<-median(ystar)
mstar
# 8.2

On répète ces étapes un grand nombre de fois, soit B = 1 000 fois par exemple. On
obtient ainsi un échantillon bootstrap de médianes de taille 1 000.

B<-1000
Boot.1<-rep(0,B)

for (i in (1:B))
{ ystar<-sample(y, size=47,replace=T)
mstar<-median(ystar)
boot.1[i]<-mstar}

summary(boot.1)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 6.7 7.8 8.2 8.448 9.2 12
var(boot.1)
# 0.8955927
hist(boot.1)

6 7 8 9 10 11 12
0
1
0
0
2
0
0
3
0
0
boot

Ce que l'on réalise ainsi est essentiellement une reconstruction de la manière dont a été
obtenu l'échantillon et sa médiane en rééchantillonnant y à partir de lui-même.

POPULATION → ECHANTILLON
ECHANTILLON → ECHANTILLON BOOTSTRAP

La variabilité d'échantillonnage dans la population se reflète dans la variabilité
d'échantillonnage dans la sous-population y : mais, alors que nous n'avons pas accès à la
variabilité de median(y), dans la population totale, le vecteur boot illustre la variabilité
de median(y bootstrap) quand on échantillonne dans la sous-population y. Aussi
utiliserons nous la variance du vecteur boot pour estimer la variance de median(y).

Il est clair que ce que nous venons de faire pour la médiane, nous pouvons le répéter
pour estimer la variance d'autres statistiques. La suite des opérations est toujours la
même :

1 Faire un tirage au hasard avec remise de taille 47, dans l'échantillon y.

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 17 Catherine Huber
2. Calculer la statistique pour le nouvel échantillon bootstrap obtenu en 1.
3. Stocker la statistique ainsi calculée dans un vecteur nommé boot.
4. Retourner en 1.

Répéter ces étapes B=1000 fois.

Cependant, nous pouvons faire beaucoup d'autres choses grâce au bootstrap. Par
exemple, nous pouvons obtenir un intervalle de confiance pour le paramètre d'intérêt
sans faire aucune supposition sur la loi de son estimateur. Tout ce dont nous avons
besoin, c'est d'ordonner le vecteur boot par ordre croissant:

boot.ord<-sort(boot.1)

Alors, un intervalle de confiance de coefficient de confiance (1-a)*100% , pour le
paramètre estimé par la statistique considérée, qui dans notre cas est la médiane est
donné par l'intervalle :

( boot.ord[ B*(a/2)] , boot.ord [B*(1-a/2)] )

Effectuons le en splus:

a<-0.05
ICbas<-boot.ord[floor(B*(a/2))]
IChaut<-boot.ord[ceiling(B*(1-a/2))]
ICbas
# 7
IChaut
# 10.5

Tout cela est obtenu par la fonction bootstrap en SPLUS.

Traitement de l'exemple précédent :

boot.obj1 <- bootstrap(data=y, statistic = median, B=1000)
boot.obj1

# Premier affichage des résultats :
boot.obj1

Summary Statistics:
Observed Bias Mean SE
median 8.2 0.2832 8.483 0.9741

# Deuxième affichage des résultats :
summary(boot.obj1)
Summary Statistics:
Observed Bias Mean SE
median 8.2 0.2832 8.483 0.9741

Empirical Percentiles:
2.5% 5% 95% 97.5%
median 7.1 7.4 9.9 11.2

BCa Confidence Limits:
2.5% 5% 95% 97.5%

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 18 Catherine Huber
median 7 7.1 9.7 9.962

var 43.84 50.79 204.6 222.8

On déduit de ce résumé que :
La médiane observée valait 8.2 La moyenne du vecteur boot, qui devrait être un bon
estimateur de la médiane de l'échantillon vaut 8.483. Donc, un estimateur du biais de
la médiane de l'échantillon comme estimateur de la médiane de la population est :

moyenne(médianes bootstrap) -médiane(y)

c'est à dire ici 8.483– 8.2 = 0.283. D'autre part, l'estimateur bootstrap de
l'écart-type de la médiane vaut 0.9741. On remarquera que ce n'est pas cet estimateur
qui est utilisé pour obtenir l'intervalle de confiance pour la variance.
La première méthode, appelée celle des percentiles, et décrite ci-dessus, donne pour
intervalle de confiance bootstrap à 95% pour la médiane de la population [7.1 ;
11.2].
La deuxième méthode, appelée BCa (Bias Corrected percentile method), l'intervalle de
confiance bootstrap à 95% vaut [7 ; 9.962]. Le vecteur boot de médianes bootstrap
est donné par SPLUS et peut être utilisé pour tracer un histogramme bootstrap de la
variance pour la population :

plot(boot.obj1)

6 7 8 9 10 11 12
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
Value
D
e
n
s
it
y
median

boot.obj1$replicates
contient les 1000 valeurs de la médiane obtenues par le bootstrap. On pourra le vérifier
en les affichant.

Si on veut des percentiles autres que les 2.5%, 5%, 95% et 97.5%, de la loi de la
statistique en question, ici la variance, on peut les demander par la fonction :
a<-limits.emp(boot.obj1 ,probs=seq(0,1,by=0.1))

Si on les veut corrigés du biais, il faut demander limits.bca :
b<-limits.bca(boot.obj1 ,probs=seq(0,1,by=0.1))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

En R

1. Il faut charger le "package" boot.
2. Il faut redéfinir la statistique à bootstrapper
Comme fonction des données et de leurs indices.

# En R: pour nettoyer:
rm(list = ls())

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 19 Catherine Huber
library(boot) # chargement de la librairie boot

y<-
c(12,9.5,5,7.9,15.2,7.0,7.6,8.2,7.1,13.4,6.9,11.3,6.3,11.9,5.8
,2.8,7.8,27.7,20.4,9.2,10.5,3.2,11.2,6.4,1.7,8.6,3.3,9.9,19.1,
7.7,1.2,6.6,2.2,6.1,3.8,9.7,3.7,12.3,12.2,11.6,12.4,32.4,6.7,7
.4,53.8,29.1,28.9)

R<-1000
boot.median<-function(y,i)
{z<-median(y[i])
z}
boot.obj1<-boot(y,boot.median,R)
boot.obj1

names(boot.obj1)

IC.perc<-boot.ci(boot.obj1,conf=0.95,type="perc", index =
1:min(2,length(boot.obj1$t0)))
IC.bca<-boot.ci(boot.obj1,conf=0.95,type="bca")
IC.perc
IC.bca


# Vérification en obtenant IC.perc à la main:

a<-0.05

med.ord<-sort(boot.obj1$t)

IC.perc.1<-c(med.ord[floor(R*(a/2))],med.ord[ceiling(R*(1-
a/2))])

IC.perc.1


Exercice:
Effectuer les mêmes opérations pour obtenir une estimation de la variance de
l'estimateur de la variance de Y obtenu à partir de l'échantillon initial y.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Solution:

1) Directement :
var(y)
# 92.31192

B<-1000
boot.var<-rep(0,B)

for (i in (1:B))
{ ystar<-sample(y, size=47,replace=T)
mstar<-var(ystar)
boot.var[i]<-mstar}


bootstrap_6exemples_pratiques_splus_et_r_papier.doc 20 Catherine Huber
summary(boot.var)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 13.78 59.85 88.28 91.07 118.2 282.4

2) En employant la fonction bootstrap de Splus :
boot.obj2 <- bootstrap(data=y, statistic = var, B=1000)

# Premier affichage des résultats :
boot.obj2
Summary Statistics:
Observed Bias Mean SE
var 92.31 -4.101 88.21 39.72

# Deuxième affichage des résultats :
summary(boot.obj2)
Summary Statistics:
Observed Bias Mean SE
var 92.31 -4.101 88.21 39.72

Empirical Percentiles:
2.5% 5% 95% 97.5%
var 29.54 35.13 168.2 181.3

BCa Confidence Limits:
2.5% 5% 95% 97.5%
var 45.24 51.88 204 222.3

On déduit de ce résumé que :

La variance observée valait 92.31 La moyenne du vecteur boot, qui devrait être un
bon estimateur de la variance de l'échantillon vaut 88.21. Donc, un estimateur du biais
de la variance de l'échantillon comme estimateur de la variance de la population est :

moyenne(variances bootstrap) -variance(y)

c'est à dire ici 88.21– 92.31 = -4.1. D'autre part, l'estimateur bootstrap de
l'écart-type de la variance vaut 39.72. On remarquera que ce n'est pas cet estimateur
qui est utilisé pour obtenir l'intervalle de confiance pour la variance.
La première méthode, appelée celle des percentiles, et décrite ci-dessus, donne pour
intervalle de confiance bootstrap à 95% pour la variance de la population [29.54 ;
181.3].
Par la deuxième méthode, appelée BCa (Bias Corrected percentile method), l'intervalle
de confiance bootstrap à 95% vaut [45.24 ; 222.3]. Le vecteur boot de variances
bootstrap est donné par SPLUS et peut être utilisé pour tracer un histogramme
bootstrap de la variance pour la population :

boot.obj2$replicates
contient les 1000 valeurs de la variance obtenues par le bootstrap. On pourra le vérifier
en les affichant.
Si on veut des percentiles autres que les 2.5%, 5%, 95% et 97.5%, de la loi de la
statistique en question, ici la variance, on peut les demander par la fonction :
a<-limits.emp(boot.obj2 ,probs=seq(0,1,by=0.1))

Si on les veut corrigés du biais, il faut demander limits.bca :
b<-limits.bca(boot.obj2 ,probs=seq(0,1,by=0.1))

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 21 Catherine Huber

Exemple 2 : Patients atteints de maladies coronariennes: coronary.txt

On dispose d'un fichier 'coronary.txt' qui donne pour n = 200 patients qui sont (ou ont
été) ou non atteints de maladies coronariennes (coron), l'identité (id) , l'âge (age), le
poids (wt), la taille (height), la tension (sbp et dbp, systolique et diastolique) et le taux de
cholestérol (chol).

id age sbp dbp chol height wt coron
1 44 124 80 254 70 190 0
2 35 110 70 240 73 216 0
3 41 114 80 279 68 178 0
4 31 100 80 284 68 149 0
5 61 190 110 315 68 182 1
6 61 130 88 250 70 185 0
7 44 130 94 298 68 161 0
8 58 110 74 384 67 175 0
9 52 120 80 310 66 144 0
10 52 120 80 337 67 130 0
11 52 130 80 367 69 162 0
12 40 120 90 273 68 175 0
13 49 130 75 273 66 155 0
14 34 120 80 314 74 156 0
15 37 115 70 243 65 151 0
16 63 140 90 341 74 168 0
17 28 138 80 245 70 185 0
18 40 115 82 302 69 225 0
19 51 148 110 302 69 247 1
20 33 120 70 386 66 146 0
21 37 110 70 312 71 170 1
22 33 132 90 302 69 161 0
23 41 112 80 394 69 167 0
24 38 114 70 358 69 198 0
25 52 100 78 336 70 162 0
26 31 114 80 251 71 150 0
27 44 110 80 322 68 196 1
28 31 108 70 281 67 130 0
29 40 110 74 336 68 166 1
30 36 110 80 314 73 178 0
31 42 136 82 383 69 187 0
32 28 124 82 360 67 148 0
33 40 120 85 369 71 180 0
34 40 150 100 333 70 172 0
35 35 100 70 253 68 141 0
36 32 120 80 268 68 176 0
37 31 110 80 257 71 154 0
38 52 130 90 474 69 145 0
39 45 110 80 391 69 159 1
40 39 106 80 248 67 181 0
41 40 130 90 520 68 169 1
42 48 110 70 285 66 160 1
43 29 110 70 352 66 149 0
44 56 141 100 428 65 171 1
45 53 90 55 334 68 166 0
46 47 90 60 278 69 121 0
47 30 114 76 264 73 178 0
48 64 140 90 243 71 171 1
49 31 130 88 348 72 181 0
50 35 120 88 290 70 162 0
51 65 130 90 370 65 153 1
52 43 122 82 363 69 164 0
53 53 120 80 343 71 159 0
54 58 138 82 305 67 152 1
55 67 168 105 365 68 190 1
56 53 120 80 307 70 200 0

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 22 Catherine Huber
57 42 134 90 243 67 147 0
58 43 115 75 266 68 125 0
59 52 110 75 341 69 163 0
60 68 110 80 268 62 138 0
61 64 105 68 261 66 108 0
62 46 138 90 378 67 142 0
63 41 120 90 279 70 212 0
64 58 130 90 416 68 188 0
65 50 160 110 261 66 145 0
66 45 100 70 332 67 144 0
67 59 156 90 337 67 158 0
68 56 120 92 365 65 154 0
69 59 126 96 292 67 148 0
70 47 110 80 304 67 155 0
71 43 95 70 341 69 154 0
72 37 120 74 317 74 184 0
73 27 100 60 296 67 140 0
74 44 110 80 390 66 167 0
75 41 120 80 274 69 138 0
76 33 120 80 355 68 169 0
77 29 115 80 225 70 186 0
78 24 120 80 218 69 131 0
79 36 108 66 298 67 160 0
80 23 110 78 178 66 142 0
81 47 120 80 341 70 218 1
82 26 110 75 274 70 147 0
83 45 130 90 285 65 161 0
84 41 164 110 259 66 245 0
85 55 125 88 266 67 167 0
86 34 110 80 214 67 139 1
87 51 110 75 267 66 150 0
88 58 120 80 256 67 175 0
89 51 118 88 273 64 123 0
90 35 110 75 348 72 174 0
91 34 118 78 322 69 192 0
92 26 120 70 267 70 140 0
93 25 110 75 270 74 195 0
94 44 100 70 280 65 144 0
95 57 130 85 320 69 193 0
96 67 110 80 320 64 134 0
97 59 160 90 330 63 144 0
98 62 130 88 274 69 179 0
99 40 140 90 269 63 111 0
100 52 120 90 269 68 164 0
101 28 130 80 135 67 168 0
102 34 115 80 403 69 175 0
103 43 122 78 294 68 173 0
104 38 125 80 312 71 158 0
105 45 110 80 311 69 154 0
106 26 120 84 222 72 214 0
107 35 112 90 302 67 176 0
108 51 120 90 269 70 262 0
109 55 120 82 311 71 181 0
110 45 130 90 286 73 143 0
111 69 160 90 370 67 185 1
112 58 140 90 403 66 140 0
113 64 190 100 244 66 187 0
114 70 190 112 353 66 163 0
115 27 112 78 252 68 164 0
116 53 155 104 453 66 170 0
117 28 115 65 260 66 150 0
118 29 110 80 269 68 141 0
119 23 120 82 235 65 135 0
120 40 120 78 264 71 135 0
121 53 160 90 420 67 141 0
122 25 110 75 235 69 148 0
123 63 130 90 420 69 160 1

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 23 Catherine Huber
124 48 110 78 277 71 180 1
125 36 120 80 319 70 157 0
126 28 120 86 386 70 189 1
127 57 110 68 353 71 166 0
128 39 110 80 344 66 175 0
129 52 130 90 210 65 172 1
130 51 140 90 286 67 134 0
131 37 120 90 260 67 188 0
132 28 110 75 252 67 149 0
133 44 120 90 336 72 175 0
134 35 100 70 216 66 126 0
135 41 100 65 208 69 165 0
136 29 120 80 352 68 160 0
137 46 125 90 346 63 155 0
138 55 148 90 259 71 140 0
139 32 100 70 290 70 181 0
140 40 125 90 239 67 178 0
141 61 154 80 333 66 141 0
142 29 100 60 173 69 143 0
143 52 110 80 253 70 139 0
144 25 120 80 156 67 136 0
145 27 110 70 156 67 150 0
146 27 130 90 208 69 185 0
147 53 130 80 218 73 185 0
148 42 120 80 172 68 161 0
149 64 115 75 357 67 180 0
150 27 130 90 178 74 198 0
151 55 110 70 283 70 128 1
152 33 120 80 275 67 177 0
153 58 110 80 187 71 224 0
154 51 110 80 282 71 160 0
155 37 134 80 282 71 181 0
156 47 120 70 254 65 136 0
157 49 120 90 273 71 245 0
158 46 150 104 328 71 187 0
159 40 110 70 244 70 161 1
160 26 110 80 277 74 190 0
161 28 110 70 195 73 180 0
162 23 108 68 206 71 165 0
163 52 125 90 327 65 147 0
164 42 110 75 246 67 146 0
165 27 115 88 203 70 182 0
166 29 120 80 185 72 187 0
167 43 122 78 224 66 128 0
168 34 110 70 246 68 140 0
169 40 120 80 227 67 163 0
170 28 115 70 229 70 144 0
171 30 115 70 214 71 150 0
172 34 108 75 206 71 137 0
173 26 120 80 173 67 141 0
174 34 135 90 248 70 141 0
175 35 100 70 222 73 190 0
176 34 110 60 230 73 167 0
177 45 100 70 219 69 159 0
178 47 120 80 239 67 157 0
179 54 134 90 258 66 170 0
180 30 110 80 190 69 132 0
181 29 110 80 252 68 155 0
182 48 110 80 253 72 178 0
183 37 120 88 172 71 168 0
184 43 138 94 320 65 159 1
185 31 124 90 166 67 160 0
186 48 140 85 266 71 165 0
187 34 110 80 176 72 194 0
188 42 130 80 271 70 191 1
189 49 122 94 295 73 198 0
190 50 130 85 271 68 212 1

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 24 Catherine Huber
191 42 120 80 259 64 147 0
192 50 140 95 178 68 173 1
193 60 160 100 317 72 206 0
194 27 124 80 192 70 190 0
195 29 120 85 187 68 181 0
196 29 110 70 238 72 143 0
197 49 112 78 283 64 149 0
198 49 100 70 264 70 166 0
199 50 128 92 264 70 176 0
200 31 105 68 193 67 141 0

On importe le fichier, on l' "attache". Si on veut un intervalle de confiance pour la
médiane de l'une des variables, par exemple le poids (wt pour weight), on peut procéder
de la manière suivante :


En R, comme en Splus,
on importe le fichier coronary.txt

coronary<-
read.table(file="C:\\Enseignement_2008\\bootstrap_2008\\bootst
rap_2008_cours\\coronary.txt", sep="",header=TRUE)

coronary[1:10,]

attach(coronary)

En Splus

boot.obj3<-bootstrap(data = wt, statistic = median, B = 1000,
trace = T)

boot.obj3
summary(boot.obj3)

Call:
bootstrap(data = wt, statistic = median, B = 1000)

Number of Replications: 1000

Summary Statistics:
Observed Bias Mean SE
median 163 -0.0805 162.9 2.081

Empirical Percentiles:
2.5% 5% 95% 97.5%
median 160 160 166 167

BCa Percentiles:
2.5% 5% 95% 97.5%
median 160 160 166 167

Essayer les ordres sur boot.obj3:

plot(boot.obj3)
limits.emp(boot.obj3,probs=seq(0,1,0.1))
limits.bca(boot.obj3, probs=seq(0,1,0.1))

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 25 Catherine Huber

En R:

boot.median<-function(y,i)
{z<-median(y[i])
z}
boot.obj3<-boot(data = wt, statistic = boot.median, R = 1000)
boot.obj3

ICbca<-boot.ci(boot.obj3,conf=0.95,type="bca")
ICbca

Exemple 3 : intervalle de confiance pour un coefficient de corrélation.

Considérons le coefficient de corrélation entre la pression systolique et le taux de
cholestérol pour les patients atteints de maladies coronariennes.

boot.obj4<-bootstrap(data = coronary, statistic =
cor(sbp,chol), B = 1000, trace = F)

boot.obj4
summary(boot.obj4)

plot(boot.obj4)
Summary Statistics:
Observed Bias Mean SE
Param 0.2324 0.0004725 0.2328 0.06012

Empirical Percentiles:
2.5% 5% 95% 97.5%
Param 0.1042 0.131 0.3256 0.3429

BCa Confidence Limits:
2.5% 5% 95% 97.5%
Param 0.1018 0.1281 0.3241 0.3416

En R

dat<-data.frame(wt,sbp)
boot.cor<-function(dat,i)
{z<-cor(dat[i,1],dat[i,2])
z}
boot.obj4<-boot(data=dat,statistic=boot.cor,R=1000)
# On peut aussi donner le même ordre
# autrement:

dat<-coronary
boot.cor<-function(dat,i)
{z<-cor(dat[i,3],dat[i,7])
z}
boot.obj4<-boot(data=coronary,statistic=boot.cor,R=1000)

boot.obj4$t0

summary(boot.obj4)


bootstrap_6exemples_pratiques_splus_et_r_papier.doc 26 Catherine Huber

Exercice
Essayer la même chose sur le coefficient de corrélation entre l'âge et le taux de
cholestérol, puis entre les deux pressions diastolique et systolique.

Exemple 4 : estimation de l'écart-type de l'aire sous une courbe ROC

a) Rappels sur la courbe ROC (Receiver Operating Characteristic Curve)

Supposons qu'une population soit répartie en deux classes notées respectivement 1 et 0.
Mais, au lieu d'observer directement la classe à laquelle appartient un sujet, on dispose
de renseignements sur chaque sujet, permettant d'en déduire la classe à laquelle il
appartient avec une certaine probabilité d'erreur.
C'est par exemple la situation dans laquelle on se trouve en général lorsqu'on établit
un diagnostic, ou, lorsqu'en épidémiologie on cherche à classer les sujets en sujets "à
risque" ou non par rapport à une maladie donnée.
On a donc recours à une procédure de classification. La qualité de la méthode de
classification est mesurée par deux indicateurs, sa sensibilité et sa spécificité, définies ci-
dessous :

1 Sensibilité se : c'est la proportion des cas, parmi les sujets de type 1, qui sont bien
classés par la procédure. Autrement dit, si on note X la vraie classe du
sujet et Y la classe du sujet prédite par la méthode de classification,

se = P(Y=1| X=1) .

2 Spécificité sp : c'est la proportion des cas, parmi les sujets de type 0, qui sont bien
classés par la procédure, c'est à dire

sp = P(Y=0| X=0) .

3 Courbe ROC : c'est la courbe représentative de la sensibilité en fonction de (1 – la
spécificité)
se = f(1 – sp) .

On utilise la courbe ROC (de l'anglais : Receiver Operating Characteristic Curve) d'une
procédure de discrimination pour mesurer globalement sa capacité à affecter
correctement les sujets à leur classe respective.

Cet exemple est fondé sur la régression logistique :

On considère un fichier de données pour des patients qui sont (ou ont été) atteints de
maladies coronariennes et pour lesquels les facteurs prédictifs sont l'âge et le poids. Une
régression logistique a été effectuée sur ces patients :

Si
π
i
= P(coron=1| âge=a,poids=b),

logit(π
i
) := log(π
i
/(1-π
i
))= β
0
+ β
1
âge(i) +β
2
poids(i) + ε( i ) i = 1,2,…,n

et on a obtenu les résultats suivants, en donnant les ordres Splus, les mêmes qu'en R :

coron.glm.AWT<-glm(coron~age+wt,family=binomial,data=coronary)
summary(coron.glm.AWT)


bootstrap_6exemples_pratiques_splus_et_r_papier.doc 27 Catherine Huber
Coefficients:
Value Std. Error t value
(Intercept) -7.5111179 1.695127756 -4.431004
age 0.0635609 0.019508277 3.258150
wt 0.0159990 0.007921398 2.019719

Ce type de régression permet d'estimer la probabilité qu'une variable réponse
(coron) soit égale à 1 quand on connaît les valeurs de plusieurs paramètres du sujet (âge,
poids).
names(coron.glm.AWT)# donne les noms des résultats
# que l'on peut obtenir à partir de
# de la régression logistique

coron.glm.AWT$fitted.values

Sur la base de ces probabilités estimées, on peut définir une règle de classification de
la façon suivante :

Si la probabilité est supérieure à a, la personne est classée comme 1 (coron =1).
Si au contraire la probabilité est inférieure à a, la classer comme 0 (coron =0).

Bien que le seuil a = 0.5 paraisse a priori une valeur raisonnable, il n'est pas du tout
évident que ce soit vrai. Pour chaque valeur de a on peut calculer la spécificité et la
sensibilité de la procédure, et, quand a varie, la courbe ROC visualise les qualités de la
règle de classification correspondante.

La sensibilité est la proportion des déclarés positifs (type 1: coron =1) parmi les
positifs, et la spécificité la proportion des déclarés négatifs (type 0 : coron = 0) parmi les
négatifs.

Si on choisit a = 1, on aura se = 0 et sp = 1. Cela donne le point (0,0) de la courbe
ROC qui a pour coordonnée (1-sp, se).

En revanche, si on choisit a = 0, on aura le point (1,1) de la courbe ROC.

La courbe ROC est croissante de (0,0) jusqu'à (1,1). Plus elle est éloignée et au-dessus
de la diagonale, meilleure est la règle de classification.

Fit<-fitted.values(coron.glm.AWT)
mmin<-min(Fit)
mmax<-max(Fit)
mmin
# [1] 0.02003988
mmax
# [1] 0.480566

On découpe le domaine de variation des valeurs a prédites
[0.02 ; 0.48], en 24 intervalles égaux.

Puis on crée une matrice rocc à 24 lignes et deux colonnes qui
contiendra:

1) en première colonne la proportion des sujets de type 1
(coron=1: ils ont eu une maladie coronarienne), qui ont une
valeur prédite supérieure à a et

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 28 Catherine Huber

2) en deuxième colonne 1-la proportion des sujets de type 0
(coron=0 :ils n'ont pas eu de maladie coronarienne), qui ont
une valeur prédite inférieure à a.

rocc<-matrix(0,24,2)

for(ii in (1:24))
{ # sensibilité
rocc[ii,1]<-sum(coron*(Fit > ii*.02))/sum(coron)
# 1 - spécificité
rocc[ii,2]<-1-sum((1- coron)*(Fit<=ii*.02))/sum(1-
coron)
}
rocc
[,1] [,2]
[1,] 1.00000000 1.000000000
[2,] 1.00000000 0.850574713
[3,] 0.96153846 0.706896552
[4,] 0.92307692 0.568965517
[5,] 0.73076923 0.454022989
[6,] 0.69230769 0.339080460
[7,] 0.61538462 0.270114943
[8,] 0.57692308 0.241379310
[9,] 0.46153846 0.189655172
[10,] 0.38461538 0.155172414
[11,] 0.38461538 0.132183908
[12,] 0.34615385 0.109195402
[13,] 0.34615385 0.097701149
[14,] 0.26923077 0.074712644
[15,] 0.19230769 0.068965517
[16,] 0.19230769 0.051724138
[17,] 0.11538462 0.040229885
[18,] 0.11538462 0.040229885
[19,] 0.11538462 0.034482759
[20,] 0.11538462 0.017241379
[21,] 0.11538462 0.011494253
[22,] 0.07692308 0.011494253
[23,] 0.00000000 0.005747126
[24,] 0.00000000 0.005747126

Remarquons que les deux quantités sensibilité = rocc[,1] et 1
- spécificité = rocc[,2] sont décroissantes. Pour obtenir un
tableau croissant, on doit réordonner par :

ord <- order(rocc[,2], rocc[,1])

ord # ord contient les indices
# des éléments du tableau ordonné
# selon les valeurs croissantes
# de la deuxième colonne, en séparant
# les ex-aequo grâce à la première colonne
[1] 23 24 22 21 20 19 17 18 16 15 14 13 12 11 10 9 8 7 6
5 4 3 2 1

rocc1 <- rocc[ord,]
rocc1

[,1] [,2]
[1,] 0.00000000 0.005747126

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 29 Catherine Huber
[2,] 0.00000000 0.005747126
[3,] 0.07692308 0.011494253
[4,] 0.11538462 0.011494253
[5,] 0.11538462 0.017241379
[6,] 0.11538462 0.034482759
[7,] 0.11538462 0.040229885
[8,] 0.11538462 0.040229885
[9,] 0.19230769 0.051724138
[10,] 0.19230769 0.068965517
[11,] 0.26923077 0.074712644
[12,] 0.34615385 0.097701149
[13,] 0.34615385 0.109195402
[14,] 0.38461538 0.132183908
[15,] 0.38461538 0.155172414
[16,] 0.46153846 0.189655172
[17,] 0.57692308 0.241379310
[18,] 0.61538462 0.270114943
[19,] 0.69230769 0.339080460
[20,] 0.73076923 0.454022989
[21,] 0.92307692 0.568965517
[22,] 0.96153846 0.706896552
[23,] 1.00000000 0.850574713
[24,] 1.00000000 1.000000000

On peut maintenant tracer la courbe ROC elle-même :

win.graph()
plot(rocc1[,2],rocc1[,1], type="l",lwd=4,
xlab="1-Specificite",ylab="Sensibilite")
title("COURBE ROC POUR LE MODELE LOGISTIQUE :
coron ~ age + weight")


1-Specificite
S
e
n
s
i
b
i
l
i
t
e
0.0 0.2 0.4 0.6 0.8 1.0
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
COURBE ROC POUR LE MODELE LOGISTIQUE :
coron ~ age +weight


# Calcul de l'aire au-dessous de la courbe ROC
roca<-0
for(ii in 2:24)
{ delta <- rocc1[ii,2] - rocc1[ii-1,2]
roca <- roca + delta * ((rocc1[ii,1]+rocc1[ii-1,1])/2)}

# Aire au-dessous de la courbe :
roca
# 0.7390584

L'aire au-dessous de la courbe ROC vaut environ .74, ce qui indique un pouvoir de
prédiction assez élevé pour ce modèle logistique.

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 30 Catherine Huber

Maintenant que nous disposons de la courbe ROC, il devient clair que le choix de a
pour classer de futurs patients dont on connaît l'âge et le poids n'est pas évident. Les
deux indicateurs que sont la sensibilité et la spécificité sont importants tous les deux, et
le choix du seuil a doit ménager un bon équilibre entre les deux.
Bien sûr, l'aire au-dessous de la courbe, roca, ainsi que la courbe elle-même, sont
aléatoires. Il est donc intéressant d'avoir un estimateur de leur écart-type.
Comme nous ne disposons pas de formule (asymptotique) pour estimer cette erreur,
nous allons utiliser des techniques de rééchantillonnage, le BOOTSTRAP et le
JACKNIFE pour ce faire.

Cherchons maintenant un estimateur bootstrap de l'écart-type de l'aire sous la courbe
ROC, et un intervalle de confiance bootstrap à 95% pour cette aire.

Dans cet exemple, la statistique n'est plus une statistique prédéfinie comme une
médiane, une variance ou un coefficient de corrélation: c'est l'aire sous la courbe ROC.
Donc lorsqu'on fait un bootstrap, on fait des tirages dans un tableau, le data.frame
constitué ci-dessous, appelé boot.frame, et pour chaque tirage, on calcule la statistique
donnée par la fonction Rocarea définie elle aussi ci-dessous:

Voici le programme Splus correspondant :

# rappelons que
# Fit<-fitted.values(coron.glm.AWT) (cf regression
#logistique)
mmin <- min(Fit)
mmax <- max(Fit)
delta <- .01
# nn = nombre des points en lesquels
# la sensibilité et la spécificité
# seront calculées.
nn <- floor((mmax - mmin) / delta)

boot.frame <- data.frame(coron,Fit)
attach(boot.frame)

ROCarea <- function(coron, Fit,nn)
{
rocc<-matrix(0,nn,2)
for(ii in (1:nn))
{
rocc[ii,1]<-sum(coron*
(Fit >ii*mmin))/sum(coron)
# sensibilite
rocc[ii,2]<-1-(sum
((1-coron)*(Fit<=ii*mmin))/sum(1-coron))
#1-specificite
}
ord <- order(rocc[,2], rocc[,1])
rocc1 <- rocc[ord,]
# coron et Fit ordonnes
roca<-0
for(ii in 2:nn)
{
delta <- rocc1[ii,2] - rocc1[ii-1,2]

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 31 Catherine Huber
roca <- roca + delta * ((rocc1[ii,1]+rocc1[ii-
1])/2 )
}
c(roca)
# roca = area under the ROC curve is
# returned by the function ROCarea
}
# fin de la fonction ROCarea
boot.obj5 <- bootstrap(data = boot.frame, statistic =
ROCarea(coron,Fit,nn), B=1000, seed=0)

summary(boot.obj5)

# Affichage des résultats :

Summary Statistics:
Observed Bias Mean SE
Param 0.7391 -0.00477 0.7343 0.04811

Empirical Percentiles:
2.5% 5% 95% 97.5%
Param 0.634 0.6532 0.8101 0.826
BCa Percentiles:
2.5% 5% 95% 97.5%
Param 0.6364 0.6572 0.8134 0.8267

plot(boot.obj5)

0.60 0.65 0.70 0.75 0.80 0.85
0
2
4
6
8
Value
D
e
n
s
i
t
y
Param


A partir de l'histogramme de la distribution bootstrap de l'aire au-dessous de la courbe
ROC, on constate que cette distribution est remarquablement normale. Pour vérifier
cette impression, on peut faire :

qqnorm(boot.obj5)

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 32 Catherine Huber

Quantiles of Standard Normal
Q
u
a
n
t
i
l
e
s

o
f

R
e
p
l
i
c
a
t
e
s
-2 0 2
0
.
6
0
0
.
6
5
0
.
7
0
0
.
7
5
0
.
8
0
0
.
8
5
Param

qui donne un graphe des quantiles de la loi normale contre les quantiles des données
(QQ plot) pour l'échantillon bootstrappé des aires sous la courbe ROC. La linéarité de
la courbe obtenue suggère bien qu'en effet la loi de l'aire sous la courbe ROC est
approximativement normale.

L'intervalle de confiance à 95%, obtenu grâce aux percentiles corrigé, pour l'aire sous
la courbe ROC, vaut [.6364 ; .8267].

Par ailleurs, l'estimateur bootstrap de l'écart-type de l'estimateur de l'aire vaut .0481.
Remarquons que si on utilisait l'intervalle de confiance à 95% fondé sur
l'approximation normale, on aurait .7391 +/- 1.96*.0481 , soit [.645 ; .833].
Cet intervalle est très proche de celui donné par les percentiles bootstrap, ce qui était
prévisible après le tracé du QQ plot.

B Utilisation du bootstrap pour estimer le degré de signification de tests.

Considérons les tests d’ajustement, les tests d'égalité de deux lois fondés sur deux
échantillons indépendants et le test du chi-2 d'indépendance de deux variables
catégorielles. Les tests statistiques consistent souvent en une règle qui rejette H
0
quand
une statistique T(X)>a (ou quand T(X)<a). Le degré de signification du test est alors

dds = P[ T(X) > T(x)| H
0
est vraie]

où T(x) est la valeur observée de T(X), et T(X) est la variable aléatoire correspondante.
L’estimateur bootstrap du dds est

dds(bootstrap) = P[ T(X*) > T(x)| H
0
est vraie]

où X* représente l'échantillon bootstrap qui suit la loi de X* sous H
0
et sachant x. Il
reste à déterminer la loi de T(X*) sous H
0
et sachant x.

Exemple 5
Les données concernent la survie de rats traités (z) et témoins (y):

Groupe Survie (jours) moyenne écart type
traités z: 94 197 16 38 99 141 23 86.86 25.24
non traités y:52 104 146 10 51 30 40 27 46 56.22 14.14

( )
2 / 1
2
1
2
1
) ) ( ) ( `
ˆ
/ 1 / 1 ˆ
ˆ ˆ
) , ( y y z z ou
m n
y z
y z T
m
i
i
n
i
i
− + − =
+

=
∑ ∑
= =
σ
σ

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 33 Catherine Huber
Pour tester Ho: F=G contre H
1
: moyenne(G)> moyenne(F), on rejette Ho si T(Z,Y)>
constante. Le dds du test est P[T(Z,Y) > T(z,y)| H
0
]. Sous H
0
, les échantillons z et y
forment un échantillon de taille m+n = 7 + 9 =16 d’une population homogène de
fonction de répartition unique F
0
. Notons x l'échantillon composé de z et de y tous
ensemble. z* (y*) est alors un échantillon avec remise de taille n (m) choisi parmi les x.
Le dds bootstrap est donné par P[T(z*,y*) > T(z,y)] où T(z,y)est la valeur observée de la
statistique T.
____________________________________________
#Ordres en SPLUS
# 1) pour le test de Student
z<-c(94, 197, 16, 38, 99, 141, 23)
mean(z)
#[1] 86.85714
y<-c(52, 104, 146, 10, 51, 30, 40, 27, 46)
mean(y)
#[1] 56.22222
m<-length(z)
n<-length(y)
tt<-(mean(z)-mean(y)) /(sqrt(1/m + 1/n)*sqrt(((m-1)*var(z)+(n-
1)*var(y))/(m+n-2)))
tt
#[1] 1.120845 la valeur de la statistique observée

# 2) pour le test bootstrap
B<-1000
boot<-rep(0,B)
# boot sera rempli par la statistique t de Student
# calculée chaque fois sur l'échantillon bootstrap
x<-c(z,y)
# x est l’échantillon composé des deux échantillons
# mis ensemble
for (b in 1:B){
bootz<-sample(x,m,replace=T)
booty<-sample(x,n,replace=T)
boot[b]<-(mean(bootz)-mean(booty)) /
(sqrt(1/m + 1/n)*sqrt(((m-1)*var(bootz)+(n-
1)*var(booty))/(m+n-2)))}
hist(boot,nclass=15,main=" Histogramme de la distribution
Bootstrap \n de T(z,y)")


bootstrap_6exemples_pratiques_splus_et_r_papier.doc 34 Catherine Huber

-4 -2 0 2 4
0
5
0
1
0
0
1
5
0
2
0
0
Histogramme de la distribution Bootstrap
de T(z,y)
boot

boot<-sort(boot) #ordonne boot par ordre croissant
dds<-sum(boot>tt)/B
dds
# 0.157 # la valeur de DDS bootstrap
dt(tt,n+m-2)
# 0.2057 #la valeur du dds
# du t-test (test de Student).

La valeur du dds obtenue par le bootstrap sur 1000 répétitions est de 0.157.

Si on fait l’hypothèse de normalité de F et de G, ce qui est nécessaire pour effectuer le
test de Student, le dds=0.206. la différence entre les deux valeurs est assez importante.

Exemple 6: test pour un échantillon :

Reprenons les données des rats traités de l’exemple précédent. Un autre chercheur,
utilisant un échantillon beaucoup plus important a trouvé que la survie moyenne des
rats traités est de 129.0. Nous allons tester l'hypothèse
H
0
: E(Z) = 129.0,
contre H
1
: E (Z) < 129.0
au seuil alpha = 0.05.

Sous H
0
, la fonction de répartition F de Z est libre sauf que sa moyenne est égale à 129.0.
Une façon simple d’estimer cette loi est d’utiliser la fonction de répartition empirique
des z' ainsi définis, qui est de moyenne 129.0 :

1.On tire B = 1000 échantillons bootstrap, avec remise, de même taille 7 que
l'échantillon initial, dans l'échantillon z’ translaté de 129.0-moyenne(z) pour avoir une
moyenne égale à 129.0:

2.Pour chaque échantillon bootstrap z’* on calcule la valeur de t


7 / '*) var(
0 . 129 '*
'*) (
z
z
z t

=
0 . 129 ' + − = z z z
i i

bootstrap_6exemples_pratiques_splus_et_r_papier.doc 35 Catherine Huber

3. Le degré de signification pour le test bootstrap t de H
0
contre H
1
:
moyenne(F) < 129.0 est la proportion nb(t(z’*)<tt)/1000,
des échantillons pour lesquels t(z'*) est inférieure à la valeur tt observée
initialement de la statistique t.
Dans notre simulation 78 échantillons bootstrap avaient une valeur t(z’*) inférieure a –
1.67, et donc le degré de signification dds du test t bootstrap était 0.078. Pour le t-test
qui fait l'hypothèse que la loi F est normale, le degré de signification est P[t
6
<-1.67] =
0.07.

# programme SPLUS
tt<-(mean(z)-129.0)/sqrt(var(z)/m)
B<-1000
boot<-rep(0,B)
M<-mean(z)
z<-z-M+129.0
# la moyenne de z est 129 après la translation
sd<-sqrt(var(z))
for(b in 1 :B){
bootz<-sample(z,m,replace=T)
boot[b]<-(mean(bootz)-129.0)/sqrt(var(bootz)/m)}
boot<-sort(boot)
dds<-sum(boot<tt)/B
dds
#[1] 0.078
#le degré de signification du test t bootstrap
Comme le dds vaut 0.078, qui est supérieur à 0.05, le t bootstrap ne rejette pas Ho.




67 . 1
7 / 8 . 66
0 . 129 9 . 86
7 / ) var(
0 . 129
− =

=

=
z
z
tt

cours_bootstrap_3_en_R.doc Catherine Huber 36

#################################################################


##### Utilisation du bootstrap en R #####


#################################################################

rm(list =ls()) #nettoyage des données

library(boot) #chargement de la bibliothèque "boot"

#Saisie des données

y<-c(12,9.5,5,7.9,15.2,7.0,7.6,8.2,7.1,13.4,6.9,
11.3,6.3,11.9,5.8,2.8,7.8,27.7,20.4,9.2,10.5,3.2,
11.2,6.4,1.7,8.6,3.3,9.9,19.1,7.7,1.2,6.6,2.2,6.1,
3.8,9.7,3.7,12.3,12.2,11.6,12.4,32.4,6.7,7.4,53.8,29.1,28.9)

##############################################################

# Estimation bootstrap de la médiane

##############################################################
R<-1000
boot.median<-function(y,i)
{z<-median(y[i])
z}
boot.obj1<-boot(y,boot.median,R)
boot.obj1

names(boot.obj1)


###############################################

IC.perc.1<-boot.ci(boot.obj1,conf=0.95,type="perc",
index =1:min(2,length(boot.obj1$t0)))
IC.bca.1<-boot.ci(boot.obj1,conf=0.95,type="bca")
IC.perc.1
IC.bca.1

######################################################
### Vérification en obtenant IC.perc.1 à la main ####
######################################################

a<-0.05

med.ord<-sort(boot.obj1$t)

cours_bootstrap_3_en_R.doc Catherine Huber 37

IC.perc.1.m<-c(med.ord[floor(R*(a/2))],med.ord[ceiling(R*(1-a/2))])

IC.perc.1.m

####################################################

#########Estimation bootstrap de la variance #####

####################################################


R<-1000
boot.var<-function(y,i)
{z<-var(y[i])
z}
boot.obj2<-boot(y,boot.var,R)
boot.obj2

names(boot.obj2)

IC.perc.2<-boot.ci(boot.obj2,conf=0.95,type="perc",
index =1:min(2,length(boot.obj2$t0)))
IC.bca.2<-boot.ci(boot.obj2,conf=0.95,type="bca")
IC.perc.2
IC.bca.2

###############################################

boot.obj3<-boot(y,boot.var,R)
boot.obj3

names(boot.obj2)

IC.perc.3<-boot.ci(boot.obj3,conf=0.95,type="perc",
index =1:min(2,length(boot.obj3$t0)))
IC.bca.3<-boot.ci(boot.obj3,conf=0.95,type="bca")
IC.perc.3
IC.bca.3

###############################################

mean(boot.obj2$t)








cours_bootstrap_3_en_R.doc Catherine Huber 38











###############################################################

###### Maladies coronariennes #############

###############################################################



###############################################################

### Lecture du fichier sur les maladies coronariennes #######

###############################################################

coronary<-read.table(file="C:\\coronary.txt",sep="",header=TRUE)

coronary[1:10,]

attach(coronary)


###############################################################

### Estimation bootstrap du coefficient de corrélation #####

### entre le poids et la pression sanguine systolique #####

###############################################################

dat<-data.frame(wt,sbp)

boot.cor<-function(dat,i)
{z<-cor(dat[i,1],dat[i,2])
z}
boot.obj4<-boot(data=dat,statistic=boot.cor,R=1000)

boot.obj4



cours_bootstrap_3_en_R.doc Catherine Huber 39
###################################################
#On peut aussi donner le même ordre
#autrement
###################################################

dat<-coronary
boot.cor.1<-function(dat,i)
{z<-cor(dat[i,3],dat[i,7])
z}
boot.obj5<-boot(data=coronary,statistic=boot.cor.1,R=1000)

boot.obj5

summary(boot.obj5)

##########################################################

####### Courbe ROC pour les maladies coronariennes ####

###########################################################

###########################################################

###### Régression logistique de la maladie ######
### sur l'âge et le poids ###

###########################################################

###########################################################

coron.glm.AWT<-glm(coron~age+wt,family=binomial,data=coronary)
coron.glm.AWT

summary(coron.glm.AWT)

names(coron.glm.AWT)


################################################################

#prédiction de la maladie coronarienne par P(coron|age, poids)

################################################################

coron.glm.AWT$fitted.values

################################################################

#### fabrication de la matrice qui contiendra #######
#### en 1re colonne : la sensibilité #######

cours_bootstrap_3_en_R.doc Catherine Huber 40
#### en 2ème colonne: 1- spécificité #######

################################################################

Fit<-fitted.values(coron.glm.AWT)

mmin<-min(Fit)
mmax<-max(Fit)
mmin
#0.02003988
mmax
#0.4805969


rocc<-matrix(0,24,2)

for(ii in (1:24))
{ #sensibilité
rocc[ii,1]<-sum(coron*(Fit >ii*.02))/sum(coron)
#1 - spécificité
rocc[ii,2]<-1-sum((1- coron)*(Fit<=ii*.02))/sum(1-coron)
}
rocc

#########################################################

### On doit réordonner les abscisses

#########################################################


ord <- order(rocc[,2], rocc[,1])

ord #ord contient les indices
#des éléments du tableau ordonné
#selon les valeurs croissantes
#de la deuxième colonne, en séparant
#les ex-aequo grâce à la première colonne

rocc1 <- rocc[ord,]
rocc1




##########################################################

win.graph()
plot(rocc1[,2],rocc1[,1], type="l",lwd=4,
xlab="1-Specificite",ylab="Sensibilite")

cours_bootstrap_3_en_R.doc Catherine Huber 41
title("COURBE ROC POUR LE MODELE LOGISTIQUE :
coron ~ age +weight")

##########################################################










# Calcul de l'aire au-dessous de la courbe ROC
roca<-0
for(ii in 2:24)
{ delta <- rocc1[ii,2] - rocc1[ii-1,2]
roca <- roca +delta * ((rocc1[ii,1]+rocc1[ii-1,1])/2)}

# Aire au-dessous de la courbe :
roca
# 0.7390584

##########################################################

#rappelons que
#Fit<-fitted.values(coron.glm.AWT) (cf regression #logistique)
mmin <- min(Fit)
mmax <- max(Fit)
delta <- .01
# nn =nombre des points en lesquels
# la sensibilité et la spécificité
# seront calculées.
nn <- floor((mmax - mmin) / delta)

boot.frame <- data.frame(coron,Fit)
attach(boot.frame)

ROCarea <- function(coron,Fit)
{
rocc<-matrix(0,nn,2)
for(ii in (1:nn))
{
rocc[ii,1]<-sum(coron*
(Fit >ii*mmin))/sum(coron)
#sensibilite
rocc[ii,2]<-1-(sum
((1-coron)*(Fit<=ii*mmin))/sum(1-coron))
#1-specificite

cours_bootstrap_3_en_R.doc Catherine Huber 42
}
ord <- order(rocc[,2], rocc[,1])
rocc1 <- rocc[ord,]
# coron et Fit ordonnes
roca<-0
for(ii in 2:nn)
{
delta <- rocc1[ii,2] - rocc1[ii-1,2]
roca <- roca +delta * ((rocc1[ii,1]+rocc1[ii-1])/2 )
}
c(roca)
#roca =area under the ROC curve is
#returned by the function ROCarea
}
#fin de la fonction ROCarea

#############################################################


boot.roc<-function(boot.frame,i)
{z<-ROCarea(boot.frame[i,1],boot.frame[i,2])
z}


boot.obj6 <- boot(data =boot.frame, statistic =
boot.roc, R=1000)


cours_bootstrap_4_uniform_counterexample.doc Catherine Huber 43
Exemple d'un cas où le bootstrap ne marche pas bien:
Estimation du paramètre θ d'une loi uniforme sur [0 θ].




X
i
de loi uniforme sur [0 θ] :
U[0 θ]

Echantillon X
1
, X
2
,...,X
n

Problème : estimer θ

Estimateur MV : theta.hat = x
(n)
le maximum des x
i
.

On connaît la loi de X
(n)
= max (X
1
, X
2
, ..., X
n
).

La fonction de répartition de l'estimateur est

F (y) = P(X
(n)
< y) = (y/ θ)
n


et la densité :

f(y) = ny
n-1
/

θ
n


sur [0 θ] .


Tirage d'un échantillon:

uniforme sur [0 1]
de taille n =100

set.seed(2)
theta <- 1
n <- 100

delta <- 0.005

y <- runif(n,0,theta)
theta.hat<-max(y)
theta.hat
# 0. 9889022

boot.max <- function(y,i){z<-max(y[i])
cours_bootstrap_4_uniform_counterexample.doc Catherine Huber 44
z}


yy <- boot(y,statistic=boot.max,R = 2000)
names(yy)
yyo<-sort(yy$t)
yyo


x<-seq(min(yyo),1,delta)
long<-length(x)
tot<-sum(yyo>=min(yyo))
freqs<-rep(0,(long-1))
i<-1
for (i in (1:(long-1)))
{freqs[i]<-sum((yyo>=x[i])*(yyo<x[i+1]))/tot}

xx<-x[(1:(long-1))]+0.005
freqs<-freqs/delta
densite<- n*xx^(n-1)

mini<-min(c(freqs,densite))
maxi<-max(c(freqs,densite))
ref<-c(rep(mini,trunc((long-1)/2)),rep(maxi,long-1-
trunc((long-1)/2)))

win.graph()
# par(mfrow=c(1,2))
plot(xx,ref,lty=1,type="l",lwd=1,xlab="x",ylab="densi
te du max")
lines(xx,freqs,lty=1, col=2,lwd=4)
lines(xx,n*xx^(n-1),type="l",col=1,lty=1,lwd=4)
lines(ksmooth(xx,freqs,kernel="normal",bandwidth=.02)
,lty=3, col=3,lwd=4)



cours_bootstrap_4_uniform_counterexample.doc Catherine Huber 45
x
d
e
n
s
i
t
e

d
u

m
a
x
0.90 0.92 0.94 0.96 0.98 1.00
0
2
0
4
0
6
0
8
0
1
0
0
1
2
0



sum(yyo==theta.hat)
1251

La proportion des cas, sur les 2000 échantillons bootstrap, qui ont donné x(n) =
0. 9889022
est ici de
1251/2000 = 0.6255

En fait, on connaît la probabilité exacte que le
maximum X*(n) de l'échantillon bootstrap X * soit
égal à
X(n)(= 0.9889022):

Elle vaut p = 1 – (1-1/n)
n
= 0.6339677

p <- 1-exp(n*log(1-1/n))
# 0.6330422

Quand n devient grand (tend vers l'infini):
log((1-1/n)
n
) = n log(1 – 1/n) ≈ - 1
cours_bootstrap_4_uniform_counterexample.doc Catherine Huber 46
Donc p → 1 - e
– 1
= 0.6321206 .

Soit F une fonction de répartition de support [0 θ]
Si on considère la statistique:

R
n
(X | F) = n(θ – X
(n)
)/ θ


sa ver si on boot st r ap est

R
n
*
(X
*
| F
n
) = n(X
(n)
– X
*
(n)
)/ X
(n)


On voi t que

P(R
n
* = 0 | F
n
) = 1 – exp(-1) = 0.6321

P(R
n
= 0 | F ) = 0

Si F est la loi uniforme sur [0 θ],
la loi asymptotique de R
n
( X | F) est l a l oi
exponent i el l e de par amèt r e 1:

P(R
n
>x) = P (n(θ – X(n))/ θ >x)
= P(X(n)<(nθ- θx)/n))
= (1-x/n)
n

→ e
-x

Alors que la loi asymptotique de R
n
*
(X
*
| F
n
) ne peut
pas converger vers la loi exponentielle de paramètre
1.



Sign up to vote on this title
UsefulNot useful