简要回顾:概念
简单线性回归建模背后的基本目标是从成对的 X 值和 Y 值(即 X 和 Y 测量值)组成的二维平面中找到最吻合的直线。一旦用最小方差法找到这条直线,就可以执行各种统计测试,以确定这条直线与观测到的 Y 值的偏离量吻合程度。
线性方程(y = mx + b)有两个参数必须根据所提供的 X 和 Y 数据估算出来,它们是斜率(m)和 y 轴截距(b)。一旦估算出这两个参数,就可以将观测值输入线性方程,并观察方程所生成的 Y 预测值。
要使用最小方差法估算出 m 和 b 参数,就要找到 m 和 b 的估计值,使它们对于所有的 X 值得到的 Y 值的观测值和预测值最小。观测值和预测值之差称为误差(yi - (mxi + b)),并且,如果对每个误差值都求平方,然后求这些残差的和,其结果是一个被称为预测平方差的数。使用最小方差法来确定最吻合的直线涉及寻找使预测方差最小的 m 和 b 的估计值。
可以用两种基本方法来找到满足最小方差法的估计值 m 和 b。第一种方法,可以使用数值搜索过程设定不同的 m 和 b 值并对它们求值,最终决定产生最小方差的估计值。第二种方法是使用微积分找到用于估算 m 和 b 的方程。我不打算深入讨论推导出这些方程所涉及的微积分,但我确实在 SimpleLinearRegression 类中使用了这些分析方程,以找到 m 和 b 的最小平方估计值(请参阅 SimpleLinearRegression 类中的 getSlope() 和 getYIntercept 方法)。
即使拥有了可以用来找到 m 和 b 的最小平方估计值的方程,也并不意味着只要将这些参数代入线性方程,其结果就是一条与数据良好吻合的直线。这个简单线性回归过程中的下一步是确定其余的预测方差是否可以接受。
可以使用统计决策过程来否决“直线与数据吻合”这个备择假设。这个过程基于对 T 统计值的计算,使用概率函数求得随机大的观测值的概率。正如第 1 部分所提到的,SimpleLinearRegression 类生成了为数众多的汇总值,其中一个重要的汇总值是 T 统计值,它可以用来衡量线性方程与数据的吻合程度。如果吻合良好,则 T 统计值往往是一个较大的值;如果 T 值很小,就应该用一个缺省模型代替您的线性方程,该模型假定 Y 值的平均值是最佳预测值(因为一组值的平均值通常可以是下一个观测值的有用的预测值)。
要测试 T 统计值是否大到可以不用 Y 值的平均值作为最佳预测值,需要计算随机获得 T 统计值的概率。如果概率很低,那就可以不采用平均值是最佳预测值这一无效假设,并且相应地可以确信简单线性模型是与数据良好吻合的。(有关计算 T 统计值概率的更多信息,请参阅第 1 部分。)
在前一篇文章中,我通过交由 R 来求得概率值,从而避开了用 PHP 实现概率函数的问题。我对这个解决方案并非完全满意,因此我开始研究这个问题:开发基于 PHP 的概率函数需要些什么。
我开始上网查找信息和代码。一个两者兼有的来源是书籍 [url=http://www.library.cornell.edu/nr/bookcpdf.html]Numerical Recipes in C [/url] 中的概率函数。我用 PHP 重新实现了一些概率函数代码(gammln.c 和 betai.c 函数),但我对结果还是不满意。与其它一些实现相比,其代码似乎多了些。此外,我还需要反概率函数。
幸运的是,我偶然发现了 John Pezzullo 的 Interactive Statistical Calculation。John 关于概率分布函数的网站上有我需要的所有函数,为便于学习,这些函数已用 JavaScript 实现。
我将 Student T 和 Fisher F 函数移植到了 PHP。我对 API 作了一点改动,以便符合 Java 命名风格,并将所有函数嵌入到名为 Distribution 的类中。该实现的一个很棒的功能是 doCommonMath 方法,这个库中的所有函数都重用了它。我没有花费力气去实现的其它测试(正态测试和卡方测试)也都使用 doCommonMath 方法。
简单的解决方案是根据需要将所有实例变量的值都显示到屏幕上。在第一篇文章中,当显示燃耗研究(Burnout Study)的线性方程、T 值和 T 概率时,我就是这么做的。能根据特定目的而访问特定值是很有帮助的,SimpleLinearRegression 支持此类用法。
然而,另一种用于输出结果的方法是将输出的各部分系统化地进行分组。如果研究用于回归分析的主要统计软件包的输出,就会发现它们往往是用同样的方式对输出进行分组的。它们往往有摘要表(Summary Table)、偏离值分析(Analysis Of Variance)表、参数估计值(Parameter Estimate)表和 R 值(R Value)。类似地,我创建了一些输出方法,名称如下:
清单 3 中的脚本是从样本数据研究工具(explore.php)中抽取的,它演示了如何调用该库以及如何将来自于 SimpleLinearRegression 分析的数据填入 Line 和 Scatter 类。这段代码中的注释是 Johan Persson 编写的(JPGraph 代码库的文档化工作做得很好)。
清单 3. 来自于样本数据研究工具 explore.php 的函数的详细内容
<?php
// Snippet extracted from explore.php script
include ("jpgraph/jpgraph.php");
include ("jpgraph/jpgraph_scatter.php");
include ("jpgraph/jpgraph_line.php");
// Create the graph
$graph = new Graph(300,200,'auto');
$graph->SetScale("linlin");
// Setup title
$graph->title->Set("$title");
$graph->img->SetMargin(50,20,20,40);
$graph->xaxis->SetTitle("$x_name","center");
$graph->yaxis->SetTitleMargin(30);
$graph->yaxis->title->Set("$y_name");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
// make sure that the X-axis is always at the
// bottom at the plot and not just at Y=0 which is
// the default position
$graph->xaxis->SetPos('min');
// Create the scatter plot with some nice colors
$sp1 = new ScatterPlot($slr->Y, $slr->X);
$sp1->mark->SetType(MARK_FILLEDCIRCLE);
$sp1->mark->SetFillColor("red");
$sp1->SetColor("blue");
$sp1->SetWeight(3);
$sp1->mark->SetWidth(4);
// Create the regression line
$lplot = new LinePlot($slr->PredictedY, $slr->X);
$lplot->SetWeight(2);
$lplot->SetColor('navy');
// Add the pltos to the line
$graph->Add($sp1);
$graph->Add($lplot);
Table Summary 以表格形式显示了输入数据和其它列,这些列指出了对应于观测值 X 的预测值 Y、Y 值的预测值和观测值之间的差以及预测 Y 值置信区间的下限和上限。
图 3 显示了 Table Summary 之后的三个高级别数据汇总表。
图 3. 显示了 Table Summary 之后的三个高级别数据汇总表
Analysis of Variance 表显示了如何将 Y 值的偏离值归为两个主要的偏离值来源,由模型解释的方差(请看 Model 行)和模型不能解释的方差(请看 Error 行)。较大的 F 值意味着该线性模型捕获了 Y 测量值中的大多数偏离值。这个表在多次回归环境中更有用,在那里每个独立变量都在表中占有一行。
Parameter Estimates 表显示了估算的 Y 轴截距(Intercept)和斜率(Slope)。每行都包括一个 T 值以及观测到极限 T 值的概率(请看 Prob > T 列)。斜率的 Prob > T 可用于否决线性模型。
如果 T 值的概率大于 0.05(或者是类似的小概率),那么您可以否决该无效假设,因为随机观测到极限值的可能性很小。否则您就必须使用该无效假设。
在火灾损失研究中,随机获得大小为 12.57 的 T 值的概率小于 0.00000。这意味着对于与该研究中观测到的 X 值区间相对应的 Y 值而言,线性模型是有用的预测器(比 Y 值的平均值更好)。
最终报告显示了相关性系数或 R 值。可以用它们来评估线性模型与数据的吻合程度。高的 R 值表明吻合良好。
本系列研究了简单线性回归分析的两个应用。在本文中,我研究了“到消防站的距离”和“火灾损失”之间的强线性关系。在第一篇文章中,我研究了“社会集中度”和称为“消耗指数”的测量值之间的线性关系,尽管这种关系相对弱一些,但仍然十分明显。(作为练习,用本文中讨论的数据研究工具重新研究第一个研究案例中较为凌乱的数据可能会很有趣。您可能会注意到 y 轴截距是负数的情况,这意味着“社会集中度”为 0,预测消耗指数为 -29.50。这有意义吗?在对一种现象建模时,您应该问问自己:方程是否应该包含可选的 y 轴截距,如果可以,那么该 y 轴截距在线性方程中会起什么作用。)
参考资料
1.请参考由 James T. McClave 和 Terry Sincich 编著的广受欢迎的大学教科书 Statistics,第 9 版(Prentice-Hall,在线),本文中所使用的算法步骤和“燃耗研究”示例参考了该书。
2.请查阅 PEAR 资源库,它目前包含了少量低级别的 PHP 数学类。最终,应该会很高兴地看到 PEAR 包含实现标准的较高级别的数值方法(比如 SimpleLinearRegression、MultipleRegression、TimeSeries、ANOVA、FactorAnalysis、FourierAnalysis 及其它)的包。
3.查看作者的 SimpleLinearRegression 类的所有源代码。
4.了解一下Numerical Python 项目,它用非常科学的数组语言以及成熟的建立下标方法扩展了 Python。有了该扩展,数学操作就非常接近人们期望从编译语言所获得的功能。
5.研究可用于 Perl 的许多数学参考资料,包括 CPAN 数学模块的索引和 CPAN 中算法部分的模块,以及 Perl 数据语言(Perl Data Language),它旨在为 Perl 提供压缩存储以及快速操作大型 N 维数据数组的能力。
6.有关 John Chambers 的 S 编程语言的更多信息,请查阅关于他的出版物以及他在贝尔实验室的各项研究项目的链接。还可以了解在 1998 年因语言设计而获得的 ACM 奖。
7.R 是用于统计计算和图形的语言和环境,类似于获奖的 S System,R 提供了诸如线性和非线性建模、统计测试、时间序列分析、分类、群集之类的统计和图形技术。请在 R Project 主页上了解 R。
8.如果您刚接触 PHP,那么请阅读 Amol Hatwar 的 developerWorks 系列文章:“用 PHP 开发健壮的代码:”“第 1 部分: 高屋建瓴的介绍 ”(2002 年 8 月)、“第 2 部分: 有效地使用变量”(2002 年 9 月)和“第 3 部分: 编写可重用函数”(2002 年 11 月)。
9.访问 John Pezzullo 的优秀站点,该站点专门提供执行统计计算的网页。基于 PHP 的概率函数是以在 John 的概率函数页面所找到的代码为基础的。
10.到 Digital Library of Mathematical Functions 了解关于 M. Abramowitz 和 I.A. Stegun 编写的书籍 The Handbook of Mathematical Functions(也称为 AMS55)的更多信息。
11.查看 JpGraph 站点,以获取关于 PHP 的主要 OO 图形库的大量信息。
12.阅读美国国家标准与技术研究所(National Institute of Standards,NIST)出版的 The Engineering Handbook of Statistics,该手册上有几章是关于 Exploratory Data Analysis 的,非常不错。
13.如果您对于更详尽地学习关于回归的主题感兴趣的话,请尝试阅读以下有用的参考资料:
L. C. Hamilton(1992年)。Regression with Graphics。加州 Pacific Grove:Brooks/Cole Publishing Company。
J Neter、M.H. Kutner 和 W Wasserman W(1990 年)。Applied Linear Regression Models(第 3 版)。芝加哥 Irwin。
E. J. Pedhazur(1982 年)。Multiple regression in behavioral research。纽约州,纽约市:Holt,Rinehart and Winston。
14.阅读 Cameron Laird 的文章“Open source in the biosciences”。PHP 需要更好的数学工具来参与这个不断成长的市场(developerWorks,2002 年 11 月)。
15.查看 RWeb,它是基于 Web 的 R 接口。