用过底层语言做计算的人转入R语言的时候一般都会觉得R语言的运算太慢,这是一个常见的对R的误解或者对R的设计的不理解。在二三十年前Chambers等一群人在贝尔实验室设计S语言之前,统计计算主要是通过那些底层语言实现的,典型的如Fortran。当时有一个基于Fortran的统计分析库,用它的麻烦就在于无论做什么样的数据分析,都涉及到一大摞繁琐的底层代码,这让数据分析变得很没劲,统计学家有统计学家的事情,天天陷在计算机程序代码中也不是个办法,要摆脱底层语言,那就只能设计高层语言了。有所得必有所失,众所周知,高层语言一般来说比底层语言低效,但对用户来说更友好。举个简单的例子,用C语言计算均值时,我们得对一个向量(数组)从头循环到尾把每个值累加起来,得到总和,然后除以向量的长度,而均值在统计当中简直是再家常便饭不过了,要是每次都要来这么个循环,大家也都甭干活儿了,天天写循环好了。
前两天COS论坛上有个帖子提到“R语言的执行效率问题”,大意如下:
有120000行数据,用perl写成12万行R命令做t.test,然后执行,大概几分钟就算完了。如果只用R语言,把所有数据先读入,然后用循环,每一行做t.test,花了几个小时,到现在还没有算完。这说明一个问题,在R里执行单行命令要比用循环快,涉及到循环的问题,最好写成单行命令执行。
我不清楚作者是如何写这“12万行”R命令的,本文假设是把t.test(dat), i = 1, 2, ..., 120000写入一个文件,然后用source()执行之。面对这样一个问题,我们有若干种改进计算的可能性。首先我们看“硬”写入程序代码的方法:
## 为了使计算可重复,设定随机数种子
set.seed(123)
## 生成数据,随机数,120000行 x 100列矩阵
dat = matrix(rnorm(120000 * 100), 120000)
nr = nrow(dat)
nc = ncol(dat)
## 六种方法的P值向量
p1 = p2 = p3 = p4 = p5 = p6 = numeric(nr)
## via source()
f = file("test.t")
writeLines(sprintf("p1 = t.test(dat)$p.value",
seq(nr), seq(nr)), f)
system.time({
source(f)
})
# user...
阅读全文 »
标签 ‘ R ’
也谈提高R语言的运算效率
用R也能做精算—actuar包学习笔记(一)
本文是对R中精算学专用包actuar使用的一个简单教程。actuar项目开始于2005年,在2006年2月首次提供公开下载,其目的就是将一些常用的精算函数引入R系统。目前,提供的函数主要涉及风险理论,损失分布和信度理论。
如题所示,本文是我在学习actuar包过程中的学习笔记,主要涉及这个包中一些函数的使用方法和细节,对一些方法的结论也有稍许探讨,因此能简略的地方简略,而讨论的地方可能讲的会比较详细。闲话少提,下面正式开始学习!
阅读全文 »
R中面向对象编程方法
R主要面向统计计算,似乎很少会用到面向对象的编程方法。但在统计计算中,在下列情形中使用面向对象的编程方法可以编程更有效率。
1)当需要用一种新的方式来表示数据,该方式与已有的数据类型有区别的时候。
2)当需要一个新的函数,该函数可以根据不同的参数类型做出不同的反应的时候。
在R中,经常需要定义一个新的函数,并且定义一个新的函数也是一项繁重的工作。相反,较少去定义一个新的类。但有时候定义一个类是一个很关键的步骤。一个类通常决定了如何对对象进行处理,决定了对象中应当包含什么样的信息。甚至有时候,类的定义决定你的项目的成败。(本文的PDF版本:R中的面象对象编程学习笔记)
阅读全文 »
用R软件绘制中国分省市地图
鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑了凑热闹,对相应的方法学习了一番。下面的这篇文章是一个初步的介绍,还有很多内容仍在学习和探索中,如果大家有什么意见或建议,我将根据自己学习的情况对文章进行进一步的补充。
阅读全文 »
WinBUGS在统计分析中的应用(第四部分)
如何生成一个GeoBUGS格式的中国地图
第一节 导言
之前有些对GeoBUGS感兴趣的同学发邮件询问我有没有GeoBUGS的中国地图,以用于分析中国国内的一些空间数据。我想有必要将如何生成GeoBUGS格式的地图的方法分享给大家。这样的话, GeoBUGS就可以真正为我们所用,从而对于其他GeoBUGS没有自带的地图,我们也可以轻松生成了。本节不涉及统计分析,仅为GeoBUGS的研究使用者提供一个软件使用的技术参考。关于GeoBUGS的统计的书,国外实在是很多了,但关于这块地图定制的参考资料较少,故提出来供大家参阅。
阅读全文 »
在Batch Mode下完成无人值守的R项目测试
今天我来谈一点用R编程的经验吧。好像R的很多方面许多牛人都谈过了,比如R的打包啊,R的图形啊,下面我来谈谈R的测试。如果希望真正学到什么的话,还是要自己花时间实践的。
在很多情况下,你自己或和你的团队在一起开发一个R的项目,而伴随着开发的深入,测试就成了家常便饭。但是往往很多统计算法涉及到比较大的计算,比方说missing data的模型,比方说具有多层次结构的模型。测试这些R程序需要花费大量的时间。当然了如果你的程序规模很小,计算量也不大的情况下,大可不必杀鸡用牛刀,但是一般情况下,再小的一段统计算法,如果需要做一系列的simulation或是case study的话,测试都会花很多的时间。比如,如果你有几个实现了推广的ROC模型的R函数,或者是一个包含这些函数的R包,没有人能说这个程序真正管用,你要测试,那你就需要做simulation和case study。simulation简单的就是模拟出一系列预先设定模型参数的数据,让目标模型去fit,然后比较结果。case study则可以做各式各样的比较研究,特定数据的实例分析等等。好了,废话不多说,总之这篇文章就是告诉你怎么样方便地测试,随时随地想测就测。
其实核心就是调用Rterm,包含的主要文件如下:
(1)创建文件:Rbatch.bat
cd test
date /T >> logout.txt
time /T >> logout.txt
cd..
C:\Progra~1\R\R-2.8.0\bin\Rterm.exe --vanilla <config.R> testout.txt
(2)创建文件:config.R
#如果你已经打好了R包,一下的代码可以减少,只要load你的包就好了。
#下面的版本是你还没有打包,但是调用了C++动态链接库,测试数据,和函数源代码需要source
# PATH
#---------------------------------------------------------
Path.autorun <- "C:\\autorun\\"
Path.rdll <- "C:\\WORK\\Project\\src\\C++\\bin\\"
Path.data <- "C:\\WORK\\Project\\Datasets\\Data\\R\\"
Path.funs <- "C:\\WORK\\Project\\src\\R\\"
Path.dump <- "C:\\autorun\\results\\"
#---------------------------------------------------------
dyn.load(paste(Path.rdll,"RDLL.dll",sep=""))
source(paste(Path.autorun,"source.data.R",sep=""))
source(paste(Path.autorun,"source.funs.R",sep=""))
source(paste(Path.autorun,"source.test.R",sep=""))
source(paste(Path.autorun,"testProjectR.R",sep=""))
source.data(Path.data)
source.funs(Path.funs)
testProjectR(paste(Path.autorun,"test\\",sep=""),TEST=0)
(3)创建测试框架函数testProjectR in testProjectR.R 文件:
testProjectR <- function(loc=getenv("STEST"), TEST=c(0,1,2)) {
## loc: the directory of the Project testing suite
## TEST: (0: the default loop test, 1: test buglist only, 2: loop test...
阅读全文 »
不同版本的散点图矩阵
散点图矩阵是散点图的高维扩展,它从一定程度上克服了在平面上展示高维数据的困难,在展示多维数据的两两关系时有着不可替代的作用。R 软件就包含了各种不同版本的散点图函数,本文主要介绍散点图矩阵的设计及其在R中的实现方法,并比较它们的长短,从而审时度势,选取自己喜欢的表现方式和相应的函数。
阅读全文 »
相关矩阵的可视化及其新方法探究
针对相关系数阵的可视化方法,本文回顾了颜色图和椭圆图,并提出了一种新方法——圆圈图。通过实际数据的比较和分析,阐述了各类图形的不同性质并发现椭圆图具有许多优良性质,是一类优秀的相关系数阵的可视化方法。
阅读全文 »
调和曲线图和轮廓图的比较
调和曲线图和轮廓图都是多元数据的可视化方法,本文利用R软件和iris数据展示了这两种方法并比较了它们的效果。
阅读全文 »
