当前位置:中国站长下载文章中心网页编程PHP编程 → PHP实现简单线性回归之数学库的重要性

PHP实现简单线性回归之数学库的重要性

减小字体 增大字体 作者:编辑整理  来源:互联网  发布时间:2008-9-15 22:05:10
法名及其序列是通过结合逆向链接和参考大学本科学生使用的统计学教科书推导得出的,该教科书一步一步地说明了如何计算中间值。我需要计算的中间值的名称带有“get”前缀,从而推导出方法名。

使模型与数据相吻合

SimpleLinearRegression过程用于产生与数据相吻合的直线,其中直线具有以下标准方程:

y=b+mx

该方程的PHP格式看起来类似于清单3:

清单3.使模型与数据相吻合的PHP方程

$PredictedY[$i]=$YIntercept+$Slope*$X[$i]


SimpleLinearRegression类使用最小二乘法准则推导出Y轴截距(YIntercept)和斜率(Slope)参数的估计值。这些估计的参数用来构造线性方程(请参阅清单3),该方程对XY值之间的关系进行建模。

使用推导出的线性方程,您就可以得到每个X值对应的预测Y值。如果线性方程与数据非常吻合,那么Y的观测值与预测值趋近于一致。

如何确定是否非常吻合

SimpleLinearRegression类生成了相当多的汇总值。一个重要的汇总值是T统计值,它可以用来衡量一个线性方程与数据的吻合程度。如果非常吻合,那么T统计值往往很大。如果T统计值很小,那么应当用一个模型替换该线性方程,该模型假设Y值的均值是最佳预测值(也就是说,一组值的均值通常是下一个观测值有用的预测值,使之成为缺省模型)。

要测试T统计值是否大得足以不把Y值的均值作为最佳预测值,您需要计算获取T统计值的随机概率。如果获取T统计值的概率很低,那么您可以否定均值是最佳预测值这个无效假设,与此相对应,也就确信简单线性模型与数据非常吻合。

那么,如何计算T统计值的概率呢?

计算T统计值概率

由于PHP缺少计算T统计值概率的数学例程,因此我决定将此任务交给统计计算包R(请参阅参考资料中的www.r-project.org)来获得必要的值。我还想提醒大家注意该包,因为:
  1. R提供了许多想法,PHP开发人员可能会在PHP数学库中模拟这些想法。
  2. 有了R,可以确定从PHP数学库获得的值与那些从成熟的免费可用的开放源码统计包中获得的值是否一致。
清单4中的代码演示了交给R来处理以获取一个值是多么容易。

清单4.交给R统计计算包来处理以获取一个值

<?php//Copyright2003,PaulMeagher//DistributedunderGPLclassSimpleLinearRegression{var$RPath="/usr/local/bin/R";//YourpathherefunctiongetStudentProb($T,$df){$Probability=0.0;$cmd="echo'dt($T,$df)'|$this->RPath--slave";$result=shell_exec($cmd);list($LineNumber,$Probability)=explode("",trim($result));return$Probability;}functiongetInverseStudentProb($alpha,$df){$InverseProbability=0.0;$cmd="echo'qt($alpha,$df)'|$this->RPath--slave";$result=shell_exec($cmd);list($LineNumber,$InverseProbability)=explode("",trim($result));return$InverseProbability;}}?>

请注意,这里已经设置了到R可执行文件的路径,并在两个函数中使用了该路径。第一个函数根据学生的T分布返回了与T统计值相关的概率值,而第二个反函数计算了与给定的alpha设置相对应的T统计值。getStudentProb方法用来评估线性模型的吻合程度;getInverseStudentProb方法返回一个中间值,它用来计算每个预测的Y值的置信区间。

由于篇幅有限,我不可能逐个详细说明这个类中的所有函数,因此如果您想搞清楚简单线性回归分析中所涉及的术语和步骤,我鼓励您参考大学本科学生使用的统计学教科书。

燃耗研究

要演示如何使用该类,我可以使用来自公共事业中燃耗(burnout)研究中的数据。MichaelLeiter和KimberlyAnnMeechan研究了称为消耗指数(ExhaustionIndex)的燃耗度量单位和称之为集中度(Concentration)的独立变量之间的关系。集中度是指人们的社交接触中来自其工作环境的那部分比例。

要研究他们样本中个人的消耗指数值与集中度值之间的关系,请将这些值装入适当命名的数组中,并用这些数组值对该类进行实例化。对类进行实例化后,显示该类所生成的某些汇总值以评估线性模型与数据的吻合程度。

清单5显示了装入数据和显示汇总值的脚本:

清单5.用于装入数据并显示汇总值的脚本

<?php//BurnoutStudy.php//Copyright2003,PaulMeagher//DistributedunderGPLinclude"SimpleLinearRegression.php";//Loaddatafromburnoutstudy$Concentration=array(20,60,38,88,79,87,68,12,35,70,80,92,77,86,83,79,75,81,75,77,77,77,17,85,96);$ExhaustionIndex=array(100,525,300,980,310,900,410,296,120,501,920,810,506,493,892,527,600,855,709,791,718,684,141,400,970);$slr=newSimpleLinearRegression($Concentration,$ExhaustionIndex);$YInt=sprintf($slr->format,$slr->YInt);$Slope=sprintf($slr->format,$slr->Slope);$SlopeTVal=sprintf($slr->format,$slr->SlopeTVal);$SlopeProb=sprintf("%01.6f",$slr->SlopeProb);?><tableborder='1'cellpadding='5'><tr><thalign='right'>Equation:</th><td></td></tr><tr><thalign='right'>T:</th><td></td></tr><tr><thalign='right'>Prob>T:</th><td><td></tr></table>

通过Web浏览器运行该脚本,产生以下输出:

Equation:Exhaustion=-29.50+(8.87*Concentration)T:6.03Prob>T:0.000005
这张表的最后一行指出获取这样大T值的随机概率非常低。可以得出这样的结论:与仅仅使用消耗值的均值相比,简单线性模型的预测能力更好。

知道了某个人的工作场所联系的集中度,就可以用来预测他们可能正在消耗的燃耗程度。这个方程告诉我们:集中度值每增加1个单位,社会服务领域中一个人的消耗值就会增加8个单位。这进一步证明了:要减少潜在的燃耗,社会服务领域中的个人应当考虑在其工作场所之外结交朋友。

这只是粗略地描述了这些结果可能表示的含义。为全面研究这个数据集的含义,您可能想更详细地研究这个数据以确信这是正确的解释。在下一篇文章中我将讨论应当执行其它哪些分析。

您学到了什么?

其一,要开发意义重大的基于PHP的数学包,您不必是一名火箭科学家。坚持标准的面向对象技术,以及明确地采用逆向链接问题解决方法,就可以相对方便地使用PHP实现某些较为基本的统计过程。

从教学的观点出发,我认为:如果只是因为要求您在较高和较低的抽象层次思考统计测试或例程,那么这个练习是非常有用的。换句话说,补充您的统计测试或过程学习的一个好办法就是将这个过程作为算法实现。

要实现统计测试通常需要超出所给定的信息范围并

上一页  [1] [2] [3]  下一页