Quantcast
Channel: 模型专题 –统计之都
Viewing all 16 articles
Browse latest View live

使用回归分析,样本过少时不妨好先作图看看

$
0
0

回归分析往往是学统计、学计量课程时接触的第一个统计模型了,甚至不少人可能认为回归分析理所当然成为计量的绝大部分内容——毕竟很多教材中提到统计模型的时候,往往就一个OLS为主的讲法。回归分析的内容当然很广泛,也在学科中占据相对基础的位置。

学会OLS,有人还明白了ML等方法的含义;现在学统计分析的时候,或多或少会安排统计软件的实践课程,于是大家学会了使用Excel,乃至SAS中如何来做经典的回归分析。看过不少的文献,很多都忽略了回归分析模型诊断这个环节——可能很多标准教科书没有强调,甚至是没有讲;这不能不说是一个遗憾。

回归分析使用最广泛,误用的情况也多了些。下面使用一个经典的例子,来“恶心”一下那些“过分钟爱”经典回归分析的人——我在很多课堂上都举过这个例子(Anscombe),作为从基础课程向中级乃至高级课程的开场白。

x1 x2 x3 x4    y1   y2    y3    y4
1  10 10 10  8  8.04 9.14  7.46  6.58
2   8  8  8  8  6.95 8.14  6.77  5.76
3  13 13 13  8  7.58 8.74 12.74  7.71
4   9  9  9  8  8.81 8.77  7.11  8.84
5  11 11 11  8  8.33 9.26  7.81  8.47
6  14 14 14  8  9.96 8.10  8.84  7.04
7   6  6  6  8  7.24 6.13  6.08  5.25
8   4  4  4 19  4.26 3.10  5.39 12.50
9  12 12 12  8 10.84 9.13  8.15  5.56
10  7  7  7  8  4.82 7.26  6.42  7.91
11  5  5  5  8  5.68 4.74  5.73  6.89

上面有四对x,y,分别做经典回归分析的话,结果如下:

[[1]]
Estimate Std. Error  t value    Pr(>|t|)
(Intercept) 3.0000909  1.1247468 2.667348 0.025734051
x1          0.5000909  0.1179055 4.241455 0.002169629
[[2]]
Estimate Std. Error  t value    Pr(>|t|)
(Intercept) 3.000909  1.1253024 2.666758 0.025758941
x2          0.500000  0.1179637 4.238590 0.002178816
[[3]]
Estimate Std. Error  t value    Pr(>|t|)
(Intercept) 3.0024545  1.1244812 2.670080 0.025619109
x3          0.4997273  0.1178777 4.239372 0.002176305
[[4]]
Estimate Std. Error  t value    Pr(>|t|)
(Intercept) 3.0017273  1.1239211 2.670763 0.025590425
x4          0.4999091  0.1178189 4.243028 0.002164602

这时候你会发现p值、s.e.值都好的很,截距项和斜率项也非常好,甚至连R square都简直一模一样。

往往讲到这个时候,机灵点的学生就开始皱眉头了:数据差别挺大的,怎么模型都是一样呢!?

学过回归诊断的人立刻就嚷嚷来做个回归诊断来看看,四种情况下是不是有的属于“模型前提假设”不满足的情况。(当然,似乎本科阶段,教师没有过分强调这点的,很少有学生能自己自主的想到这点,所以往往让人感叹教学过程中的不完善。)

紧接着我就给他们做出一幅图:

anscombe

这时候他们有点明白,能回答说左上是我们“常见”的回归;右上完全就是二次曲线嘛;左下存在一个“异常点”;而右下,完全就属于“诡异”情形。

所以可以归纳一下:做统计模型的时候,一定记得要模型诊断下——重点就分析下残差是不是符合假设——这个是标准套路。如果你想“偷懒”,在只有一个自变量的时候,不妨在样本量不多(现在的统计软件已经非常强大了,数万对点很容易搞定;如果数据太多,你也可以抽样来试试嘛。)这样,“一眼”就能看出个大概了——这恐怕就是人比机器厉害的地方,人比模型厉害的地方。


开源的计量经济学软件gretl

$
0
0

gretl(Gnu Regression,Econometrics and Time-series Library)是一款跨平台的计量分析软件。它是开源软件,用C语言写成,由 Allin Cottrell和Riccardo “Jack” Lucchettii 共同开发。

主要特性

  • 简单友好的界面
  • 多种估计方法:最小二乘、极大似然、GMM
  • 时间序列方法:ARMA,GARCH,VAR和VECM,单位根和协整检验
  • 模型结果以LaTeX文件的形式输出,包括表格和方程
  • 通过鼠标菜单操作,或通过脚本语言的命令操作
  • 为蒙特卡洛模拟和迭代估计过程提供循环的命令语句
  • 可以和R连接进行进一步的数据分析
  • 安装插件包(X-12-ARIMA 和TRAMO/SEATS)可以实现ARIMA模型里的季节调整
  • 提供有多部经典计量经济学教材的数据和程序,包括Wooldridge、 Gujarati 等

数据类型

  • gretl自身的文件格式是XML,但它还可输入Excel、Gnumeric、Stata、EViews、RATS、GNU Octave、PcGive、JMulTi和ASCII文件,也可以输出到GNU Octave、GNU R、JMulTi和PcGive文件格式。

界面截图

gretl界面截图

gretl界面截图

相关链接

Hilbert空间视角下的时间序列模型

$
0
0

Hilbert空间说起来和我国古代数学有着一定的渊源。《九章算术》里记载:“勾股术曰:勾股各自乘,并,而开方除之,即弦”。这条著名的勾股定理实质上蕴含了Hilbert空间中对于距离和正交的核心性质。

Hilbert空间特点是通过定义内积$ < \cdot , \cdot > $来导出范数,进而导出距离函数。由内积可以定义正交关系,即若$ <x,y>=0 $则定义$ x , y $在空间中正交。一列彼此正交的元素$ e_j $称为一组正交基,内积的概念给出了任意元素$ x $相对于这组正交基的坐标,即元素$ x $在各个正交基上的投影$ < x , e_j > $.

最常见的Hilbert空间是Euclidean空间$ R^n $,即是线性代数研究的范畴。平面几何研究的是$ R^2 $,“勾股定理”反映的性质就是属于这个空间内的。“勾股定理”用Hilbert空间中的概念表达即为:
给定$ R^2 $中的一组标准正交基${e_1 , e_2} $,则任意点$ x $关于0元素的距离$ \parallel x \parallel $满足:$ \parallel x \parallel^2=\mid<x , e_1>\mid^2 + \mid <x , e_2>\mid^2 $.

这条定理的一般形式正是Hilbert空间中著名的Parseval公式,前提是正交系$ \{e_j\} $是完备的。在此前提下,Parseval公式成立:

$ \parallel x \parallel^2 =\sum_j \mid < x , e_j >\mid^2 $

Parseval公式揭示了Hilbert空间的优良特点,即任一点的位置可以相对于一组完备正交基完全定义,而且这种定义完全保留了点与点之间的距离关系。这就给计算带来极大的便利。

时序模型研究的是一类特殊的Hilbert空间:$ \mathscr{L}^2\{\Omega,\mathscr{F},P\} $,即一个定义在概率空间$ \{\Omega,\mathscr{F},P\} $上的平方可积函数集合,其中的内积定义为:

$ <X,Y>=E(XY)=\int_\Omega xydP(x,y) $

在提出这个定义以前,时序中经常提到的“均方收敛”的概念难以理解:一个随机变量“均方收敛”的结果是另一随机变量,也就是说这个序列收敛的结果取值仍然是不确定的;这和数学分析中研究的收敛范畴大相径庭。实际上,“收敛”的确切含义是指点与点之间距离趋向于0,但是对于这种“距离”的定义在不同的空间中可以是不同的。数学分析中的距离由绝对值定义,而这里的“距离”则由内积定义。均方收敛实际上与上述距离的定义完全一致,即:

$ \parallel X_m-X_n \parallel =(E(X_m-X_n)^2)^{\frac{1}{2}} $

再来看$ \mathscr{L}^2\{\Omega,\mathscr{F},P\} $的正交基的形式。其实最简单的正交基就是白噪声序列$ \{a_t\} \sim i.i.d(0,\sigma^2) $,因为

$ <a_i,a_j> = E a_ia_j=\delta_{ij}\sigma^2 $

为了应用之前的Parseval公式,严格的说需要证明$ \{a_t\} $是完备的。但如果我们只研究这组基生成的线性子空间$ \mathscr{H}:=\overline{sp}{a_j} $,那么显然在$ \mathscr{H} $上这组正交基是完备的。这个空间对线性时序模型已经完全足够了。

对于平稳的ARMA序列,$ X_t $的信息是由t时刻以前的白噪声序列决定的,写成数学形式即

$ X_t \in\mathscr{H}_t:=\overline{sp}{a_j,j \leq t} $

这反映了序列的鞅性质。更一般地,$ X_t $在Hilbert子空间$ \overline{sp}{a_j,j \leq t} $有固定的表达,这就是模型的$ MA(\infty) $表示。但是在实际情况中对$ \{X_j,j < t\} $的观测更为直接,因此我们也关心$ X_t $ 在$ \overline{sp}{X_j,j < t} $上的投影表达,即模型的$ AR(\infty) $表达形式。注意到$ \overline{sp}{X_j,j<t}=\overline{sp}{a_j,j<t} $,因此这两种表达形式本质是一致的,只是前者子空间的生成元不是正交基。

线性时序模型ARMA的预测问题可以归结为求解$ X_t $在空间$ \mathscr{H}_{t-1} $的投影,即在Hilbert子空间$ \mathscr{H}_{t-1} $中的最佳逼近元。最佳逼近元的泛函概念是在$ \mathscr{H}_{t-1} $中寻找使得距离$ \parallel X-\hat{X} \parallel $最小的估计值$ \hat{X} $,从范数的定义很容易看出,这个概念和统计上“均方误差最小”的概念是一致的。注意到在线性回归模型中,我们求解的目标也是$ \parallel y-\hat{y} \parallel $最小,但是线性回归模型中范数$ \parallel \cdot \parallel $是定义在Euclidean空间$ R^n $上的。最小二乘模型中的$ R^n $也是一种Hilbert空间,而$ R^n $和$ \mathscr{L}^2\{\Omega,\mathscr{F},P\} $的区别也说明了ARMA回归和线性回归的差别。线性回归模型的最小二乘法完全源于$ R^n $的性质,但是对于ARMA 模型来说,$ \parallel X-\hat{X} \parallel $的计算是几乎不可能的,因此首先都是通过构造一组由$ \{a_j,1 \leq j \leq t-1\} $作为正交基生成的Euclidean空间$ R^{t-1} $去对$ \mathscr{H}_{t-1} $作近似,用$ R^{t-1} $中的范数近似$ \mathscr{H}_{t-1} $的范数。

这种做法背后的假设是,随机白噪声序列的观测值$ \{a_j,1 \leq j \leq t-1\} $在距离上典型的“代表意义”,即以观测值为基生成的欧式空间$ R^{t-1} $可以反映$ \mathscr{H}_{t-1} $空间中的距离信息,这个思想和极大似然估计是相似的,即把观测值都是具有典型性代表性的。有了这个空间的变换,就把原先非欧空间中的优化问题转化为欧式空间中的问题,解决起来也就容易多了。从算法上看,回归模型和ARMA模型都是在欧式空间中进行,方法十分类似;但是二者本质上是存在差别的,回归模型本身就是欧式空间中的问题,而把ARMA模型放到欧式空间中进行求解只是一种简化。当对统计量极限分布进行研究时,ARMA模型必须重新考虑在原有空间$ \mathscr{L}^2\{\Omega,\mathscr{F},P\} $中距离的定义,这个过程就远比线性回归模型要复杂了。

时间序列的谱分析实质上是在另一种Hilbert空间$ \mathscr{L}^2(F) $的视角下进行研究。Fourier变换定义了一个映射$ T : \mathscr{L}^2\{\Omega,\mathscr{F},P\}\rightarrow \mathscr{L}^2(F) $,该映射满足

$ TX_t=e^{it} $

这两个空间是通过一个$ \mathscr{L}^2\{\Omega,\mathscr{F},P\} $上的正交增量过程$ Z(v) $发生联系的,其中

$ X_t=\int_{(-\pi,\pi]}e^{itv}dZ(v) $

定义$ F(v):=var(Z(v)-Z(-\pi)) $,则在空间$ \mathscr{L}^2(F) $上,利用Ito积分的有关性质得到:

$ <e^{i(t+h)},e^{it}>=\int e^{i(t+h)v-itv}dF(v)=\int e^{ihv}dF(v)=\gamma(h) $

因此在空间$ \mathscr{L}^2(F) $上可以直观地对自相关函数进行描述。函数$ F(v) $的导数$ f(v) $就是谱函数。对有限序列$ \{X_t,1 \leq t \leq n \} $作Fourier变换得到的序列$ f_n(\omega_j) $,就是$ f(v) $在各个频率上的估计。可以证明对固定的时序模型,该映射$ T $对应的正交增量过程$ Z(v) $以概率1恒定;所以相应的谱函数$ f(v) $是唯一的。

以上提到的两种Hilbert空间为时序模型提供了时域和频域两种不同的视角,也在泛函领域奠定了两种分析方法的的理论基础。在对时序模型统计量的收敛性进行分析时,以上两种视角是必不可少的。

注:本文已经由COS编辑部整理为PDF(LaTeX)版本,读者可以下载:

http://cos.name/wp-content/uploads/2009/03/Hilbert空间视角下的时间序列模型.pdf

漫谈相关与回归

$
0
0

老师不断提醒我要对统计学的基本概念、定义及背景反复思考,这样才不会本末倒置,迷失方向。但是这个做起来很难,因为那些概念定义等看起来实在”太简单”、”没什么东西”,可能还是不能够平心静气吧!

最近静下来看了David Freedman等著的《统计学》的”相关与回归”部分,以及一篇关于直方图的文章,不免有些感慨!其实统计学中的很多概念、工具、方法等的实际意义或作用可能要比我们认为的要大很多,同时,当我们从一些概念定义等中发现出一些新东西时我们总会欣喜若狂。世界上的很多事物又何尝不是如此,人们对事物的了解总易受到传统或他人的影响仅仅停留在表面,很少达到全面而深刻,而一旦我们获得了那种深刻的洞察力,才发现真实世界是何等的精彩!一直以为直方图很简单,无非是一些代表频数的柱状图的组合而已,感觉没什么作用,但是看了一篇关于直方图制作方面的论文时,才认识到直方图的威力。直方图其实是非参数统计中估计总体分布特征的一项重要工具,选择好适当的组距和边界点(组距和最小边界点是关键),随着样本量的增大,它可以非常接近地反映数据的真实分布情况。其实,在统计中使用一种工具方法的目的也应该是使现有的数据尽可能多地反映出真实的信息,而这项工作往往是一个无底洞(这时又要考虑到效率问题了)。

散点图亦是如此。散点图给出了所有数据点的信息,但是如何从这些数据中获得结论或拟合模型,甚至用来预测?面对一张散点图,相关和回归应该是最容易想到的吧!这里主要谈谈两个变量间的相关和回归。

在研究两个变量的关系时,一般会先看看它们的散点图,在图中两变量的关系还是比较直观的,大致可以判断是否线性相关及相关性大小如何,是否是非线性相关等。而到底什么是相关呢?相关其实就是知道一件事对了解另一件事的帮助的大小。实际中,如果对某一事物不太了解,但是对与其有一定联系的另一事物有所了解,如果这种联系很强,那我们对于那件不了解的事物就有了更多的信息,或者说对这个不了解的事物有了更大的自信去预测。其实这也是研究中的一种常用的方法。

关于两个变量间的相关系数的计算。我们都知道两个变量X与Y的相关系数的计算公式为$Cov(x,y)/(SD(x)*SD(y))$,然而这已经是一个结果性东西了,我更推崇David Freedman等著的《统计学》中计算方法:先分别对两个变量做标准化,比如对变量X做标准化$(x_i-\bar{x})/SD(x)$,然后对应的标准量相乘,最后加总再求平均. 这种求法反映到散点图中,相当于对散点图的坐标刻度标准化,从而使两个坐标轴具有了相同的刻度,同时在直观两个变量之间的相关性大小时不会受到各自的标准差大小的影响。这个新的坐标系把所有的点(数据对)分到了不同的象限,通过观察各个象限的点的个数和大致分布情况便可以对相关性的大小与正负有直观的了解,比如更多的点都分布在一、三象限且群集于一条直线周围,那么这两个变量的一般具有较强的正线性相关。

我们都知道相关系数是-1到1之间的一个实数,那么相关系数为0.8是不是表示百分之八十的点群集在一条直线的周围吗?当然不是,相关系数是基于全体数据的一个综合信息,它反映的是所有点与某一条直线的群集程度,而不是一部分的点。由此也不免想到,我们在用到一些概念或定义时,也必须清楚这个概念或定义是基于怎样的对象,或有哪些局限条件或假定,比如概率论中的”事件”, “事件”是基于特定条件的,在具体使用过程中大家对这些特定条件都太”熟悉”以至于很少关注到它们,所以一旦条件改变了,大部分的人认为还是指同一个东西。

相关与因果也是这样,我们都知道相关不能同因果划等号,但实际过程中人们总”自然而然”地得出一些结论。一般来说,体重和升高相关,那体重大是不是就因为身高高呢?除非有一个固定的身材标准,而所有人都是这个标准。(随便提个问题:如果两个变量严格线性相关,即相关系数为1,那是否可以说这两个变量中一个为因一个为果呢?)。其实两个变量的相关更经常的情况是它们同时受到另外的一个或多个因素的影响,在这里可以通过对照试验或观察研究来进一步研究。另外,相关是可逆的,而因果则不可以。所以我们分析相关时总是如此谨慎地说,某某变化,与此相关的某某”相应地”如何变化。研究发现,个人收入与教育水平相关,高教育水平是不是高收入的原因呢?实际情况是它们相互影响:教育水平高的人收入一般较高,收入高的一般也更有能力获得继续教育的机会。虽然相关不是因果,然而有时我们并不需要弄清所有的因果关系,盯住输入和输出,只要存在相关,即使不是因果关系也不妨碍人们利用这种关系来进行推断。比如利用公鸡打鸣来预报太阳升起,虽然公鸡打鸣绝对不是日出的原因(虽然打鸣发生在先)。

在对两变量的相关关系有一定了解后,接下来的自然想法便是拟合回归模型。”回归”这一词来自于高尔顿的父子两代身高的研究,身高较高的父亲其儿子的平均身高要比父亲矮些,身高较矮的父亲其儿子的平均身高要比父亲高些,用高尔顿的话说就是”回归到平常”。虽然现在统计学上的”回归”这一概念已经远远超出的当时的定义,但是回归的原始思想依然有着非常重要的作用。”回归”,个人认为其实就是向中心的回归。在知道某地区18-24岁男子的身高的大致情况时,如果没有其他信息,让我们估计该地区中某一特定区域18-24岁男子的平均身高时(当然不是侏儒或篮球运动员之类的人),自然是用平均数(包括中位数)去估计了,这便是回归,没有其它的辅助信息时我们总倾向于平均值,这当然是符合统计思想的。两个变量的相关系数绝对值为1时,那么知道一变量的值就立即知道了另一变量的值;相关系数为0时,那么知道一变量的值对预测另一变量没有任何意义,那么我们就估计其值为平均值;相关系数绝对值介于0与1之间时,相关程度越大,我们越不倾向于取平均值。其实回归模型也是基于平均意义的,让我们来看看回归的本质(暂以两个变量x和y为例),回归是对每一个x值的y的平均值的估计,所以用回归模型来预测或估计总是平均意义的(这也是回归的思想),而针对某个特别的个体的预测则就需要非常的慎重了。

有这样一个例子,某学前班在儿童入学和结业时均要做智商测验,结果发现前后两次测验的分数平均都接近于100分,标准差为15分。但是仔细观察发现入学分数低于平均值的儿童结业时分数平均提高了5分,相反入学分数高于平均值的儿童结业时分数平均降低了5分,难道学前班会使儿童的智商平均化?其实没那么夸张,这只是回归效应的一个表现,只要两次测验分数的散点图中所有点不在同一条直线(这条直线的斜率为1)上,那么就会存在回归效应。观察得到的数据并不是真实值,都有或大或小的、或正或负误差,在大多数对称的概率分布中,观察值大于平均值的往往是其真实值加上了一个正的机会误差,观察值小于平均值的往往是其真实值加上了一个负的机会误差。所以在那个学前班中,入学分数较平均分低的儿童其真实分数一般是大于观察值的,因此在结业时的分数一般是要比入学时高,因为在向观察值的平均值,即真实值回归。

相关与回归是一定范围内的相关与回归,超出范围没有任何意义(经常实践的人应该会很少犯此类毛病的吧)。回归其实并不能增加信息量,它是一种结论(结论的准确性还有待评价),或对数据以某一种方式的总结,超出范围的估计预测是没有任何意义的。收入与教育水平有关,无休止的教育显然不会带来收入的持续的增加,所以人为地改变一个变量,希望通过回归模型的”魔力”来改变另一个变量是很荒谬的。另外,变量也是有范围或区域限制的,因此在使用回归模型做预测时是要非常谨慎的。

现在研究的回归往往都是多元回归,往往比较复杂,其实这是符合实际情况的,因此往往要用多个变量作为因子来拟合,但是这些变量是不是考察某一方面的较好指标呢,比如收入与教育水平有关,还可能与父母的社会地位有关,那这个”父母的社会地位”这一因子又该如何度量呢?这又是一个问题,尽管多元回归是一种非常有用的技术,但是永远代替不了对数据间内在关系的了解。由此可见实践经验的重要性!

有边界区间上的核密度估计

$
0
0

一、一个例子

核密度估计应该是大家常用的一种非参数密度估计方法,从某种程度上来说它的性质比直方图更好,可以替代直方图来展示数据的密度分布。但是相信大家会经常遇到一个问题,那就是有些数据是严格大于或等于零的,在这种情况下,零附近的密度估计往往会出现不理想的情况。下面以一个指数分布的模拟数据为例(样本量为1000),R程序代码为:

set.seed(123);
x=rexp(1000,1);
plot(density(x,kernel="epanechnikov"),ylim=c(0,1.2));
lines(seq(0,8,by=0.02),dexp(seq(0,8,by=0.02),1),col="blue");
abline(v=0,col="red");

可以看出,理论上应该单调递减的密度函数在0附近有明显的“陡坡”,而且不应该有密度的小于零的区域也有着正的估计值。当样本量增大时,这种现象也不会得到明显好转,下图是将样本量改为10000时的情形。

set.seed(123);
x=rexp(10000,1);
plot(density(x,kernel="epanechnikov"),ylim=c(0,1.2));
lines(seq(0,8,by=0.02),dexp(seq(0,8,by=0.02),1),col="blue");
abline(v=0,col="red");

我们也许从平时看的书中了解到,当样本量趋于无穷时,核密度估计值将是收敛到真实的密度函数的,但我们可能不会特意去研究那些结论成立的条件。以上这两个简单的例子似乎给了我们一个直观的感觉,那就是当真实密度函数的支撑集(函数f(x)的支撑集指的是使得f(x)≠0的x的集合)有边界时,核密度估计值可能会出现一些不理想的情况。下面就简单地给出一些理论的结果。

二、理论分析

在一些必要的条件下(真实的密度函数f二阶导绝对连续,三阶导平方可积),核密度估计值$\hat{f}(x)$的偏差有表达式$Bias[\hat{f}(x)]=\frac{h^2\sigma_k^2f”(x)}{2}+O(h^4)$,其中h是带宽,$\sigma_k^2=\int u^2k(u)du$,k(u)是支集为[-1,1]的核函数(即在[-1,1]上有值,其余的地方取零)。可以看出这个偏差是随着带宽h的减小以$h^2$的速度趋于零的。

而假设密度函数以0为边界,那么上述表达式将不再成立,而是代之以
$E[\hat{f}_k(x)]=a_0(x)f(x)-ha_1(x)f’(x)+O(h^2)$
其中$a_i(x)=\int_{-1}^{x/h}u^ik(u)du$。可以看出,当$x \ge h$时,$a_0(x)=1$,$a_1(x)=0$,此时的偏差跟之前的那个表达式没有区别;但当$0 \le x<h$时,$a_0(x)$和$a_1(x)$都是非零的,于是偏差总是存在。

也许你会提议说,将估计值除以$a_0(x)$,偏差就可以减小了吧?的确,这样是一种改进的办法,但也要注意到,此时h的一次项不会消除,也就是说原来$h^2$的衰减速度放慢到了h,从效率上说相对于理想的情况是大打了折扣。

这时候一个巧妙的办法是,用另外一个核函数l(x)对f也做一次估计,那么就有
$E[\hat{f}_l(x)]=b_0(x)f(x)-hb_1(x)f’(x)+O(h^2)$
其中的$b_0$和$b_1$意义类似,只不过是针对l(x)的。

对以上两个式子进行线性组合,则会有
$b_1(x)*E[\hat{f}_k(x)]-a_1(x)*E[\hat{f}_l(x)]=[b_1(x)a_0(x)-a_1(x)b_0(x)]f(x)+O(h^2)$
然后把f(x)的系数移到等式左边,O(h)项的偏差就神奇地消失了。

通过观察核密度估计的表达式,我们可以将上面这个过程等价地认为是对f(x)用了一个新的核函数进行估计,这个新的核函数是
$p(x)=\frac{b_1(x)k(x)-a_1(x)l(x)}{b_1(x)a_0(x)-a_1(x)b_0(x)}$

特别地,如果将l(x)取为x*k(x),那么p(x)将有一个简单的形式
$p(x)=\frac{(a_2(x)-a_1(x)x)k(x)}{a_0(x)a_2(x)-a_1^2(x)}$

当$x \ge h$时,这个新的核函数p(x)就是k(x),而当$x \ge h$时(也就是在边界),它会对最初的核函数进行调整。当$x<0$时,不管算出来的估计值是多少,都只需将密度的估计值取为0即可。

三、程序实现

下面这段程序是对本文的第一幅图进行“整容”,代码及效果图如下:

k=function(x) 3/4*(1-x^2)*(abs(x)<=1);
a0=function(u,h)
{
	lb=-1;
	ub=pmin(u/h,1);
	0.75*(ub-lb)-0.25*(ub^3-lb^3);
}
a1=function(u,h)
{
	lb=-1;
	ub=pmin(u/h,1);
	3/8*(ub^2-lb^2)-3/16*(ub^4-lb^4);
}
a2=function(u,h)
{
	lb=-1;
	ub=pmin(u/h,1);
	0.25*(ub^3-lb^3)-0.15*(ub^5-lb^5);
}
kernel.new=function(x,u,h)
{
	k(x)*(a2(u,h)-a1(u,h)*x)/(a0(u,h)*a2(u,h)-a1(u,h)^2);
}
den.est=function(u,ui,h)
{
	sapply(u,function(u) ifelse(u<0,0,mean(kernel.new((u-ui)/h,u,h))/h));
}
set.seed(123);
dat=rexp(1000,1);
x=seq(0,8,by=0.02);
y=den.est(x,dat,2*bw.nrd0(dat));
plot(x,y,type="l",ylim=c(0,1.2),main="Corrected Kernel");
lines(x,dexp(x,1),col="red");

从中可以看出,边界的偏差问题已经得到了很好的改进。

如果真实的密度函数的支集不是[0,+∞],而是某一个闭区间[m,n],那么偏差修正的过程与上面类似,只不过是要将$a_i(x)$定义为$a_i(x)=\int_{(x-n)/h}^{(x-m)/h}u^ik(u)du$。在编程序的时候,也只需把积分的上下限进行相应的调整即可。

四、参考文献

Jeffrey S. Simonoff, 1998. Smoothing Methods in Statistics. Springer-Verlag

相关链接:http://pages.stern.nyu.edu/~jsimonof/SmoothMeth/

从线性模型到广义线性模型(1)——模型假设篇

$
0
0

在统计学里,对特定变量之间的关系进行建模、分析最常用的手段之一就是回归分析。回归分析的输出变量通常记做$ Y$,也称为因变量(dependent)、响应变量(response)、被解释变量(explained)、被预测变量(predicted)、从属变量(regressand);输入变量通常记做$ x_1$,…,$x_p$,也称为自变量(independent)、控制变量(control&controlled)、解释变量(explanatory)、预测变量(predictor)、回归量(regressor)。本文根据作者自己的一些学习心得和理解,简单且不严格地介绍在模型假设方面普通线性模型和广义线性模型的区别和联系/推广(generalization)。广义线性模型的拟合检验、推断、诊断等方面的方法和手段依赖于模型所采用的分布类型,难以一概而论,将在作者后续的学习心得文章里具体介绍。

1.普通线性模型的简单回顾

普通线性模型(ordinary linear model)可以用下式表示:

$ Y={\beta}_0+{\beta}_1x_1+{\beta}_2x_2+…+{\beta}_{p-1}x_{p-1}+\epsilon$                          (1.1)

这里$ {\beta}_i$,$ i=1$,…,$p-1$称为未知参数,$ {\beta}_0$称为截矩项。

普通线性模型的假设主要有以下几点:

1.响应变量$ Y$和误差项$\epsilon$正态性:响应变量$ Y$和误差项$\epsilon$服从正态分布,且$\epsilon$是一个白噪声过程,因而具有零均值,同方差的特性。

2.预测量$x_i$和未知参数${\beta}_i$的非随机性:预测量$x_i$具有非随机性、可测且不存在测量误差;未知参数${\beta}_i$认为是未知但不具随机性的常数,值得注意的是运用最小二乘法或极大似然法解出的未知参数的估计值$\hat{\beta}_i$则具有正态性。

3.研究对象:如前所述普通线性模型的输出项是随机变量$ Y$。在随机变量众多的特点或属性里,比如分布、各种矩、分位数等等,普通线性模型主要研究响应变量的均值$E[ Y]$。

4.联接方式:在上面三点假设下,对(1.1)式两边取数学期望,可得

$ E[Y]={\beta}_0+{\beta}_1x_1+{\beta}_2x_2+…+{\beta}_{p-1}x_{p-1}$                                        (1.2)

从 (1.2)式可见,在普通线性模型里,响应变量的均值$E[ Y]$与预测量的线性组合${\beta}_0+{\beta}_1x_1+{\beta}_2x_2+…+{\beta}_{p-1}x_{p-1}$通过恒等式(identity)联接,当然也可认为通过形为$f(x)=x$的函数(link function)联接二者,即

$ E[Y]=f({\beta}_0+{\beta}_1x_1+{\beta}_2x_2+…+{\beta}_{p-1}x_{p-1})={\beta}_0+{\beta}_1x_1+{\beta}_2x_2+…+{\beta}_{p-1}x_{p-1}$

2.广义线性模型的简单介绍

广义线性模型(generalized linear model)正是在普通线性模型的基础上,将上述四点模型假设进行推广而得出的应用范围更广,更具实用性的回归模型。

1.响应变量的分布推广至指数分散族(exponential dispersion family):比如正态分布、泊松分布、二项分布、负二项分布、伽玛分布、逆高斯分布。exponential dispersion family的详细定义限于篇幅这里不做详细介绍。

2.预测量$x_i$和未知参数${\beta}_i$的非随机性:仍然假设预测量$x_i$具有非随机性、可测且不存在测量误差;未知参数${\beta}_i$认为是未知且不具有随机性的常数。

3.研究对象:广义线性模型的主要研究对象仍然是响应变量的均值$E[ Y]$。

4.联接方式:广义线性模型里采用的联连函数(link function)理论上可以是任意的,而不再局限于$f(x)=x$。当然了联接函数的选取必然地必须适应于具体的研究案例。同时存在着与假设2.1里提及的分布一一对应的联接函数称为标准联接函数(canonical link or standard link),如正态分布对应于恒等式,泊松分布对应于自然对数函数等。标准联接函数的推导及其应用上的优点涉及到指数分散族的标准化定义,这里不做详述。

3.简单的例子

考虑这样一个简单的退保案例:一个保险产品一共卖出12份保单(当然了这在现实中不可能,这里仅为示例),在保单期限内一共有6人退保。那么采用这12个投保人的特征数据如收入、职业、年龄等做为预测变量对退保/退保率进行回归分析时,普通线性模型不再适用,因为这里退保这一事件不再服从正态分布,而是二项分布(当然了如果观测值的个数足够大,比如大于30,正态分布是一个很好的近似)。此时就可采用广义线性模型(目标分布采用二项分布)进行建模。

4.补充:指数分布族的简介

指数分布族(exponential dispersion family)实质上是对一类具有以下形式的概率密度函数或具有此类密度函数的分布的总括:

$f_Y(y;\theta,\Psi)=exp[(y\theta - b(\theta))/{\Psi} + c(y;\Psi)]$

这里$\Psi$和$\theta$是实参数,$b(.)$和$c(.;.)$是实函数,该密度函数的支集(support)$D_{\Psi}$是$R$的子集,且不依赖于$\theta$。满足$\theta=\eta=g(\mu)$的联接函数$g(\mu)$称为标准联接函数(standard or canonical link)。

一般情况下参数$\Psi$的值是未知常数(fixed and unknown),因此在许多GLM文献里指数分布族又被称为单参数指数族(one-parameter exponential family)。对于比较常用的分布,$\Psi$和$\theta$的取值具有特殊的形式:

正态分布$N(\mu,{\sigma}^2)$:$\Psi={\sigma}^2$和$\theta=\mu$

泊松分布$Poisson(\lambda)$:$\Psi=1$和$\theta=log\lambda$

二项分布$Binomial(m,p)$:$\Psi=1$和$\theta=log(p/(p-1))$

负二项分布$Negative Binomial(r,p)$:$\Psi=1$和$\theta=log(1-p)$

伽玛分布$Gamma(\alpha,\beta)$:$\Psi=1/{\alpha}$和$\theta=-{\beta}/{\alpha}$

从线性模型到广义线性模型(2)——参数估计、假设检验

$
0
0

1.GLM参数估计——极大似然法

为了理论上简化,这里把GLM的分布限定在指数分布族。事实上,实际应用中使用最多的分布就是指数分布族,所以这样的简化可以节省很多理论上的冗长论述,也不会限制实际应用。
如前文如述,指数分布族的概率密度函数可以统一地写为:

$f_Y(y;\theta,\Psi)=exp[(y\theta - b(\theta))/{\Psi} + c(y;\Psi)]$

这里为了在模型中体现散布参数(dispersion parameter)$\phi$,把上述密度函数中的$\Psi$记做
$\Psi=a_i(\phi)={\phi}/w_i$
从而响应变量的单个观测值的(加权)对数似然函数可以表示为:

$logL({\theta}_i,\phi;y_i)=w_i[(y_i{\theta}_i-b({\theta}_i))/{\phi}]+c(y_i,\phi)$

再结合观测值之间的独立性,全体观测值的对数似然函数可记做:$\sum_i logL({\theta}_i,\phi;y_i)$
一般情况下最大化上述的对数似然函数很难找到解析解(正态分布是特例之一),因而必须使用数值方法求解。McCullagh和Nelder(1989)证明了使用Newton-Raphson方法,结合Fisher scoring算法,上述对数似然函数的最大化等价于连续迭代的加权最小二乘法(iteratively weighted least squares, or IRWLS)。

广义线性模型的IRWLS算法如下:
1.设置线性估计量和响应变量的均值的初始估计值: $\hat {\eta}_0$和$\hat {\mu}_0$
这里$\hat {\mu}_0$是根据经验或是专家意见等信息对$\mu=E(Y)$的一个估计值,而$\hat {\eta}_0$可以利用模型建立时选用的联接函数来获得,即$\hat {\eta}_0=g(\hat {\mu}_0)$。这一函数关系也用于计算步骤2和3中$\eta$对$\mu$一阶导数。
2.构造调整的因变量(adjusted dependent variable):$z_0=\hat {\eta}_0+(y-{\hat \mu}_0){d\eta \over d\mu}|_{\hat {\eta}_0}$
3.构造权重:$w^{-1}_0={({d\eta \over d\mu})}^2|{\hat {\eta}_0V(\hat {\mu}_0)}$
这里$V(\hat {\mu}_0)$是利用方差函数(variance function)和$\hat {\mu}_0$构造的$Var(Y)$的估计值。
4.利用步骤2和3构造的调整的因变量和权重,拟合普通线性模型(ordinary linear model),预测/拟合(predict)新的线性估计量和均值: $\hat {\eta}_1$和$\hat {\mu}_1$
5.重复步骤2-4直到收敛(满足一定的迭代步数或是精度要求)。
此时得到的模型就是极大似然估计方法下的广义线性模型。IRWLS的算法思路也从另一个方面说明了广义线性模型是普通线性模型的推广。在广义线性模型的实际应用中,IRWLS算法是最常用的极大似然估计求解方法。对于特殊的案例,也有其他的特殊的参数估计方法。比如对于在精算学科中最常用的列联表(contigency table)数据或案例就有Bailey-Simon法、边际总和法(marginal totals)、最小二乘法(least squares)、直接法(direct method)等。

2.假设检验

2.1 空模型和全模型

一个极端的情况,所有自变量$x_i$对于响应变量$Y$都没有影响,也即是为所有的响应变量$Y$拟合一个共同的均值,即只有一个参数。这样的模型称为空模型(null model)。对于普通线性模型(正态分布下的GLM)而言,空模型的具体形式就是$y=\mu + \epsilon$。对于特殊的数据或案例类型,可能存在着其他的限制条件(constraints)从而空模型的参数个数大于1。比如非寿险精算中经常用到的列联表(contigency table)数据,其空模型就可能包含了行号、列号、对角线序号等限制。

相反的一个极端情况就是,所有自变量$x_i$的每一个观测值或称为数据的样本点(data points)对于响应变量$Y$都有影响,这样的模型称为全模型(full or saturated model)。一般可以通过构造阶数足够高的多项式或者把所有的量化观测值(quantitative)视为质化观测值(qualitive),并且引入适当数量的交叉项(interactions)来构造全模型。

统计建模的目的之一就是把样本数据划分为随机成分和系统成分两大部分。在这一点上,空模型认为响应变量的变动(variation)完全由随机性(random variation)造成,而全模型则认为响应变量的变动完全来自于系统成分(systematic)。一个直观地理解就是全模型是在现有的数据或样本的条件下,针对某一种分布所能拟合的最优模型,因而可以做为检验目标模型拟合优度的一个标准(measure)。

2.2 偏差(Deviance)

如果把全模型的对数似然函数记为$l(y,\phi|y)$,把目标模型的对数似然函数记为$l({\hat {\mu}},\phi|y)$,那么目标模型与全模型在拟合优度上的偏离的定义可写成$2(l(y,\phi|y)-l({\hat {\mu}},\phi|y))$。再结合观测值的独立性假设和指数散布族的假设,那么上述偏离的定义可以简化为:

$\sum_i 2w_i(y_i({\hat {\theta}_i} – {\tilde {\theta}_i}) – b({\tilde {\theta}_i}) + b({\hat {\theta}_i})) /{\phi}$

其中$a_i(\phi)={\phi}/w_i$,$\tilde {\theta}$是全模型下的参数估计值,$\hat {\theta}$是目标模型下的参数估计值。如果把上式写成$D(y,\hat {\mu})/{\phi}$,那么$D(y,\hat {\mu})$称为偏差(Deviance),$D(y,\hat {\mu})/{\phi}$则称为标准化偏差(scaled deviace)。
此外,皮尔逊卡方统计量(Pearson’s chi-square statistics):

$X^2={\sum_i (y_i – {{\hat \mu}_i})^2 \over Var({\hat {\mu}}_i)}$

也是衡量模型偏离程度(discrepancy)的统计量之一,在一些场合可以做为偏差的替代选择。

2.3 拟合优度检验

广义线性模型的假设检验可以分为两种:一是检验目标模型相对于数据或预测值的拟合有效性的检验(goodness of fit test);另外一种则是对“大”模型以及对“大”模型的参数施加一定的线性约束(linear restrictions)之后得到的“小”模型之间的拟合优度比较检验。直观上的理解就是,“大”模型具有更多的参数,即从参数的线性约束总可把一个或多个参数用其他参数的线性组合来表示,然后代入“大”模型,从而参数的个数减少,派生出所谓的“小”模型,也就是说“大”和“小”并非任意的,而是具有一种派生关系(nested models)。如果把全模型认为是“大”模型,而目标模型是“小”模型,那么上述两种检验的本质是相同的。因而假设检验的零假设(null hypothsis)可以统一且直观地设定为:“小”模型(目标模型)是正确的模型。

如果把大模型记做$\Omega$,把小模型记做$\omega$,其标准化偏差之差记做$D_{\omega} – D_{\Omega}$,其自由度之差记做$df_{\omega}-df_{\Omega}$,则构造如下的统计量:${(D_{\omega} – D_{\Omega})/(df_{\omega}-df_{\Omega})} \over {\phi}$。

当$\phi$是已知常数时,比如泊松和二项分布的情况下$\phi=1$,上述统计量在零假设下渐近地(asymptotically)服从卡方分布(正态分布时正好是卡方分布)。当$\phi$未知时,通常需要用估计值代替。最常用的估计值是$\hat {\phi}=X^2/(n-p)$这里n是数据中观测值的数量,p是目标模型的参数个数。此时上述的统计量在零假设下近似地(approximately)服从F分布(正态分布时严格服从F分布)。注意上述两种情况下,渐近和近似的区别。

对于某一个参数,可以使用其估计值的标准误(standard error)来构造一个z统计量来检验其显著性,即$z=\hat {\beta}/se(\hat {\beta})$。在零假设下,z统计量在普通线性模型,也就是正态分布下的广义线性模型中就是我们熟知的t统计量,严格服从t分布。在其他分布下的广义线性模型中,渐近地服从正态分布。z检验也称为Wald检验,在广义线性模型中效果不如上述的偏差检验,因而较少使用。

LARS算法简介

$
0
0

最近临时抱佛脚,为了讨论班报告Group Regression方面的文章,研究了Efron等人于2004年发表在Annals of Statistics里一篇被讨论的文章LEAST ANGLE REGRESSION。这篇文章很长,有45页。加上后面一些模型方面大牛的讨论的文章,一共有93页。对于这种超长论文,我向来敬畏。后来因为要报告的文章里很多东西都看不懂,才回过头来研读这篇基石性的文章。

所谓大牛,就是他能提出一种别人从来没有提出过的想法。大牛们看待问题的角度和常人不同。比如在回归中常用的逐步回归法。我们小辈们只知道向前回归,向后回归还有二者结合的一些最基本的想法。比如向前回归,就是先选择和响应最相关的变量,进行最小二乘回归。然后在这个模型的基础上,再选择和此时残差相关度最高的(也就是相关度次高)的变量,加入模型重新最小二乘回归。之后再如法继续,直到在某些度量模型的最优性准则之下达到最优,从而选取一个最优的变量子集进行回归分析,得到的模型是相比原模型更加简便,更易于解释的。这种方法,牺牲了模型准确性(预测有偏),但是提高了模型的精确度(方差变小)。大多数本科生对逐步回归的理解也就如此了。Efron看待这个问题时,比起常人更高了一个层次。他首先指出,逐步向前回归,有可能在第二步挑选变量的时候去掉和X1相关的,但是也很重要的解释变量。这是因为它每次找到变量,前进的步伐都太大了,侵略性太强。

因此在这个基础上,Efron提出了Forward stagewise。也就是先找出和响应最相关的一个变量,找到第一个变量后不急于做最小二乘回归,而是在变量的solution path上一点一点的前进(所谓solution path是指一个方向,逐步回归是在这个方向上进行),每前进一点,都要计算一下当前的残差和原有的所有变量的相关系数,找出绝对值最大的相关系数对应的变量。我们可以想像,刚开始,前进的步伐很小,相关系数绝对值最大的对应的变量一定还是第一步选入的变量。但是随着前进的进程不断向前,这个相关系数的绝对值是在慢慢减小的,直到找到另外一个变量X2,它和当前前残差的相关系数和第一个入选变量X1的相关系数绝对值相同,并列第一。此时把X2也加入回归模型中,此时回归模型在X1上的系数已经确定了,如果在X1的solution path上继续前进,则得到的与当前残差相关系数最大的变量一定是X2,所以不再前进,而是改为在X2的solution path上前进,直到找到第三个变量X3,使得X3的与当前残差的相关系数绝对值最大。这样一步一步进行下去。每一步都是很多小步组成。直到某个模型判定准则生效,停止这个步骤。在每一个solution path上的计算都是线性的。总体的solution path是分段线性的。这种算法是一种自动进行模型构建的方法。它和传统的Forward selection在本质上是一样的,都是选择一个变量,然后选择一个继续进行的solution path,在该方向上前进。这两种方法的solution path的选择方法是一样的,唯一的区别就是前进的步伐不一样,Forward selection的前进步伐很大,一次到头,而stagewise则是一小步一小步前进。这样比Forward selection要谨慎一些,会免于漏掉一些重要的变量。

从这个视角来看,我们可以选择另外一种solution path。Efron等人在这篇文章中,就提出了一种新的solution path。在已经入选的变量中,寻找一个新的路径,使得在这个路径上前进时,当前残差与已入选变量的相关系数都是相同的。直到找出新的与当前残差相关系数最大的变量。从几何上来看,当前残差在那些已选入回归集的变量们所构成的空间中的投影,是这些变量的角平分线。下面我简单的描述一下这个算法:

  • 第一步,我们初始的估计模型为0,那么当前的残差就是Y,我们找出X’Y中绝对值最大的那个对应的变量,记为X1,把它加入回归模型。这一步中X’Y是当前残差和所有变量的相关系数向量。(注意这里Y都已经中心化,X中心标准化过了)。
  • 第二步,在已选的变量的solution path上前进,solution path就是s1*X1,s1是X1与当前残差的相关系数的符号。在这个path上前进,直到另外一个变量出现,使得X1与当前残差的相关系数与它和当前残差的相关系数相同。记这个变量为X2,把它加入回归模型中。
  • 第三步,找到新的solution path。Efron在文章中提出了一种找出满足LARS条件的solution path的解法。solution path需要使得已选入模型变量和当前残差的相关系数均相等。因此这样的路径选择它的方向很显然就是$X_k(X_k’X_k)^{-1}1$的指向(因为$X_k’(X_k(X_k’X_k)^{-1})1$的元素都相同,保证了LARS的要求,当然这里或许会有一些其他的解,也能满足LARS的要求,有没有达人能想到或许证明这个解是唯一的)。只要再标准化这个向量,我们便就找到了solution path的方向。在这个方向上前进,直到下一个满足与当前残差相关系数绝对值最大的变量出现。如此继续下去。

LARS算法,保证了所有入选回归模型的变量在solution path上前进的时候,与当前残差的相关系数都是一样的。这一点,比起Forward stagewise要捷径一些,走得更快一些。

LARS算法已经在SAS和R中实现了。作为回归模型选择的一种重要的算法,LARS相比起传统的Forward selection和Forward stagewise,既不那么富于侵略性,又比较走捷径。LARS算法在lasso 估计的求解中也有非常好的应用。在Efron等人的同篇论文中有详细的讨论。关于lasso和它的LARS算法,笔者将在今后的文章中介绍。

 


修正的LARS算法和lasso

$
0
0

在小弟的上一篇文章中,简单的介绍了LARS算法是怎么回事。主要参考的是Efron等人的经典文章least angle regression。在这篇文章中,还提到了一些有趣的看法,比如如何用LARS算法来求解lasso estimate和forward stagewise estimate。这种看法将我对于模型选择的认识提升了一个层次。在这个更高的层次下看回归的变量选择过程,似乎能有一些更加创新的想法。

lasso estimate的提出是Tibshirani在1996年JRSSB上的一篇文章Regression shrinkage and selection via lasso。所谓lasso,其全称是least absolute shrinkage and selection operator。其想法可以用如下的最优化问题来表述:

在限制了$\sum_{j=1}^J|\hat{\beta_j}|\leq t$的情况下,求使得残差平和$\|y-X\hat{\beta}\|^2$达到最小的回归系数的估值。

我们熟悉如何求解限制条件为等号时,回归方程的求解。也就是用lagrange乘子法求解。但是对于这种,限制条件是不等号的情况,该如何求解,则有两种想法。第一种,也是我比较倾向于的方法,是利用计算机程序,对$t$从$0$开始,不断慢慢增加它的值,然后对每个$t$,求限制条件为等号时候的回归系数的估计,从而可以以$t$的值为横轴,作出一系列的回归系数向量的估计值,这一系列的回归系数的估计值就是lasso estimation。另外一种想法,是借助与最优化问题中的KKT条件,用某个黑箱式的算法,求解。(本人对于最优化方面的东西实在是不很熟悉,故不在此弄斧,只求抛砖引玉,能有高手给出这种想法的具体介绍。)

lasso estimate具有shrinkage和selection两种功能,shrinkage这个不用多讲,本科期间学过回归分析的同学应该都知道岭估计会有shrinkage的功效,lasso也同样。关于selection功能,Tibshirani提出,当$t$值小到一定程度的时候,lasso estimate会使得某些回归系数的估值是$0$,这确实是起到了变量选择的作用。当$t$不断增大时,选入回归模型的变量会逐渐增多,当$t$增大到某个值时,所有变量都入选了回归模型,这个时候得到的回归模型的系数是通常意义下的最小二乘估计。从这个角度上来看,lasso也可以看做是一种逐步回归的过程。

在我的上一篇文章中,提到了Efron对于逐步回归的一种看法,就是在某个标准之下(比如LARS的标准就是要保证当前残差和已入选变量之间的相关系数相等,也就是当前残差在已入选变量的构成空间中的投影,是那些变量的角平分线)选择一条solution path,在这个solution path上proceed,不断吸收新的变量进入,然后调整solution path 继续proceed。那么对于求解lasso的算法,也有一个相应的对应。Efron提出了一种修正的LARS算法,可以用修正的LARS算法来求解所有的lasso estimates。下面我介绍一下这种修正的LARS算法。

首先假设我们已经完成了几步LARS steps。这时候,我们已经有了一个回归变量集,我们记这个回归变量集为$X_{\mathscr{A}}$。这个集合就对应着一个对于$Y$的估计,我们记为$\hat{\mu}_{\mathscr{A}}$。这个估值对应着一个lasso方法对于响应的估值(这里我认为LARS估值和lasso估值应该是一样的),lasso的估值,对应着回归系数的lasso估值,回归系数向量的lasso估值我们记为$\hat{\beta}$。

为了继续进行下一步,我们先给出一个向量的表达式,然后再解释一下它

$w_{A}=(1_{A}’(X_{A}’X_{A})^{-1}1_{A})^{-\frac{1}{2}}(X_{A}’X_{A})^{-1}1_{A}$.

$X_{A}w_{A}$就是LARS算法的在当前回归变量集下的solution path。那么我们可以把$w_{A}$作为$\beta$的proceed的path。Efron定义了一个向量$\hat{d}$,这个向量的元素是$s_jw_j$,其中$s_j$是入选变量$x_j$与当前残差的相关系数的符号,也是$\hat{\beta_j}$的符号。对于没有入选的变量,他们对应在$\hat{d}$中的元素为0。也就是对应着$\mu(r)=X\beta(r)$,我们有

$\beta_j(r)=\hat{\beta_j}+r\hat{d_j}$

将LARS的solution path对应到lasso estimate的path上,这种对应的想法非常值得借鉴。

很显然,$\beta_j(r)$会在$r_j=-\hat{\beta_j}/\hat{d_j}$处变号。那么对于我们已经有的lasso estimate$\beta(r)$,它中的元素会在最小的的那个大于$0$的$r_j$处变号。我们记之为$\bar{r}$。如果没有$r_j$大于$0$,那么$\bar{r}$就记为无穷大。

对于LARS本身而言,在已经有了如今的回归变量集和当前残差的基础上,我们就会有条solution path,在这个solution path上proceed的最大步记为$\hat{r}$.通过比较$\hat{r}$和$\bar{r}$就会有进一步的想法。Efron的文章证明了如果$\bar{r}$小于$\hat{r}$,则对应于LARS估计的那个$\beta_j(r)$不会成为一个lasso estimation。(这个是因为当前残差和对应变量的相关系数的符号一定是和该变量的系数符号一致才行)。在这种情况下,我们就不能继续在LARS的solution path上继续前进了,为了利用LARS算法求得lasso estimate,Efron提出把$\bar{r}$所对应的那个$r_j$所对应的$x_j$从回归变量中去掉。去掉之后再计算当前残差和当前这些变量集之间的相关系数,从而确定一条新的solution path,继续进行LARS step。这样进行下去,可以通过LARS算法得到所有的lasso estimate。

这个对于LARS的lasso修正算法,被Efron称作“one at a time”条件,也就是每一步都要增加或删掉一个变量。下图显示了用修正了的LARS算法求lasso estimate的过程。

这个图是Efron等人的文章中,对于一个实际数据进行回归得到的。该数据一共有10个变量。图的横轴,是所有回归系数估值的绝对值之和,这个值从$0$增加。左侧的纵轴,是回归系数的估值,右侧纵轴是这些回归系数对应的变量的下标。这个图中,我们可以看到每一个回归系数的path。可以看到第七个变量对应的回归系数在横轴快到3000的时候变为了0,说明到这一步时,该变量被删除掉,之后又被重新添加到了回归变量集中。

下面通过一个简单的模拟,对lars和lasso以及forward stagewise做一个简单的实现。其实在R中已经有了一个名为lars的包,可以实现上述三种回归。

首先,我要模拟的方程为

$y={x^3}_1+{x^2}_1+x_1+\frac{1}{3}{x^3}_2-{x^2}_2+\frac{2}{3}x_2+e$

其中$x_1$和$x_2$是服从二维联合正态分布,均值为零向量,$cov(x_1,x_2)=0.5$,$var(x_1)=var(x_2)=1$,$e$服从$N(0,9)$。我取了50次观测,然后分别通过lasso,lars,以及forward stagewise三种算法进行了回归,其变量的回归路径如下图。

简单的代码我直接贴在本文的最后。从这三个算法的图中,我们并看不出有特别的区别,只能看出一些细小的差别。至于要判断哪种算法更好,则应该因问题而异。也不是本文能够论述的问题了。

对于LARS算法的修正,还可以应用到计算forward stagewise的estimate中,在Efron的文章中也有介绍。他的这种看法,好似凌驾在整个回归变量选择过程之上,从一个更高的角度观察之,给出一种更为一般性的视角。这也就是大牛和一般人之间的差别。读Efron的文章,总有一种让人想要膜拜的冲动。对于模型选择方面的东西,值得挖掘的还很多。Tibshirani在最新的一篇综述性的文章中,给出了lasso的诞生到现今发展的一系列流程。感兴趣的读者,可以去看看这篇文章,在cos论坛上有。链接如下:

http://cos.name/cn/topic/104104

用lars算法做模拟的代码:

利用lars模拟

 

分组最小角回归算法(group LARS)

$
0
0

继续前两篇博文中对于最小角回归(LARS)和lasso的介绍。在这篇文章中,我打算介绍一下分组最小角回归算法(Group LARS)。本文的主要观点均来自Ming Yuan和Yi Lin二人2006合作发表在JRSSB上的论文Model selection and estimation in regression with grouped variables.

首先,我想说明一下,为何要引入分组变量(grouped variable)的概念。举一个简单的例子,在可加的多项式模型中,每一项都是多项式。这个多项式有可能可以通过最初的变量的线性组合来表达。在进行这种类型的回归中,挑选重要的变量其实质是挑选重要的因子(factor),而因子则是最初的那些变量的线性组合。分组变量的回归问题,实际上就是我们一般所说的回归问题的推广。如果我们把每一个单独的变量都看成一个因子,那么这种情况下的回归就是一般意义下的回归。下面用公式更加直白的说明这个问题:

$Y=\sum_{j=1}^JX_j\beta_j+e$

其中$Y$是个$n$维向量,$e\~N_n(0,\sigma^2I)$.$X_j$是$n\times p_j$矩阵,代表的是第j个因子(factor,是变量variables的线性组合)。$\beta_j$是$p_j$维的系数向量。依然假定$Y$是中心化的,$X_j$是中心化并且正交化的($X_j’X_j=I$)。这个就是分组变量的回归模型。

在小弟之前的文章中介绍过最小角回归(LARS)算法,对于变量选择来说,这种算法是比较易于计算机实现的,而且比传统的向前逐步回归(forward selection)更加谨慎,但是没有逐段回归(stagewise)那么谨小慎微。对于分组变量的回归模型选择问题来说,直接套用LARS算法可能会挑选出一些不必要的因子进入回归模型中。因此在文章中,作者提出了分组最小角回归(group LARS).这种算法对最小角回归进行了推广,下面简单介绍一下这种算法。

推广是循序渐进的,因此,我们先来看看$p_j$均相等的情况(注意这里$p_j$未必等于1)。在传统的LARS算法中,我们是要保证入选变量和当前残差的角度都相同。如今,我们就需要保证入选的因子们(再次强调,这里是因子,是原始变量的线性组合)与当前残差的角度相同。直观地来定义一个角度$\theta(r,X_j)$,这个角度就是向量$r$与$X_j$中的变量所构成的空间的夹角,也就是$r$与它在$X_j$中的变量所构成空间的投影的夹角。(再废话两句,这个夹角越小,就意味着$r$与$X_j$中的变量构成的空间中的相关系数越大。)当$r$是当前残差的时候,我们就可以确定求解路径(solution path)为当前残差在$X_j$中的变量所构成的空间上的投影的方向。

上面说的可能还不够清楚,下面我分步骤具体介绍每一步的做法。

  1. 最开始时,回归变量集依然是空集,此时的残差就是$Y$,我们寻找和$Y$夹角最小的$X_j$.记它为$X_{j1}$.(这里要插一句,就是如何度量这个角度。用这个角的余弦值的平方即可:$cos^2(\theta(r,X_j))=\frac{\|X_j’r\|^2}{\|r\|^2}$,角度越小,这个值越大。)
  2. 确定求解路径为$Y$在$X_{j1}$中的变量所构成的空间上的投影的方向。然后在这个路径上前进,直到出现第二个因子$X_{j2}$,使得当前残差$r$与这两个因子的夹角同样小。也就是$\|X_{j1}’r\|^2=\|X_{j2}’r\|^2$。
  3. 计算新的求解路径,这个路径其实就是当前残差在$X_{j1}$和$X_{j2}$的变量所构成的空间中投影的方向。然后再沿着这条路径前进,直到第三个因子出现,使得当前残差和这三个因子的夹角都是同样小。

然后继续按照上面的步骤,计算出求解路径,然后继续前进。直到找到第四个满足条件的因子。

这些步骤和原始的LARS的进程是同样的。只不过在确定求解方向时有了变化。

上面介绍的都是$p_j$相同的情况,当$p_j$不同的时候,只要对上面的过程做一个小的改动即可。用$\frac{\|X_j’r\|^2}{p_j}$代替$\|X_j’r\|^2$,其他过程都不变。这种对于LARS算法的推广是比较直观的。而且M.Yuan和Y.Lin在文章中还指出,这种算法相对于正交化$X_j$的过程是稳定的,通过Gram-Schmidt方法进行正交化本来是依赖于选择的参数的,但是分组LARS确定的求解方向并不依赖该参数。

R 中大型数据集的回归

$
0
0

众所周知,R 是一个依赖于内存的软件,就是说一般情况下,数据集都会被整个地复制到内存之中再被处理。对于小型或者中型的数据集,这样处理当然没有什么问题。但是对于大型的数据集,例如网上抓取的金融类型时间序列数据或者一些日志数据,这样做就有很多因为内存不足导致的问题了。

这里是一个具体的例子。在 R 中输入如下代码,创建一个叫 x 的矩阵和叫 y 的向量。

set.seed(123);
n = 5000000;
p = 5;
x = matrix(rnorm(n * p), n, p);
x = cbind(1, x);
bet = c(2, rep(1, p));
y = c(x %*% bet) + rnorm(n);

如果用内置的 lm 函数对 x 和 y 进行回归分析,就有可能出现如下错误(当然,也有可能因为内存足够而运行成功):

> lm(y ~ 0 + x);
Error: cannot allocate vector of size 19.1 Mb
In addition: Warning messages:
1: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
  Reached total allocation of 1956Mb: see help(memory.size)
2: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
  Reached total allocation of 1956Mb: see help(memory.size)
3: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
  Reached total allocation of 1956Mb: see help(memory.size)
4: In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
  Reached total allocation of 1956Mb: see help(memory.size)

本文代码运行的电脑的配置是:

CPU: Intel Core i5-2410M @ 2.30 GHz
Memory: 2GB
OS: Windows 7 64-bit
R: 2.13.1 32-bit

在 R 中,每一个 numeric 数 占用 8 Bytes,所以可以估算到 x 和 y 只是占用 5000000 7 8 / 1024 ^ 2 Bytes = 267 MB,离运行的电脑的内存 2 GB 差很远。问题在于,运行 lm() 函数会生成很多额外的变量塞满内存。比如说拟合值和残差。

如果我们只是关心回归的系数,我们可以直接用矩阵运算来计算 $\hat{\beta}$ :

beta.hat = solve(t(x) %*% x, t(x) %*% y);

在本文运行的计算机中,这个命令成功执行,而且很快(0.6秒)(我使用了一个优化版本的 Rblas, 下载)。然而,如果样本变得更加大了,这个矩阵运算也会变得不可用。可以估算出,如果样本大小为 2GB / 7 / 8 Bytes = 38347922 ,x 和 y 自己就会占用了全部内存,更不要说其他计算过程中出现的临时变量了。

怎么破?

一个方法就是用数据库来避免占用大量内存,并且直接在数据库中执行 SQL 语句等。数据库使用硬盘来保存数据,并且执行 SQL 语句时只是占用少量内存,所以基本上不用过于担心内存占用。不过有得有失,要更加关注完成任务所占用的时间。

R 支持很多数据库,其中 SQLite 是最轻量级和简单的。有一个 RSQLite 包,允许用户在 R 中对 SQLite 进行操作。这些操作包括了对 SQLite 数据库进行读写,执行 SQL 语句和在 R 中获取执行结果。所以,如果我们能够把需要的算法“翻译”到 SQL 语句版本,数据集的大小只受限于硬盘的大小和我们能够接受的执行时间。

采用上面的那个例子,我这里说明我们会怎样用数据库和 SQL 语句来对数据集进行回归。首先我们要把数据塞到硬盘上面。

gc();
dat = as.data.frame(x);
rm(x);
gc();
dat$y = y;
rm(y);
gc();
colnames(dat) = c(paste("x", 0:p, sep = ""), "y");
gc();

# Will also load the DBI package
library(RSQLite);
# Using the SQLite database driver
m = dbDriver("SQLite");
# The name of the database file
dbfile = "regression.db";
# Create a connection to the database
con = dbConnect(m, dbname = dbfile);
# Write the data in R into database
if(dbExistsTable(con, "regdata")) dbRemoveTable(con, "regdata");
dbWriteTable(con, "regdata", dat, row.names = FALSE);
# Close the connection
dbDisconnect(con);
# Garbage collection
rm(dat);
gc();

上述代码有很多 rm()gc() ,函数,这些函数是用来移除没有用的临时变量和释放内存。当代码运行完毕的时候,你就会发现在你的工作空间中有一个 320M 左右的 regression.db 文件。然后就是最重要的一步了:把回归的算法转化为 SQL。

我们有

$$\hat{\beta}=(X’X)^{-1}X’y$$

而且,无论 $n$ 有多大,$X’X$ 和 $X’y$ 的大小总是 $(p+1)*(p+1)$ 。如果变量不是很多,R 处理矩阵逆和矩阵乘法还是很轻松的,所以我们的主要目标是用 SQL 来计算 $X’X$ 和 $X’y$ 。

由于 $X=(x_0,x_1,…,x_p)$,所以 $X’X$ 可以表达为:

$$% \left(\begin{array}{cccc}\mathbf{x_{0}'x_{0}} & \mathbf{x_{0}'x_{1}} & \ldots & \mathbf{x_{0}'x_{p}}\\\mathbf{x_{1}'x_{0}} & \mathbf{x_{1}'x_{1}} & \ldots & \mathbf{x_{1}'x_{p}}\\\vdots & \vdots & \ddots & \vdots\\\mathbf{x_{p}'x_{0}} & \mathbf{x_{p}'x_{1}} & \ldots & \mathbf{x_{p}'x_{p}}\end{array}\right) %]]>$$

而每一个矩阵元素都可以用 SQL 来计算,比如说:

select sum(x0 * x0), sum(x0 * x1) from regdata;

我们可以用 R 来生成 SQL 语句,然后把语句发送到 SQLite :

m = dbDriver("SQLite");
dbfile = "regression.db";
con = dbConnect(m, dbname = dbfile);
# Get variable names
vars = dbListFields(con, "regdata");
xnames = vars[-length(vars)];
yname = vars[length(vars)];
# Generate SQL statements to compute X'X
mult = outer(xnames, xnames, paste, sep = "*");
lower.index = lower.tri(mult, TRUE);
mult.lower = mult[lower.index];
sql = paste("sum(", mult.lower, ")", sep = "", collapse = ",");
sql = sprintf("select %s from regdata", sql);
txx.lower = unlist(dbGetQuery(con, sql), use.names = FALSE);
txx = matrix(0, p + 1, p + 1);
txx[lower.index] = txx.lower;
txx = t(txx);
txx[lower.index] = txx.lower;
# Generate SQL statements to compute X'Y
sql = paste(xnames, yname, sep = "*");
sql = paste("sum(", sql, ")", sep = "", collapse = ",");
sql = sprintf("select %s from regdata", sql);
txy = unlist(dbGetQuery(con, sql), use.names = FALSE);
txy = matrix(txy, p + 1);
# Compute beta hat in R
beta.hat.DB = solve(txx, txy);
t6 = Sys.time();

我们可以检查这个结果:

> max(abs(beta.hat - beta.hat.DB));
[1] 3.028688e-13

可以看出差别是舍入误差导致的。

以上计算用了大约 17 秒,远远超出矩阵运算的时间。不过它也几乎没有占用额外的内存空间。实际上我们采用了“时间换空间”的策略。此外,你可能还发现,我们可以通过多个对数据库的连接同步地计算 sum(x0*x0), sum(x0*x1), ..., sum(x5*x5) ,所以如果你有一个多核的服务器(而且硬盘足够快),你还可以通过适当的安排大量地减少运行时间。

完整的源代码可以在这里下载

昔日因,今日意

$
0
0

本文作者杨灿:杨灿于2011年在香港科技大学电子计算机工程系获得博士学位,2011-2012为耶鲁大学生物统计系博士后,现为耶鲁大学副研究员。

飞帅云:“三十功名尘与土,八千里路云和月。莫等闲,白了少年头,空悲切。”可我在耶鲁两年多了,基本一事无成。既没有像当年那样死磕Lasso和Boosting,也没有能追随Deep Learning 的浪潮。曾经真的以为人生就这样了,平静的心拒绝再有浪潮。斩了千次的情丝却断不了,百转千折她将我围绕。有人问我她究竟是哪里好?我想我是鬼迷心窍。

1 向来痴

她就是LMM,我给她起了一个美丽的中文名:“林妹妹”。

对我这种工科男,与林妹妹相知相识,是需要一段奇缘。从在浙大本科自动化专业入学,到港科大的电子系博士快毕业,曾经有且仅有一次机会与她相识,还是被很傻很天真的我错过了。现在不管我怎么念“菠萝菠萝蜜”,时光还是不会倒流的。我只是想,如果上天可以给我一个机会再来一次的话,我会对她说八个字:“我们好像在哪见过?”然而,有缘人终归是有缘人,奇妙的感觉就在点火的那一刹那。

2010年,夏。

香港,清水湾。

海浪拍打着沙滩,伴随着风的欢笑,涌出蔚蓝的一片。

那一天,香港科大来了一位远方的客人,便是我现在耶鲁的老板。在他的演讲中,提到了一个故事。本人平生听了很多故事,但是我认为这个是最精彩的。据一些专家估算,人类身高的差异(统计学上用方差来描述),70%左右由遗传决定。另一批专家利用最新科技做了全基因组扫描,发现了大约100多个遗传变异点与人类身高显著的相关。这批专家就用这些显著的变异点去解释身高的方差时,惊讶地发现它们只能解释5%!从5%到70%,我靠,这中间的差距也太大了吧!“到底哪批专家是砖家,或者都是?”这个问题在我脑子里油然而生。然而以我的智慧,只猜中了开头,却猜不到结尾。林妹妹的出现让剧情峰回路转……

如今,专家们基本已达成共识:不要只是去关注那些显著的变异点!虽然这些不显著的变异点每一个的作用都比较小,但是他们总的作用却不能忽略!如果把那些不显著变异点的作用一起考虑进去,就能解释身高方差的45%,如果再考虑上那些没有被直接观察到的变异点的影响,就基本上接近70%。如何能把那么多不显著变异点的作用都优雅地考虑进去呢?这里就需要林妹妹了。

前面讲的故事是当今生命科学中最重要的课题之一。2009年的时候,科学家们还专门给这个故事起了一个名字–“missing heritability”,用今年流行的语言翻译过来就是“遗传物质都去哪儿了?”身高只是其中一个例子,对很多复杂疾病,比如糖尿病,高血压,精神分裂症等,科学家们也发现类似的情况。这个missing heritability 类似于物理学上的暗物质,感觉它存在却看不到它。林妹妹的出现让我们真实地测量到遗传学中的“暗物质”,并确认它的存在。

2 从此醉

好了,是时候停止卖萌,进入主题了。LMM全称是Linear Mixed Model(混合线性模型)。她血统高贵,与现代统计学之父Ronald Fisher提出的随机效应一脉相承。上个世纪50 年代,Charles Henderson 为她打造了国际一流的统计性质(BLUE and BLUP),他的学生Shayle Searle 更是为她配上了“黑客帝国(Matrix)” 的装备,从此她的名字将永远记入统计学的史册。1991年,statistical science上有一篇很经典的文章“That BLUP is a Good Thing: The Estimation of Random Effects”,里面谈到了她许多超一流的品质。事实上,我们在实践中已经用到了她的很多好的性质,只不过我们以前不知道罢了。

现在从她的一副黑客帝国装备说起,因为这副装备低调奢华有内涵:

\begin{equation}
\begin{aligned}
\textbf{y}&=\textbf{X}\mathbf{\beta} + \textbf{Zu}+\textbf{e},\\
\textbf{u}&\sim \mathcal{N}(\mathbf{0},\sigma^2_u\textbf{I}),\\
\textbf{e}&\sim\mathcal{N}(\mathbf{0},\sigma^2_e\textbf{I})\\
\end{aligned}
\end{equation}
这里$\textbf{y}\in\mathbb{R}^n$是回归问题中的因变量,$\textbf{X}\in\mathbb{R}^{n\times d}$和$\textbf{Z}\in\mathbb{R}^{n\times p}$分别是固定效应和随机效应的设计矩阵,$\textbf{e}\in\mathbb{R}^n$是随机误差,$\mathbf{\beta}\in\mathbb{R}^d$和$\textbf{u}\in\mathbb{R}^p$分别是固定效应向量与随机效应向量,$n,d,p$ 分别是样本数目,固定效应的个数以及随机效应的个数。这里$\textbf{y},\textbf{X},\textbf{Z}$是给定的,需要估计的是$\mathbf{\beta},\textbf{u},\sigma^2_u,\sigma^2_e$。 看到这里,我知道大部分童鞋已经有点晕了:啥叫固定效应,啥叫随机效应?先解释什么叫随机效应。 我相信大家都理解随机数,简单点说,他们就是从某一个分布里面随机抽出来的数,这些数不是固定的,但是他们总体上服从某种规律(即某种分布),比如服从正态分布。之所以用“随机效应”而不是用“随机数”,是为了描述设计矩阵的每一列所对应的变量对因变量$\textbf{y}$的作用,比如在上述模型中的$\textbf{u}$ 是一个$p$ 维的向量,它的每个元素即$u_j,j=1,\dots,p$都来自于正态分布$\mathcal{N}(0,\sigma^2_u)$,$u_j$即是$\textbf{Z}$的第$j$列对$\textbf{y}$ 的效应。现在来解释啥叫固定效应,一句话,固定效应就是非随机效应。当固定效应与随机效应在一起的时候,就是所谓的mixed model。 注意千万不要把mixed model与mixture model 混为一谈!因为前者是被动在一起的,后者则是主动在一起的,想分都分不开。

既然是被动在一起,把二者拆开就比较容易。如果只看固定效应那一部分,
\begin{equation}\label{ols}
\textbf{y}=\textbf{X}\mathbf{\beta} +\textbf{e},\quad\textbf{e}\sim\mathcal{N}(\mathbf{0},\sigma^2_e\textbf{I}),
\end{equation}
这就是最基本的多元线性回归,$\mathbf{\beta}$的最优解由最小二乘法(Least square)给出,即$\hat{\mathbf{\beta}}_{LS}$,它的统计性质由高斯马尔科夫定理(Gauss–Markov Theorem)保证,比如$\hat{\mathbf{\beta}}_{LS}$是所有无偏估计中方差最小的。如果只看随机效应那一部分,
\begin{equation}\label{ridge}
\begin{aligned}
\textbf{y}&= \textbf{Zu}+\textbf{e},\\
\textbf{u}&\sim \mathcal{N}(\mathbf{0},\sigma^2_u\textbf{I}),\\
\textbf{e}&\sim\mathcal{N}(\mathbf{0},\sigma^2_e\textbf{I}),
\end{aligned}
\end{equation}
相信大家对上式也不会陌生。比如,看过Pattern recognition and machine learning (by Bishop, C.)的第三章Linear Models for Regression的童鞋应该会发现:当$\lambda=\frac{\sigma^2_e}{\sigma^2_u}$时,求解上式与下式得到的解则是完全等价。
\begin{equation}\label{ridge2}
\min_{\textbf{u}}\|\textbf{y}-\textbf{Z}\textbf{u}\|^2+\lambda\|\textbf{u}\|^2,
\end{equation}
不同的是,这里的$\lambda$通常由交叉验证确定,而估计前面式子中的参数($\sigma^2_u$与$\sigma^2_e$)则另有办法。在机器学习中,大家把它叫做Evidence approximation,统计学里面把它叫经验贝叶斯(Empirical Bayes)。

现在可以再把二者合在一起了,但这里涉及到一个重要的问题。举一个简单的例子,有$n$个数据点$(x_1,x_2,\dots,x_n)$,每个数据点$x_i\in \mathbb{R}$ 都独立地来自$\mathcal{N}(\mu,\sigma^2)$。对$\sigma^2$的最大似然估计是$\tilde{\sigma}^2=\sum_i(x_i-\bar{x})^2/n$,这里$\bar{x}=\sum_i x_i/n$是均值。但是,正如大家所知道的,对$\sigma^2$的无偏估计应该是$\hat{\sigma}^2=\sum_i(x_i-\bar{x})^2/(n-1)$,因为在估计均值的时候已经消耗掉一个数据了。为了补偿在有若干个固定效应情况下对方差估计的偏差,有一个办法应运而生,它的名字叫REML (REstricted Maximum Likelihood,约束极大似然)。

前面提到的探索遗传学中的暗物质是对LMM一次高端大气上档次的运用。遗传的变异会引起身高的差异,那么身高有多大程度上是由遗传因素决定的?翻译成统计学语言:用遗传变异点数据究竟能解释身高方差的百分之多少?回过头来再看,$\textbf{y}$中是$n$ 个样本($\sim5000$) 的身高数据,$\textbf{X}$ 的每一列对应一个协变量,比如年龄、性别,基因组变异点的数据都放到$\textbf{Z}$中,其中每一列对应一个变异点的数据。为了写出$\textbf{y}$的边际分布,需要对$\textbf{u}$和$\textbf{e}$积分,
\begin{equation}\label{}
\textbf{y}\sim\mathcal{N}(\textbf{X}\mathbf{\beta},\textbf{ZZ}^T \sigma^2_u + \sigma^2_e \textbf{I}).
\end{equation}
注意$\textbf{X}\mathbf{\beta}$并不影响$\textbf{y}$的方差。Heritability定义为:

\begin{equation}
h^2=\frac{p{\sigma}^2_u}{p{\sigma}^2_u+{\sigma}^2_e},
\end{equation}
这里$p\sigma^2_u$是遗传因素解释的方差($p$是变异点个数,大约是50万到100万这个范围),$\sigma^2_e$是非遗传因素造成的方差。启动REML 以后,就能得到($\hat{\sigma}^2_u,\hat{\sigma}^2_e$),然后算出heritability。

3 水榭听香,指点群豪戏

“脚步不能达到的地方,眼光可以到达。”抬望眼,满城尽是LMM,如下图所示。由于篇幅所限,我只能简单地介绍一部分。

LMM-all2

LMM与很多经典方法的关系图

第一,LMM与JSE-Ridge Regression的关系最为明显。当没有固定效应,$\textbf{Z}$变为单位矩阵的时候,LMM就变为了JSE(这个时候需要$\sigma^2_e$ 是已知的,不然会有可辨识性的问题。在JSE(James-Stein Estimator)的问题中,$\sigma^2_e=1$,更详细的描述请参考我的《那些年我们一起追的EB》)。LMM与Ridge 的关系,前面已经讲过了。

第二,RVM(relevance vector machine)如下:

\begin{equation}
\begin{aligned}
\textbf{y}&= \sum_j \textbf{Z}_j u_j+\textbf{e},\\
u_j&\sim \mathcal{N}(0,\sigma^2_{u_j}),\\
\textbf{e}&\sim\mathcal{N}(\mathbf{0},\sigma^2_e\textbf{I}),
\end{aligned}
\end{equation}

RVM与LMM的差别是:RVM允许每个随机效应$u_j$有自己的方差$\sigma^2_{u_j}$,而LMM中所有的随机效应(random effects)具有同样的$\sigma^2_u$。 从RVM 到Lasso(Least Absolute Shrinkage and Selection Operator),只需要假设$\{\sigma^2_{u_j}\}$来自指数分布,详情参见Bayesian Lasso。Lasso,LARS和Boosting已经成为统计学与计算科学史上的一段佳话,最好的文献当然是Efron教授的Least Angle Regression,喜欢看故事的童鞋可以看我的《统计学习那些事》。

第三,LMM与PCA(Principal Component Analysis)的联系似乎不是那么直接,因为这里已经从监督学习走向了非监督学习。然而,当PCA被赋予概率的解释后,天堑变通途。这篇里程碑式的文章就是Probabilistic principal component analysis by Tipping and Bishop。PCA与clustering的亲密关系暴露在本世纪初,clustering和mixture models的关系嘛,应该是不言而喻的。

第四,大家都知道,Mixture models里面是有一个隐状态,比如在做clustering的时候,这个隐状态就用来表明数据点与cluster的隶属关系。当这些隐状态不再是独立等分布的时候,比如,后一个状态取决于前一个状态的时候,HMM便应运而生。HMM与卡曼滤波(Kalman filter)基本上可以看做孪生兄弟,一个为离散状态而生,一个为连续状态而来。LMM与卡曼滤波的关系在“BLUP is a good thing”这篇雄文中早有讨论。当年学控制的我与卡曼滤波有过初步接触,但是却与LMM 失之交臂,还好在耶鲁与LMM再续前缘。

第五,如今的Matrix factorization已经是令人眼花缭乱了,因为这里加入了很多sparse(包括low-rank)与smoothing的技术。但不可否认,PCA依然是矩阵分解中最重要的一种,奇异值分解依然是这里最重要的数学基石。

面对如此波澜壮阔的模型表演,不知道大家会如何感想?这里我先引用Terry Speed在“BLUP is a good thing”的评论里的最后一段话:“In closing these few remarks, I cannot resist paraphrasing I.J. Good’s memorable aphorism: `To a Bayesian, all things are Bayesian.’ How does `To a non-Bayesian, all things are BLUPs’ sound as a summary of this fine paper?” 大师的话值得久久回味……我自己总结的话,来点通俗易懂的,还是这句“天下武功,若说邪的,那是各有各的邪法,若说正的,则都有一种‘天下武功出少林’的感觉”。

4 杏子林中,商略平生義

“眼光不能到达的地方,精神可以飞到。”

“随机还是非随机?”是一个问题,甚至是一个哲学问题。或许,我们参一生也参不透这道难题。爱因斯坦说:“上帝不玩骰子。”然而,麦克斯韦却说:“这个世界真正的逻辑就是概率的计算。” 电影《美丽心灵》的纳什也在追问“到底什么才是真正的逻辑”。最后他在获得诺奖时说:“ 我一直以来都坚信数字,不管是方程还是逻辑都引导我们去思考。但是在如此追求了一生后,我问自己:‘逻辑到底是什么?谁决定原由?’我的探索让我从形而下到形而上,最后到了妄想症,就这样来回走了一趟。在事业上我有了重大突破,在生命中我也找到了最重要的人:只有在这种神秘的爱情方程中,才能找到逻辑或原由来。”这是我听到的最美的答案。

如果回到工程实践的话,或许我们应该追问:“为什么引入随机效应后会有如此神奇的疗效?”Efron教授在他的一篇文章中称赞James-Stein Estimator:“This is the single most striking result of post-World War II statistical theory”。 我想,我们应该可以从JSE 中寻找到一些蛛丝马迹。JSE的原问题是:现已观察到$N$个$z$值,即$[z_1,z_2,\dots,z_N]$,还知道$z_i$独立地来自以$\mu_i$为均值,方差为1的正态分布,即$z_i|\mu_i \sim \mathcal{N}(\mu_i,1)$, $i=1,2,\dots,N$.问题是:如何从观察到的$\mathbf{z}=[z_1,z_2,\dots,z_N]$估计$\boldsymbol{\mu}=[\mu_1,\mu_2,\dots,\mu_N]$?最大似然法和James-Stein Estimator给出解答分别是(更多细节参考《那些年,我们一起追的EB》):

\begin{equation}
\hat{\mathbf{\mu}}_{ML} = \textbf{z},\quad\hat{\mathbf{\mu}}_{JS} = \left( 1- \frac{N-2}{||\mathbf{z}||^2}\right)\mathbf{z}.
\end{equation}
对JSE的理解有很多不同的角度,个人觉得从下面的这个角度看过去是非常精彩的。如果我们把$\mu_i,i=1,\dots,N$看做是随机,那么我们可以认为他们来自某一个分布$\mathcal{G}(\mu)$,随着$N$的增大,我们对$\mathcal{G}(\mu)$ 的估计就会越准确。原来看似独立的$z_i$却能通过这样一个分层结构(见下图)来共享信息。虽然$N$很小的时候,$\mathcal{G}(\mu)$是没法估计准确的,但幸运的是,这里的$N$并不要求太大。可以证明,只要$N\geq3$,JSE就比MLE好。这就是Efron教授所说的“learning from others”。如果用更加数学的语言来刻画信息共享,其实就是Bias-Variance trade-off。当信息共享的时候,偏差增加了少许但方差却大大降低。

JSnew2

5 须倾英雄泪

James Watson在他的《双螺旋》一书的序言中写道:“科学的发现很少会像门外汉所想像的那样,按照直截了当、合乎逻辑的方式进行。事实上,科学的进步(有时是倒退)往往是人为事件。在这些事件中,人性以及文化传统都起着巨大的作用。”

“庾信平生最萧瑟,暮年诗赋动江关。”这是张益唐教授为“孪生素数猜想”作出巨大贡献后接受采访时引用的诗句。听罢,令人感慨万千。

昔时因。

今日意。

“胡汉恩仇”,须倾英雄泪。

最后附上本文的pdf原稿供下载:LMM_Yale

 

COS每周精选:数据挖掘中的十大算法

$
0
0

本期投稿:谢益辉 施涛 朱雪宁 王小

编辑:王小宁

国际权威的学术组织 The IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, 和 CART.,相关的论文在这里。最近有人把这些算法用R实现了

前两天有关疑似MH370 遗骸的消息登上各大新闻头条,信息真假还未得知,其实早在今年三月份CNN报道得克萨斯A&M大学的数学家宣布,他已通过一台计算机上运行的数据,并确定它是有可能的飞机已经垂直坠入海洋,请参看这里

一位2013年毕业于杜克大学的同学总结的今年在Coursera 上关于约翰霍普金斯大学数据科学课程的笔记,有志于上此系列课的童鞋可以先看看哦!小编提醒,新的一轮数据科学课程也从8月3日开始了。

一篇关于R 语言进行并行计算的深度好文

广义线性模型(GLMS)在数据科学工具箱中不可或缺的工具。它们是适用于涉及很多现实世界的问题,连续数据,计数和生存数据(及其他)。模型本身是直观的,并且可以被用于推断和预测。一些非常高品质的免费软件和开源软件的实现方式是可获得的如R

最近比较火的一篇文章,UCLA的一个学生伪造了数据发了一篇Science文章,后来被别人发现,被撤稿了。这里面的侦察过程有点意思,参见文中的PDF报告链接。

为什么我不是R方的粉丝

$
0
0

本文翻译自 John Myles White 的博客 Why I’m Not a Fan of R-Squared。翻译工作已经获得作者授权同意。

本文大意

人们通常喜欢用 $R^2$ 作为评判模型拟合好坏的标准。与 MSE MAD 不同,$R^2$ 不只是模型误差的函数,它的定义中还隐含了两个模型的比较:一个是当前被分析的模型,一个是所谓的常数模型,即只利用因变量均值进行预测的模型。基于此,$R^2$ 回答的是这样一个问题:“我的模型是否比一个常数模型更好?”,然而我们通常想要回答的是另一个完全不同的问题:“我的模型是否比真实的模型更差?

通过一些人为构造的例子我们可以很容易发现,对这两个问题的回答是不可互换的。我们可以构造一个这样的例子,其中我们的模型并不比常数模型好多少,但同时它也并不比真实的模型差多少。同样,我们也可以构造出另一个例子,使得我们的模型远比常数模型要好,但也远比真实模型要差。

与所有的模型比较方法一样,$R^2$ 不单是被比较模型的函数,它也是观测数据的函数。几乎对于所有的模型,都存在一个数据集,使得常数模型与真实模型之间是无法区分开的。具体来说,当使用一个模型区分效能很低的数据集时,$R^2$ 可以任意地向零趋近——即使我们对真实模型计算 $R^2$ 也是如此。因此,我们必须始终记住,$R^2$ 并不能告诉我们模型是否是对真实模型的一个良好近似:$R^2$ 只告诉我们,我们的模型在当前的数据下是否远比一个常数模型要好。

一个例子

我们来考虑一个简单的例子,首先将备选模型与常数模型相比,然后将备选模型与真实模型对比,我们将会发现他们会产生完全相反的结论。假设我们想对函数 $f(x)$ 进行建模,它在 $x_{min}$ 和 $x_{max}$ 之间均匀分布的 $n$ 个点上又加入了噪声的观测。

我们首先假定:

  • $f(x)=\log(x)$
  • $x_{min}=0.99$
  • $x_{max}=1.01$
  • 在 $x_{min}$ 和 $x_{max}$ 之间均匀分布的 1000 个点上,我们观测到 $y_i=f(x_i)+\epsilon_i$,其中 $\epsilon\sim N(0,\sigma^2)$.

基于这组数据,我们尝试利用单变量普通线性回归来学习 $f(x)$。我们先后拟合一个线性模型和一个二次模型。下面展示了两个模型的拟合结果:

model_comparison_1在图中,我们可以看到 $f(x)$ 可以被一条直线很好地近似,所以我们的线性和二次回归模型都可以很好地还原真实模型。这是因为 $x_{min}$ 和 $x_{max}$ 非常接近,因此真实的函数在这个区域中可以被直线很好地近似,特别是相对于我们观测的噪声水平而言。

我们可以通过两组模型比较来对这些简单回归的效果进行评判:一组是我们的模型与常数模型的对比,另一组是我们的模型与真实的对数函数模型的对比。为了简化计算,我们采用不对回归变量数目进行调整的 $R^2$ 定义,因此模型 $m$(相对于常数模型 $c$)的 $R^2$ 计算方法是

$$R^2 = \frac{\text{MSE}_c – \text{MSE}_m}{\text{MSE}_c} = 1 – \frac{\text{MSE}_m}{\text{MSE}_c}$$

与“官方”的 $R^2$ 定义一样,这个数值告诉我们,在常数模型留下的残差中,有多大的比例是为备选模型所解释的。这个比较可能会与备选模型和真实模型之间的比较得出不同的结论。为了展示这一点,接下来我们考察一个 $R^2$ 的变种,我们称之为 $E^2$,它衡量了备选模型的误差相对于真实模型 $t$ 而言有多差:

$$E^2 = \frac{\text{MSE}_m – \text{MSE}_t}{\text{MSE}_t} = \frac{\text{MSE}_m}{\text{MSE}_t} – 1$$

注意,$E^2$ 在意义上与 $R^2$ 是相反的:拟合更好的模型具有更小的 $E^2$ 取值。

在我们的例子中,可以计算出线性模型的 $R^2=0.007$,而真实模型的是 $R^2=0.006$。相对而言,线性模型的 $E^2=-0.0008$,这说明对于这组数据,备选模型与真实模型之间是很难区分开的。尽管 $R^2$ 表明我们的模型可能不是非常好,但 $E^2$ 的取值说明在当前 $x$ 的范围内,我们的备选模型已经接近完美了。

那么当 $x_{max}$ 与 $x_{min}$ 之间的间隔变大之后会发生什么呢?对于单调函数,如 $f(x)=\log(x)$,我们将发现 $E^2$ 会随着间隔的增加而增加,而 $R^2$ 的表现则非常奇特:它先会递增一会儿,然后再下降。

在考虑一般的情形之前,我们先看一个具体的例子,设定 $x_{min}=1$,$x_{max}=1000$:

model_comparison_2在这个例子中,可以通过上图看出线性模型和二次模型都有系统性的偏差,但它们的 $R^2$ 值都有显著的增长:线性模型是 $R^2=0.760$,真实模型是 $R^2=0.997$。相比较而言,线性模型的 $E^2=85.582$,这说明该数据集提供了有力的证据表明线性模型比真实模型要差。

这个例子说明,尽管大多数人都会同意线性模型对真实模型的近似效果是越来越差的,但 $R^2$ 却有了显著的增长。从前一个例子到后一个的转换过程中,$R^2$ 看似得到了提升,$E^2$ 却表明由于 $x_{min}=1$ 和 $x_{max}$ 之间的间隔增加了,备选模型的拟合效果是大打折扣的。这表明 $R^2$ 并不能解释为 $E^2$ 的一个替代量($E^2$ 依赖于真实模型,通常是不可测量的)。然而我们的两个极端例子还不是故事的全部:事实上,$R^2$ 从前一个例子到后一个的转换过程中,其变化并不是单调的。

我们进行一项跟之前类似的分析,从 $(x_{min},x_{max})=(1,1.1)$ 开始到 $(x_{min},x_{max})=(1,1000)$ 结束,但考虑间隔在这其中的多个取值情形。如果我们依次计算每种情形下的 $R^2$ 和 $E^2$,那么将会得到如下的图形(对 x 轴进行了对数变换,以使曲线的非单调性更加明显)。

首先是 $R^2$ 的图像:

r2其次是 $E^2$ 的:

e2注意到 $R^2$ 的图像相对于 $E^2$ 而言是多么的奇特。$E^2$ 始终是递增的:随着间隔的增加我们拥有更多可以区分模型的数据时,我们同时也拥有越来越强的证据表明线性近似不是正确的模型。相反,$R^2$ 一开始非常低(也正是 $E^2$ 很低的时候,因为我们的线性模型略差于真实模型),之后以非单调的模式发生变化:它的峰值位于当数据有足够的变异来排除常数模型,但还不足以排除线性模型的时候。在这个临界点之后,$R^2$ 就开始下降。对于二次模型,$R^2$ 的取值具有类似的非单调性。只有真实的模型展现出单调递增的 $R^2$。

结论

我写这篇文章的目的不是希望大家放弃使用 $R^2$,事实上我也一直时常需要用到它,但我认为理解以下这两点是非常重要的:(1) $R^2$ 的取值很大程度上依赖于数据集;(2) 即使你的模型在逐渐向真实模型靠近,$R^2$ 却可能会变小。在决定一个模型是否有用时,一个很高 $R^2$ 的模型也可能不理想,而反之一个具有很低 $R^2$ 的模型也有可能是非常好的。

这是一个不可回避的问题:一个错误的模型是否有用,总是和它被应用的范围,以及在这个范围内我们评价所有误差的方式有关。由于 $R^2$ 隐含了对两个模型的比较,所以一般而言它会依赖于具体的数据集。$E^2$ 同样有所依赖,但至少它不会随着回归变量 $x$ 变异的增大而呈现出非单调性的变化。

代码

文章的代码托管在 GitHub 上。

补记一

回顾这篇文章的时候,我发现当时应该更加明确地指出,像 MSE 和 MAD 这样的模型拟合评判标准也是与模型的应用范围有关的。我之所以更倾向于使用它们,是因为它们没有隐含的归一化过程,也就是说它们看上去可以是任意的数,这意味着它们对于模型的应用范围是非常敏感的——反观 $R^2$,由于它是一个归一化的数字,因此它显得不那么“任意”,这可能会让我们忘了它是非常依赖于数据的。

其次,我之前确实应该用一种不同的归一化方法来定义 $E^2$。对于模型 $m$,当拿它与常数模型 $c$ 和真实模型 $t$ 相比较时,下面这个有界的数值可能使用起来更为简便:

$$E^2 = \frac{\text{MSE}_m – \text{MSE}_t}{\text{MSE}_c – \text{MSE}_t}$$

这个数值的意义是,在较差的基准模型($\text{MSE}_c – \text{MSE}_t$)到最好的模型($\text{MSE}_t – \text{MSE}_t=0$)之间,当前模型所处的位置是哪里。注意到在之前考察的同方差回归模型中,$\text{MSE}_t=\sigma^2$,它可以从经验数据利用同方差的可识别性假定和任意固定回归变量 $x$ 上的重复观测进行估计。

此外,为了保证这个数值在 $[0,1]$ 之间,我们可能还需要加上一些额外的限制。这是因为当待比较的模型没有嵌套关系时,其取值就有可能超出范围。在线性回归的设定中,其取值一定不会超出 $[0,1]$,因为常数模型几乎总是嵌套更复杂的模型)。

补记二

在我睡醒看到这篇博客被转发到 Hacker News 上后,我意识到或许应该加上一些图形化的表示,以帮助那些没有理论统计背景的读者理解本文的核心思想。下面这张图表明,给定三个进行比较的模型,我们总可以在最差的模型(即常数模型)到最好的模型(即真实模型)之间找到备选模型的位置。

spectrum在测量备选模型所处的位置时,$R^2$ 和 $E^2$ 是互补的关系。

补记三

另一种对这些想法的表达是将其中涉及到的数量进行偏差/方差分解。在这种视角下,我们可以得到

$$R^2 = 1 – \frac{\text{MSE}_m}{\text{MSE}_c} = 1 – \frac{\text{bias}_m^2 + \sigma^2}{\text{bias}_c^2 + \sigma^2}$$

而补记一中的 $E^2$ 定义则有

$$E^2 = \frac{\text{MSE}_m – \text{MSE}_t}{\text{MSE}_c – \text{MSE}_t} = \frac{(\text{bias}_m^2 + \sigma^2) – (\text{bias}_t^2 + \sigma^2)} {(\text{bias}_c^2 + \sigma^2) – (\text{bias}_t^2 + \sigma^2)} = \frac{\text{bias}_m^2 – \text{bias}_t^2}{\text{bias}_c^2 – \text{bias}_t^2} = \frac{\text{bias}_m^2 – 0}{\text{bias}_c^2 – 0} = \frac{\text{bias}_m^2}{\text{bias}_c^2}$$

在很大程度上,我认为 $R^2$ 难以理解的地方就在于其表达式中分子分母都含有 $\sigma^2$ 项。而 $E^2$ 本质上就是移除了 $\sigma^2$ 之后的结果。我认为这对于理解模型的拟合效果是更有帮助的。

作者简介:

John Myles White,Facebook 核心数据科学团队成员,加入 Facebook 之前获得普林斯顿大学心理系博士学位,并在麻省理工学院从事 Julia 编程语言的开发。

译者简介:

邱怡轩,普渡大学统计系博士研究生,对统计计算和机器学习等领域感兴趣,是Spectra、showtext、recosystem、prettydoc等开源软件包的作者,个人主页 http://yixuan.cos.name/cn

                                                                                                                  翻译:邱怡轩

                                                                                                                  审稿:冯凌秉

                                                                                                                  编辑:彭晨昱

版权公告:
原创文章,版权所有。

敬告各位友媒,如需转载,请与统计之都小编联系(直接留言或发至邮箱:editor@cos.name ),获准转载的请在显著位置注明作者和出处(转载自:统计之都),并在文章结尾处附上统计之都二维码。

QR

 

共轭梯度法计算回归

$
0
0
共轭梯度示意图(图片来源:维基百科)
轮回眼 共轭梯度示意图(图片来源:维基百科

引子

之所以写这篇文章,是因为前几天统计之都的微信群里有同学提了一个问题,想要对一个很大的数据集做回归。然后大家纷纷给出了自己的建议,而我觉得共轭梯度算回归的方法跟这个背景比较契合,所以就正好写成一篇小文,与大家分享一下。

说到算回归,或许大家都会觉得这个问题太过简单了,如果用 $X$ 表示自变量矩阵,$y$ 表示因变量向量,那么回归系数的最小二乘解就是 $\hat{\beta}=(X’X)^{-1}X’y$。(本文完)



哎等等,别真走啊,我们的主角共轭梯度还没出场呢。前面的这个算系数的公式确实非常简洁、优雅、纯天然、不做作,但要往里面深究的话,还是有很多问题值得挖掘的。

最简单暴力的方法,就是从左向右,依次计算矩阵乘法,矩阵求逆,又一个矩阵乘法,最后是矩阵和向量的乘法。如果你就是这么算的,那么可以先默默地去面壁两分钟了。

更合理的方法,要么是对 $X’X$ 进行 Cholesky 分解,要么是对 $X$ 进行 QR 分解,它们基本上是现在算回归的软件中最常见的方法。关于暴力方法和矩阵分解方法的介绍和对比,可以参见这个B站上的视频。(什么?你问我这么严肃的话题为什么要放B站上?因为大部分时间都是在吐槽啊)

好,刚才去面壁的同学现在应该已经回来了,我们继续。前面这些通过矩阵运算求回归系数的方法,我们可以统称为直接法。叫这个名字,是因为它们都可以在确定数目的步骤内得到最终的结果。而与之相对的,则叫做迭代法,意思是通过不断更新已经得到的结果,来逐渐逼近真实的取值。打个比方,你想要知道一瓶82年的拉菲值多少钱,直接法就是去做调研,原料值多少,品牌值多少,加工费多少,运输费多少……然后加总起来得到最终的定价;而迭代法就是去问酒庄老板,你先随便蒙一个数,然后老板告诉你高了还是低了,反复循环,总能猜个八九不离十。

说到这里,你自然要问了,既然算回归的软件大都是用直接法,为什么还要考虑迭代法?莫非直接法有什么不好的地方?这就说到问题的点子上了。

首先,如果我们假设数据有 $n$ 行 $p$ 列,那么我们会发现,$X’X$ 的维度就是 $p\times p$,而如果变量数特别多,那么这个矩阵就会以平方的速度增大,那时候不要说算矩阵分解,即使是要存储这个大矩阵,可能都会遇到很多麻烦。

第二点,往好的方面讲,直接法给出的结果精度一般非常高,但在许多实际问题中,可能小数点后面三位保证正确就足够了,而直接法可能会为了保证十三位的精度而多出非常多的计算量。用直接法得到高精度的结果,再舍入成低精度的实际需求,总有一种买椟还珠的感觉。相反,迭代法是一个向真相逐渐靠近的过程,如果在中途已经可以保证需要的精度,那么就随时可以停止,节省计算时间。

第三点就更偏技术层面一点。通常而言,如果数据很大,那么很有可能矩阵 $X$ 会带有某种稀疏特性,也就是说其中会有非常多的零元素。稀疏矩阵具有一些高效的存储方法和矩阵运算算法,但用直接法得到 $X’X$ 之后,它就往往不再是稀疏矩阵了,于是存储量和计算量都会陡增。换言之,本来具有计算优势的稀疏矩阵,在直接法中却并不能发挥出它的优势来。

那么是不是有某种迭代法可以克服这些缺点呢?巧的是,本文要介绍的共轭梯度法就是其中之一。(哎说实话写这句的时候我自己都不信有多巧,前面铺垫这么多+设问句+巧合明显是作者刻意安排的啊,太明显了……)

什么是共轭梯度法?

共轭,其实是线性代数里面的一个概念。给定一个正定矩阵 $A$,如果两个向量 $u$ 和 $v$ 满足 $u’Av=0$,就说 $u$ 和 $v$ 是关于 $A$ 共轭的。一个 $m\times m$ 的正定矩阵,最多可以有 $m$ 组相互共轭的向量,而它们就组成了 $m$ 维向量空间里的一组基 $\{p_1,p_2,\ldots,p_m\}$。通过线性代数的知识我们知道,给定了一组基后,向量空间里的任何一个元素就可以写成这组基的线性组合,比如

$$x=\sum_{i=1}^m \alpha_i p_i.$$

在回归模型中,回归系数 $\hat{\beta}$ 正是线性方程组 $Ax=b$ 的解,其中 $A=X’X$,$b=X’y$。而共轭梯度法(Conjugate gradient, CG),就是想像上面这个式子一样,把解 $x$ 表达成共轭向量基的线性组合:只要依次算出所有的共轭向量 $p_i$ 和对应的系数 $\alpha_i$,就可以得出 $x$。而在实际情况中,有可能用更少数目的 $p_i$ 就能得到对 $x$ 的良好近似,于是在这个意义上 CG 就是一种迭代法了。

那么为什么要叫共轭“梯度”呢?这是因为前面的这个公式还有另一种理解。考虑一个函数 $f(x)=\frac{1}{2}x’Ax-b’x$,我们很容易发现它取最小值的点正是方程 $Ax=b$ 的解。如果我们用最优化的思路去解 $Ax=b$,就是要找到一个 $x$ 使得 $f(x)$ 达到最小。一般情况下,我们会采用“最速下降”的算法,即给定一个初始值 $x_0$,计算当前的梯度,然后沿着该梯度方向移动到下一个更新值 $x_1$,再计算梯度,如此反复循环。而共轭梯度法,则是说我们并不是沿着梯度走,而是沿着所谓的“共轭梯度”,即 $p_i$,进行移动。

至于为什么应该用共轭梯度而不是梯度,我建议感兴趣的读者看一看文章最后的那篇参考文献,其中对共轭梯度的优势进行了非常详细的阐述。一个直观的理解就是,普通的梯度法往往会有重复移动的方向(如文首图片中的绿线),而共轭梯度保证了每次移动的方向是共轭的(即关于 $A$ 是正交的,如文首图片中的红线),因此不会有重复的劳动。关于 CG 的理论说来那个话就长了,因此本文不在这方面做过多的论述(其实是因为作者太懒),我在这里更想强调的其实是它的计算过程,参见图 1。

图1:共轭梯度法算法流程

神奇在哪里?

图 1 所示的算法基本上可以展现出 CG 最重要的几个特性。

首先第一点,从图 1 可以看出,与 $A$ 有关的运算只是一个矩阵乘法 $Ap_k$,剩下的部分都是向量之间的运算,没有任何其他更复杂的操作。而我们知道,矩阵与向量的乘法是很容易编程实现的,而且即使当矩阵很大的时候,它的内存占用量也非常小。纵观整个算法,基本上只需要存储若干个向量,所以在这个层面上,共轭梯度法非常适合内存受限的情形。

然后第二点,就如之前所说,共轭梯度法是一种迭代法,但它最奇特的一点在于,它同时又能保证在 $m$ 步内完成计算。所以从某种层面上说,它兼具了直接法和迭代法的优点,好的情形下可以提前终止,最差的情况也能在 $m$ 步内完成。

第三点,由于共轭梯度法中的大矩阵只参与乘法运算,所以稀疏矩阵的高效算法就可以派上用场了。可能你会说,$A=X’X$ 不是已经破坏了稀疏性了吗?但实际上,在计算 $Ap_k$ 的时候,可以先计算 $v=Xp_k$,再计算 $Ap_k=X’v$,这样两步分开来都是稀疏矩阵的运算。

代码实现

如前所说,CG 的一大优势在于编程实现非常简单。不依赖于任何附加包,我们就可以用几十行 R 代码搞定其核心算法。

## Target: solve linear equation Ax = b. A is positive definite
## Ax      -- A function to calculate the matrix-vector product
##            `A * x` given a vector `x` as the first argument
## b       -- Vector of the right hand side of the equation
## x0      -- Initial guess of the solution
## eps     -- Precision parameter
## verbose -- Whether to print out iteration information
cg = function(Ax, b, x0 = rep(0, length(b)), eps = 1e-6,
              verbose = TRUE, ...)
{
    m = length(b)
    x = x0
    r = b - Ax(x0, ...)
    p = r
    r2 = sum(r^2)
    for(i in 1:m)
    {
        Ap = Ax(p, ...)
        alpha = r2 / sum(p * Ap)
        x = x + alpha * p
        r = r - alpha * Ap
        r2_new = sum(r^2)
        err = sqrt(r2_new)

        if(verbose)
            cat(sprintf("Iteration %d, err = %.8f\n", i, err))

        if(err < eps)
            break;
        beta = r2_new / r2
        p = r + beta * p
        r2 = r2_new
    }
    x
}

或许会有读者疑问,为什么我要把矩阵乘法定义成一个函数参数 Ax,而不是直接在算法过程中写矩阵乘法。这是因为,某些情况下矩阵乘法可能有特殊的实现,用户只需要定义好相应的函数,就可以直接调用上面的这段程序,而不需要去修改算法的细节。使用上面的程序,一个简单的模拟例子如下:

## Simulation example
set.seed(123)
n = 10000
p = 1000
x = matrix(rnorm(n * p), n)
b = rnorm(p)
y = x %*% b

beta_direct = solve(crossprod(x), crossprod(x, y))

mat_vec_mult = function(x, mat)
{
    as.numeric(crossprod(mat, mat %*% x))
}
xy = as.numeric(crossprod(x, y))
beta_cg = cg(mat_vec_mult, xy, mat = x)

max(abs(beta_direct - beta_cg))
## [1] 7.422063e-12

其中 CG 程序打印出了如下的信息:

Iteration 1, err = 80261.88521243
Iteration 2, err = 24276.83688338
...
Iteration 21, err = 0.00000622
Iteration 22, err = 0.00000197
Iteration 23, err = 0.00000062

可以看出,CG 在第 23 步迭代后就收敛了,在我的机器上耗时约 0.82 秒,而直接法总共耗时约 5.3 秒,是 CG 的将近 6.5 倍。

真有这么神奇?

看到这个结果,我估计小伙伴们都惊呆了。如果效果真这么好,那赶紧拿它去跑跑回归试试啊。于是我到 UCI 机器学习数据库上找了一个中等大小的数据集,包含 53500 个观测和 384 个自变量,然后兴冲冲地跑了个 CG(这里完全只是为了演示算法,实际处理数据时,请千万千万先对数据的背景有所了解,然后再考虑建模,切记切记):

dat = read.csv("slice_localization_data.csv")
n = nrow(dat)
y = dat$reference
x = as.matrix(dat[, -c(1, ncol(dat))]) / sqrt(n)
xy = as.numeric(crossprod(x, y))

coeffs = cg(mat_vec_mult, xy, mat = x)
## Iteration 1, err = 11262.97730747
## Iteration 2, err = 4471.54099614
## Iteration 3, err = 1783.28640925
## ...
## Iteration 100, err = 2.94723420
## Iteration 101, err = 4.60232106
## Iteration 102, err = 4.02014578
## ...
## Iteration 200, err = 0.63018214
## Iteration 201, err = 1.67568741
## Iteration 202, err = 0.49243538
## ...
## Iteration 382, err = 0.16954617
## Iteration 383, err = 1.05050962
## Iteration 384, err = 0.11322079

纳尼??怎么跟剧本写的不一样啊?说好的提前收敛呢?就算不提前不是说最多 $m$ 步就收敛吗?我文章都写到这里了突然被打脸还怎么圆场啊?

(此处过去了半个小时……)

当崩塌的三观逐渐恢复的时候,就开始回过头来反思哪儿出了问题。其实,本文在之前有个非常重要的细节非常容易被忽视掉,大家把文章翻回第二节的第一句话,那里对矩阵 $A$ 加了一个定语:正定。正定的代数意义表现在矩阵所有的特征值都大于 0,而在回归中,它等价于数据矩阵 $X$ 是满秩的,换言之,没有多重共线性的存在。而如果我们检查一下这个数据中 $X’X$ 的行列式,就会发现它等于 0,也就是说有多重共线性的存在——原来我们之前兴冲冲地犯了一个美丽的错误。

知道哪儿出错了就好办了,对于多重共线性,其中的一种应对办法就是给 $X’X$ 的对角线上加上一个很小的常数 $\lambda$,这也就是我们常说的岭回归。我们重新修改一个岭回归版的矩阵运算函数,设定好  $\lambda$ 参数和精度,再放到 CG 中去运行:

ridge = function(x, mat, lambda = 0.01)
{
    as.numeric(crossprod(mat, mat %*% x)) + lambda * x
}
coeffs_ridge = cg(ridge, xy, eps = 1e-3, mat = x, lambda = 0.01)
## Iteration 1, err = 11256.55983300
## Iteration 2, err = 4455.13459864
## Iteration 3, err = 1767.78523995
## ...
## Iteration 61, err = 0.00164239
## Iteration 62, err = 0.00127173
## Iteration 63, err = 0.00092021

这一回迭代 63 次就以 0.001 的精度收敛了,耗时约 4.2 秒。而更进一步,如果查看原始数据就会发现,这个数据的稀疏比例非常大,所以我们可以把矩阵转换成稀疏格式,再来尝试运行 CG:

library(Matrix)
xsp = as(x, "sparseMatrix")
coeffs_sparse_ridge = cg(ridge, xy, eps = 1e-3, mat = xsp, lambda = 0.01)

最后耗时约 2.6 秒。

总结

前面那个错误使用 CG 的例子并不是我杜撰的,而是我在准备这篇文章的时候真实发生的事情。对于我自己而言也是一个教训:跑算法跑模型的时候,一定要仔细检查假定条件,然后对数据要有充分的了解,否则前方的终点就会跟非正定的 CG 一样,不收敛啊。

相信通过模拟和实际数据的例子,读者可以更直观地感受到 CG 的如下一些优点:

  1. 实现简单,会矩阵乘法就行,不会的话请会的人吃顿饭就够了;
  2. 内存占用小,妈妈再也不用担心花钱给我加内存了;
  3. 可以控制收敛精度,想到哪儿停就到哪儿停;
  4. 可以充分利用稀疏矩阵或者其他特殊的矩阵构造加快运算,激发小宇宙潜能。

本文的代码可以在 Github 上查看和下载。

参考文献:An Introduction to the Conjugate Gradient Method without the Agonizing Plain


COS访谈第25期:李东老师

$
0
0

受访人:李东老师

采访人:张心雨

 

个人简介

李东,清华大学统计学研究中心助理教授。2005年在中科院数学与系统科学研究院获得硕士学位,2010年在香港科技大学获得博士学位。在香港科技大学和美国爱荷华大学做过博士后研究。研究兴趣主要集中在金融计量经济学、非线性时间序列分析、网络与大数据等方向。个人主页:http://www.stat.tsinghua.edu.cn/teambuilder/faculty/李东/

 

访谈内容

张心雨:李老师,请简述您的求学经历,您为什么选择了统计?

李老师:这个要从大学时候说起。我本科是数学系应用数学专业的,刚开始学数学教育。大三的时候,面临考研究生选择方向的问题。我当时最喜欢的并不是统计,当时学统计的人还很少。我当时最喜欢的是群论和非线性分析,研究生就准备考这方面的。但是后来老师对我建议,选方向要照顾一下未来的就业问题,所以我就改成了当时并算不上热门的统计。当时想报中科院数学与系统科学研究院,于是给吴国富研究员写了一封信,问他收不收学生,得到首肯之后就报考了,最后以总分391分的成绩考入中科院应用数学所读硕士。入学之后,我还有另外一位导师陈敏研究员。

在大四的时候,我选修了概率论与数理统计,了解了一些统计推断的内容。那个时候特别喜欢参数统计推断,而对非参数不怎么感兴趣,结果读研究生之后,就开始学非参数的内容。研究生时对时间序列不是很感兴趣,结果研二下学期就开始做时间序列分析。研二时对线性时间序列模型比较感兴趣,对非线性的不感兴趣,结果后来发现线性时间序列模型早就被别人做完了,并且有完备的理论,于是就开始转向非线性时间序列模型,主要研究门限模型。

所以刚开始的时候,做的并不是自己喜欢的那个方向,但是自己喜欢的方向发现都被别人做的差不多了,于是只能找那个你不太心甘情愿的方向去做了,但是后来也就慢慢地就喜欢上那个方向了。做研究可能就是做多了,做习惯了的一个过程。现在回想,当初这个选择还不错,因为没有别人和你竞争。你不会发现自己正在研究的东西已经被别人研究过;同时你会做出来很多基础性的结果,对这个方向产生比较重要的影响。所以我觉得自己也还比较幸运,至今也仍在尝试用更多工具来研究门限模型。

张心雨:老师您理论功底很强,您觉得这个主要归功于您哪个阶段的学习?还是纯粹兴趣使然?

李老师:强算不上,只能说比较熟悉。这并不是因为本科学数学的原因,我当时也只学过初等概率论这一门课。主要是从我到中科院读书之后吧。一年级学习了概率论、随机数学这些基础课,二年级的时候,我们组织讨论班来讨论概率论,主要是周元燊那本《probability theory》,一本绿皮书。当时安鸿志老师指导我们读了很多概率论的书,他当时考察我们的方法很有意思。他给我们一些题目让大家去做,但并不考察你是否会做,而要求你用最简单的方法做出来。他搜集了七个比较有意思的题目,我当时一共做出了五个题目,其中有三个和他给的方法简易度相当,一个比他方法复杂,一个比他方法简单。所以安老师那时候就极力推荐我去读博士。我那时读博士的意愿并不算强烈,但老师说如果你去业界工作的话可能就浪费了。如果你还喜欢读书,那我就送你去香港好不好?于是我就到香港科技大学跟着凌仕卿老师学习时间序列。至于概率论的基础都是在平时的时候,自己读书做习题。

所以说现在我教高等概率论这门课的时候,就跟学生说不布置作业了,习题你自己去做就好。概率论主要可以看这几本书:一本是钟开莱的书,一本是周元燊的书,还有一本是Kallenberg的书,或者是Durrett的书都行,然后你去做书后面的习题。做的多了之后就会发现有很多收获,将来做研究的时候就比较得心应手。平时读到好文章,拿笔记本记录下来,经常翻看,也会有收获的。所以呢主要是靠在中科院时自己自觉读书和讨论班,以及在香港又重新修了概率论、随机过程等课程,前后一共学了四年半的概率论,又做了很多习题,所以只能说基础好一点点,没有你说的那么强。

张心雨:老师,我知道您对历史特别感兴趣。前两天和汤家豪教授座谈聊天的时候,他也提到了历史。我忽然就开了个脑洞,因为时间序列感觉和历史也有些关联,是不是研究时间序列的人会更容易对历史感兴趣呢哈哈?

李老师:没有。我从中学的时候就对历史比较感兴趣,当时教我们的老师非常有意思,从不让大家记笔记,上课像讲评书一样。虽然后来由于他教的太好被文科班抢走了吧,但是我这个兴趣就一直留下了。到了大学里面就看了一些历史书,然后又到了香港之后书就更多了,各个方面的历史书都有,后来在美国也看了很多。但是大部分也不是正史,主要是为了娱乐。因为有很多牛人,你看汤教授啊,安教授啊,他们也喜欢历史,为了和大家聊天比较和谐,自己就也去了解一些。我觉得统计圈里面讨论历史的人还比较多的,尤其是我们这些男的碰到一起,有时候大家不聊学术了没话题了,就开始聊历史了,这还是个不错的材料。历史呢,主要是个人的兴趣爱好,平时看专业的东西,看累的时候读一读,缓解一下心情。

张心雨:嗯老师,那您觉得时间序列跟历史会有某种共通之处吗?

李老师:嗯共通之处我倒没考虑过。不过确实有人用统计研究历史,有一个方向是历史动态学, dynamic history,还发表过不错的文章。我看到过别人的研究,是研究每个历史朝代它持续的时间,与当时朝代环境的一些关系。时间序列和音乐也有关系的,我当时在香港科技大学当助教的时候,有个学生就研究时间序列和音乐的关系。

(张心雨:嗯我之前去一个日本大学访问,他们有一个文化情报学部,主要就是拿统计来研究历史、文物等。)

对,时间序列可以预测未来,也可以预测过去,预测过去也就是考古嘛。根据已有信息对时间节点以前的事情进行推测。我们平时比较注重预测将来,预测过去也是有人做的。

张心雨:老师,您平时除了研究都有什么其他爱好?

李老师:我的爱好就是坐着,哈哈。我现在还好了,现在经常去跑步。以前读书的时候,喜欢的运动比较多,乒乓球篮球足球游泳网球这些,有时几个朋友周末一起打打牌,在香港的时候经常去爬山,一起买菜做饭。到了清华任教之后,这几年科研压力比较大的话,也没有去运动,现在好一点了,从今年暑假开始每天去跑步,3个月瘦了7公斤。

张心雨:老师您觉得一个比较好的、合理的博士生生活是怎样的?您对博士生有什么建议?可以是科研、生活各个方面的建议。

李老师:读博士本来就是一个很辛苦的事情。我个人当年读博士也是比较辛苦的,读书、查文献啊,给你题目之后各种事情都要自己思考自己做。对博士有什么建议的话,不同方向要求不太一样,我只说时间序列分析。个人认为时间序列分析是统计里面比较难的一个分支了,因为它不像其他分支是处理独立同分布的数据较多,时间序列分析里都是相关的数据,所以用的工具可能就比较复杂一些,对概率论的要求可能就比较高了。所以我就要求你两个师兄,一定要学好概率论的基础课,然后多做一些习题,增加一些尝试,掌握一些技术技巧。将来你做研究,你总不能遇到一个理论问题,就找别人去帮你做,不太现实。不能对别人的依赖性太强,这样你才可以走得更远。遇到困难的问题当然是可以找领域的其他人咨询的,但是你如果上来就问很简单的问题就不太好了。当然了,统计方法是很重要的,统计的思想更重要。你要有好的想法,并且有能把它实现的功底。所以第一个要求就是理论功底要扎实,第二个要求就是要有统计思想。

至于生活上,每个人生活方式都不一样了。你经常去爬爬山也行,经常回家也行,周末打打牌也行,没有什么太严格的要求。但是有一点,最好是经常锻炼,这样的话精力比较充沛。不要整天闷在办公室里,有些问题的解决并不一定是在办公室或者实验室解决的,有可能是你在外面玩的时候吃饭的时候,或者你在机场、车站的时候解决的。我就经常在走路的时候想问题,有时走到家或者到吃饭的时候就把这个问题给解决了。做研究嘛,解决问题就好了,对时间地点都没有限制。

读博士这几年时间非常快,一定要抓紧时间。给你一个题目之后,就尽快尽最大努力去做。研究的时候也不要看一山比另一山高,摇摆不定,总是换题目,这样的话,最后你把时间全浪费了,一个问题都没解决。有些问题,也许你再坚持一下就解决了。有些问题可能确实太难,近期解决不了,但是老师总不至于给你这么难的题目,这样你就没法毕业了嘛。所以肯定是一个难度适当的题目让你去做,你产生一些比较好的想法再努力去做,基本上就可能解决一个比较好的问题。

张心雨:老师请您简单介绍一下清华大学统计学研究中心。

李老师:清华大学统计学研究中心,她是一个比较年轻的实体,是直属学校的机构。目前的制度与美国大学的制度比较相像,是一个比较有激励作用的有活力的中心。目前中心有6位全职教员、3位兼职教员,也还在逐步招募新的教员。中心招的大部分都是年轻的教员,还有一些比较有名望的教授,比如杨立坚教授。中心所有教员都有海外背景。该中心是2015年6月27号正式成立的,到目前已有一年半的时间,发展还是比较迅猛的,出了一些高质量的科研成果,同时也招了一批高质量的博士生。并开设了本科生的统计学辅修学位,清华本科生对统计的需求非常大,中心教员逐渐增开新的统计课程,以满足需求。新单位嘛,没有什么历史包袱的,大家都放开手就开始干,比较有冲劲。我们现在要做的事情主要是想让中心制度化、品牌化。

张心雨:最后一个问题,老师您了解统计之都吗?您对我们有什么建议?

李老师:嗯,知道,我以前在海外的时候就知道,当时在统计之都主站上下载专业相关的材料。我感觉统计之做的这些志愿性的东西非常棒。现在你们经常举办R语言会议是吧,每年有多少场?

(张:啊今年很多,各地加起来一共有9场)

哦怪不得每个月都看到有R 会议的通知,是不是有点太多了,可以适当减少一点,我个人的感觉哈。

张心雨:嗯我们也注意到了这个问题,谢谢老师的建议!

访谈后记

李东老师是我未来的博士生导师,在学术上理论功底深厚,生活中又非常幽默有趣,是一个非常好的老师。清华大学统计中心科研氛围浓厚,老师师兄师姐又都非常优秀善良,是一个非常好的中心。欢迎各位师弟师妹关注~不说了,我去学时间序列和历史去了…

 

编辑 | 张心雨

版权公告
原创文章,版权所有。

敬告各位友媒,如需转载,请与统计之都小编联系(直接留言或发至邮箱:editor@cos.name ),获准转载的请在显著位置注明作者和出处(转载自:统计之都),并在文章结尾处附上统计之都二维码。

Viewing all 16 articles
Browse latest View live