1 统计计算介绍

1.1 统计计算的范畴

统计计算是现代统计的重要组成部分。 从上个世纪三、四十年代起, 数理统计的理论和方法得到跨越式的发展, 统计推断理论、回归分析、试验设计、方差分析、 序贯分析、时间序列分析、 随机过程等理论和方法在这个时期逐渐成熟。 但是,直到上个世纪八十年代, 统计学作为一门学科才真正得到了广泛的普及, 其应用深入到了我们的学术研究和社会生活的每一个方面, 只要需要分析数据的地方就需要用到统计学。 这种普及很大程度上要归功于电子信息技术的高速发展。

统计计算就是统计方法和实际计算的结合。 统计计算有以下两个方面的内容:

  • 把统计方法变成可靠、高效的算法, 并编程实现。这是经典的统计计算要解决的问题, 比如计算分布函数值、分位数函数值、 计算线性回归参数估计和检验、求解最大似然估计等。
  • 借助于现代计算机的强大处理能力, 发展新的统计方法。 这是计算技术对统计学的贡献, 比如用随机模拟方法求解贝叶斯模型、 Bootstrap置信区间,等等。 这个方面有时被称为“计算统计”(computational statistics)。

第二个方面的内容包括计算密集的统计方法及相应的理论工作。 随机模拟方法是其中一个重要内容。 随机模拟的基本思想是在计算机上模拟生成一个统计问题的数据并进行大量的重复, 这样相当于获得了此问题的海量的样本。 如果我们的目的是评估某种建模方法, 我们可以对每个样本建模, 最后从所有建模结果评估这种方法的性能。 可以从理论模型产生海量模拟样本后对此模型进行理论推断, 如蒙特卡洛检验。 可以对观测数据进行多次重复再抽样生成许多新样本, 如Bootstrap方法。 在贝叶斯统计框架下, 我们可以从先验分布抽样并按照模型产生大量样本并结合观测数据计算其似然, 从而获得参数后验分布的大量样本, 以此进行贝叶斯推断。 借助于随机模拟, 我们可以试验各种各样的模型与方法, 发现表现优秀的模型和方法后再进行深入研究。

另外,各行各业中数据收集越来越广泛, 在迅速积累的海量数据中包含了许多以前无法触摸的现象和规律, 对海量数据进行探索性分析,从海量数据中发现规律, 已经成为统计学和信息科学的热门研究方法, 通常称为机器学习、数据挖掘等。 这也是统计计算第二个方面的重要内容。

现在已经有了许多专用的统计软件, 比如R、SAS等,为我们平常遇到的许多问题提供了现成的解决办法, 那么,我们为什么还需要学习统计计算呢?

我们遇到的具体应用问题常常是没有现成的方法可以套用的。 即使有现成的统计软件可用, 我们也需要理解这些软件的工作原理以避免错误使用; 在遇到新问题时,需要能够修改原有代码或编写新代码, 把计算工具结合在一起解决自己的数据分析问题, 而不是修改自己的问题以适应现成的软件。

1.2 算法和计算机语言

算法是完成某项任务的步骤的精确的描述。 比如,泡方便面的一种算法为:

  1. 准备方便面、容量500毫升的碗、300毫升开水;
  2. 将方便面包装撕开,放入碗中;
  3. 将调料包撕开,放入碗中;
  4. 向碗中倒入开水;
  5. 等待5分钟。

当然,算法主要针对在电子计算机上的计算而设计。 好的算法应该满足如下要求:

  • 结果正确,即要求算法的最后结果是我们问题的正确解, 最好能够验证结果的正确性。
  • 指令可行,即指令含义明确无歧义, 指令可以执行并且在现有的计算条件下算法能在允许的时间计算结束。
  • 高效,尽可能少地消耗时间和内存、外存资源。

电子计算机由CPU、内存、大容量外存、输入/输出装置等硬件构成, 但是依赖于软件完成任务。 软件在执行时是一系列机器指令进行取值、存储、加法等操作。 操作系统是最基本的计算机软件, 用来管理内存位置、软件指令、输入输出和其他程序的运行调度。

计算机软件可以用于完成特定任务, 如字处理、记账, 也可以适用于较宽的范围,比如电子表格软件可以用来记账、试算、作图, 而计算机语言则是用来编制新的软件的工具。

计算机语言根据其运行方式可以分为解释型和编译型两种, 解释型语言逐句解释程序并逐句执行, 编译型语言把整个程序编译为二进制代码后再执行。 按照计算机语言的抽象程度区分, 包括二进制形式的机器语言,仅能用在特定的硬件中; 汇编语言,用与CPU指令对应的命令编写,主要用于底层功能; 面向细节的通用语言,如Pascal, C, Fortran, Lisp, Cobol, C++, Java等, 优点是通用性和可复用性。

更高级的计算机语言有R、Matlab等,提供了包括向量、矩阵等高级数据类型, 代码与统计学的数学公式相似,直接支持求和、向量、矩阵等运算,易写易读, 用户不用自己实现如解线性方程、求特征根这样的基础操作, 但是这样的语言一般是解释执行的,执行效率难以改进,不利于使用循环或迭代算法。 本书使用R和Julia作为配套的编程语言。

R软件是一个统计计算软件, 同时也是一种计算机编程语言,与S语言基本兼容。 S语言是Rick Becker, John Chambers等人在贝尔实验室开发的一个进行数据分析和交互作图的计算机语言, 可以使用向量、矩阵、对象等数据进行编程, 功能强大,程序简单。 R是GPL授权的自由软件, 最初由新西兰Auckland大学的Ross Ihaka 和 Robert Gentleman 于1997年发布,现在由R核心团队开发, 全世界的用户贡献了上万个软件包, 功能涵盖了经典和现代统计方法的绝大部分, 是世界上许多顶尖的统计学家进行统计研究和发表算法的工具。 见R的网站: http://www.r-project.org/。 我们将讲授R的基本使用, 在算法示例和习题中使用R作为编程语言, 并在讲到具体统计计算方法时提及R中有关的函数。

Julia程序语言也是一种计算机编程语言, 就像C、C++、Fortran、Java、R、Python、Matlab等程序语言一样。 Julia语言历史比较短,发布于2012年,是MIT的几位作者和全世界的参与者共同制作的。 主网站在https://julialang.org/。 Julia与R、Python等一样是动态类型语言, 程序与R、Python一样简单易用; 同时,Julia语言支持实时编译, 使得Julia程序的效率基本达到和C、Fortran等强类型语言同样的高效率, 尤其适用于数值计算,在现今的大数据应用中也是特别合适的语言, 在大数据应用中排在Python、R之后,已经获得广泛的关注, 现在用户较少只是因为历史还太短。 本书将混合使用R语言和Julia语言。

本书目的主要是要求学生掌握统计计算方法、理解统计计算思想, 但是这些算法的正确、高效实现也是很重要的。 我们设置了足够的习题让学生通过实际编程了解算法实现中的各种问题。

1.3 优秀程序设计要旨

在进行程序设计时,应注意以下几点:

  • 要对程序抱有怀疑态度。逐步验证每一个模块。
  • 大的任务要分解为小的模块。对每个模块进行详细测试。 象R、Julia、Python、MATLAB这样的更高级语言的优点是许多模块已经由系统本身提供了, 如矩阵计算、函数优化等。 但即使这样也应进行测试, 因为系统提供的功能有可能不适用于你的特殊情况。
  • 编写一系列测试问题,涵盖应用的不同情况。 最开始用最简单的测试。 测试也应该包括超出范围的问题,这时程序应该能正确地判别错误输入。
  • 好的程序不应该是用了很多高明的技巧以至于别人很难看懂, 而是越直接越好,这样只要出错误就是明显的错误。
  • 要有程序文档。
  • 只要对程序的每一模块都进行了详细验证和检查,就可以确信程序的正确性。

1.4 内容提要

本书包括基本的统计计算方法, 如计算分布函数、分位数函数的一般方法, 矩阵计算方法、最优化方法、随机数生成算法。 另外还用较大篇幅讲述了随机模拟方法, 包括随机模拟的基本思想、改进精度的方法、重要应用。 最后,还介绍了完全由计算方法发展出来的统计方法, 如Bootstrap、EM算法、MCMC方法等。

第一部分包括本章, 以及第2-4章, 第2章讲解误差的来源和分类以及避免和减少误差的方法, 这对我们了解算法的局限并在算法实现时避免产生有缺陷的算法有重要意义。 第3章讲描述统计量计算, 第4章讲简单的统计图形用法。

第二部分包括第5-9章, 讲随机数产生与检验, 内容有均匀随机数的产生方法和检验方法, 非均匀随机数的各种生成方法,包括函数变换、舍选抽样、重要抽样等。 关于随机向量和随机过程的产生方法也进行了简单介绍。

第三部分包括第10-20章, 讲随机模拟方法。 第10-14章用随机模拟积分作为例子, 讲解随机模拟方法的基本思想, 包括减小随机模拟误差的技术。 第15章介绍了离散随机事件模拟中随机服务系统模拟问题。 随机模拟方法对新统计方法的研究比较也具有广泛应用, 第16章用一个例子演示了随机模拟在统计方法研究中的用法。 第17章讲述了Bootstrap方法, 这是完全利用随机模拟方法解决统计推断问题的一个具体示例。 第18章讲置换检验, 此方法基于对称性的思想。 MCMC是现代统计计算的重要工具, 尤其是在贝叶斯建模中起到关键作用, 第19章讲解了MCMC的部分理论基础和实际做法。 序贯重要抽样方法也是现代统计计算中一类重要方法, 第20章做了介绍。

第四部分包括第21-26章, 针对分布函数和分位数函数等近似计算问题, 介绍函数逼近的多项式方法、连分数表示, 插值方法,样条函数, 数值积分和数值微分。

在回归分析等线性模型、多元模型、函数数据分析的计算中广泛用到矩阵计算方法。 第五部分包括第27-34章, 介绍统计计算中常用的矩阵方法, 比如矩阵三角分解、正交三角分解、特征值分解、奇异值分解, 广义特征值,广义逆等。

很多统计计算问题都会归结为一个最优化问题, 即求解函数的无约束或有约束的最小值(最大值)点的问题, 比如最大似然估计、非线性回归等。 第六部分包括第35-39章, 首先给出最优化问题的一些理论基础, 然后讨论无约束最优化的方法, 再给出约束最优化的一些算法, 并讨论了统计计算中的一些特定的优化问题, 如最大似然估计、非参数回归、EM算法。

附录A介绍了R语言的基础, 由于篇幅所限仅包括数据类型、程序结构、函数的基础介绍, 进一步的用法还要参考其他教材和R用户手册。 附录B介绍了Julia语言的基本使用。 附录C介绍了自由软件的计算机代数系统Maxima的基本用法。

本书的每一章后面附有习题, 有一些是对教材中理论的进一步延伸讨论, 有一些是程序编制问题。 读者可以选作这些习题, 加深对教材内容的理解, 并获得实际编程锻炼。

本书是在已经出版的教材的基础上逐步更新, 添加新内容而逐渐形成的, 内容随时会有增删。

参考: Gentle (2002), Gentle (2009), 高惠璇 (1995), Kochenderfer (2019)

参考文献

Gentle, James E. 2002. Elements of Computational Statistics. Springer Science + Business Media, Inc.
———. 2009. Computational Statistics. Springer.
Kochenderfer, Tim A., Mykel J. and Wheeler. 2019. Algorithms for Optimization. MIT Press. https://algorithmsbook.com/optimization/.
高惠璇. 1995. 统计计算. 北京大学出版社.