Cette confusion entre les procédures de bootstrap et les procédures de Monte-Carlo continue de se reproduire, donc c'est peut-être un meilleur endroit pour y remédier. (Les exemples de R
code peuvent également aider avec les devoirs.)
Considérez cette implémentation du bootstrap dans R
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
Un coup d'œil rapide confirmera qu'il s'agit d'un calcul déterministe : aucune valeur aléatoire n'est générée ou utilisée. (Je laisserai les détails de son fonctionnement interne aux lecteurs intéressés pour qu'ils les découvrent par eux-mêmes.)
Les arguments de boot
sont un lot de données numériques dans le tableau x
et une référence t
à une fonction (qui peut être appliquée à des tableaux exactement comme x
) pour renvoyer une seule valeur numérique; en d'autres termes, t
est une statistique . Il génère tous les échantillons possibles avec remplacement à partir de x
et s'applique t
à chacun d'eux, produisant ainsi un numéro pour chacun de ces échantillons: c'est le bootstrap en bref. La valeur de retour est un tableau représentant la distribution d'amorçage exacte de t
pour l'échantillon x
.
À titre d'exemple minuscule , amorçons la moyenne d'un échantillon x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
Il y a en effet quatre échantillons possibles de taille avec remplacement de ; à savoir, , , et . les génère tous (dans l'ordre qui vient d'être indiqué) et s'applique à chacun d'eux. Dans ce cas, calcule la moyenne et ceux-ci se révèlent être respectivement , , et , comme indiqué dans la sortie.( 1 , 3 )2( 1 , 3 )( 1 , 3 ) ( 3 , 1 ) ( 3 , 3 ) 1 2 2 3( 1 , 1 )( 1 , 3 )( 3 , 1 )( 3 , 3 )boot
t
t
1223
Où vous allez à partir d'ici dépend de la façon dont vous souhaitez utiliser le bootstrap. Les informations complètes sur le bootstrap sont contenues dans ce tableau de sortie, donc c'est généralement une bonne idée de l'afficher. Voici un exemple où l'écart-type est bootstrapé à partir de l'échantillon :( 1 , 3 , 3 , 4 , 7 )
hist(boot(c(1,3,3,4,7), sd))
Nous sommes maintenant prêts à parler de simulation de Monte Carlo. Supposons, par exemple, que nous allions bootstraper une limite de confiance supérieure de 95% sur la SD à partir d'un échantillon de en utilisant le 95e centile supérieur de sa distribution bootstrap. Quelles propriétés cette procédure aurait-elle? Une façon de le savoir est de supposer que l'échantillon a été obtenu de manière aléatoire à partir, disons, d'une distribution uniforme. (L'application indiquera souvent ce qu'est une hypothèse de distribution raisonnable; ici, j'en ai choisi arbitrairement une qui est simple pour le calcul mais pas facile à traiter analytiquement.) Nous pouvons simuler ce qui se passe en prenant un tel échantillon et en calculant l'UCL:5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
Le résultat pour cet échantillon aléatoire particulier est de 3,83587. C'est certain: si vous appeliez à boot
nouveau avec le même ensemble de données, la réponse serait exactement la même. Mais comment la réponse pourrait-elle changer avec différents échantillons aléatoires? Découvrez-le en répétant ce processus plusieurs fois et en dessinant un histogramme des résultats:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
Si nous faisions un autre ensemble de simulations, les tirages au sort seraient différents, créant un histogramme (légèrement) différent - mais pas très différent de celui-ci. Nous pouvons l'utiliser avec une certaine confiance pour comprendre comment fonctionne l'UCL d'amorçage de la SD. Pour référence, notez que l'écart type d'une distribution uniforme (couvrant la plage de à comme spécifié ici) est égal à . Comme on pourrait l'espérer pour toute UCL digne de ce nom, la majorité (les trois quarts ou 0,75) des valeurs de l'histogramme dépassent cela:10 10 / √0dix10 / 12--√≈ 2,888
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Mais ce n'est pas du tout le 95% nominal que nous avons spécifié (et espérions)! C'est une valeur de la simulation: elle compare nos espoirs à ce qui se passe réellement. (Pourquoi la différence? Je pense que c'est parce que l'amorçage d'une SD ne fonctionne pas bien avec de très petits échantillons.)
La revue
Les statistiques de bootstrap sont conceptuellement les mêmes que toute autre statistique comme une moyenne ou un écart-type; ils ont juste tendance à prendre beaucoup de temps à calculer. (Voir le message d'avertissement dans le boot
code!)
La simulation Monte-Carlo peut être utile pour étudier comment une statistique de bootstrap varie en raison de l'aléatoire dans l'obtention d'échantillons. La variation observée dans une telle simulation est due à la variation des échantillons et non à la variation du bootstrap.
(Non illustré ici) Parce que les statistiques de bootstrap peuvent prendre beaucoup de calculs (apparemment, jusqu'à calculs pour des échantillons de taille ), il est commode d' approximer la distribution de bootstrap. Cela se fait généralement en créant un programme "boîte noire" pour obtenir une valeur au hasard à partir de la vraie distribution d'amorçage et en appelant ce programme à plusieurs reprises. La sortie collective se rapproche de la distribution exacte. L'approximation peut varier en raison du caractère aléatoire dans la boîte noire - mais cette variation est un artefact de la procédure d'approximation. Il n'est pas (conceptuellement) inhérent à la procédure de bootstrap elle-même. nnnn