(ignora il codice R se necessario, poiché la mia domanda principale è indipendente dalla lingua)
Se voglio esaminare la variabilità di una statistica semplice (es: media), so di poterlo fare tramite una teoria come:
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
o con il bootstrap come:
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)
Tuttavia, ciò che mi chiedo è, può essere utile / valido (?) Guardare l' errore standard di una distribuzione bootstrap in determinate situazioni? La situazione con cui ho a che fare è una funzione non lineare relativamente rumorosa, come ad esempio:
# 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)
Qui il modello non converge nemmeno utilizzando il set di dati originale,
> (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
quindi le statistiche che mi interessano sono invece stime più stabilizzate di questi parametri nls - forse i loro mezzi attraverso una serie di repliche 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)
Qui questi sono, in effetti, nel parco giochi di ciò che ho usato per simulare i dati originali:
> pars
[1] 5.606190 1.859591 -1.390816
Una versione stampata assomiglia a:
# 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)
Ora, se voglio la variabilità di queste stime di parametri stabilizzati , penso di poter, ipotizzando la normalità di questa distribuzione bootstrap, solo calcolare i loro errori 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
È un approccio sensato? Esiste un approccio generale migliore all'inferenza sui parametri di modelli non lineari instabili come questo? (Suppongo che potrei invece fare un secondo livello di ricampionamento qui, invece di fare affidamento sulla teoria per l'ultimo bit, ma ciò potrebbe richiedere molto tempo a seconda del modello. Tuttavia, non sono sicuro che questi errori standard sarebbero essere utile a tutto, dato che si avvicinerebbero a 0 se solo aumentassi il numero di repliche bootstrap.)
Molte grazie e, a proposito, sono un ingegnere, quindi ti prego di perdonarmi di essere un novizio relativo qui intorno.
nls
attacchi potrebbe fallire, ma, di quelli che convergono, il pregiudizio sarà enorme e gli errori / IC standard previsti sono spuratamente piccoli.nlsBoot
utilizza un requisito ad hoc di accoppiamenti riusciti al 50%, ma sono d'accordo con te sul fatto che la (dis) somiglianza delle distribuzioni condizionate sia ugualmente preoccupante.