(bỏ qua mã R nếu cần, vì câu hỏi chính của tôi là độc lập với ngôn ngữ)
Nếu tôi muốn xem xét tính biến thiên của một thống kê đơn giản (ví dụ: mean), tôi biết tôi có thể làm điều đó thông qua lý thuyết như:
x = rnorm(50)
# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))
hoặc với bootstrap như:
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)
Tuy nhiên, điều tôi băn khoăn là, nó có hữu ích / hợp lệ (?) Để xem xét lỗi tiêu chuẩn của phân phối bootstrap trong một số tình huống không? Tình huống tôi đang xử lý là một hàm phi tuyến tương đối ồn, chẳng hạn như:
# 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)
Ở đây, mô hình thậm chí không hội tụ bằng cách sử dụng bộ dữ liệu gốc,
> (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
vì vậy các số liệu thống kê mà tôi quan tâm thay vào đó là các ước tính ổn định hơn về các tham số nls này - có lẽ là phương tiện của chúng trên một số bản sao 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)
Thực tế, đây là những gì tôi đã sử dụng để mô phỏng dữ liệu gốc:
> pars
[1] 5.606190 1.859591 -1.390816
Một phiên bản âm mưu trông như:
# 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)
Bây giờ, nếu tôi muốn tính biến thiên của các ước tính tham số ổn định này , tôi nghĩ rằng tôi có thể, giả sử tính quy tắc của phân phối bootstrap này, chỉ cần tính toán các lỗi tiêu chuẩn của chúng:
> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824
Đây có phải là một cách tiếp cận hợp lý? Có một cách tiếp cận chung tốt hơn để suy luận về các tham số của các mô hình phi tuyến không ổn định như thế này? (Tôi cho rằng thay vào đó tôi có thể thực hiện một lớp thay đổi thứ hai ở đây, thay vì dựa vào lý thuyết cho bit cuối cùng, nhưng điều đó có thể mất rất nhiều thời gian tùy thuộc vào mô hình. sẽ hữu ích cho mọi thứ, vì chúng sẽ tiến tới 0 nếu tôi chỉ tăng số lần sao chép bootstrap.)
Rất cám ơn, và nhân tiện, tôi là một kỹ sư vì vậy xin hãy tha thứ cho tôi là một người mới làm quen ở đây.
nls
phù hợp có thể thất bại, nhưng, trong số những điều phù hợp, sự thiên vị sẽ rất lớn và các lỗi tiêu chuẩn / CIs được dự đoán là nhỏ.nlsBoot
sử dụng một yêu cầu đặc biệt là 50% phù hợp thành công, nhưng tôi đồng ý với bạn rằng sự tương đồng (dis) của các bản phân phối có điều kiện cũng là một mối quan tâm không kém.