Pourquoi mon intervalle de bootstrap a-t-il une couverture terrible?

29

Je voulais faire une démonstration de classe où je compare un intervalle t à un intervalle de bootstrap et calcule la probabilité de couverture des deux. Je voulais que les données proviennent d'une distribution asymétrique, j'ai donc choisi de générer les données sous la forme d' exp(rnorm(10, 0, 2)) + 1un échantillon de taille 10 à partir d'un lognormal décalé. J'ai écrit un script pour dessiner 1000 échantillons et, pour chaque échantillon, calculer à la fois un intervalle t à 95% et un intervalle de centile de bootstrap à 95% sur la base de 1000 répétitions.

Lorsque j'exécute le script, les deux méthodes donnent des intervalles très similaires et les deux ont une probabilité de couverture de 50 à 60%. J'ai été surpris car je pensais que l'intervalle de bootstrap serait meilleur.

Ma question est, ai-je

  • fait une erreur dans le code?
  • fait une erreur dans le calcul des intervalles?
  • fait une erreur en s'attendant à ce que l'intervalle de bootstrap ait de meilleures propriétés de couverture?

De plus, existe-t-il un moyen de construire un CI plus fiable dans cette situation?

 tCI.total <- 0
 bootCI.total <- 0
 m <- 10 # sample size
 true.mean <- exp(2) + 1

for (i in 1:1000){
 samp <- exp(rnorm(m,0,2)) + 1
 tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)

 boot.means <- rep(0,1000)
 for (j in 1:1000) boot.means[j] <- mean(sample(samp,m,replace=T))
 bootCI <- sort(boot.means)[c(0.025*length(boot.means), 0.975*length(boot.means))]

 if (true.mean > min(tCI) & true.mean < max(tCI)) tCI.total <- tCI.total + 1
 if (true.mean > min(bootCI) & true.mean < max(bootCI)) bootCI.total <- bootCI.total + 1 
}
tCI.total/1000     # estimate of t interval coverage probability
bootCI.total/1000  # estimate of bootstrap interval coverage probability
Flet
la source
3
Les gens oublient souvent une autre utilisation du bootstrap: identifier et corriger les biais . Je soupçonne que si vous incluiez une correction de biais dans votre amorçage, vous pourriez obtenir de bien meilleures performances du CI.
whuber
@whuber: joli point, +1. Pour autant que je m'en souvienne, les méthodes d'amorçage et leurs applications par Davison & Hinkley donnent une introduction agréable et accessible à la correction de biais et à d'autres améliorations du bootstrap.
S.Kolassa - Rétablir Monica
1
Il vaut la peine d'essayer les autres variantes de bootstrap, en particulier le bootstrap de base.
Frank Harrell
3
L'amorçage est une procédure à large échantillon. n'est pas grand, en particulier pour les données log-normales . n=10
Cliff AB

Réponses:

16

Les diagnostics bootstrap et les remèdes de Canto, Davison, Hinkley & Ventura (2006) semblent être un point de départ logique. Ils discutent de plusieurs façons dont le bootstrap peut se décomposer et - plus important ici - offrent des diagnostics et des remèdes possibles:

  1. Valeurs aberrantes
  2. Modèle de rééchantillonnage incorrect
  3. Nonpivotalité
  4. Incohérence de la méthode bootstrap

Je ne vois pas de problème avec 1, 2 et 4 dans cette situation. Regardons 3. Comme le note @Ben Ogorek (bien que je sois d'accord avec @Glen_b que la discussion sur la normalité peut être un hareng rouge), la validité du bootstrap dépend de la pivotalité de la statistique qui nous intéresse.

La section 4 de Canty et al. suggère un rééchantillonnage dans les rééchantillonnages pour obtenir une mesure du biais et de la variance pour l'estimation des paramètres dans chaque rééchantillonnage bootstrap . Voici le code pour répliquer les formules de p. 15 de l'article:

library(boot)
m <- 10 # sample size
n.boot <- 1000
inner.boot <- 1000

set.seed(1)
samp.mean <- bias <- vars <- rep(NA,n.boot)
for ( ii in 1:n.boot ) {
    samp <- exp(rnorm(m,0,2)) + 1
    samp.mean[ii] <- mean(samp)
    foo <- boot(samp,statistic=function(xx,index)mean(xx[index]),R=inner.boot)
    bias[ii] <- mean(foo$t[,1])-foo$t0
    vars[ii] <- var(foo$t[,1])
}

opar <- par(mfrow=c(1,2))
    plot(samp.mean,bias,xlab="Sample means",ylab="Bias",
        main="Bias against sample means",pch=19,log="x")
    abline(h=0)
    plot(samp.mean,vars,xlab="Sample means",ylab="Variance",
        main="Variance against sample means",pch=19,log="xy")
par(opar)

diagnostics d'amorçage

Notez les échelles de journal - sans journaux, c'est encore plus flagrant. Nous voyons bien comment la variance de l'estimation moyenne du bootstrap augmente avec la moyenne de l'échantillon du bootstrap. Pour moi, cela ressemble à une arme à feu pour attacher la faute à la non-totalité en tant que coupable de la faible couverture de l'intervalle de confiance.

Cependant, j'admettrai volontiers que l'on puisse faire un suivi de nombreuses façons. Par exemple, nous pourrions voir comment la question de savoir si l'intervalle de confiance d'une réplique bootstrap spécifique inclut la vraie moyenne dépend de la moyenne de la réplique particulière.

Quant aux recours, Canty et al. discuter des transformations et des logarithmes me viennent à l'esprit ici (par exemple, bootstrap et construire des intervalles de confiance non pas pour la moyenne, mais pour la moyenne des données enregistrées), mais je ne pouvais pas vraiment le faire fonctionner.

Canty et al. continuer de discuter de la façon dont on peut réduire à la fois le nombre de bootstraps internes et le bruit restant en échantillonnant et en lissant l'importance ainsi qu'en ajoutant des bandes de confiance aux graphiques croisés dynamiques.

Cela pourrait être un projet de thèse amusant pour un étudiant intelligent. J'apprécierais tout indice sur lequel je me suis trompé, ainsi que sur toute autre littérature. Et je prendrai la liberté d'ajouter le diagnostictag à cette question.

S. Kolassa - Rétablir Monica
la source
13

μ^-μ
μ^t
mμ^-μσ^

Ensuite, j'ai réfléchi un peu plus à l'ensemble de la configuration. Avec seulement 10 observations et une distribution extrêmement asymétrique, n'est-il donc pas fondamentalement impossible d' estimer de façon non paramétrique la moyenne et encore moins de construire des intervalles de confiance avec la bonne couverture?

e2+1=8.39P(X2)=0,84XN(0,4)0,840,84dix=0,178. Donc dans un peu moins de 18% des cas, la plus grande observation est plus petite que la moyenne. Pour obtenir une couverture supérieure à 0,82, nous avons besoin d'une construction d'un intervalle de confiance pour la moyenne qui s'étend au-delà de la plus grande observation. J'ai du mal à imaginer comment une telle construction peut être faite (et justifiée) sans hypothèses préalables selon lesquelles la distribution est extrêmement asymétrique. Mais j'accueille toute suggestion.

NRH
la source
Je suis d'accord avec toi. Je voulais vraiment y penser du point de vue de quelqu'un qui a un échantillon de cette distribution. Comment pourrais-je savoir qu'il est dangereux d'utiliser allègrement le bootstrap dans ce cas? La seule chose à laquelle je peux penser est que j'aurais bien pu prendre des journaux avant de faire l'analyse, mais l'un des autres répondeurs dit que cela n'aide pas vraiment.
Flounderer
1
Vous ne saurez pas s'il est sûr ou dangereux uniquement à partir des 10 points de données. Si vous soupçonnez une asymétrie ou des queues lourdes, la solution pourrait être de se concentrer sur un paramètre différent de la moyenne. Par exemple, la moyenne logarithmique ou la médiane. Cela ne vous donnera pas d'estimation (ou d'intervalle de confiance pour) la moyenne, sauf si vous faites des hypothèses supplémentaires, mais il serait peut-être préférable de se concentrer sur un paramètre moins sensible aux queues de la distribution.
NRH
6

Les calculs étaient bons, j'ai recoupé avec le démarrage du paquet bien connu . De plus, j'ai ajouté l'intervalle BCa (par Efron), une version à biais corrigé de l'intervalle d'amorçage centile:

for (i in 1:1000) {
  samp <- exp(rnorm(m, 0, 2)) + 1

  boot.out <- boot(samp, function(d, i) sum(d[i]) / m, R=999)
  ci <- boot.ci(boot.out, 0.95, type="all")

  ##tCI <- mean(samp) + c(1,-1)*qt(0.025,df=9)*sd(samp)/sqrt(10)
  tCI <- ci$normal[2:3]
      percCI <- ci$perc[4:5]
  bcaCI <- ci$bca[4:5]
      boottCI <- ci$student[4:5]

  if (true.mean > min(tCI) && true.mean < max(tCI)) tCI.total <- tCI.total + 1
  if (true.mean > min(percCI) && true.mean < max(percCI)) percCI.total <- percCI.total + 1 
  if (true.mean > min(bcaCI) && true.mean < max(bcaCI)) bcaCI.total <- bcaCI.total + 1
}

tCI.total/1000     # estimate of t interval coverage probability
0.53
percCI.total/1000  # estimate of percentile interval coverage probability
0.55
bcaCI.total/1000  # estimate of BCa interval coverage probability
0.61

Je suppose que les intervalles seraient bien meilleurs si la taille de l'échantillon d'origine était supérieure à 10, disons 20 ou 50.

De plus, la méthode bootstrap-t conduit généralement à de meilleurs résultats pour les statistiques asymétriques. Cependant, il a besoin d'une boucle imbriquée et donc de plus de 20 fois plus de temps de calcul.

Pour les tests d'hypothèse, il est également très important que les couvertures unilatérales soient bonnes. Donc, regarder uniquement les couvertures recto verso peut souvent être trompeur.

lambruscoAcido
la source
1
n<100
5

J'étais confus à ce sujet aussi, et j'ai passé beaucoup de temps sur les Intervalles de confiance du papier DiCiccio et Efron 1996 , sans grand chose à montrer.

Cela m'a en fait amené à penser moins au bootstrap en tant que méthode à usage général. J'avais l'habitude de le voir comme quelque chose qui vous sortirait d'un bourrage quand vous étiez vraiment coincé. Mais j'ai appris son sale petit secret: les intervalles de confiance du bootstrap sont tous basés sur la normalité d'une manière ou d'une autre. Permettez-moi de vous expliquer.

XN(μ,σ2)
σ
z=X-μσN(0,1)
μPr(-1,96X-μσ1,96)=0,95

Lorsque vous pensez à ce qui justifie que les centiles de la distribution normale soient liés aux intervalles de confiance, il est entièrement basé sur cette quantité pivot pratique. Pour une distribution arbitraire, il n'y a pas de lien théorique entre les centiles de la distribution d'échantillonnage et les intervalles de confiance , et prendre des proportions brutes de la distribution d'échantillonnage bootstrap ne le coupe pas.

Ainsi, les intervalles BCa (corrigés du biais) d'Efron utilisent des transformations pour arriver à la normalité approximative et les méthodes bootstrap-t reposent sur les statistiques t résultantes qui sont approximativement pivots. Maintenant, le bootstrap peut estimer l'enfer hors des moments, et vous pouvez toujours assumer la normalité et utiliser le standard +/- 2 * SE. Mais compte tenu de tout le travail qui a été effectué pour devenir non paramétrique avec le bootstrap, cela ne semble pas tout à fait juste, n'est-ce pas?

Ben Ogorek
la source
2
Il est possible que j'ai raté quelque chose, mais le fait que le bootstrap soit associé à des quantités pivots ou quasi pivots n'implique en soi aucune association avec la normalité. Les quantités pivots peuvent avoir toutes sortes de distributions dans des circonstances particulières. Je ne vois pas non plus comment la phrase en italique de votre avant-dernier paragraphe suit.
Glen_b -Reinstate Monica
1
Comment se déroule alors l'affirmation relative à la normalité?
Glen_b -Reinstate Monica
1
FΦ-1[F(X)]
2
F
2
Pour ajouter à @Glen_b: la transformation en une distribution normale doit seulement exister pour prouver que la méthode est correcte. Vous n'avez pas besoin de le trouver pour utiliser la méthode. De plus, si vous n'aimez pas les distributions normales, vous pouvez réécrire toute la preuve avec une autre distribution symétrique continue. L'utilisation de distributions normales est techniquement utile, mais pas strictement nécessaire, elle ne dit rien sur la source des données ou la moyenne de l'échantillon.
Peter