说明:本来这只是一篇学生时期对研究方向进行总结的文章,没想到能够给其他人带来了一些的帮助。两年多以来,有许多人留言及私信问我相关的问题,我也不止一次地改正文章中的一些纰漏。但限于时间久远以及水平有限,这篇文章仍然只能作为入门读物,希望文中的一些描述不要给大家带来误解。
2020年7月28日

最近的论文写作中,需要用到Bootstrap方法,即所谓的“自举法”、“靴带法”。Bootstrap在英语中作为一个名词的话,其的意思是“拔靴带”,也就是通过 自身的 力量,自己把自己抬起来。注意这个限定——“通过自身的力量”——这是Bootstrap方法的核心所在。本篇博文旨在根据自身的实际工作,对Bootstrap方法进行带有实例的说明,有些冗长,但主要是为了总结一下最近的工作,如果可以为别人的工作带来帮助,那么我将感到十分高兴。

股票的例子

我所研究的领域是计量经济学中时间序列的变点研究,涉及的一些复杂的概念不过多说明,只用最简单的语言进行描述,力图让其他领域的人也能够理解。

假设我有一组股票数据,y1,y2,...,yny_{1},y_{2},...,y_{n}y1​,y2​,...,yn​,分别对应于时间节点x1,x2,...,xnx_{1},x_{2},...,x_{n}x1​,x2​,...,xn​时的股票价格(当然你也可以理解为第1天、第2天、……、第n天的价格)。我现在想要实现的是:找到一个模型MMM,它以已知的数据为基础进行构造(或者机器学习中的训练),完成后的模型基于历史数据,预测未来一段时间内(比如下一个交易日)的股票价格——即所谓的股票预测模型

我想拥有这样一个模型是所有股民期待的事情,这里我暂且不去考虑其可行性及准确性,单单就此问题进行讨论。

一、可能的问题1

我们知道,要想训练一个准确的模型MMM,则对序列{X,Y}\left \{ X,Y \right \}{X,Y}中所包含信息的理解越透彻越好。比如说,我们知道分红会降低股价,如果n=100n=100n=100,在x50x_{50}x50​时进行了分红,那么股价很可能发生如下的变化:

用时间序列中的术语来说,就是股价序列中存在均值变点,即均值发生了变化,生成上图中的数据时,前一半均值为5,后一半均值为2。当然,图中情况是非常理想化的,但足以说明问题。

这种情况下,如果仍然不进行任何处理仍然用这些数据进行建模的话,很可能会得到下面一个模型:
M=3.5M=3.5M=3.5
这意味着,股价将(至少在一段时间内)维持在3.5左右。而实际上分红已经导致了价格降低(维持在2左右),若仍用这个模型去描述股价,很明显是不明智的,更别说据此来作出正确的买入卖出决策了。

二、可能的问题2

在上个问题中,我实际上说的是最简单的一类变点了,我们都知道实际的股票价格的变化是更加复杂的一个过程。事实上,不仅仅是股票价格,还有其他几乎所有涉及到时间序列分析的领域,都会产生的大量的数据,而且这些数据往往不符合数理统计课本上的所有美好的假定——独立、正态、同分布……也就是说,序列完全有可能存在不止一个均值变点,也可能存在不止一类变点。

接下来,介绍另一种比较常见的变点——方差变点。还是先上图:

在这幅图中,仍然是在x50x_{50}x50​时序列发生了方差的变化,前一段序列的离散程度比后一段的离散程度要小——即序列中存在方差变点。

那么,第二个存在的问题就是,序列存在不止一类变点,例如,有可能既存在均值变点,又存在方差变点。

而实际情况是,序列的变点种类远不止均值与方差两种,还有所谓的“持久性变点”、“指数变点”以及“斜率变点”等许多种;另外,上面两幅图中展示的都是“突变”类型的变点,即序列的变化在一点完成,与之对应的还有渐变与周期性变化。

三、解决的方法

上面提到的问题,当然会对模型的准确性产生影响。从上面的分析也可以看出,既然变点的存在导致了模型的失准,那么一个直观的想法就是剔除变点的影响。而想要剔除变点的影响,首先就要搞清楚原始时间序列中是否存在变点以及存在什么类型的变点。

为了解决“时间序列中是否存在变点”以及“存在什么样的变点”的问题,我们可以利用假设检验的方法:对样本的分布作出某种假设,然后构造合适的统计量,由样本可以计算出统计量的值,根据这个值是否落入拒绝域作出拒绝或接受愿假设的判定。

事实上,说“接受原假设”是不严谨的。因为我们获取到的永远都是总体的一部分而非全部的总体,所以,只能说根据当前收集到的样本来看,没有理由拒绝原假设,但这并不意味着其他的样本不会使统计量得出拒绝原假设的结论。因此,更为稳妥的说法是“不拒绝原假设”,这种说法隐含的意思就是:不排除以后会获得使原假设不成立的样本。

这里对几个术语做一个简单的说明:

  • 统计量:不含未知参数的、样本的已知函数。例如均值,方差都属于统计量。
  • 假设检验:含原假设与备择假设。例如:原假设为不含均值变点,则备择假设可以设置为含有均值变点
  • 拒绝域:设针对某假设检验问题所构造的统计量在原假设正确的条件下有分布FFF,根据FFF可以计算出一个数值区间,使得满足原假设条件的序列经过统计量运算后很大概率落在该区间内。若对新的序列计算出的统计量的值落在该区间之外(称为拒绝域),则有把握说原假设不对,即拒绝原假设。

通过上述方法,我们可以初步判断一个序列中是否存在指定类型的变点。在文献中,针对不同类型的变点、满足不同条件的序列以及不同的原假设和备择假设,有许多可靠的统计量用来检验是否存在变点;进一步地,如果存在,可以估计出该变点的位置。

如果知道了变点类型和变点位置,那么就可以尝试解决上述问题1,例如,我们可以在变点前建立模型M1M_{1}M1​,在变点后建立模型M2M_{2}M2​,一般来讲,这种分类模型具有更高的准确性。

四、问题二呢?

在第三部分,我们找到了一种解决问题一的方案,即构造统计量来检验是否存在(单一类型的)变点及估计变点的位置。但是此类方法对问题二——存在多种类型的变点——有效吗?

请记住:一般情况下,检验统计量对于变点检验问题有很强的针对性。

换句话说,不同类型的变点只能用与之相对应的统计量去检验,而且这些统计量对于变点的数量及种类是非常敏感的。比如,有两类变点,分别是c1c_{1}c1​和c2c_{2}c2​,与之对应的检验统计量分别是T1T_{1}T1​与T2T_{2}T2​。如果序列中只存在一个c1c_{1}c1​变点,这时候用T1T_{1}T1​去检验,能够得出正确的结论;然而,如果序列中还存在一个c2c_{2}c2​变点,那么它就极有可能会影响T1T_{1}T1​对c1c_{1}c1​变点的检验。

考虑如下假设检验问题:
H0:不存在c1变点H_{0}:不存在c_{1}变点H0​:不存在c1​变点H1:存在c1变点H_{1}:存在c_{1}变点H1​:存在c1​变点

如果c2c_{2}c2​类变点存在,那么一个可能的后果就是使得T1T_{1}T1​拒绝H0H_{0}H0​的概率增加——即使序列中根本不存在c1c_{1}c1​类变点。

在变点检验领域,通常用size和power来衡量一个统计量的work效果
size:原假设为真时,拒绝原假设的概率,即犯第一类错误的概率。
power:原假设为假时,拒绝原假设的概率。

五、Bootstrap方法

根据四中的描述,当序列存在混合变点时,原本起作用的统计量很可能失真。这时,就需要我们的Boostrap方法上阵了。基于Bootstrap的方法种类有很多,这里不打算做太多理论总结。可以参考这里,如果想深入了解,最好去找相关文献。

简而言之,人们希望获取整体的全部信息,因为这样就可以做到“运筹帷幄”——整体都知道了,还有什么样本是我们不能掌握的吗?而实际上获取整体的信息是很难的,甚至是不可能的,所以才有了统计学中的“抽样”。也就是说,我们只能获取整体中的某些样本的信息,人们期望可以通过这些有限的样本信息来尽可能准确地估计总体,从而为决策提供依据。而Bootstrap方法认为,既然得到的样本是从总体中“抽取”的,那么为什么不可以把这些样本当做一个整体,从中进行 有放回地再抽取 呢?

这种方法看似简单,而实际上却是十分有效的。

来看如何解决四中的问题:

问题描述

已知序列{Y1,Y2,...,Yn}\left \{ Y_{1},Y_{2},...,Y_{n}\right \}{Y1​,Y2​,...,Yn​},想检验它是否存在变点c1c_{1}c1​。已知:原假设为序列含不有c1c_{1}c1​;序列存在不同类变点c2c_{2}c2​;采用的统计量为T1T_{1}T1​;临界值为v1v_{1}v1​;采用右侧拒绝(即统计量的值大于v1v_{1}v1​,则拒绝原假设)。

解决步骤

  • Step1. 对{Y1,Y2,...,Yn}\left \{ Y_{1},Y_{2},...,Y_{n}\right \}{Y1​,Y2​,...,Yn​}进行有放回的重抽样,得到新序列Y1∗,Y2∗,...,Yn∗Y_{1}^{*},Y_{2}^{*},...,Y_{n}^{*}Y1∗​,Y2∗​,...,Yn∗​。
  • Step2. 将上述Y1∗,Y2∗,...,Yn∗Y_{1}^{*},Y_{2}^{*},...,Y_{n}^{*}Y1∗​,Y2∗​,...,Yn∗​代入T1T_{1}T1​进行计算,得到一个值。
  • Step3. 重复Step1和Step2,一共进行B次,则从Step2中共得到B个值,分别记为b1,b2,...,bBb_{1},b_{2},...,b_{B}b1​,b2​,...,bB​。
  • Step4. 将得到的b1,b2,...,bBb_{1},b_{2},...,b_{B}b1​,b2​,...,bB​与v1v_{1}v1​进行比较,计算大于v1v_{1}v1​的个数,记为KKK,则KB\frac{K}{B}BK​为数值验证得到的size。

注意1: 在Step4中得到的size是有用的,如果我们知道原假设不含变点c1c_{1}c1​,那么size的值应该稳定在显著性水平附近;如果不采用上述方法,则会产生size distortion,即size偏高,亦即犯第一类错误概率增加,导致的结果就是,即使序列不含有c1c_{1}c1​,统计量也会拒绝它。

注意2: 如果我们想用这种方法去检验一个序列到底含不含有c1c_{1}c1​,该怎么做呢?很简单,将Step4中的KB\frac{K}{B}BK​换成1−KB1-\frac{K}{B}1−BK​,这就是所谓的p值,检验法则是:当p小于显著性水平时,拒绝原假设。

注意3: 如果是用来验证方法的有效性,通常会人为生成许多组{Y1,Y2,...,Yn}\left \{ Y_{1},Y_{2},...,Y_{n}\right \}{Y1​,Y2​,...,Yn​},然后计算KB\frac{K}{B}BK​得平均值即可。

统计学中的Bootstrap方法介绍及其应用相关推荐

  1. 统计学中的Bootstrap方法(Bootstrap抽样)用来训练bagging算法,如果随机森林Random Forests

    统计学中的Bootstrap方法(Bootstrap抽样)用来训练bagging算法,如果随机森林Random Forests 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学 ...

  2. 3不生效 bootstrap_Minitab学习 | 统计学中的Bootstrap方法

    什么是Bootstrap 抽样分布描述从总体的随机样本中获取统计量的每个可能值的可能性:换句话说,该大小的所有随机样本中有多大比率将得到该值.Bootstrap是一种通过抽取多个样本来估计抽样分布的方 ...

  3. 统计学中的Bootstrap方法(Bootstrap抽样)

    Bootstrap又称自展法.自举法.自助法.靴带法 ,  是统计学习中一种重采样(Resampling)技术,用来估计标准误差.置信区间和偏差 Bootstrap是现代统计学较为流行的一种统计方法, ...

  4. PHP删除数组中空值的方法介绍

    这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...

  5. java中equals函数所在的类,重写Java中的equals方法介绍

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  6. 寻仙手游服务器无响应,寻仙手游游戏中常见问题解决方法介绍

    寻仙手游游戏中常见问题解决方法介绍九游小编已经整理好了,现第一时间把寻仙手游游戏中常见问题解决方法介绍分享给大家.希望由九游小编所提供的这篇攻略玩家朋友们喜欢,也希望能对大家有所帮助,下面就请大家一起 ...

  7. bootstrap方法_中介效应中的bootstrap方法

    当我们有如上图所示的中介模型时,x--m的系数为0.1,m--y的系数也为0.1,这两个系数是显著的.但是0.1*0.1=0.01,此时中介效应还是显著的吗? 为了解决这个问题,有人提出只要两条路径都 ...

  8. transactionscope 中的异步 处理 异常_.NET Core中TransactionScope事务处理方法介绍及注意事项...

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.html 今天在写CzarCms的UnitOfWork的使用使用到了这个Transacti ...

  9. ASP.NET中的加密方法介绍

    以MD5为例(SHA1大致相同,只是使用的类不一样) MD5 相关类: System.Security.Cryptography.MD5 System.Security.Cryptography.MD ...

最新文章

  1. golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比
  2. 机器学习基础专题:感知机
  3. linux c 多线程socket编程,Linux多线程socket编程一些心得
  4. JDK8 SE安装步骤
  5. 就是要你懂 Java 中 volatile 关键字实现原理
  6. 解决PHP 中英文字符串截取出现半个字符
  7. 100转换成二进制 java,一段简单的java代码,十进制转二进制
  8. electron打包失败在下载nsis的地方
  9. 西门子cnc sinumerik_2020邯郸cnc加工中心编程要多久就是工厂傅
  10. qq音速显示服务器断开,《QQ音速》常见问题问答汇总
  11. c语言ip判断程序,IP判断 (C语言代码)
  12. 网络领域 ——《Adaptable Switch: A Heterogeneous Switch Architecture for Network-Centric Computing》
  13. Python实现基于ClipCap的看图说话Image Caption模型
  14. 用计算机弹音乐乐谱小幸运,小幸运——歌词和弦版本钢琴谱
  15. 魔兽世界服务器维护后 猎人宝宝,9.0猎人全宠物刷新地点 猎人宝宝刷新点大全...
  16. 怎么理解VGG-16结构图中的block
  17. x265工程简介、编译、调试测试
  18. 外键和内键.个人理解
  19. nacos1.1.4连接mysql 8.0.18步骤(有图有真相)
  20. 理解BERT:一个突破性NLP框架的综合指南

热门文章

  1. junit多个测试方法共享变量
  2. java 选择框_JSP、Java实现选择框多级连动
  3. fiddler 连接手机IP+端口不能够打开证书下载页如何处理。
  4. Mysql安装测试数据库employees
  5. WinCE 调试某手写输入法时遇到的加载手写库失败的问题
  6. 【最新】十项网络安全标准下载与最全解读(免费下载)
  7. matlab跳舞小人代码,可控制的跳舞小人
  8. 基于单片机控制的智能窗帘控制系统的设计与实现
  9. iOS:高仿微信文章悬浮球
  10. 初中信息技术面试计算机网络,2020下初中信息技术教师资格证面试试题及答案【1月10日上午】...