简要回顾:概念 简单线性回归建模背后的基本目标是从成对的 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 的概率函数需要些什么。
我开始上网查找信息和代码。一个两者兼有的来源是书籍 Numerical Recipes in C 中的概率函数。我用 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)。类似地,我创建了一些输出方法,名称如下:
Y 轴截距没有有意义的解释,或者 输入值可能是经过转换的,而您可能需要取消对它们的转换以获取最终的解释。 所有这些方法都假定输出媒介是网页。考虑到您有可能希望用非网页的其它媒介输出这些汇总值,所以我决定将这些输出方法包装在一个继承了 SimpleLinearRegression 类的类中。清单 2 中的代码旨在演示输出类的通用逻辑。为了使通用逻辑更突出,所以除去了实现各种 show 方法的代码。
清单 2. 演示输出类的通用逻辑
// HTML.php
// Copyright 2003, Paul Meagher // Distributed under GPL
include_once "slr/SimpleLinearRegression.php";
class SimpleLinearRegressionHTML extends SimpleLinearRegression {
function SimpleLinearRegressionHTML($X, $Y, $conf_int) { SimpleLinearRegression::SimpleLinearRegression($X, $Y, $conf_int); }