(ignoriere den R-Code falls nötig, da meine Hauptfrage sprachunabhängig ist)
Wenn ich die Variabilität einer einfachen Statistik (zB Mittelwert) untersuchen möchte, weiß ich, dass ich das mit folgender Theorie tun kann:
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
oder mit dem bootstrap wie:
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)
Aber was ich mich frage ist, kann es nützlich sein / gültig (?) Zum Standard suchen Fehlern einer Bootstrap - Verteilung in bestimmten Situationen? Die Situation, mit der ich es zu tun habe, ist eine relativ verrauschte nichtlineare Funktion, wie zum Beispiel:
# 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)
Hier konvergiert das Modell nicht einmal mit dem Originaldatensatz.
> (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
so dass die Statistiken , die ich in stattdessen bin interessiert sind mehr stabilisiert Schätzungen dieser nls Parameter - vielleicht ihre Mittel über eine Reihe von Bootstrap - Replikationen.
# 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)
Hier sind diese in der Tat im Baseballstadion von dem, was ich verwendet habe, um die ursprünglichen Daten zu simulieren:
> pars
[1] 5.606190 1.859591 -1.390816
Eine geplottete Version sieht so aus:
# 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)
Wenn ich nun die Variabilität dieser stabilisierten Parameterschätzungen will , kann ich, unter der Annahme der Normalität dieser Bootstrap-Verteilung, einfach ihre Standardfehler berechnen:
> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824
Ist das ein vernünftiger Ansatz? Gibt es eine allgemeinere Herangehensweise, um auf die Parameter solcher instabiler nichtlinearer Modelle zu schließen? (Ich nehme an, ich könnte stattdessen hier eine zweite Ebene des Resamplings durchführen, anstatt mich auf die Theorie für das letzte Bit zu verlassen, aber das kann je nach Modell eine Menge Zeit in Anspruch nehmen. Trotzdem bin ich mir nicht sicher, ob diese Standardfehler auftreten würden nützlich für alles, da sie sich 0 nähern würden, wenn ich nur die Anzahl der Bootstrap-Replikationen erhöhen würde.)
Vielen Dank, und übrigens, ich bin Ingenieur, bitte verzeihen Sie mir, dass ich hier ein relativer Neuling bin.
quelle
nls
Anpassungen kann fehlschlagen, aber von den konvergierenden ist die Verzerrung groß und die vorhergesagten Standardfehler / CIs sind falsch klein.nlsBoot
verwendet eine Ad-hoc-Anforderung von 50% für erfolgreiche Anpassungen, aber ich stimme Ihnen zu, dass die (Dis-) Ähnlichkeit der bedingten Verteilungen ebenfalls ein Problem darstellt.