级别: 初级 Cameron Laird (claird@phaseit.net), 副总裁, Phaseit, Inc.
2003 年 12 月 01 日 R 是一个用于统计计算的成熟的开源软件。它的使用很简单,有时甚至只用它的部分功能也能满足您的需要。
要进行统计?请使用 R
developerWorks
最近刊出了一些文章,指出了开放源代码软件在科学和工程工作中的地位日益重要(请在
参考资料
中查看这些文章的链接)。在为这些文章所做的采访中,科学家们反复提到一点,即开放源代码的应用程序已经可以与他们使用的商业软件相抗衡,原因是:这些程序几乎具备了那些专有产品的所有功能,有时甚至还要多。
R 就是一个这样的程序。虽然它通常出现在一些过程的早期,但我觉得还是应该把它单独提出来,以限制文章的篇幅。有一些研究人员曾经向我强调说,虽然从书面意义看来
R 可能更接近于
统计学而不是
科学,但是它非常重要并值得我们关注。让我们来看一下 R 和相关的软件,并站在服务器端开发者和阅读本专栏的管理员的角度来讨论
R 的意义所在。
R 是一门通用的、面向统计的开放源代码的语言,它基于 20 多年的产品经验,可以与行业产品相媲美。
R 重新实现了 S
贝尔实验室的一个开发团队自 20 世纪 70 年代中期就开始进行一项名为“S”的研究项目。最后,这个项目成为了一门成熟的、通用的计算语言,具有丰富的统计能力。这在当时来说是一场革命;在
80 年代早期,工作于此领域的绝大多数工程师和实验者都认为那些重要的计算机程序需要艰苦的底层工作和经验才能完成。S 证明了存在高质量的“通用的”解决方案。项目领导人
Dr. John Chambers 于 1999 年受到了 ACM Software System Award,这一功绩得到了承认,“S 永久地改变了人们分析、显示和操作数据的方式”。S
的强大功能之一是,它可以与那些用 Fortan 和 C 等语言编写的模块“非常好地配合”。
Insightful Corporation 销售一种商业上成功的、广为关注的 S 的衍生产品,称为 S-PLUS。在 90 年代早期,Auckland
大学的 Robert Gentleman 和 Ross Ihaka 开始开发 R,他们将 R 作为一个自由软件发布,并且(按 Ihaka 的思路)演变成非常类似于
S。不过,R 的实现中有一些界面与 S 和 S-PLUS 是完全不同的。R 的核心开发团队主要从事的是 Scheme 的工作,Chambers
于 1997 年加入了这个团队。正如统计计算专家 Patrick Burns 所写的,“现在,无法比较 S-PLUS 和 R 孰优孰劣……
有些功能在 S-PLUS 中更好而且/或者更快,而有些功能则在 R 中更好而且/或者更快。”
结果如何?
这为什么对您来说很重要呢?我们首先从 Lucent Corporation 和其他内部使用 S 的主要企业的角度来看。Lucent 是现在的贝尔实验室的前身,它宣称在对移动电话欺骗模式、电路制造质量衡量等诸多数据进行基于
S 的分析后,根据分析结果采取措施已经节省了上百万美元。S 得出了 Lucent 用其他任何方法都得不到的结果。这些早期的成功如此显著,以至于对现在的“数据挖掘”技术的发展产生了重要的影响。
总部设于 San Diego 的 Cymer, Inc.,是世界领先的准分子光源供应商,它在最近也宣布取得了类似的成功。Cymer 的客户是世界上
100 多个地区的半导体制造商。这种芯片工厂都特别大,高度自动化,也非常昂贵。不用说出现故障了,光是质量上的偏差,每天就会带来上百万美元的浪费。Cymer
使用基于 S-PLUS 的分析方法来
实时地报告产品性能。这就使得决策周期从几周加快到了几分钟。
统计分析怎么会带来如此不可思议的效果?它可以帮助人们进行判断,来完成我们不能完成的那些任务。人类擅长识别模式——虽然有时可以做得非常好,但只能是针对某些特定类的模式。好的统计分析在决策者注意到之前很早就可以得到微小的系统信号,例如芯片生产中、电话欺骗中或者消费者购买模式中的信号。及早地发现这些变化,就可以在这些变化发展为“问题”之
前让企业有更多机会来进行纠正或者调整。
服务器诊所的读者所在的工作环境中有很多这样的例子。我们很多人都淹没在 Web 流量或其他网络进程的日志中。经常会有这样的问题,“我得需要多大的带宽才能在
1 秒钟内处理 98% 的请求?”或者“在一天中什么时候进行离线的备份不会对用户通信带来影响?”可是,如果没有熟练的统计人员进行仔细的数据分析,或者没有由
S 做出的分析和报告,这些问题都将没有意义。
所以请将这种强大的统计功能用于满足您的报告和分析需要。大多数计算机用户在需要使用统计结果的时候倾向于使用面向桌面的“软件包”,即使用流行的电子表格和相关的“办公自动化”产品,很多这些产品在其各自的领域内还是相当有效的。但是,作为一门通用的计算语言,S
处理大型的、服务器端问题的抽象和扩展能力远比它们要强。如果您希望基于得到的电子商务、Web 服务、网络负载、传感接收器的数据或者其他复杂的数据进行实时的统计计算
(用软件),这种抽象能力,以及 S 对其他语言的开放性将对您有极大的帮助。如果您有了一些典型的经验,您将会有其他方法无法得到的惊奇发现:例如,一个特定的仓库有不正常的“损失”,即用户由于个人习惯而输入了错误的数据,或者您没有必要增加一台新的服务器,您只需要缓存一些关键计算。
也许您能想到 S 适合用于统计,但您却认为它是专门的工具,只有在您要做一个年终报告或者有临时的预算需求时才会用到。这是完全错误的。我们大家
经常要作统计推论:交通和天气问题可能性的判断、更多硬件的需求、在周五下午同时出现
5 个客户危机的可能性,等等。在我们的日常生活中,我们通过直觉提供的隐式模型来进行判断。但是研究表明这些隐式模型是多么的不完善,而且我们也开始体会到它们的代价。S
提供了另一种选择,可以让我们的模型显式化,还可以计算实际的代价和收益。
S 本身很容易学习和使用,因此它有实际的作用,而不仅仅有“理论上的”作用。为方便起见,可以认为它是一种类似于“编写要做的工作列表”或者“做预算”的技术。绝对不能保证在
S 中建立的模型是准确的,就像许多电子表格中的收益-损失预测显然是错误的一样。不过这些程序要做的第一件事是,验证我们的假设和随之而来的结果。这是惟一可靠的改进它们的方法。
高层次统计工作的技术
R 是对 S 的重新实现,它的设计要归功于 Scheme 编程语言。这除了给 R 带来其他好处之外,还扩充了 R 的词汇。R 的 Frequently
Asked Questions 文档 (参阅
参考资料
中的链接) 中有一些有趣的例子,是关于这个词汇集如何使常见函数定义的表达更加自然。按照 S-PLUS 文档,当抽样数为
n 时,应该这样来计算
r阶统计的密度函数:
清单 1. 用 S 编写的
r阶统计的密度函数
dorder <- function(n, r, pfun, dfun) {
f <- function(x) NULL
con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
PF <- call(substitute(pfun), as.name("x"))
DF <- call(substitute(dfun), as.name("x"))
f[[length(f)]] <-
call("*", con, call("*", call("^", PF, r - 1),
call("*", call("^", call("-", 1, PF), n - r), DF)))
f
}
|
借助 R 的扩充后的词汇,用下面的方法就可以完成同样的事情:
清单 2. 用 R 编写的
r
阶统计的密度函数
dorder <- function(n, r, pfun, dfun) {
con <- round(exp(lgamma(n + 1) - lgamma(r) - lgamma(n - r + 1)))
function(x) {
con * pfun(x)^(r - 1) * (1 - pfun(x))^(n - r) * dfun(x)
}
}
|
作为一个开发环境,R 最大的优势可能是 Comprehensive R Archive Network (CRAN),这是类似于 Perl
的 CPAN 的一个软件包档案文件。使用 CRAN (同样,请参阅
参考资料
中的链接),使得使用别人所开发的代码将比不使用 CRAN 时要容易得多得多。
虽然 S 是专业统计学领域的标准,但是还是可以有其他有效的方法。在早期的“开放科学”系列文章(请参阅
参考资料)中提及的
Matlab、SAS和其他商业化的科学计算软件包都拥有实用的统计库。
不过另外一个方案是使用一种通用的计算语言,在其之上增加统计功能。C、Fortran、Java 和其他语言都有很好的库。在多数情况下,
服务器诊所关心的是高层次的语言。尤其是
Perl、Python 和 Yorich,它们拥有特别完美的库,包括 PDL、Numeric、Scientific Python、stats.py
和 SalStat。其中一些还具有可视化和文件管理的能力,以产生快速而令人满意的图形化结果。
SalStat 的创造者 Alan James Salmoni 给出了一个例子,从中可见在自然的面向对象的 Python 语法中使用他的软件包是多么的简单:
清单 3. 简单的 SalStat 例子
import salstat_stats
a = [2,3,4,3,4,5] # first data set
b = [6,7,8,7,8,4] # second data set
x = salstat_stats.TwoSampleTests(a,b)
x.TTestUnpaired()
print x.df # prints out the degrees of freedom
print x.t # t statistic
print x.prob # probability from the t statistic and the df
|
简洁易懂的编码可以让统计学专家和软件专家在处理实际的统计问题时更为有效地合作,而不会让他们将时间都浪费在存在设计缺陷的软件包上。
结束语
我要感谢所有给我写信来与我分享 R 以及相关项目经验的人。不计其数的软件都可以用来解决
服务器诊所 中出现的问题。我能及时获得最佳解决方案的惟一希望是能够充分利用读者提供的帮助。
仅仅知道存在解决方案,或者知道它们的名字,当然是不够的。您还应该学习如何去使用它们。对本专栏的这一期来说,最好的方法是去参考
Computer
Science & Perl Programming (
CS&PP)。这部
700 页的合集囊括了到 2002 年底以前
The
Perl Journal中最好的 70 篇文章。如您所期望的,
CS&PP
中都是很好的服务器端编程的例子以及并不局限于 Perl 开发的原理性文章。此外,还有一些专门的文章涵盖了本专栏去年提到的话题,包括:
- Microsoft Office 的自动操作和数据管理器组件
- 科学软件,包括 bioinformatics
- 安全
- E-mail 管理
CS&PP 中适合用
R 来完成的高强度统计处理的例子为数并不多,但这本书和这门语言之间有着高层次的联系。应该认识到 R 是一个可以管理、总结和利用大规模数据的有效而灵活的工具。Perl
实质上也是如此:它具有简洁而功能强大的表达式,可以有效地从大量输入数据中得到想要的结果。它们都可以用来
探索
新的方法,要用好它们首先就要去理解它们。
参考资料
现实生活中的统计
丰富您的统计学知识
利用 Python、Perl
和 C 进行统计
进阶读物
- 阅读 Cameron 的这些与科学主题相关的
developerWorks 文章。
尽管 R 在本系列出没有以出版的形式出现,但是很多从事于这些程序开发的试验者都提到了他们对 R 的信赖和影响。
关于作者
对本文的评价
|