(ana sorum dilden bağımsız olduğundan, gerekirse R kodunu yoksayın)
Eğer basit bir istatistiğin değişkenliğine bakmak istersem (ör: ortalama), bunu teori ile yapabileceğimi biliyorum:
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
veya bootstrap ile:
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)
Ancak, merak ediyorum, bazı durumlarda bir bootstrap dağıtımının standart hatasına bakmak yararlı / geçerli (?) Olabilir mi? Karşılaştığım durum, nispeten gürültülü doğrusal olmayan bir işlevdir, örneğin:
# 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)
Burada model orijinal veri kümesini kullanarak bile birleşmiyor,
> (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
bunun yerine ilgilendiğim istatistikler , bu nls parametrelerinin daha kararlı tahminleridir - belki de bir dizi bootstrap replikasyonu arasındaki araçları.
# 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)
İşte bunlar, orijinal verileri simüle etmek için kullandığım top parkında:
> pars
[1] 5.606190 1.859591 -1.390816
Çizilmiş bir sürüm şöyle görünür:
# 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)
Şimdi, bu stabilize parametre tahminlerinin değişkenliğini istiyorsam, bu önyükleme dağılımının normalliğini varsayarak, sadece standart hatalarını hesaplayabileceğimi düşünüyorum:
> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824
Bu mantıklı bir yaklaşım mı? Bunun gibi kararsız doğrusal olmayan modellerin parametrelerinde çıkarımda daha iyi bir genel yaklaşım var mı? (Sanırım son örnek için teoriye güvenmek yerine burada ikinci bir yeniden örnekleme katmanı yapabilirim, ancak modele bağlı olarak çok zaman alabilir. Yine de, bu standart hataların olup olmayacağından emin değilim herhangi bir şey için yararlı olun, çünkü sadece bootstrap çoğaltma sayısını arttırırsam 0'a yaklaşırlar.)
Çok teşekkürler ve bu arada, ben bir mühendisim, bu yüzden lütfen buralarda göreceli bir acemi olmamı affet.
nls
başarısız olabilir, ancak yakınlaşanlardan önyargı büyük olacak ve tahmin edilen standart hatalar / CI'ler sahte bir şekilde küçük olacaktır.nlsBoot
% 50 başarılı uyum için özel bir gereksinim kullanır, ancak koşullu dağıtımların (dis) benzerliğinin aynı derecede endişe duyduğunu kabul ediyorum.