(ignora el código R si es necesario, ya que mi pregunta principal es independiente del lenguaje)
Si quiero ver la variabilidad de una estadística simple (por ejemplo, la media), sé que puedo hacerlo a través de la teoría como:
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
o con el bootstrap como:
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)
Sin embargo, lo que me pregunto es, ¿puede ser útil/válido(?) recurrir a la norma error de una distribución bootstrap en determinadas situaciones? La situación con la que estoy tratando es una función no lineal relativamente ruidosa, como:
# 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)
Aquí el modelo ni siquiera converge utilizando el conjunto de datos original,
> (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
por lo que las estadísticas que me interesan en cambio son más estabilizado estimaciones de estos parámetros nls - quizás sus medias a través de un número de réplicas 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)
En este caso, los resultados se aproximan a los que utilicé para simular los datos originales:
> pars
[1] 5.606190 1.859591 -1.390816
Una versión ploteada tiene este aspecto:
# 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)
Ahora, si quiero la variabilidad de estos estabilizado estimaciones de los parámetros, creo que puedo, asumiendo la normalidad de esta distribución bootstrap, simplemente calcular sus errores estándar:
> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824
¿Es éste un planteamiento sensato? ¿Existe un método general mejor para inferir los parámetros de modelos no lineales inestables como éste? (Supongo que aquí podría hacer una segunda capa de remuestreo, en lugar de basarme en la teoría para la última parte, pero eso podría llevar mucho tiempo dependiendo del modelo. Aun así, no estoy seguro de si estos errores estándar serían útiles para algo, ya que se acercarían a 0 si simplemente aumento el número de réplicas bootstrap).
Muchas gracias y, por cierto, soy ingeniero, así que disculpen que sea relativamente novato por aquí.