自举残差:我做对了吗?

机器算法验证 时间序列 matlab 引导程序 残差
2022-03-10 20:41:14

首先: 据我了解,引导残差的工作原理如下:

  1. 将模型拟合到数据
  2. 计算残差
  3. 对残差重新采样并将它们加到 1。
  4. 将模型拟合到 3 中的新数据集。
  5. 重复n次数,但始终将重新采样的残差添加到从 1 开始的拟合中。

到目前为止是正确的吗?


我想做的是略有不同:

我想为估计一些环境变量的算法估计参数和预测不确定性。

我所拥有的是该变量 的无错误时间序列(来自模拟),x_true我在其中添加了一些噪声 ,x_noise以生成合成数据集x然后,我尝试通过将平方和sum((x_estimate - x_true)^2)(!不是x_estimate - x!)作为目标函数拟合我的算法来找到最佳参数。为了查看我的算法如何执行并创建参数分布的样本,我想重新采样x_noise,将其添加到x_true,再次拟合我的模型,冲洗并重复。这是评估参数不确定性的有效方法吗?我可以将自举数据集的拟合解释为预测不确定性,还是必须遵循我上面发布的程序?

/edit:我想我还没有真正弄清楚我的模型是做什么的。把它想象成一种去噪方法。它不是一个预测模型,它是一种算法,它试图从环境数据的嘈杂时间序列中提取潜在信号。

/edit^2:对于那里的 MATLAB 用户,我写了一些快速而肮脏的线性回归示例来说明我的意思。

这就是我认为残差的“普通”引导(如果我错了,请纠正我): http: //pastebin.com/C0CJp3d1

这就是我想做的:http: //pastebin.com/mbapsz4c

4个回答

这是更详细的通用(半参数引导)算法:

B= 引导数

该模型:
y=xβ+ϵ

ϵ^成为残差

  1. 运行回归并获得估计量β^和残差ϵ^.
  2. 对残差进行替换重采样,得到自举残差向量ϵ^B.
  3. 通过将 (1) 中的估计量与原始回归量相乘并添加自举残差来获得自举因变量:yB=xβ^+ϵ^B.
  4. 使用自举因变量和原始回归量运行回归,这给出自举估计量,即回归yBx,这给出β^B.
  5. 重复该过程 B- 回到 (2) 次。

要查看算法在预测准确性/均方误差方面的表现,您可能需要 Efron-Gong “乐观”引导程序。这是为了便于在 Rrms包中使用而实现的。查看它的功能ols, validate.ols, calibrate

我不确定我的理解是否正确。但这是我的建议,将您的代码(“残差的普通引导”,第 28-34 行)修改为:

for i = 2:n_boot  
x_res_boot = x_residuals( randi(n_data,n_data,1) );  
x_boot = x_res_boot+ x_best_fit;  
p_est(:, i) = polyfit( t, x_boot, 1 );  
x_best_fit2 = polyval( p_est(:, i), t );  
x_residuals = x_best_fit2 - x_boot;
x_best_fit=x_best_fit2;
end  

这个想法是,每次您使用的残差都不是来自第一次运行,而是来自之前的引导拟合。至于我,所有其他似乎都是有效的。

这是已在 MATLAB 中检查的修订版本。已修复两个错误。

时空应用

我应用了@Sweetbabyjesus 的回答。不幸的是,我的模型比 OLS 回归(它是来自R包的分布式滞后“hhh4 框架”时空模型)更复杂,在进行此类数据更改时会导致不稳定,从而导致不收敛消息。surveillance

如果您遇到这种情况,那么第二好的解决方案是通过将模型拟合到您的数据集来生成折刀估计,其中一个数据点丢失并重复N得到模型估计的分布;在时空模型上下文中,我将其解释为从响应变量中减去 1y例如疾病病例计数同时避免负计数,因此它是一个修剪减法函数。由于如果我使单个空间x时间单元格丢失,我无法拟合整个模型,即NA,减去 1 个计数是唯一的选择。

折刀估计的平均值非常接近模型点估计,但是折刀 sd 估计低估了模型 sd 1-3 个数量级!一般来说,jackknifing 是引导程序的“一阶近似”,因此我认为这个解决方案不是最理想的。