(如果需要,请忽略 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。)
非常感谢,顺便说一下,我是一名工程师,所以请原谅我是这里的新手。