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
47
Embed
Le Bootstrap · 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
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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 methode de reechantillonnage:
le bootstrap.
Catherine Huber
Le terme de reechantillonnage, ou, en anglais, ”bootstrap” , qui evoque l’actionde ”se hisser en tirant sur ses propres lacets”, designe un ensemble de methodes quiconsistent a faire de l’ inference statistique sur de ”nouveaux” echantillons tires a par-tir d’un echantillon initial. Disposant d’un echantillon destine a donner une certaineinformation sur une population, on tire au sort, parmi la sous-population reduite acet echantillon, un nouvel echantillon de meme taille n. Et on repete cette operationB fois, ou B est grand. On analyse ensuite les nouvelles observations ainsi obtenuespour affiner l’inference faite sur les observations initiales. A priori, on peut avoir desdoutes sur l’efficacite d’une telle methode et penser qu’il n’y a aucune ameliorationa esperer en reechantillonnant a partir du meme echantillon. En effet, aucune infor-mation supplementaire ne peut etre esperee, toute l’information etant contenue dansl’echantillon initial. Cependant, comme on va le voir, ce reechantillonnage, s’il ne ra-joute aucune information, permet, dans certains cas, d’extraire de l’echantillon de basel’information souhaitee.
Partie I
Le principe.
1 Illustration
Le principe qui sous-tend le bootstrap est tres simple et tres ancien, et il peut etreillustre par un systeme d’emboıtement (P. Hall, 1992) tel que celui des poupees russes:
1
1 ILLUSTRATION Bootstrap 2
il s’agit d’une poupee qui, lorsqu’on l’ouvre, laisse apparaıtre une poupee identiquemais plus petite (”homothetique”), qui a son tour contient une poupee plus petite,etc... . Imaginons que l’on veuille estimer le nombre r des taches de rousseur de lapremiere de ces poupees, 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 premiere, et quicontient toutes les autres. Soit ro le nombre des taches de rousseur de la seconde. Onpeut, en premiere approximation, estimer r par ro. On appelle ’Poupee’ la plus grandepoupee, non observee, ’poupee 0’ celle qui est observee, ’poupee 1’ celle qu’on trouvedans la poupee 0, et ainsi de suite pour toutes les poupees plus petites que la poupee1, qui sont toutes observables puisque contenues dans la poupee 1.
Comme la Poupee initiale est plus grande que la poupee numero 0, on s’attend ace que r soit plus grand que ro et dans le rapport de leurs tailles. Cependant, on nepeut pas observer la premiere poupee et on ne connaıt donc pas sa taille. En revanche,on peut observer le nombre des taches de rousseur r1 de la troisieme poupee. Donc, sile rapport du nombre des taches de rousseur d’une poupee a la suivante est toujoursle meme, le rapport ro/r1 , qui, lui, est observable, fournira une estimation du rapportr/ro. Cela donne comme estimateur de r :
r = r0r0
r1
.
Mais il se peut que le rapport de ces nombres ne soit pas constant, ce que l’on peutverifier en comparant ro/r1 a r1/r2 par exemple, puisque ces deux quantites sont observ-ables. Si ces deux quantites ne sont pas egales, ro/r1 ne constitue qu’une approximationpour la valeur de r/r0.Pour effectuer une correction supplementaire, si on peut supposer que le rapport destailles d’une poupee a la suivante, bien que n’etant plus constant, varie regulierement,par exemple les rapports de taille d’une poupee a la suivante sont dans un rapportconstant, c’est a dire que
r/r0
r0/r1
=ri−1/ri
ri/ri+1
,
alors, on peut effectuer une correction supplementaire en observant r2 sur la poupeesuivante et en prenant pour estimateur de r la valeur precedente multipliee par
(r0/r1)/(r1/r2),
ce qui donne :
r = r0 (r0
r1
)2 r2
r1
On peut a nouveau verifier si l’hypothese faite sur la variation des rapports est exacteen considerant la poupee suivante, et, dans le cas contraire, effectuer une nouvellecorrection.
C.Huber 2
2 ELIMINATION DU BIAIS Bootstrap 3
2 Elimination du biais
L’un des emplois les plus frequents du bootstrap est d’eliminer le biais d’un estimateurde la maniere suivante : Soit T un estimateur de θ, parametre de la loi F communeaux Xi constituant l’observation X = (X1, · · · , Xn)). Son biais est
b(T ) = E(T |F ) − θ
en notant E( | F ) la moyenne (l’esperance) pour la loi F , car cette notation seracommode dans la suite. On estime ce biais par
b∗(T ) = E(T ∗|X) − T
ou T ∗ est calcule sur un echantillon bootstrap X∗ issu de l’echantillon initial X, etE(T ∗|X) signifie la moyenne de T ∗ pour la loi empirique determinee par X, c’est a direla loi qui attribue la probabilite 1/n a chacune des valeurs observees xi, i = 1, · · · , n.L’estimateur T est ensuite ”corrige de son biais” et donc remplace par :
T − b∗(T ) = 2T − E(T ∗|X)
Comme T − b(T ) est sans biais pour θ, T − b∗(T ) sera presque sans biais. Prenons unexemple. Supposons que l’on veuille estimer la moyenne µ d’une population pour unevariable aleatoire dont la fonction de repartition est F , inconnue, soit :
µ =
∫xdF (x)
et que l’on dispose pour cela d’un echantillon X = (X1, , Xn) de n observationsindependantes et equidistribuees selon F . Comme on l’a dit, la loi empirique est cellequi attribue la probabilite 1/n a chacune des n observations. Designons par F0 safonction de repartition, appelee fonction de repartition empirique:
F0(x) =
∑n
i=1 1{xi ≤ x}
n
On peut, pour estimer µ, utiliser la meme quantite (on dit la meme ’fonctionnelle’)que ci-dessus, en remplacant F , qui est inconnue, par la fonction de repartition em-pirique F0 qui, elle, est connue. On estime donc µ par
µ = X =
∫xdF0(x) =
∑i Xi
n
qui est la moyenne observee sur l’echantillon ou moyenne empirique. Dans l’exempleconsidere, on sait que l’estimateur ainsi obtenu est sans biais. Mais supposons main-tenant que l’on veuille estimer un autre ’parametre’, c’est a dire une autre fonctionnellede la loi F , par exemple
C.Huber 3
3 NOTATIONS Bootstrap 4
µr = (
∫xdF (x))r.
On pourra verifier que l’estimateur correspondant
µr = (X)r
= (
∑i Xi
n)r
n’est pas sans biais en general, sauf si r = 1. Comment peut on le corriger pour qu’ildevienne 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{[
∫xdF0(x)]r − [
∫xdF (x)]r | F}
Comme dans le calcul du biais intervient F qui est inconnue, on peut appliquer anouveau le principe initial et remplacer dans cette expression F par F0 et donc F0 parF1 obtenu par un nouvel echantillonnage a partir de F0 , c’est a dire par echantillonnagea partir de l’echantillon.
L’analogie avec les poupees russes est la suivante : la population initiale, non ob-servable, de distribution F correspond a la grande Poupee, et l’echantillon observe, dedistribution F0, a la plus grande des poupees observees, la poupee numero 0. Mais alorsa quoi correspond la poupee numero 1 , que l’on decouvre en ouvrant la poupee numero0 ? Eh bien, et c’est la le principe du bootstrap, on l’obtient en effectuant, a partir del’echantillon, de loi F0, considere maintenant comme nouvelle population initiale, unnouvel echantillon, de meme taille n , appele echantillon bootstrap et note X∗. Commeon aura en general B echantillons bootstrap, on les notera X∗
b , avec b variant de 1 aB quand on aura besoin de les distinguer. On dit que ”on reechantillonne”.
Partie II
Notations et remarques.
3 Notations
L’echantillon initial est note
X = (X1, ..., Xn)
et F0 la loi empirique associee. Les echantillons obtenus par reechantillonnage ou”reechantillons”, ou ”echantillons bootstrap” sont notes
X∗ = (X∗
1 , ..., X∗
n).
C.Huber 4
4 REMARQUES Bootstrap 5
Les echantillons X∗ sont des echantillons fondes sur F0. On notera indifferemment:
P (X∗
j = Xi|X) = 1/n , 1 ≤ i, j ≤ n.
ouP (X∗
j = Xi|F0) = 1/n , 1 ≤ i, j ≤ n.
car des qu’on connaıt X on peut en deduire F0 et reciproquement.
4 Remarques
1. Problemes parametriques et non parametriques:
La loi F0 associee a l’echantillon peut etre, comme dans l’exemple ci-dessus del’estimation d’une moyenne, la loi empirique. C’est le cas lorsqu’on a affaire a unprobleme non parametrique. Mais la loi F0 peut etre une loi issue d’un modeleparametrique: les parametres, qu’on notera λ dans la suite, sont alors estimes enemployant le modele, en principe par maximum de vraisemblance, et alors F0 estla loi appartenant au modele, dont les parametres sont ceux estimes a partir del’echantillon.
2. Parametres et fonctionnelles :
On a vu que pour estimer une fonctionnelle T(F) de la distribution inconnueF on remplacait F , dans le cas non parametrique, par la loi empirique F0 as-sociee a l’echantillon. Mais si par exemple on veut estimer un parametre commele centre de symetrie d’une loi symetrique, ce centre de symetrie peut corre-spondre a plusieurs fonctionnelles differentes: la moyenne, la mediane de F etbeaucoup d’autres encore; par exemple les moyennes α-tronquees. Ces dernieressont obtenues en prenant la moyenne des observations qui restent lorsqu’on a oteles plus grandes et les plus petites, en proportion α. Il est donc necessaire de direprecisement quelle est la fonctionnelle que l’on veut estimer.
3. Approximation d’une statistique bootstrap :
Il faut bien distinguer deux elements differents dans les methodes bootstrap :
• Le principe lui-meme, illustre par les poupees emboıtees, et qui consiste aremplacer la loi initiale inconnue par une loi associee a l’echantillon observe,et toutes les lois derivees necessaires. Le (ou les) parametre(s) d’interetest (sont) ainsi remplace(s) par une statistique ”bootstrap”, en principecompletement calculable(s).
C.Huber 5
Bootstrap 6
• Le calcul proprement dit de la statistique bootstrap : bien que la statistiquebootstrap soit en principe completement calculable, souvent son calcul ef-fectif serait trop long. Il s’agit en general d’esperances fondees sur la loiF0 et des derivees de cette loi. Aussi, Efron a-t-il suggere de le faire parune methode de type Monte-Carlo qui consiste a reechantillonner a partir del’echantillon initial, obtenant des echantillons de meme taille n. Si le nombredes reechantillonnages est assez grand, on aura une bonne approximation del’esperance cherchee a cause de la loi des grands nombres.
Partie III
Simulations.
Etant donnee une loi de probabilite sur IR de fonction de repartition F , on peut ”in-venter” un echantillon de n observations d’une variable aleatoire reelle X de loi F enfaisant n tirages independants 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 generateur de nombres au hasard. Un tel generateur est inclus dans tousles langages de programmation et dans tous les logiciels. A partir de cet echantillonuniforme simule (U1, . . . , Un), on peut ensuite construire un echantillon simule pourn’importe quelle loi F en remarquant que:
X = F−1(U)
a F pour fonction de repartition, comme on pourra aisement le verifier, en particulierdans le cas ou 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 echantillon de la loi F .Exercice 1
Comment generer un echantillon de taille n = 10 d’une variable exponentielle de
parametre 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 procedeautrement. On a remarque en effet, que, si U et V sont deux variables uniformes sur[0; 1] et independantes, la variable :
X = cos(2πU)√
(−2 log(V ))
C.Huber 6
5 EVALUATION DE LA PRECISION 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 vraieF , qui n’est en general pas connue, mais de la loi empirique Fn qui a ete observee.
Partie IV
Deux applications fondamentales du bootstrap:
Les deux applications fondamentales du bootstrap sont la reduction du biais et ladetermination d’intervalles de confiance. Nous allons commencer par presenter un ex-emple donne par Efron, qui est celui qui a le premier mis en valeur les possibilites decette methode, connue depuis longtemps mais non exploitee, notamment a cause dutemps de calcul qu’elle implique.
5 Evaluation de la precision d’une estimation
Voici un exemple propose par Efron:A l’origine, le bootstrap a ete employe pour evaluer la precision d’un estimateur. Parexemple, lors d’un petite experimentation sur des souris, on a tire au sort parmi 16souris, 7 qui recoivent le nouveau traitement alors que les 9 autres sont des controlesles qui recoivent un placebo. Leurs durees de vie sont mesurees, en jours, et donnentles resultats suivants :
On a l’impression que le traitement assure une meilleure survie que le placebo, carles durees moyennes observees sont respectivement : 86,86 et 56,22. Mais les deuxechantillons sont petits et la precision de ces deux estimateurs des deux vraies moyennescertainement tres mauvaise. Comment mesurer cette precision ? Si l’on disposait d’une
C.Huber 7
5 EVALUATION DE LA PRECISION 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 (µ,s2
n)
Mais les tailles d’echantillon sont trop faibles pour cela. De plus, si au lieu decomparer les moyennes, on comparait les medianes, qui sont ici respectivement 94 et46, que faire pour en estimer la precision et savoir a quel point elles sont effectivementdifferentes ? Commencons par considerer le cas des souris traitees. Eh bien, si leprincipe du bootstrap est valable, c’est a dire si on peut remplacer la loi inconnue Fde X par la loi observee F0 ( sur le 7-echantillon) et l’echantillon initial X lie a F0 parl’echantillon bootstrap X∗ et la loi associee F1 , on a l’identification suivante :
L(X | F ) ≈ L(X∗ | F0)
Comme F0 est connue, la loi de X∗ s’en deduit completement, et donc aussi la loi dela moyenne de X∗. Si on prend les quantiles 0,025 et 0,975 de cette loi, on sait qu’avecune probabilite de 0,95 cette moyenne va rester entre ces deux valeurs. De meme pourla mediane ou n’importe quelle autre statistique. On peut remarquer aussi qu’au lieude s’interesser aux deux quantiles 0,025 et 0,975 de la moyenne pour voir a quel pointelle est precise, on peut vouloir estimer l’ecart-type de la moyenne, ( ou de la mediane,d’ailleurs). On procedera de la meme facon : par remplacement de l’ecart-type cherchepar l’ecart-type de la statistique bootstrap. Dans l’equation (*), le membre de droiteest en principe completement calculable mais en pratique il est en general beaucoupplus simple de reechantillonner un grand nombre de fois :
X∗1, X∗2, . . . , X∗B
On reechantillonne B fois . Pour chaque echantillon X∗b, on calcule la statistiquequi nous interesse: soit la moyenne, soit la mediane, dans les cas envisages ici. Onobtient ainsi une loi empirique pour cette statistique, qui, si B est assez grand, est unebonne approximation de la vraie loi . L’estimateur bootstrap de l’ecart-type est donnepar
s∗ =
√
{
∑B
b=1 (X∗b −¯
X∗b)2
B − 1}
et voici ce que donne cette statistique pour differents nombres B de reechantillonnages.
En ce qui concerne la moyenne, on voit que l’ecart-type bootstrap est proche del’estimateur usuel. Pour la mediane, on constate qu’elle est plus dispersee.
6 Reduction du biais
Dans l’exemple precedent, on estimait une moyenne par la moyenne observee, et onsait bien que dans ce cas on n’a aucun probleme de biais. Par contre dans beaucoupde cas, meme l’estimateur du maximum de vraisemblance a un biais. On peut utiliserle bootstrap pour reduire ce biais. Supposons que l’on veuille estimer
θ(F ) = [
∫xdF (x)]
r
a partir d’un echantillon auquel est associe F0. On choisit l’estimateur
θ(F ) = θ(F0) = [
∫xdF0(x)]
r
Quel est son biais ? Par definition
Biais = E{θ(F ) − θ(F0) | F }
Comme on ne connaıt pas F , on utilise le principe du bootstrap en remplacant danscette equation F par F0 et F0 par F1, ou F1 est la loi associee a un n-echantillon d’unevariable de loi F0 :
Biais = E{θ(F0) − θ(F1) | F0 }
Donc l’estimateur sans biais de θ s’obtient en retranchant a θ(F0) cet estimateurde son biais, soit:
Estimateur sans biais de θ = θ(F0) − Biais
Pour obtenir un estimateur sans biais, on doit donc ajouter t a θ(F0) ou t est definipar
E(θ(F0) − θ(F ) + t) = 0 (1)
On a donc remplace l’equation initiale qui donne la correction t que l’on devrait
faire pour supprimer le biais de l’estimateur θ(F0) par une equation bootstrap quidonne une correction t∗ , en principe calculable, et dont on espere qu’elle est une
C.Huber 9
6 REDUCTION DU BIAIS Bootstrap 10
bonne estimation de t. On remarque que t est un parametre qui depend de F alorsque t∗ est une statistique dependant de F0. De cette equation se deduit la correctiont∗ = θ(F0) − E(θ(F1)|F0).
On doit donc calculer la quantite:
E(θ(F1)|F0),
et l’estimateur sans biais est alors egal a:
θ(F0) + t∗ = 2θ(F0) − E(θ(F1)|F0).
Prenons un exemple concret : On n’a aucun renseignement sur F , on veut estimerE(X)2 et on dispose de 3 observations : x1 = 1, 2; x2 = 2, 5; x3 = 1, 1. Donc
θ(F ) =
∫xdF (x)
2
On est dans un cas non parametrique. F0 est donc la f.r. empirique qui donne achacune des trois valeurs ci-dessus la probabilite 1/3 et donc
θ(F0) = [(1.2 + 2.5 + 1.1)/3]2 = 2, 560.
F1 peut prendre 10 valeurs differentes: en effet, quand on tire un echantillon de taillen = 3 de la loi F0 , tout se passe comme si on tirait trois fois avec remise dans uneurne a trois boules numerotees 1.1 1.2 et 2.5. Chaque tirage peut etre resume par lenombre de fois qu’on a tire chacune des trois boules:
On en deduit E(θ(F1)|F0) = 1.21/27+1.44/9+2.56/9+ ... = 2.6955. L’estimateur sansbiais est donc egal a 2 × 2.56 − 2.695 = 2.42(4). On voit clairement sur cet exemplecomment effectuer le calcul explicite d’une statistique bootstrap. Mais on voit aussi
C.Huber 10
6 REDUCTION DU BIAIS Bootstrap 11
que, meme pour un cas aussi simple ou la taille n de l’echantillon est egale a 3, il y aun grand nombre de tirages possibles pour F1.
Exercice 3:
1. Si au lieu de 3 valeurs, on avait observe un echantillon de taille n = 4, combien
de tirages F1 distincts peut on faire ?
2. Meme question pour n = 5.
3. Meme question pour n quelconque lorsque l’echantillon initial consiste en mvaleurs distinctes.
Indication:
Le nombre des configurations distinctes de F1 est egal au nombre de manieres distinctesde repartir n boules dans m cases.
Remarque: Comme F0 est une loi discrete, la loi de θ(F1) est, elle aussi, discrete. Onremarque cependant que, meme avec seulement 3 observations, on obtient pour θ(F1)une loi beaucoup plus etalee. Ce phenomene ne fait que s’accentuer quand on augmenten. En particulier, on pourra constater, apres avoir fait l’exercice precedent, que le nom-bre des tirages F1 possibles lorsqu’on a 10 observations distinctes pour l’echantilloninitial, est deja tres grand : 92 378. Et le mode a pour probabilite 0,00036, ce qui esttres faible. Donc, la loi, sous F0 d’une fonctionnelle θ(F1) , bien qu’elle soit en principediscrete, est en general tres proche d’une loi continue. On se sert de cette remarquequand on veut construire des intervalles de confiance.
Exercice 4:
On considere un n-echantillon (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 methode du bootstrap pour reduire le biais ?
Indication:
La loi initiale est F = U[0θ] . F0 = U[0,max(Xi)] et F1 = U[0,max(Xi∗)]
C.Huber 11
7 INTERVALLE DE CONFIANCE Bootstrap 12
7 Intervalle de confiance
Soit F la loi inconnue, dont on veut estimer le parametre θ(F ) par un intervalle deconfiance a 0,95 et F0 la loi associee a l’echantillon observe. θ(F0) est l’estimateurde θ(F ). Soit F la loi inconnue, dont on veut estimer le parametre θ(F ) par unintervalle de confiance a 0,95 et F0 la loi associee a l’echantillon observe. θ(F0) estun estimateur de θ(F ). Pour obtenir, a partir de θ(F0), un intervalle de confiance (engeneral asymetrique) pour θ(F ), on a besoin de connaıtre la loi de θ(F ) − θ(F0), sousF (alors que F est inconnue) ou une approximation pour cette loi. Si c’est le cas, onprend pour bornes de l’intervalle, en notant t1 = t0.025 et t2 = t0.975 les quantiles0.025 et 0.975 de cette loi: [θ(F0) + t1 ; θ(F0) + t2]. En effet:
Si on ne connaıt pas cette loi, et si on n’a pas d’approximation pour celle-ci, ou, toutsimplement si on en dispose mais que les calculs sont tres compliques, le bootstrappermet de lui substituer la loi de θ(F0) − θ(F1) sous F0. Comme F0 est cette foisconnue, cette loi est, en principe, une loi discrete completement calculable. Alorsapparaissent 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 realite, pour les taillesd’echantillon usuelles, le calcul exact serait trop long (voir ci-dessus ce que celadonne dans le cas n = 3) et on doit donc proceder par simulation pour evaluercette loi bootstrap, ou pour evaluer ses parametres d’interet pour le problemeconsidere.
Supposons que l’on cherche maintenant un intervalle symetrique par rapport aθ(F0), qui est par exemple la moyenne observee s’il s’agit de la moyenne, la medianeobservee s’il s’agit de la mediane, etc... En utilisant toujours le meme principe dubootstrap, au lieu de t tel que
P (θ(F0) − t ≤ θ(F ) ≤ θ(F0) + t|F ) = 0, 95
C.Huber 12
7 INTERVALLE DE CONFIANCE Bootstrap 13
on va chercher t∗ tel que
P (θ(F1) − t∗ ≤ θ(F0) ≤ θ(F1) + t∗| F0) = 0, 95
Dans cette derniere expression, F0 etant connu, θ(F0) est connu. Il s’agit donc dedeterminer la loi de θ(F1) ou F1 est echantillonne a partir de F0. On pourra parexemple penser a l’echantillon ci-dessus, θ etant la mediane ou le carre de la moyenne,etc.. . On trouve dans ce cas tres facilement la loi de θ(F1) car la taille de l’echantillonest tres faible : n = 3. Lorsque n est plus grand, cela devient complique et on utilise laloi des grands nombres: On reechantillonne B fois, en faisant chaque fois n tirages sansremise 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 θ(F1):
(θ(X∗1), θ(X∗2), . . . , θ(X∗B))
Ces valeurs dessinent progressivement la loi de θ(F1) et si on pouvait faire tendreB vers l’infini, on aurait exactement la loi de θ(F1). En general, on choisit des valeursde B de l’ordre de 50 a 200 (voir Efron, 1993).
Remarque : Nous avons vu que, dans le cas non parametrique, θ(F1) a une loidiscrete, et, par consequent, une valeur exactement egale a 0,95 n’est generalement pasatteignable. Nous avons cependant aussi remarque que, tres vite quand n croıt, la loiF1 se diversifie et les atomes ne portent pas beaucoup de probabilte chacun. Par con-tre, dans le cas d’une loi parametrique continue, l’equation ci-dessus peut se resoudreexactement : il n’y a pas de saut de la probabilite qui regit θ(F1).
Exemple:
Prenons la loi exponentielle F = E(λ) de fonction de repartition F (x) = exp (−x/λ) etθ(F ) = λ. L’estimateur du maximum de vraisemblance de λ est la moyenne empirique(on pourra le verifier a titre d’exercice):
λ = X
DoncF0 = E(λ) = E(X)
Notons la moyenne empirique Y/n : la loi de Y est la loi de la somme de n variablesexponentielles de meme parametre λ et donc c’est une loi gamma Γ(n, λ)(on pourra leverifier ). L’equation qui donne l’intervalle de confiance bootstrap
P (θ(F1) − t∗ ≤ θ(F0) ≤ θ(F1) + t∗|F0) = 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 deuxieme parametre de la loi gamma est un parametre d’echelle. En divisanttout par ce parametre, qui est connu puisqu’il est egal a la moyenne observee, onobtient:
P (|Y ′/n − 1| ≤ t∗/X | Γ(n, 1)) = 0, 95
ou Y ′ suit la loi gamma Γ(n, 1). Une table de la loi gamma suffit donc maintenantpour calculer t∗. Notons g0,95 le quantile verifiant:
P (|Y ′/n − 1| ≤ g0,95) = 0, 95.
Alors, t∗ = X0,95 et l’intervalle de confiance ”bootstrape” pour la moyenne d’une loiexponentielle est finalement:
[X − g0,95 × X; X − g0,95 × X]
Exercice 5: Faire le meme calcul dans le cas ou la loi exponentielle est remplacee
par la loi normale N (µ, σ2). On note λ = (µ, σ2) et on veut un intervalle de confiancepour la moyenne, c’est a dire que θ(F ) = µ.
Exercice 6: Bootstrap pour des durees censureesLorsqu’on a affaire a des durees de survie censurees, les observations se presentent
sous la forme de couples (Ti, Di), T etant la duree observee et D l’indicateur de cen-sure. Deux types de bootstrap peuvent alors etre envisages: le bootstrap simple et lebootstrap evident. Le premier consiste a faire un tirage au hasard dans les couples, lesecond a faire un tirage selon les fonctions de survie de Kaplan-Meier pour la duree devie et pour la censure. On essaiera les deux methodes sur un exemple.
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.
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
010
020
030
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.
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%
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
Den
sity
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())
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}
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))
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)
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 :
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
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é
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.
} 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
02
46
8
Value
Den
sity
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)
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) 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
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)+(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)")
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 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:
2.Pour chaque échantillon bootstrap z’* on calcule la valeur de t
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.
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.
67.17/8.66
0.1299.867/)var(
0.129−=
−=
−=
zztt
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)
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 <- 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])
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