(私の主な質問は言語に依存しないため、必要に応じてRコードを無視します)
単純な統計(例:平均)の変動性を調べたい場合、次のような理論を介してそれを行うことができます。
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
または次のようなブートストラップで:
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)
しかし、私が疑問に思っているのは、特定の状況でブートストラップディストリビューションの標準エラーを調べることは有用/有効ですか?私が扱っている状況は、次のような比較的ノイズの多い非線形関数です。
# 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)
ここでは、モデルは元のデータセットを使用しても収束しません。
> (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
そのため、代わりに私が興味を持っている統計は、これらのnlsパラメーターのより安定した推定値です-おそらく、多くのブートストラップ複製での平均です。
# 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)
実際、これらは元のデータをシミュレートするために使用したもののボールパークにあります:
> pars
[1] 5.606190 1.859591 -1.390816
プロットされたバージョンは次のようになります。
# 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)
さて、これらの安定化されたパラメーター推定値の変動性が必要な場合、このブートストラップ分布の正規性を仮定して、標準誤差を計算するだけでよいと思います。
> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824
これは賢明なアプローチですか?このような不安定な非線形モデルのパラメータを推測するためのより一般的なアプローチはありますか?(最後の部分を理論に頼る代わりに、ここでリサンプリングの第2層を行うことができると思いますが、モデルによっては時間がかかる場合があります。それでも、これらの標準エラーがブートストラップレプリケーションの数を増やすだけで0に近づくため、あらゆる用途に役立ちます。)
感謝します。そして、ところで、私はエンジニアですので、この辺りで比較的初心者であることを許してください。
nls
近似の大部分は失敗する可能性がありますが、収束するものの中で、バイアスは大きくなり、予測される標準誤差/ CIは偽りなく小さくなります。nlsBoot
50%の成功を収めるアドホック要件を使用していますが、条件付き分布の(非)類似性も同様に懸念事項であることに同意します。