(ігноруйте 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
Це розумний підхід? Чи є кращий загальний підхід до висновку щодо таких нестабільних параметрів, як ця? (Я припускаю, що я міг би зробити тут другий шар перекомпонування, замість того, щоб останній біт покладатися на теорію, але це може зайняти багато часу залежно від моделі. Навіть все ж я не впевнений, що ці стандартні помилки будуть бути корисним для будь-чого, оскільки вони підійдуть до 0, якщо я просто збільшить кількість реплікацій завантажувальної програми.)
Велике спасибі, і, до речі, я інженер, тому, будь ласка, пробачте мене, що я тут родич.
nls
припадків може зазнати невдач, але, з тих, що сходяться, ухил буде величезним, а прогнозовані стандартні помилки / CI неправдиво малі.nlsBoot
використовує спеціальну вимогу 50% успішних підходів, але я згоден з вами, що (не) подібність умовних розподілів однаково викликає занепокоєння.