Le Bootstrap

Transcription

Le Bootstrap
C. Huber
Master 2
Le Bootstrap
I
PREMIERE PARTIE : COURS
I
Le principe
1
Illustration
2 Elimination du biais
II Notations et Remarques
3
Notations
4
Remarques
III Simulations
IV Deux applications fondamentales
5
Evaluation de la précision d'une estimation
6
Réduction du biais
7
Intervalle de confiance
Exercices
1
2
3
4
5
6
II
1
1
3
4
4
5
6
7
7
9
12
6
7
11
11
14
14
DEUXIEME PARTIE : EXEMPLES PRATIQUES AVEC SPLUS et R
A. Estimation
1 Exemple 1: durées de rémission: médiane
2 Exemple 2 : durées de rémission: variance
3 Exemple 3 : maladies coronariennes
4 Exemple 4 : intervalle de confiance pour un coefficient de corrélation
5 Exemple 5 : courbe ROC
15
20
21
25
26
B. Tests
1 Exemple 6 : rats traités et témoins
2 Exemple 7 : test pour un échantillon
33
34
III TROISIEME PARTIE : UTILISATION du BOOTSTRAP en R
36
III QUATRIEME PARTIE : CONTRE-EXEMPLE UNIFORME
43
Bootstrap 1
Une méthode de rééchantillonnage:
le bootstrap.
Catherine Huber
Le terme de rééchantillonnage, ou, en anglais, ”bootstrap” , qui évoque l’action
de ”se hisser en tirant sur ses propres lacets”, désigne un ensemble de méthodes qui
consistent à faire de l’ inférence statistique sur de ”nouveaux” échantillons tirés à partir d’un échantillon initial. Disposant d’un échantillon destiné à donner une certaine
information sur une population, on tire au sort, parmi la sous-population réduite à
cet échantillon, un nouvel échantillon de même taille n. Et on répète cette opération
B fois, où B est grand. On analyse ensuite les nouvelles observations ainsi obtenues
pour affiner l’inférence faite sur les observations initiales. A priori, on peut avoir des
doutes sur l’efficacité d’une telle méthode et penser qu’il n’y a aucune amélioration
à espérer en rééchantillonnant à partir du même échantillon. En effet, aucune information supplémentaire ne peut être espérée, toute l’information étant contenue dans
l’échantillon initial. Cependant, comme on va le voir, ce rééchantillonnage, s’il ne rajoute aucune information, permet, dans certains cas, d’extraire de l’échantillon de base
l’information souhaitée.
Partie I
Le principe.
1
Illustration
Le principe qui sous-tend le bootstrap est très simple et très ancien, et il peut être
illustré par un système d’emboı̂tement (P. Hall, 1992) tel que celui des poupées russes:
1
Bootstrap 2
1 ILLUSTRATION
il s’agit d’une poupée qui, lorsqu’on l’ouvre, laisse apparaı̂tre une poupée identique
mais plus petite (”homothétique”), qui à son tour contient une poupée plus petite,
etc... . Imaginons que l’on veuille estimer le nombre r des taches de rousseur de la
première de ces poupées, 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ère, et qui
contient toutes les autres. Soit ro le nombre des taches de rousseur de la seconde. On
peut, en première approximation, estimer r par ro . On appelle ’Poupée’ la plus grande
poupée, non observée, ’poupée 0’ celle qui est observée, ’poupée 1’ celle qu’on trouve
dans la poupée 0, et ainsi de suite pour toutes les poupées plus petites que la poupée
1, qui sont toutes observables puisque contenues dans la poupée 1.
Comme la Poupée initiale est plus grande que la poupée numéro 0, on s’attend à
ce que r soit plus grand que ro et dans le rapport de leurs tailles. Cependant, on ne
peut pas observer la première poupée et on ne connaı̂t donc pas sa taille. En revanche,
on peut observer le nombre des taches de rousseur r1 de la troisième poupée. Donc, si
le rapport du nombre des taches de rousseur d’une poupée à la suivante est toujours
le même, le rapport ro /r1 , qui, lui, est observable, fournira une estimation du rapport
r/ro . Cela donne comme estimateur de r :
r0
r̂ = r0 .
r1
Mais il se peut que le rapport de ces nombres ne soit pas constant, ce que l’on peut
vérifier en comparant ro /r1 à r1 /r2 par exemple, puisque ces deux quantités sont observables. Si ces deux quantités ne sont pas égales, ro /r1 ne constitue qu’une approximation
pour la valeur de r/r0 .
Pour effectuer une correction supplémentaire, si on peut supposer que le rapport des
tailles d’une poupée à la suivante, bien que n’étant plus constant, varie régulièrement,
par exemple les rapports de taille d’une poupée à la suivante sont dans un rapport
constant, c’est à dire que
ri−1 /ri
r/r0
=
,
r0 /r1
ri /ri+1
alors, on peut effectuer une correction supplémentaire en observant r2 sur la poupée
suivante et en prenant pour estimateur de r la valeur précédente multipliée par
(r0 /r1 )/(r1 /r2 ),
ce qui donne :
r0 2 r2
)
r1 r1
On peut à nouveau vérifier si l’hypothèse faite sur la variation des rapports est exacte
en considérant la poupée suivante, et, dans le cas contraire, effectuer une nouvelle
correction.
r̂ = r0 (
C.Huber
2
Bootstrap 3
2 ELIMINATION DU BIAIS
2
Elimination du biais
L’un des emplois les plus fréquents du bootstrap est d’éliminer le biais d’un estimateur
de la manière suivante : Soit T un estimateur de θ, paramètre de la loi F commune
aux Xi constituant l’observation X = (X1 , · · · , Xn )). Son biais est
b(T ) = E(T |F ) − θ
en notant E( | F ) la moyenne (l’espérance) pour la loi F , car cette notation sera
commode dans la suite. On estime ce biais par
b∗ (T ) = E(T ∗ |X) − T
où T ∗ est calculé sur un échantillon bootstrap X ∗ issu de l’échantillon initial X, et
E(T ∗ |X) signifie la moyenne de T ∗ pour la loi empirique déterminée par X, c’est à dire
la loi qui attribue la probabilité 1/n à chacune des valeurs observées xi , i = 1, · · · , n.
L’estimateur T est ensuite ”corrigé de son biais” et donc remplacé 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éatoire dont la fonction de répartition est F , inconnue, soit :
Z
µ = xdF (x)
et que l’on dispose pour cela d’un échantillon X = (X1 , , Xn ) de n observations
indépendantes et équidistribuées selon F . Comme on l’a dit, la loi empirique est celle
qui attribue la probabilité 1/n à chacune des n observations. Désignons par F0 sa
fonction de répartition, appelée fonction de répartition empirique:
Pn
1{xi ≤ x}
F0 (x) = i=1
n
On peut, pour estimer µ, utiliser la même quantité (on dit la même ’fonctionnelle’)
que ci-dessus, en remplaçant F , qui est inconnue, par la fonction de répartition empirique F0 qui, elle, est connue. On estime donc µ par
P
Z
Xi
µ̂ = X̄ = xdF0 (x) = i
n
qui est la moyenne observée sur l’échantillon ou moyenne empirique. Dans l’exemple
considéré, on sait que l’estimateur ainsi obtenu est sans biais. Mais supposons maintenant que l’on veuille estimer un autre ’paramètre’, c’est à dire une autre fonctionnelle
de la loi F , par exemple
C.Huber
3
Bootstrap 4
3 NOTATIONS
Z
µ = ( xdF (x))r .
r
On pourra vérifier que l’estimateur correspondant
P
Xi
r
r
µb = (X̄) = ( i )r
n
n’est pas sans biais en général, 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
Z
Z
r
r
r
b = E(µb ) − µ = E{[ xdF0 (x)] − [ xdF (x)]r | F }
Comme dans le calcul du biais intervient F qui est inconnue, on peut appliquer à
nouveau le principe initial et remplacer dans cette expression F par F0 et donc F0 par
F1 obtenu par un nouvel échantillonnage à partir de F0 , c’est à dire par échantillonnage
à partir de l’échantillon.
L’analogie avec les poupées russes est la suivante : la population initiale, non observable, de distribution F correspond à la grande Poupée, et l’échantillon observé, de
distribution F0 , à la plus grande des poupées observées, la poupée numéro 0. Mais alors
à quoi correspond la poupée numéro 1 , que l’on découvre en ouvrant la poupée numéro
0 ? Eh bien, et c’est là le principe du bootstrap, on l’obtient en effectuant, à partir de
l’échantillon, de loi F0 , considéré maintenant comme nouvelle population initiale, un
nouvel échantillon, de même taille n , appelé échantillon bootstrap et noté X ∗ . Comme
on aura en général B échantillons bootstrap, on les notera Xb∗ , avec b variant de 1 à
B quand on aura besoin de les distinguer. On dit que ”on rééchantillonne”.
Partie II
Notations et remarques.
3
Notations
L’échantillon initial est noté
X = (X1 , ..., Xn )
et F0 la loi empirique associée. Les échantillons obtenus par rééchantillonnage ou
”rééchantillons”, ou ”échantillons bootstrap” sont notés
X ∗ = (X1∗ , ..., Xn∗ ).
C.Huber
4
Bootstrap 5
4 REMARQUES
Les échantillons X ∗ sont des échantillons fondés sur F0 . On notera indifféremment:
P (Xj∗ = Xi |X) = 1/n , 1 ≤ i, j ≤ n.
ou
P (Xj∗ = Xi |F0 ) = 1/n , 1 ≤ i, j ≤ n.
car dès qu’on connaı̂t X on peut en déduire F0 et réciproquement.
4
Remarques
1. Problèmes paramétriques et non paramétriques:
La loi F0 associée à l’échantillon peut être, comme dans l’exemple ci-dessus de
l’estimation d’une moyenne, la loi empirique. C’est le cas lorsqu’on a affaire à un
problème non paramétrique. Mais la loi F0 peut être une loi issue d’un modèle
paramétrique: les paramètres, qu’on notera λ dans la suite, sont alors estimés en
employant le modèle, en principe par maximum de vraisemblance, et alors F0 est
la loi appartenant au modèle, dont les paramètres sont ceux estimés à partir de
l’échantillon.
2. Paramètres et fonctionnelles :
On a vu que pour estimer une fonctionnelle T(F) de la distribution inconnue
F on remplaçait F , dans le cas non paramétrique, par la loi empirique F0 associée à l’échantillon. Mais si par exemple on veut estimer un paramètre comme
le centre de symétrie d’une loi symétrique, ce centre de symétrie peut correspondre à plusieurs fonctionnelles différentes: la moyenne, la médiane de F et
beaucoup d’autres encore; par exemple les moyennes α-tronquées. Ces dernières
sont obtenues en prenant la moyenne des observations qui restent lorsqu’on a ôté
les plus grandes et les plus petites, en proportion α. Il est donc nécessaire de dire
précisément quelle est la fonctionnelle que l’on veut estimer.
3. Approximation d’une statistique bootstrap :
Il faut bien distinguer deux éléments différents dans les méthodes bootstrap :
• Le principe lui-même, illustré par les poupées emboı̂tées, et qui consiste à
remplacer la loi initiale inconnue par une loi associée à l’échantillon observé,
et toutes les lois dérivées nécessaires. Le (ou les) paramètre(s) d’intérêt
est (sont) ainsi remplacé(s) par une statistique ”bootstrap”, en principe
complètement calculable(s).
C.Huber
5
Bootstrap 6
• Le calcul proprement dit de la statistique bootstrap : bien que la statistique
bootstrap soit en principe complètement calculable, souvent son calcul effectif serait trop long. Il s’agit en général d’espérances fondées sur la loi
F0 et des dérivées de cette loi. Aussi, Efron a-t-il suggéré de le faire par
une méthode de type Monte-Carlo qui consiste à rééchantillonner à partir de
l’échantillon initial, obtenant des échantillons de même taille n. Si le nombre
des rééchantillonnages est assez grand, on aura une bonne approximation de
l’espérance cherchée à cause de la loi des grands nombres.
Partie III
Simulations.
Etant donnée une loi de probabilité sur IR de fonction de répartition F , on peut ”inventer” un échantillon de n observations d’une variable aléatoire réelle X de loi F en
faisant n tirages indépendants 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] ,
à partir d’un générateur de nombres au hasard. Un tel générateur est inclus dans tous
les langages de programmation et dans tous les logiciels. A partir de cet échantillon
uniforme simulé (U1 , . . . , Un ), on peut ensuite construire un échantillon simulé pour
n’importe quelle loi F en remarquant que:
X = F −1 (U )
a F pour fonction de répartition, comme on pourra aisément le vérifier, en particulier
dans le cas où F est continue et strictement monotone. On forme la suite:
(X1 , X2 , . . . , Xn ) = (F −1 (U1 ), F −1 (U2 ), ..., F −1 (Un ))
qui est alors un échantillon de la loi F .
Exercice 1
Comment générer un échantillon de taille n = 10 d’une variable exponentielle de
paramètre 1 ?
Remarque:
Certaines lois ont des inverses F −1 qui ne sont pas explicites. C’est vrai en particulier de la loi normale qu’on a souvent besoin de simuler. Dans ce cas, on procède
autrement. On a remarqué en effet, que, si U et V sont deux variables uniformes sur
[0; 1] et indépendantes, la variable :
p
X = cos(2πU ) (−2 log(V ))
C.Huber
6
5 EVALUATION DE LA PRÉCISION 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 à faire une simulation à partir, non pas de la loi vraie
F , qui n’est en général pas connue, mais de la loi empirique Fn qui a été observée.
Partie IV
Deux applications fondamentales du bootstrap:
Les deux applications fondamentales du bootstrap sont la réduction du biais et la
détermination d’intervalles de confiance. Nous allons commencer par présenter un exemple donné par Efron, qui est celui qui a le premier mis en valeur les possibilités de
cette méthode, connue depuis longtemps mais non exploitée, notamment à cause du
temps de calcul qu’elle implique.
5
Evaluation de la précision d’une estimation
Voici un exemple proposé par Efron:
A l’origine, le bootstrap a été employé pour évaluer la précision d’un estimateur. Par
exemple, lors d’un petite expérimentation sur des souris, on a tiré au sort parmi 16
souris, 7 qui reçoivent le nouveau traitement alors que les 9 autres sont des contrôles
les qui reçoivent un placebo. Leurs durées de vie sont mesurées, en jours, et donnent
les résultats suivants :
moyenne écart-type
Traitées
X 94 197 16 38 99 141 23
86,86
25,24
Contrôles 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ées moyennes observées sont respectivement : 86,86 et 56,22. Mais les deux
échantillons sont petits et la précision de ces deux estimateurs des deux vraies moyennes
certainement très mauvaise. Comment mesurer cette précision ? Si l’on disposait d’une
C.Huber
7
5 EVALUATION DE LA PRÉCISION D’UNE ESTIMATION
Bootstrap 8
taille d’échantillon suffisamment grande pour pouvoir appliquer l’approximation normale, on utiliserait le fait que:
s2
L(X | F ) ≈ N (µ, )
n
Mais les tailles d’échantillon sont trop faibles pour cela. De plus, si au lieu de
comparer les moyennes, on comparait les médianes, qui sont ici respectivement 94 et
46, que faire pour en estimer la précision et savoir à quel point elles sont effectivement
différentes ? Commençons par considérer le cas des souris traitées. Eh bien, si le
principe du bootstrap est valable, c’est à dire si on peut remplacer la loi inconnue F
de X par la loi observée F0 ( sur le 7-échantillon) et l’échantillon initial X lié à F0 par
l’échantillon bootstrap X ∗ et la loi associée F1 , on a l’identification suivante :
L(X | F ) ≈ L(X ∗ | F0 )
Comme F0 est connue, la loi de X ∗ s’en déduit complètement, 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é de 0,95 cette moyenne va rester entre ces deux valeurs. De même pour
la médiane ou n’importe quelle autre statistique. On peut remarquer aussi qu’au lieu
de s’intéresser aux deux quantiles 0,025 et 0,975 de la moyenne pour voir à quel point
elle est précise, on peut vouloir estimer l’écart-type de la moyenne, ( ou de la médiane,
d’ailleurs). On procèdera de la même façon : par remplacement de l’écart-type cherché
par l’écart-type de la statistique bootstrap. Dans l’équation (*), le membre de droite
est en principe complètement calculable mais en pratique il est en général beaucoup
plus simple de rééchantillonner un grand nombre de fois :
X ∗1, X ∗2, . . . , X ∗B
On rééchantillonne B fois . Pour chaque échantillon X ∗ b , on calcule la statistique
qui nous intéresse: soit la moyenne, soit la médiane, dans les cas envisagés 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’écart-type est donné
par
s
PB
¯ 2
(X¯∗ b − X ∗ b )
b=1
∗
}
sˆ = {
B−1
et voici ce que donne cette statistique pour différents nombres B de rééchantillonnages.
B
50
sˆ∗ (moyenne) 19,72
sˆ∗ (médiane) 32,21
C.Huber
100
23,63
36,35
250
22,32
34,46
500
23,79
36,72
8
1000
23,02
36,48
infini
23,36
37,83
Bootstrap 9
6 RÉDUCTION DU BIAIS
En ce qui concerne la moyenne, on voit que l’écart-type bootstrap est proche de
l’estimateur usuel. Pour la médiane, on constate qu’elle est plus dispersée.
6
Réduction du biais
Dans l’exemple précédent, on estimait une moyenne par la moyenne observée, et on
sait bien que dans ce cas on n’a aucun problème de biais. Par contre dans beaucoup
de cas, même l’estimateur du maximum de vraisemblance a un biais. On peut utiliser
le bootstrap pour réduire ce biais. Supposons que l’on veuille estimer
Z
r
θ(F ) = [ xdF (x)]
à partir d’un échantillon auquel est associé F0 . On choisit l’estimateur
Z
r
d
θ(F ) = θ(F0 ) = [ xdF0 (x)]
Quel est son biais ? Par définition
Biais = E{θ(F ) − θ(F0 ) | F }
Comme on ne connaı̂t pas F , on utilise le principe du bootstrap en remplaçant dans
cette équation F par F0 et F0 par F1 , où F1 est la loi associée à un n-échantillon d’une
variable de loi F0 :
d = E{θ(F0 ) − θ(F1 ) | F0 }
Biais
Donc l’estimateur sans biais de θ s’obtient en retranchant à θ(F0 ) cet estimateur
de son biais, soit:
d
Estimateur sans biais de θ = θ(F0 ) − Biais
Pour obtenir un estimateur sans biais, on doit donc ajouter t à θ(F0 ) où t est défini
par
E(θ(F0 ) − θ(F ) + t) = 0
(1)
On a donc remplacé l’équation initiale qui donne la correction t que l’on devrait
d0 ) par une équation bootstrap qui
faire pour supprimer le biais de l’estimateur θ(F
∗
donne une correction t , en principe calculable, et dont on espère qu’elle est une
C.Huber
9
Bootstrap 10
6 RÉDUCTION DU BIAIS
bonne estimation de t. On remarque que t est un paramètre qui dépend de F alors
que t∗ est une statistique dépendant de F0 . De cette équation se déduit la correction
t∗ = θ(F0 ) − E(θ(F1 )|F0 ).
On doit donc calculer la quantité:
E(θ(F1 )|F0 ),
et l’estimateur sans biais est alors égal à:
θ(F0 ) + t∗ = 2θ(F0 ) − E(θ(F1 )|F0 ).
Prenons un exemple concret : On n’a aucun renseignement sur F , on veut estimer
E(X)2 et on dispose de 3 observations : x1 = 1, 2; x2 = 2, 5; x3 = 1, 1. Donc
Z
2
θ(F ) = xdF (x)
On est dans un cas non paramétrique. F0 est donc la f.r. empirique qui donne à
chacune des trois valeurs ci-dessus la probabilité 1/3 et donc
θ(F0 ) = [(1.2 + 2.5 + 1.1)/3]2 = 2, 560.
F1 peut prendre 10 valeurs différentes: en effet, quand on tire un échantillon de taille
n = 3 de la loi F0 , tout se passe comme si on tirait trois fois avec remise dans une
urne à trois boules numérotées 1.1 1.2 et 2.5. Chaque tirage peut être résumé par le
nombre de fois qu’on a tiré chacune des trois boules:
Fréquences
1.1
3
2
2
1
1
1
0
0
0
0
1.2
0
1
0
1
2
0
2
1
3
0
2.5
0
0
1
1
0
2
1
2
0
3
probabilité
θ
(1/3)3
(1/3)2
(1/3)2
2/9
(1/3)2
(1/3)2
(1/3)2
(1/3)2
(1/3)3
(1/3)3
1.210
1.284
2.454
2.560
1.361
4.134
2.667
4.271
1.440
6.250
On en déduit E(θ(F1 )|F0 ) = 1.21/27 + 1.44/9 + 2.56/9 + ... = 2.6955. L’estimateur sans
biais est donc égal à 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
Bootstrap 11
6 RÉDUCTION DU BIAIS
que, même pour un cas aussi simple où la taille n de l’échantillon est égale à 3, il y a
un grand nombre de tirages possibles pour F1 .
Exercice 3:
1. Si au lieu de 3 valeurs, on avait observé un échantillon de taille n = 4, combien
de tirages F1 distincts peut on faire ?
2. Même question pour n = 5.
3. Même question pour n quelconque lorsque l’échantillon initial consiste en m
valeurs distinctes.
Indication:
Le nombre des configurations distinctes de F1 est égal au nombre de manières distinctes
de répartir n boules dans m cases.
Remarque: Comme F0 est une loi discrète, la loi de θ(F1 ) est, elle aussi, discrète. On
remarque cependant que, même avec seulement 3 observations, on obtient pour θ(F1 )
une loi beaucoup plus étalée. Ce phénomène ne fait que s’accentuer quand on augmente
n. En particulier, on pourra constater, après avoir fait l’exercice précédent, que le nombre des tirages F1 possibles lorsqu’on a 10 observations distinctes pour l’échantillon
initial, est déjà très grand : 92 378. Et le mode a pour probabilité 0,00036, ce qui est
très faible. Donc, la loi, sous F0 d’une fonctionnelle θ(F1 ) , bien qu’elle soit en principe
discrète, est en général très proche d’une loi continue. On se sert de cette remarque
quand on veut construire des intervalles de confiance.
Exercice 4:
On considère un n-échantillon (X1 , . . . , Xn ) 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éthode du bootstrap pour réduire le biais ?
Indication:
La loi initiale est F = U[0θ] . F0 = U[0,max(Xi )] et F1 = U[0,max(Xi ∗ )]
C.Huber
11
Bootstrap 12
7 INTERVALLE DE CONFIANCE
7
Intervalle de confiance
Soit F la loi inconnue, dont on veut estimer le paramètre θ(F ) par un intervalle de
confiance à 0,95 et F0 la loi associée à l’échantillon observé. θ(F0 ) est l’estimateur
de θ(F ). Soit F la loi inconnue, dont on veut estimer le paramètre θ(F ) par un
intervalle de confiance à 0,95 et F0 la loi associée à l’échantillon observé. θ(F0 ) est
un estimateur de θ(F ). Pour obtenir, à partir de θ(F0 ), un intervalle de confiance (en
général asymétrique) pour θ(F ), on a besoin de connaı̂tre la loi de θ(F ) − θ(F0 ), 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 t1 = t0 .025 et t2 = t0 .975 les quantiles
0.025 et 0.975 de cette loi: [θ(F0 ) + t1 ; θ(F0 ) + t2 ]. En effet:
P (θ(F ) − θ(F0 ) < t1 )
= 0.025
P (θ(F ) − θ(F0 ) > t2 )
= 0.025
P (θ(F0 ) + t1 ≤ θ(F ) ≤ θ(F0 ) + t2 ) = 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ès compliqués, le bootstrap
permet de lui substituer la loi de θ(F0 ) − θ(F1 ) sous F0 . Comme F0 est cette fois
connue, cette loi est, en principe, une loi discrète complètement 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éalité, pour les tailles
d’échantillon usuelles, le calcul exact serait trop long (voir ci-dessus ce que cela
donne dans le cas n = 3) et on doit donc procéder par simulation pour évaluer
cette loi bootstrap, ou pour évaluer ses paramètres d’intérêt pour le problème
considéré.
Supposons que l’on cherche maintenant un intervalle symétrique par rapport à
θ(F0 ), qui est par exemple la moyenne observée s’il s’agit de la moyenne, la médiane
observée s’il s’agit de la médiane, etc... En utilisant toujours le même principe du
bootstrap, au lieu de t tel que
P (θ(F0 ) − t ≤ θ(F ) ≤ θ(F0 ) + t|F ) = 0, 95
C.Huber
12
Bootstrap 13
7 INTERVALLE DE CONFIANCE
on va chercher t∗ tel que
P (θ(F1 ) − t∗ ≤ θ(F0 ) ≤ θ(F1 ) + t∗ | F0 ) = 0, 95
Dans cette dernière expression, F0 étant connu, θ(F0 ) est connu. Il s’agit donc de
déterminer la loi de θ(F1 ) où F1 est échantillonné à partir de F0 . On pourra par
exemple penser à l’échantillon ci-dessus, θ étant la médiane ou le carré de la moyenne,
etc.. . On trouve dans ce cas très facilement la loi de θ(F1 ) car la taille de l’échantillon
est très faible : n = 3. Lorsque n est plus grand, cela devient compliqué et on utilise la
loi des grands nombres: On rééchantillonne B fois, en faisant chaque fois n tirages sans
remise dans l’échantillon initial. On obtient ainsi B nouveaux échantillons de taille n:
X1∗ , X2∗ , . . . , XB∗
et B valeurs de la statistique bootstrap θ(F1 ):
(θ(X ∗ 1 ), θ(X ∗ 2 ), . . . , θ(X ∗ B ))
Ces valeurs dessinent progressivement la loi de θ(F1 ) et si on pouvait faire tendre
B vers l’infini, on aurait exactement la loi de θ(F1 ). En général, on choisit des valeurs
de B de l’ordre de 50 à 200 (voir Efron, 1993).
Remarque : Nous avons vu que, dans le cas non paramétrique, θ(F1 ) a une loi
discrète, et, par conséquent, une valeur exactement égale à 0,95 n’est généralement pas
atteignable. Nous avons cependant aussi remarqué que, très vite quand n croı̂t, la loi
F1 se diversifie et les atomes ne portent pas beaucoup de probabilté chacun. Par contre, dans le cas d’une loi paramétrique continue, l’équation ci-dessus peut se résoudre
exactement : il n’y a pas de saut de la probabilité qui régit θ(F1 ).
Exemple:
Prenons la loi exponentielle F = E(λ) de fonction de répartition F (x) = exp (−x/λ) et
θ(F ) = λ. L’estimateur du maximum de vraisemblance de λ est la moyenne empirique
(on pourra le vérifier à titre d’exercice):
λ̂ = X̄
Donc
F0 = 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ême paramètre λ et donc c’est une loi gamma Γ(n, λ)(on pourra le
vérifier ). L’équation qui donne l’intervalle de confiance bootstrap
P (θ(F 1) − t∗ ≤ θ(F0 ) ≤ θ(F1 ) + t∗ |F0 ) = 0, 95
C.Huber
13
Bootstrap 14
7 INTERVALLE DE CONFIANCE
s’écrit ici:
P (Y /n − t∗ ≤ X ≤ Y /n + t∗ | Γ(n, X)) = 0.95
Le deuxième paramètre de la loi gamma est un paramètre d’échelle. En divisant
tout par ce paramètre, qui est connu puisqu’il est égal à la moyenne observée, on
obtient:
P (|Y ′ /n − 1| ≤ t∗ /X | Γ(n, 1)) = 0, 95
où Y ′ suit la loi gamma Γ(n, 1). Une table de la loi gamma suffit donc maintenant
pour calculer t∗ . Notons g0,95 le quantile vérifiant:
P (|Y ′ /n − 1| ≤ g0,95 ) = 0, 95.
Alors, t∗ = X0,95 et l’intervalle de confiance ”bootstrapé” pour la moyenne d’une loi
exponentielle est finalement:
[X̄ − g0,95 × X̄; X̄ − g0,95 × X̄]
Exercice 5: Faire le même calcul dans le cas où la loi exponentielle est remplacée
par la loi normale N (µ, σ 2 ). On note λ = (µ, σ 2 ) et on veut un intervalle de confiance
pour la moyenne, c’est à dire que θ(F ) = µ.
Exercice 6: Bootstrap pour des durées censurées
Lorsqu’on a affaire à des durées de survie censurées, les observations se présentent
sous la forme de couples (Ti , Di ), T étant la durée observée et D l’indicateur de censure. Deux types de bootstrap peuvent alors être envisagés: le bootstrap simple et le
bootstrap évident. Le premier consiste à faire un tirage au hasard dans les couples, le
second à faire un tirage selon les fonctions de survie de Kaplan-Meier pour la durée de
vie et pour la censure. On essaiera les deux méthodes sur un exemple.
C.Huber
14
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.
1.
2.
3.
4.
Choisir une initialisation de l'aléa.
Tirer un échantillon de taille n = 47 de y, avec remise.
Calculer la médiane de l'échantillon ainsi obtenu.
Stocker la médiane de l'échantillon Bootstrap dans un vecteur appelé boot.
Retourner en 1.
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
15
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}
Mean
8.448
3rd Qu. Max.
9.2
12
0
100
200
300
summary(boot.1)
# Min. 1st Qu. Median
#
6.7
7.8
8.2
var(boot.1)
# 0.8955927
hist(boot.1)
6
7
8
9
10
11
12
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
16
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
median
8.2 0.2832 8.483
SE
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
17
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)
Density
0.0
0.2
0.4
0.6
0.8
median
6
7
8
9
10
11
12
Value
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
18
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*(1a/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
19
Catherine Huber
summary(boot.var)
# Min.
1st Qu. Median
# 13.78
59.85
88.28
Mean
91.07
3rd Qu. Max.
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
20
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
44
35
41
31
61
61
44
58
52
52
52
40
49
34
37
63
28
40
51
33
37
33
41
38
52
31
44
31
40
36
42
28
40
40
35
32
31
52
45
39
40
48
29
56
53
47
30
64
31
35
65
43
53
58
67
53
age
124
110
114
100
190
130
130
110
120
120
130
120
130
120
115
140
138
115
148
120
110
132
112
114
100
114
110
108
110
110
136
124
120
150
100
120
110
130
110
106
130
110
110
141
90
90
114
140
130
120
130
122
120
138
168
120
sbp
80
70
80
80
110
88
94
74
80
80
80
90
75
80
70
90
80
82
110
70
70
90
80
70
78
80
80
70
74
80
82
82
85
100
70
80
80
90
80
80
90
70
70
100
55
60
76
90
88
88
90
82
80
82
105
80
dbp chol height wt coron
254 70 190 0
240 73 216 0
279 68 178 0
284 68 149 0
315 68 182 1
250 70 185 0
298 68 161 0
384 67 175 0
310 66 144 0
337 67 130 0
367 69 162 0
273 68 175 0
273 66 155 0
314 74 156 0
243 65 151 0
341 74 168 0
245 70 185 0
302 69 225 0
302 69 247 1
386 66 146 0
312 71 170 1
302 69 161 0
394 69 167 0
358 69 198 0
336 70 162 0
251 71 150 0
322 68 196 1
281 67 130 0
336 68 166 1
314 73 178 0
383 69 187 0
360 67 148 0
369 71 180 0
333 70 172 0
253 68 141 0
268 68 176 0
257 71 154 0
474 69 145 0
391 69 159 1
248 67 181 0
520 68 169 1
285 66 160 1
352 66 149 0
428 65 171 1
334 68 166 0
278 69 121 0
264 73 178 0
243 71 171 1
348 72 181 0
290 70 162 0
370 65 153 1
363 69 164 0
343 71 159 0
305 67 152 1
365 68 190 1
307 70 200 0
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
21
Catherine Huber
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
42
43
52
68
64
46
41
58
50
45
59
56
59
47
43
37
27
44
41
33
29
24
36
23
47
26
45
41
55
34
51
58
51
35
34
26
25
44
57
67
59
62
40
52
28
34
43
38
45
26
35
51
55
45
69
58
64
70
27
53
28
29
23
40
53
25
63
134
115
110
110
105
138
120
130
160
100
156
120
126
110
95
120
100
110
120
120
115
120
108
110
120
110
130
164
125
110
110
120
118
110
118
120
110
100
130
110
160
130
140
120
130
115
122
125
110
120
112
120
120
130
160
140
190
190
112
155
115
110
120
120
160
110
130
90
75
75
80
68
90
90
90
110
70
90
92
96
80
70
74
60
80
80
80
80
80
66
78
80
75
90
110
88
80
75
80
88
75
78
70
75
70
85
80
90
88
90
90
80
80
78
80
80
84
90
90
82
90
90
90
100
112
78
104
65
80
82
78
90
75
90
243
266
341
268
261
378
279
416
261
332
337
365
292
304
341
317
296
390
274
355
225
218
298
178
341
274
285
259
266
214
267
256
273
348
322
267
270
280
320
320
330
274
269
269
135
403
294
312
311
222
302
269
311
286
370
403
244
353
252
453
260
269
235
264
420
235
420
67
68
69
62
66
67
70
68
66
67
67
65
67
67
69
74
67
66
69
68
70
69
67
66
70
70
65
66
67
67
66
67
64
72
69
70
74
65
69
64
63
69
63
68
67
69
68
71
69
72
67
70
71
73
67
66
66
66
68
66
66
68
65
71
67
69
69
147
125
163
138
108
142
212
188
145
144
158
154
148
155
154
184
140
167
138
169
186
131
160
142
218
147
161
245
167
139
150
175
123
174
192
140
195
144
193
134
144
179
111
164
168
175
173
158
154
214
176
262
181
143
185
140
187
163
164
170
150
141
135
135
141
148
160
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
1
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
22
Catherine Huber
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
48
36
28
57
39
52
51
37
28
44
35
41
29
46
55
32
40
61
29
52
25
27
27
53
42
64
27
55
33
58
51
37
47
49
46
40
26
28
23
52
42
27
29
43
34
40
28
30
34
26
34
35
34
45
47
54
30
29
48
37
43
31
48
34
42
49
50
110 78 277 71 180 1
120 80 319 70 157 0
120 86 386 70 189 1
110 68 353 71 166 0
110 80 344 66 175 0
130 90 210 65 172 1
140 90 286 67 134 0
120 90 260 67 188 0
110 75 252 67 149 0
120 90 336 72 175 0
100 70 216 66 126 0
100 65 208 69 165 0
120 80 352 68 160 0
125 90 346 63 155 0
148 90 259 71 140 0
100 70 290 70 181 0
125 90 239 67 178 0
154 80 333 66 141 0
100 60 173 69 143 0
110 80 253 70 139 0
120 80 156 67 136 0
110 70 156 67 150 0
130 90 208 69 185 0
130 80 218 73 185 0
120 80 172 68 161 0
115 75 357 67 180 0
130 90 178 74 198 0
110 70 283 70 128 1
120 80 275 67 177 0
110 80 187 71 224 0
110 80 282 71 160 0
134 80 282 71 181 0
120 70 254 65 136 0
120 90 273 71 245 0
150 104 328 71 187 0
110 70 244 70 161 1
110 80 277 74 190 0
110 70 195 73 180 0
108 68 206 71 165 0
125 90 327 65 147 0
110 75 246 67 146 0
115 88 203 70 182 0
120 80 185 72 187 0
122 78 224 66 128 0
110 70 246 68 140 0
120 80 227 67 163 0
115 70 229 70 144 0
115 70 214 71 150 0
108 75 206 71 137 0
120 80 173 67 141 0
135 90 248 70 141 0
100 70 222 73 190 0
110 60 230 73 167 0
100 70 219 69 159 0
120 80 239 67 157 0
134 90 258 66 170 0
110 80 190 69 132 0
110 80 252 68 155 0
110 80 253 72 178 0
120 88 172 71 168 0
138 94 320 65 159 1
124 90 166 67 160 0
140 85 266 71 165 0
110 80 176 72 194 0
130 80 271 70 191 1
122 94 295 73 198 0
130 85 271 68 212 1
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
23
Catherine Huber
191
192
193
194
195
196
197
198
199
200
42
50
60
27
29
29
49
49
50
31
120 80 259 64 147 0
140 95 178 68 173 1
160 100 317 72 206 0
124 80 192 70 190 0
120 85 187 68 181 0
110 70 238 72 143 0
112 78 283 64 149 0
100 70 264 70 166 0
128 92 264 70 176 0
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
median
163
-0.0805
Mean
162.9
SE
2.081
Empirical Percentiles:
2.5% 5% 95% 97.5%
median 160 160 166
167
BCa Percentiles:
2.5% 5%
median 160 160
95%
166
97.5%
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
24
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
25
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 cidessous :
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
26
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
27
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((1coron)*(Fit<=ii*.02))/sum(1coron)
}
rocc
[,1]
[,2]
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
[8,]
[9,]
[10,]
[11,]
[12,]
[13,]
[14,]
[15,]
[16,]
[17,]
[18,]
[19,]
[20,]
[21,]
[22,]
[23,]
[24,]
1.00000000
1.00000000
0.96153846
0.92307692
0.73076923
0.69230769
0.61538462
0.57692308
0.46153846
0.38461538
0.38461538
0.34615385
0.34615385
0.26923077
0.19230769
0.19230769
0.11538462
0.11538462
0.11538462
0.11538462
0.11538462
0.07692308
0.00000000
0.00000000
1.000000000
0.850574713
0.706896552
0.568965517
0.454022989
0.339080460
0.270114943
0.241379310
0.189655172
0.155172414
0.132183908
0.109195402
0.097701149
0.074712644
0.068965517
0.051724138
0.040229885
0.040229885
0.034482759
0.017241379
0.011494253
0.011494253
0.005747126
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
5 4 3 2 1
7
6
rocc1 <- rocc[ord,]
rocc1
[,1]
[,2]
[1,] 0.00000000 0.005747126
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
28
Catherine Huber
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
[8,]
[9,]
[10,]
[11,]
[12,]
[13,]
[14,]
[15,]
[16,]
[17,]
[18,]
[19,]
[20,]
[21,]
[22,]
[23,]
[24,]
0.00000000
0.07692308
0.11538462
0.11538462
0.11538462
0.11538462
0.11538462
0.19230769
0.19230769
0.26923077
0.34615385
0.34615385
0.38461538
0.38461538
0.46153846
0.57692308
0.61538462
0.69230769
0.73076923
0.92307692
0.96153846
1.00000000
1.00000000
0.005747126
0.011494253
0.011494253
0.017241379
0.034482759
0.040229885
0.040229885
0.051724138
0.068965517
0.074712644
0.097701149
0.109195402
0.132183908
0.155172414
0.189655172
0.241379310
0.270114943
0.339080460
0.454022989
0.568965517
0.706896552
0.850574713
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")
0.6
0.4
0.0
0.2
Sensibilite
0.8
1.0
COURBE ROC POUR LE MODELE LOGISTIQUE :
coron ~ age + weight
0.0
0.2
0.4
0.6
0.8
1.0
1-Specificite
#
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
29
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
30
Catherine Huber
roca <- roca + delta * ((rocc1[ii,1]+rocc1[ii1])/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)
4
0
2
Density
6
8
Param
0.60
0.65
0.70
0.75
0.80
0.85
Value
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
31
Catherine Huber
0.75
0.70
0.60
0.65
Quantiles of Replicates
0.80
0.85
Param
-2
0
2
Quantiles of Standard Normal
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 H0 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)| H0 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)| H0 est vraie]
où X* représente l'échantillon bootstrap qui suit la loi de X* sous H0 et sachant x. Il
reste à déterminer la loi de T(X*) sous H0 et sachant x.
Exemple 5
Les données concernent la survie de rats traités (z) et témoins (y):
Groupe
Survie (jours)
traités z:
94 197 16 38 99 141 23
non traités y:52 104 146 10 51 30 40 27 46
T ( z, y ) =
zˆ − yˆ
σˆ 1 / n + 1 / m
ou `σˆ =
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
(∑
n
i =1
32
moyenne
86.86
56.22
écart type
25.24
14.14
( z i − z ) 2 + ∑i =1 ( y i − y ) 2 )
m
)
1/ 2
Catherine Huber
Pour tester Ho: F=G contre H1: moyenne(G)> moyenne(F), on rejette Ho si T(Z,Y)>
constante. Le dds du test est P[T(Z,Y) > T(z,y)| H0]. Sous H0, 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 F0. 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)+(n1)*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)+(n1)*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
33
Catherine Huber
0
50
100
150
200
Histogramme de la distribution Bootstrap
de T(z,y)
-4
-2
0
2
4
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
H0 : E(Z) = 129.0,
contre
H1: E (Z) < 129.0
au seuil alpha = 0.05.
Sous H0, 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:
z ' i = z i − z + 129.0
2.Pour chaque échantillon bootstrap z’* on calcule la valeur de t
t ( z '*) =
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
z '* − 129.0
var( z34
'*) / 7
Catherine Huber
3. Le degré de signification pour le test bootstrap t de H0 contre H1:
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.
z − 129.0
86.9 − 129.0
tt =
=
= −1.67
var( z ) / 7
66.8 / 7
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[t6<-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.
bootstrap_6exemples_pratiques_splus_et_r_papier.doc
35
Catherine Huber
#################################################################
#####
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
36
Catherine Huber
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
37
Catherine Huber
###############################################################
######
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
38
Catherine Huber
###################################################
# 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
39
Catherine Huber
####
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
40
Catherine Huber
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
41
Catherine Huber
}
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_3_en_R.doc
42
Catherine Huber
Exemple d'un cas où le bootstrap ne marche pas bien:
Estimation du paramètre θ d'une loi uniforme sur [0 θ].
Xi de loi uniforme sur [0 θ] :
U[0 θ]
Echantillon X1, X2,...,Xn
Problème : estimer θ
Estimateur MV : theta.hat = x(n)
le maximum des xi.
On connaît la loi de X(n) = max (X1, X2, ..., Xn).
La fonction de répartition de l'estimateur est
F (y) = P(X(n) < y) = (y/ θ)n
et la densité :
f(y) = nyn-1 / θn
sur [0 θ] .
Tirage d'un échantillon:
uniforme sur [0 1]
de taille n =100
set.seed(2)
theta
<n
<delta
1
100
<- 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
43
Catherine Huber
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-1trunc((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
44
Catherine Huber
120
100
80
60
0
20
40
densite du max
0.90
0.92
0.94
0.96
0.98
1.00
x
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
45
Catherine Huber
Donc p → 1 - e
– 1
=
0.6321206 .
Soit F une fonction de répartition de support [0 θ]
Si on considère la statistique:
Rn(X | F) = n(θ – X(n))/ θ
sa version bootstrap est
Rn*(X* | Fn) = n(X(n) – X*(n))/ X(n)
On voit que
P(Rn* = 0 | Fn) = 1 – exp(-1) = 0.6321
P(Rn = 0 | F ) = 0
Si F est la loi uniforme sur [0 θ],
la loi asymptotique de Rn(X | F) est la loi
exponentielle de paramètre 1:
P(Rn>x)
= P (n(θ – X(n))/ θ >x)
= P(X(n)<(nθ- θx)/n))
= (1-x/n)n
→
e-x
Alors que la loi asymptotique de Rn*(X* | Fn) ne peut
pas converger vers la loi exponentielle de paramètre
1.
cours_bootstrap_4_uniform_counterexample.doc
46
Catherine Huber

Documents pareils