使用引导分布的标准误差

机器算法验证 r 引导程序 非线性回归
2022-02-09 07:53:06

(如果需要,请忽略 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。)

非常感谢,顺便说一下,我是一名工程师,所以请原谅我是这里的新手。

1个回答

这个问题有几个问题。首先,即使某些单独的自举估计量不可计算(缺乏收敛性,不存在解决方案),自举平均值是否会成为合理的估计量也是一个问题。其次,鉴于自举估计量是合理的,因此存在一个问题,即如何获得置信区间或这些估计的标准误差。

平均自举估计的想法与机器学习中用于提高弱预测器的预测性能的自举聚合或装袋密切相关,如果实际上不一样的话。参见ESL,第 8.7 节。在某些情况下也用于估计参数与仅在原始数据集上使用估计器相比,引导估计的平均可能会减少结果估计器的方差。

然而,问题的目的是即使在用于计算估计的算法可能偶尔失败或估计量偶尔未定义的情况下也能产生估计。作为一般方法,存在一个问题:

  • 对自举估计进行平均,同时盲目地丢弃估计不可计算的自举样本,通常会产生有偏差的结果。

一般问题的严重程度取决于几件事。例如,估计不可计算的频率以及在估计不可计算的情况下样本的条件分布是否与在估计可计算的情况下样本的条件分布不同。我不建议使用该方法。

对于问题的第二部分,我们需要一点符号。如果表示我们的原始数据集,我们的估计器(为简单起见假设它是实值并允许取值 NA)使得是原始数据的估计集合,并且表示单个引导样本,那么引导平均有效地计算估计量 其中表示事件,取决于也就是说,我们在自举样本上计算估计器的条件期望Xθ^θ^(X)Y

θ~(X)=E(θ^(Y)X,A(X))
A(X)Xθ^(Y)NA以原始样本和事件为条件,估计量对于自举样本是可计算的。实际的引导计算是基于采样的近似值。XA(X)θ~(X)

问题中的建议是计算自举估计量的经验标准差,这是条件下的标准差的估计。所需的标准偏差,即标准误差,是的标准偏差。你不能从前者那里得到后者。除了使用第二层自举来获得标准误差的可靠估计之外,我没有看到其他明显和通用的方法。θ^(Y)XA(X)θ~(X)

关于标准误差估计的讨论与上的条件如何影响估计量的偏差无关。如果影响严重,那么即使对标准误差的正确估计,置信区间也会产生误导。 A(X)θ~(X)

编辑

非常好的论文Estimation and Accuracy After Model Selection由 Efron 提供了一种无需使用第二层引导即可估计袋装估计器的标准误差的通用方法。该论文没有明确处理偶尔不可计算的估计量。