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