Utilisation de l'erreur standard de distribution bootstrap

19

(ignorez le code R si nécessaire, car ma question principale est indépendante de la langue)

Si je veux regarder la variabilité d'une statistique simple (ex: moyenne), je sais que je peux le faire via la théorie comme:

x = rnorm(50)

# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))

ou avec le bootstrap comme:

library(boot)

# Estimate standard error from bootstrap
(x.bs = boot(x, function(x, inds) mean(x[inds]), 1000))
# which is simply the standard *deviation* of the bootstrap distribution...
sd(x.bs$t)

Cependant, ce que je me demande, peut-il être utile / valide (?) De rechercher l' erreur standard d'une distribution bootstrap dans certaines situations? La situation à laquelle je fais face est une fonction non linéaire relativement bruyante, telle que:

# Simulate dataset
set.seed(12345)
n   = 100
x   = runif(n, 0, 20)
y   = SSasymp(x, 5, 1, -1) + rnorm(n, sd=2)
dat = data.frame(x, y)

Ici, le modèle ne converge même pas en utilisant l'ensemble de données d'origine,

> (fit = nls(y ~ SSasymp(x, Asym, R0, lrc), dat))
Error in numericDeriv(form[[3L]], names(ind), env) : 
  Missing value or an infinity produced when evaluating the model

donc les statistiques qui m'intéressent plutôt sont des estimations plus stabilisées de ces paramètres nls - peut-être leurs moyens à travers un certain nombre de réplications bootstrap.

# Obtain mean bootstrap nls parameter estimates
fit.bs = boot(dat, function(dat, inds)
              tryCatch(coef(nls(y ~ SSasymp(x, Asym, R0, lrc), dat[inds, ])),
                       error=function(e) c(NA, NA, NA)), 100)
pars = colMeans(fit.bs$t, na.rm=T)

Les voici, en effet, dans le parc à billes de ce que j'ai utilisé pour simuler les données originales:

> pars
[1]  5.606190  1.859591 -1.390816

Une version tracée ressemble à:

# Plot
with(dat, plot(x, y))

newx = seq(min(x), max(x), len=100)
lines(newx, SSasymp(newx, pars[1], pars[2], pars[3]))

lines(newx, SSasymp(newx, 5, 1, -1), col='red')
legend('bottomright', c('Actual', 'Predicted'), bty='n', lty=1, col=2:1)

entrez la description de l'image ici

Maintenant, si je veux la variabilité de ces estimations de paramètres stabilisés , je pense que je peux, en supposant la normalité de cette distribution bootstrap, simplement calculer leurs erreurs standard:

> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824

Est-ce une approche sensée? Existe-t-il une meilleure approche générale de l'inférence sur les paramètres de modèles non linéaires instables comme celui-ci? (Je suppose que je pourrais plutôt faire une deuxième couche de rééchantillonnage ici, au lieu de compter sur la théorie pour le dernier bit, mais cela pourrait prendre beaucoup de temps selon le modèle. Même encore, je ne suis pas sûr si ces erreurs standard être utile pour n'importe quoi, car ils approcheraient de 0 si j'augmentais simplement le nombre de réplications de bootstrap.)

Merci beaucoup, et en passant, je suis ingénieur alors s'il vous plaît pardonnez-moi d'être un novice relatif ici.

John Colby
la source

Réponses:

13

Il y a plusieurs problèmes dans cette question. Premièrement, il y a la question de savoir si les moyennes bootstrapées seront des estimateurs sensés même lorsque certains des estimateurs bootstrap individuels ne sont pas calculables (manque de convergence, inexistence de solutions). Deuxièmement, étant donné que les estimateurs bootstrap sont raisonnables, la question se pose de savoir comment obtenir des intervalles de confiance ou peut-être simplement des erreurs types pour ces estimations.

--

Le but de la question est cependant de produire des estimations même dans les cas où l'algorithme de calcul des estimations peut parfois échouer ou lorsque l'estimateur est parfois indéfini. En général, il y a un problème:

  • La moyenne des estimations bootstrapées tout en jetant aveuglément les échantillons bootstrapés pour lesquels les estimations ne sont pas calculables donnera en général des résultats biaisés.

La gravité du problème général dépend de plusieurs choses. Par exemple, à quelle fréquence l'estimation n'est pas calculable et si la distribution conditionnelle de l'échantillon étant donné que l'estimation n'est pas calculable diffère de la distribution conditionnelle de l'échantillon étant donné que l'estimation est calculable. Je ne recommanderais pas d'utiliser la méthode.

Pour la deuxième partie de la question, nous avons besoin d'une petite notation. Si représente notre ensemble de données d' origine, θ notre estimateur (Supposons pour simplifier , il est vrai apprécié et a permis de prendre la valeur NA) telle que θ ( X A ( X ) représente l'événement, en fonction de X , sur lequelXθ^θ^(X)Oui

θ~(X)=E(θ^(Oui)X,UNE(X))
UNE(X)Xθ^(Oui)N / A-XUNE(X)θ~(X)

θ^(Oui)XUNE(X)θ~(X)

UNE(X)θ~(X)

Modifier :

Le très beau papier Estimation and Accuracy After Model Selection par Efron donne une méthode générale pour estimer l'erreur standard d'un estimateur ensaché sans utiliser une deuxième couche de bootstrap. L'article ne traite pas explicitement des estimateurs qui ne sont parfois pas calculables.

NRH
la source
Merci pour la réponse formidable. Le point sur le biais est particulièrement bien pris. Vous pouvez imaginer un cas extrême où le nuage de points est totalement uniforme, à l'exception d'un seul ensemble de points éloignés qui correspondent très bien au modèle. La grande majorité des nlsajustements peuvent échouer, mais, parmi ceux qui convergent, le biais sera énorme et les erreurs / IC standard prédits sont extrêmement faibles. nlsBootutilise une exigence ad hoc de 50% d'ajustements réussis, mais je suis d'accord avec vous que la (dis) similitude des distributions conditionnelles est également une préoccupation.
John Colby
(J'essaierai de vous donner un bonus demain si ce site me le permet comme SO)
John Colby