Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18
M2 CEE
Pr. Philippe Polomé, Université Lumière Lyon 2
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Sommaire
Définitions Illustration
Commande sample
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Motivation
I
En régression np, on n’a pas
I d’hyp. de normalité
I de coefficient dont on pourrait tester la significativité
I
Par contre, il faut pouvoir inférer
I L’effet d’un régresseurx sur une dépendantey,@y/@x, est-il significatif ?
I Peut-on calculer un IC ?
I Toute autre hyp moins simple
I
Dans les régressions np au ch suivant, bootstrap est la seule
technique d’inférence
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Bootstrap
I
Hyp. “Principe de médiocrité” :
I Si on pouvaitré-échantillonner la pop.
I dans les mêmes conditions
I on obtiendrait un échantillon semblable à celui qu’on a déjà
I On ne peut pas ré-échantillonner
I Pas la même chose que représentativité
I
Principe : Traiter l’éch. comme une pop.
I Échantillonner l’échantillon originalavec remplacement
I Si on a une taillenau départ, on faitntirages avec remplacement
I Chaquei a une probabilité 1/nde sortir à chaque tirage
I On obtient unéchantillon Bootstrap(de taillen)
I oupseudo-échantillon
I Certaines obs. sont tirées pls fois, d’autres aucune
I Hyp. : ce pseudo-échantillon est semblable à ce qu’on aurait obtenu en ré-échantillonnant la pop.
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Exemple notionel
I
Dans un tableur, plus intuitif
I
Soit un éch. de taille n d’une variable
zI On numérote chaque obs. de 1 à n
I On crée une plage de n lignes x 1 col
I Chaque cellule est remplie de la fonctionrandbetween(1 ;n)
I Tire un naturel entre 1 et n
I On obtient n chiffres entre 1 et n
I certains sont répétés
I d’autres absents
I un pseudo-échantillon est généré en
I créant une nouvelle plage de n lignes x 1 col
I dans chaque cellule on associe l’observation original au chiffre trouvé
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Exemple
Fichier “bootstrap.ods” sur page web
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Exemple MCO
I
Échantillon original
<Y,X >,
Xpeut être une matrice
I B pseudo-échantillons
différents
<Yb,Xb>I S’appelle “Bootstrap par paire” cary etX sont tirés ensemble
I N’est pas la seule façon
I p.e. on peut se baser sur les résidus I
Pour chaque pseudo-échantillon
I On prend le MRLY =X +✏
I On estime dans chaque pseudo-échantillon ˆb=⇣
Xb0Xb
⌘ 1
Xb0Yb I Au total, une matrice ˆB deB vecteurs estimées ˆb
I
On prend un élément de , soit
iI On aB estimations ˆib, on les mets en histogramme
50 échantillons 500 échantillons
5000 échantillons
1échantillons
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Exemple MCO et distribution empirique
I
La distribution empirique est représentée par les histogrammes
I LorsqueB! 1, et que les hypothèses bootstrap sont vérifiées
I alors la distribution empirique converge à la vraie distribution
I qui est normale pour un ˆMCO, mais ça n’est pas vrai pour p.e.
des stats de test
I
Deux moments de cette distribution empirique “bootstrap”
I ¯ˆi = B1 XB b=1
ˆib=E\⇣ ˆib⌘
I var\⇣ ˆib⌘
=B11 XB b=1
⇣ˆib ¯ˆi⌘2
I
Intervalle de confiance, p.e. avec
B =1000
I On ordonne ces 1000 estimations de la plus petite à la plus grande
I Alors les estimations numéro 25 et 975 sont les bornes inf et sup, respectivement, de l’intervalle de confiance à 95% de
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Définitions
Pourquoi est-ce intéressant ?
1.
Pas d’hypothèse sur la distribution des erreurs
1.1 Mais il ne peut y avoir de corrélation entre observations
I Le ré-échantillonnage casserait cette corrélation
I En panels, on ré-échantillonne seulement suri en utilisant touteslesT périodes de chaquei sélectionné
1.2 Le bootstrap par paires<Yb,Xb>devrait produire des écarts types robustes à l’hétéroscédasticité
2.
On peut calculer des intervales de confiance
2.1 pour toute fonction des paramètres estimés, y-compris non-linéaire
2.2 pour des paramètres estimés de modèles sans propriétés d’échantillons finis connues
I comme semi-np
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Sommaire
Définitions Illustration
Commande sample
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Exemple du package AER, Journals
I
On veut calculer des écarts-types & des intervales de confiance
I
data("Journals")
I
journals <- Journals[, c("subs", "price")]
I
journals$citeprice <- Journals$price/Journals$citations
I
jour_lm <- lm(log(subs) ~ log(citeprice), data = journals)
I
Voir commandes bootstrap dans np2017.R
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
La commande boot( )
I
Le bootstrap dans R
I utilise la commandeboot( )du package boot
I Elle accepte pls arguments,
I desquels 3 sont requis : I
Data : les données
I
Statistic : une fonction à définir qui renvoie la stat à
“bootstrapper”
I avec 2 arguments
I Les données (une nouvelle fois !)
I Un vecteur index qui donne les indices des obs à inclure dans l’échantillon bootstrap
I
R : le nombre de réplication
I B dans la présentation théorique
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Construction de la fonction pour l’arg. “statistic” de boot( )
refit <- function(data, i)
I
Se rappeler que dans une
fonctionil ne faut qu’énoncer les arguments
I Ce que la fonction fait est décrit en dessous
I
coef(lm(log(subs) ~ log(citeprice), data = data[i,]))
I refitest définie juste pour les besoins deboot( )
I sur les données et sur un index i des données
I Icirefitrenvoie lescoefficients MCO delog(subs) ~ log(citeprice)
I et utilise comme indexile num. de la ligne des données
I pas MCO sur la lignei
I Donc, la fonctionboot( )prend icomme index du bootstrap
I Dans chaque réplication bootstrap, un nouvel éch. extrait des lignes dedata
Tout ça n’est pas très intuitif,
I
mais c’est le format de boot( )
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Appeler boot( )
I
library("boot")
I boot est le package recommandé pour le bootstrap
I
set.seed(123)
I
jour_boot <- boot(journals, refit, R = 999)
I boot : 3 arg – données, fonction, B
I
jour_boot montre comme résultats :
I Les coef du lm original
I La différence avec la moyenne des coeffissus du bootstrap
I appelé “biais”
I Les écarts-types de ces derniers
I Pour calculer des t-stats bootstrappés il vaut mieux extraire les t-stats de lm plutôt que les coef
I voir np2017.R
I
Peu de différence avec la sortie standard coeftest(jour_lm)
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Autres éléments de boot
I
t0 est la stat originale sur laquelle on réalise le bootstrap
I jour_boot$t0pour l’extraire
I
t l’ensemble des R stat bootstrappées
I Ici, intercept (col 1) et pente (col 2)
I On peut calculer directement un CI à partir de t avec la fonction quantile
I quantile(jour_boot$t[,2], probs = c(.025,.975))
I on prend [,2] pour le 2nd élément des coef = pente de la régression
I
Pour calculer un IC des t-stat, voir np2017.R
I
Exercice : IC du
R2de cette régression
I LeR2peut être extrait de summary
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Illustration
Exemple test de Kruskal Walis
I
kruskal.test(Ozone ~ Month, data = airquality)
I
retest <- function(data, i)
I (kruskal.test(Ozone ~ Month, data = data[i,]))$statistic
I
air_boot <- boot(airquality, retest, R = 999)
I
Exercice :
I Donnez un IC pour la p-valeur en utilisant la fonction boot.ci
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Commande sample
Sommaire
Définitions Illustration
Commande sample
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Commande sample
Commande sample
I
sample(x, size, replace = FALSE)
I
Permet de prendre un sous-échantillon de x de taille size
I avec ou sans remplacement
I
En prenant un sous-éch. de la même taille que l’éch.
I avec remplacement
I on fait un éch. bootstrap
I
En mettant ça dans une boucle R fois
I et en pratiquant l’analyse désirée à chaque fois
I on obtient une alternative à la commandeboot
I
Quel intérêt ? permet de spécifier des groupes
I x est soit une variable dans le dataframe
I ou un index compatible
I p.e. en panel, on pourrait avoir i=pays et t=année
I on veut faire un bootstrap sur les seuls
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Commande sample
Bootstrap avec sample
I
package plm
I
Estimation panel effet fixe
I grun.fe <- plm(inv~value+capital, data = Grunfeld, model =
"within")
I En panel, svt het. & autocor. => calculer le t-stat par bootstrap
I
Ensuite, il faut définir une “function” pour définir un éch.
bootstrap
I Puis une boucle “for” pour appeler cette function R fois
FUN
I
myfunc <- function(n,df) {
I définit function (n et df sont dans l’appel de la fonction + bas)
I n est Grunfeld$firm lors de l’appel de myfunc
I df est le dataframe
I Grunfeld unique_firm <- unique(n)
I firme unique (help : unique renvoie un vecteur ou data frame comme son arg x mais en enlevant les lignes doublons, dans ce cas définies sur firm)
I sample_firm <- sample(unique_firm, size=length(unique_firm), replace=T )
I choisit sur firm unique, au hasard avec remplacement, de la taille de "size" (help sample)
I new_df <- do.call(rbind, lapply(sample_firm, function(x) df[df$firm==x,] ))
I va chercher toutes les années de chaque Etat choisi aleatoirement et rbind c’est-a-dire empile en ligne
I }
Bootstrap avec sample
I
do.call
I construit & execute une fonction : do.call(what, args)
I what : soit une fonction ou une chaine de caracteres nommant une fonction a appeler - rbind "row bind" lier des lignes
I args : lapply(X, FUN, ...) : Appliquer une Function FUN sur un vecteur ou une liste X et renvoie une liste de meme longueur que X, chaque element de cette liste est le resultat d’appliquer FUN a l’element correspondant de X
I Donc creation d’une 2eme function a l’interieur de lapply qui va chercher les lignes correspondantes aux états dans
"sample_firm"
I
a <- myfunc(Grunfeld$firm, Grunfeld)
I exécute la function, on voit que le résultat a la même taille que Grunfeld
I Mais certaines firmes sont dupliquées, d’où message d’erreur de plm
I pour éviter ca, re-créer un index des firmes
I On sait qu’on a 20 obs par firme, 10 firmes
I On va creer une sequencea$E <- rep(1 :10, each = 20)
I On teste :coef(plm(inv~value+capital, data = a, index = c("E","year"), model = "within"))ok !
Boucle for de 1 a R
I
R=99
I
c <- coef(plm(inv~value+capital, data = Grunfeld, model =
"within"))
I Estimation initiale (peut etre part du bootstrap), coef est un vector
I
for(i in 1 :R) {
I a <- myfunc(Grunfeld$firm, Grunfeld)# A chaque i on relance le bootstrap & les estimations
I a$E <- rep(1 :10, each = 20)
I c <- cbind(c,coef(plm(inv~value+capital, data = a, index = c("E","year"), model = "within")))
I cree une matrice avec tous les 1ers coefs sur la 1ere ligne, tous les 2nds sur la seconde et ainsi de suite pour l’ensemble des coef du modele (ici 2)
I }
Statistiques non-paramétriques Ch. 2. Bootstrap 2017-18 Commande sample
Sorties
I
colMeans(t(c))
I moyenne sur chaque coef
I
sqrt(apply(t(c), MARGIN = 2, var))
I ecarts-types par coef
I MARGIN = 2 indique à apply de calculer var sur les col de t(c) (transposée de c)
I
apply(t(c), MARGIN = 2, quantile, probs=c(.025, .975))
I 95% CI over coef value