Beta

It’s a beautiful thing when free data meets free algorithm.

前几天COS论坛上还在说中科大的R镜像还没弄好,今天再看CRAN,中科大的镜像已然可以正式使用。

中国的 R 语言镜像近几年来变化比较大,最早是东南大学,但不知道什么原因消失了。而后国内镜像主要集中在香港的 geoexpat 和厦门大学,再后来加入了中科院的两个所(包括CTeX),到今日加入中科大镜像。个人一直觉得,人大作为中国R语言的倡导者,却一直没有提供镜像,挺遗憾的(人大文科氛围太浓烈)。

SAS

4月30日,dapangmao 在 SAS圈子更新了一篇博客——SAS,一个华丽时代的结束,具体内容见文末。不过有些奇怪的是,评论没有硝烟,不知道是因为 SAS 太封闭还是大家争累了。

MySQL

以前工作环境一般都是直接面对服务器上的Oracle、DB2,数据库安装、调试甚至数据源这些一般不用考虑。这两天项目需要,导了一些数据在本地。说来数据量也不大,1.5GB。一般的分析软件还不能直接搞定,于是乎倒腾上了MySQL。这个轻量级数据库挺有意思,注释和R是一样的(#),其前端工具 heidisql 不支持查询结果直接粘贴到word,却支持 Copy selected rows as LaTeX table,大大的逗了我一下。以前我老说 R 和 LaTeX 是天然的搭档,现看来 MySQL 也是 ^_^

SAS 一个华丽时代的结束

来源:http://www.mysas.net/sns/space.php?uid=808&do=blog&id=853

我是从 2000 年左右开始接触 SAS 的。当时还是本科生,带我的师兄要发表英文文章,杂志要求用SAS,所以需要用SAS做几个ANOVA和t-test。那时候用的SAS是存在十几张软盘上的一个dos程序,还请了高手帮我们破解,很是花了一番功夫。印象深刻的是,第一SAS的data step有一个内循环,初学者不需要基本的循环知识就可以上手,第二可以把数据直接考到程序里面,不需要像其他软件那样需要指定路径,读取硬盘上的文件。所以SAS尤其适合像大胖猫这样不是出身计算机相关领域,但是又想要做一些统计分析的业余选手。后来认真学SAS是05年以后的事情了,来到美国可以用正版的SAS,学习SAS也方便很多了。这时候的SAS是8.2版本了,该有的都有了,Proc SQL也变得很流行。再以后,变化就不大了,9.1有了hash object,9.2有了画图的SG procedures,SAS的老本行,广义线性模式,也升级到了Proc GLIMMIX。今年下半年,9.3也应该面世了。

一直在 SAS-L 潜水,觉得最近几年邮件组里人气掉的厉害,讨论的话题也一直没有什么变化,倒是跟oloolo这样的新生代大侠学到了一些新的编程风格。Oloolo大侠把一些新的算法和数据挖掘方法整合进SAS,让人耳目一新。还有经常出没SAS-L的 Liu Wensui大侠,也是华人中间的SAS高手。刘大侠的Blog也是学习SAS的好地方,他用macro封装输入-计算-输出的模式是我们规范SAS编程的好榜样,而且他很早就开始使用SAS和R的混合编程(可惜他的blog最近关门了,无缘瞻仰了)。

SAS的疲软,一部分原因是因为SAS自身的因素。SAS开发过SAS/AF和SCL,后来都失败了。一个有经验的SAS Programmer没法转变成为一个SAS Developer。 把所有的模块(Base/STAT/ETS/IML 等等)和系统(PC,UNIX,z/OS)弄过一遍就没有什么好学的了。想自己在SAS里面开发自定义模块,困难重重。另外有很大一部分原因是因为R的挑战。R最近几年的发展让人目不暇接,已经成为定量金融,生物信息学和网络分析领域的行业标准。而这三个领域恰恰是发展最快的三个领域。学习R,很快就能开发自己的package,放到CRAN上面就可以扬名立万。所以从职业生涯考虑。有能力的新人不愿意学习SAS,造成了好的SAS Programmer青黄不接。

R 的突飞猛进,一个方面因为它是开源的,学习起来很方便,不像SAS要考虑买许可证或者满世界找盗版。想用什么package,敲几个指令就行了。另外一个方面是因为原来制约R发展的内存瓶颈消失了。像Matlab和R这样的矩阵语言,里面的garbage collector不能像通用型编程语言(Java,Python等等)那样快的清空物件,所以内存很容易不够用。现在是64位时代了,买个4G以上的内存不贵。流行的分布式计算(Map/Reduce, Hadoop, Hive)和云计算也帮助解决了这个矛盾。在Amazon,Facebook,Google的数据中心里面,很容易从几千台机器里面集中几T的内存,跑跑R没有问题。大胖猫用过Amazon的EC2服务,价格很公道,也不用掏钱买另外的机器。而SAS对于比较大的数据,则只有望洋兴叹了。

SAS 每年的营业额大概是20亿美元,人数只有它1/3的Teradata的营业额也是这么多。要想提高营业额和利润,把注意力集中在电信,银行,保险,医药这些高端客户,是SAS必然的选择。SAS和Teradata都是历史悠久的老公司,SAS从60年代一个做田间统计的小软件发展到现在横跨各个领域的大家伙,的确不易;Teradata是关系型数据库的开创者,Oracle和Sun都是 这个领域的后起之秀。SAS和Teradata的确也有互补之处;也许未来两者合并,更加符合股东的利益。SAS正在开发的并行procedure就是为Teradata专门设计的。SAS的老板,Dr. Goodnight或者不愿意失去对SAS的控制权,但现实上现在的市场恐怕容不下专门的分析软件公司了。统计软件界另一个和Goodnight齐名的传奇人物,Dr. Nie,果断卖掉SPSS是一个正确的选择,借助IBM的国际影响力,SPSS在世界其他国家卖的还不错。将近七十岁的老聂看到R的潜力,重新创业,现在他的Revolution R看上去发展势头不错。如果他还呆在SPSS,现在的情况就很难说了。

由于 SAS 是行读入的,所以特别适合整数据,我经常没事到各个论坛找些题换几种做法做做,其实跟电脑游戏一样好玩。感谢SAS帮我学会了统计和编程,伴我度过异国他乡的漫漫长夜。虽然属于SAS的华丽时代不会再有,但我仍会纪念开创那个时代的伟大的SAS程序员。Old SAS programmers never die, they just fade away.

2011年3月11日日本福岛9.0级大地震以后,紧接着是海啸,跟着福岛核电厂接连发生爆炸。如果开始还可以说是电影《日本沉没》的剧情的话,那核电站爆炸的后果,可就有点像《生化危机》前奏的味道了。

民众对于核辐射污染的担心要远超过地震和海啸。就拿前几天国内发生的碘盐抢购事件来说,虽然主要原因是民众对政府的不信任(对比日本灾民的有序和平静),但很大的恐慌来自于人们对核辐射的危害的恐惧。

从各国对核武器的态度以及实际行动上看,核武器和核污染基本不沾边。一旦发生了核污染,那必定是和核能电站有密切关系。而这几年,我国政府既要保证高速经济增长所需要的电力能源,又要尽力控制二氧化碳排放,那大力发展核能便是上上之选了。本来这等国家大事和我等小民也没什么关系,不过上次回老家,偶然听说河北要建四座核电站,其中一座就在离我老家不足4公里的位置

枕头边上放一个随时爆炸的定时炸弹,这事不关心也不成了。随手翻了翻网上的资料,发现前期的选址和研究审批已然结束。(我等一厢情愿的认为,这种事情是应该公投的,至少要听证一下吧。从现在我周围人态度上看,肯定不可能通过。如果通过了,我们那儿将继重污染企业首钢搬迁后,又一次为伟大祖国首都——北京做的巨大贡献)。

核能是潘多拉盒子,这次日本的核泄漏给大陆敲响了警钟,有评论说,两会上刚刚获得通过的“十二五”规划中的核能规划后续也可能会有很大变动。和普通人一样,我也怕核辐射,更怕核辐射毁掉家园。核能电站的建设需要有极专业的考证和后续严谨的政府管理,如果我是日本人,我相信这两点。但不幸的是,我是中国(大陆)人,这两条我都不信任。一个最基本的常识上——核能电站不应该建设在地震带上。

最近花了一些时间,零零散散地收集了一些数据,附一些分析。还是那句话,我等小民虽说不能决定此等国家大事,但心里明白明白也是有必要的。首先是世界范围,各国拥有核电站的数量:

可以看到,世界范围核电排名前四的国家分别是美国、法国、日本,俄罗斯联邦,我国排名第十,和发达国家确实有段距离;这排名前四的几个国家的核电基本都是在1970-1990时间段建设,而近十年发展速度明显降了下来。但反观中国大陆,大部分核能电站都是在2000-2010年期间修建,并且在规划中的核电站(反应堆)更多。

而从日本核电站事故上看,核能电站修建在地震多发地带是非常不明智的,即便是有多重的防护措施。我们关注一下,地震多发地带和核电站分布重合的程度。下图标记了1973年至2010年,世界范围内的1级(包含)以上地震分布(红色为实际的地震发生地点,蓝色为当年发生地震的密度),以及每年各国存量核电站(绿色点标记)的情况:

左下角的小图是1973年至今所有世界一级以上地震发生的高概率区域,从这个小图上看,日本、美国西海岸、南美洲西海岸是高发地震区域。最近发生在这三个区域的大型破坏地震有:智利2010年8.8级、日本2011年9.0级、美国加利福尼亚州2003年6.5级(不过加州的这次好像还不够,有报道说可能还会发生更大级别的地震)。

美国的大部分核电站都修建在东部地区,而在地震高发的西部地区,核能反应堆的数量明显很少,最大程度的降低了地震对核能电站的影响;而日本就比较郁闷了,整个国家都处在地震高发区上,核电站修的又很密集,出现3月11日的事件有其必然性。

那对于我国呢,不言自明:修在唐山这种时不时就震一下的地方是绝对不应该的,修的话向内陆靠一靠,离地震发生高概率区域远一些!

最后在扯一句,大地震似乎总和核爆有关系,包括中国汶川、日本福岛,随便搜一搜可以罗列关于很多核试验的传闻。也许渺小的人类看到的毁灭性的灾难都是一个样子吧。

附:

数据

Rexer Analytics 关于数据挖掘的年度调查开始于 2007 年,本次(2010年)是第四次年度调查,原文链接在这里

调查的关键要点如下:

1.调查样本量

2010年前期,735个参与者,来自于60个国家

2.数据挖掘覆盖领域

数据挖掘覆盖很多领域,但CRM/Marketing在过去的几年一直排名第一。

3.涉及算法

决策树、回归、聚类是主要的使用方法,但其他算法也被广泛使用。虽然第一次涉及 Ensemble Models,但22%的人宣称正在使用。

4.模型

三分之一的建模人员使用了10个及以下的变量建模,同时28%的建模人员宣称模型一般使用45个以上的变量

5.工具

随着过去几年稳定的增长,开源数据挖掘软件R已经成为挖掘人员的首选(43%),其次是 STATISTICA(18%)。STATISTICA、IBM SPSS Modeler 和 R 在2009、2010年被参与调查的挖掘人员给了最高满意得分。

6.技能

数据挖掘依然主要发生在个人电脑上(而不是服务器),数据一般也是存储在本地。模型的结果依然主要依赖于软件本身。STATISTICA 用户比其他软件用户,更倾向于使用PMML标准。

7.挑战

脏数据,数据挖掘概念的普及、对数据的访问

8.未来

参与调研的人员对于数据挖掘还是非常乐观的。这个领域仍然有上升空间,只有13%的挖掘人员给自己的公司的分析能力评为“excellent”,只有8%的人认为他们的数据质量可以被认为“very strong”。

同往常一样,一些评论:
  1. 鉴于数据挖掘从业人员的总体数量,有735个样本已经很不错了。
  2. CRM/Marketing在中国国内也依然是数据挖掘最重要的应用领域。
  3. 比较惊讶的是,Ensemble Models 居然在国外的使用率已到到22%。
  4. 模型的变量问题是具体业务所决定,甚至是效率、成本的考虑,多少都是正常。
  5. R语言成为挖掘人员的首选工具是必然的(包括在 KDNuggets 上的调查也是如此)。当然如果从数据分析的本源出发的话,R语言有不可替代的天然优势。
  6. PMML标准依然可以在R语言上实现,感谢Graham Williams和他的同事。
  7. 挑战估计是每个挖掘从业人员都遇到过的问题,大家多多交流吧
  8. 数据挖掘的未来是美好的,毕竟我们生活的世界数据越来越多,扔在那儿太可惜了~~

集智俱乐部是我最近两年来比较关注的俱乐部,尤其集智在三号会所的线下活动,一帮来自五湖四海、背景迥异的年轻人,因为一个共同感兴趣的主题,各抒己见(头脑风暴),过程非常奇妙。至今依然清晰的记得第一次参加集智活动时,大家对超自然(超能力)现象的热烈讨论。说实话,当时刚听完报告,还以为进入一个邪教组织了,呵呵~~

2010年12月9日,集智俱乐部的 计算士 和 Jake 发布了头脑风暴论坛数据分析报告。报告很有趣,其中讲到了 Zipf 定律和以社会网络分析为主的网络骨架图。Jake 同时将头脑风暴论坛的数据发布,数据为XML格式文件。而我,恰恰对头脑风暴论坛的兴趣也是非常浓厚,所以这边本地将这些数据处理了一下(大家可参考这里),并作了一些简单分析同大家分享。

首先是头脑风暴论坛中最为关键的几个actors:

这里考虑了两个因素,网络的 Eigenvector Centrality 和 Betweenness Centrality(即vertex和edge信息),从上图看:jake 的地位最高,且Eigenvector和Betweenness相差较小;紧随其后的是东方隐,当然这个紧随其后是指相对概念。

由于 jake 的地位(重要到有点儿离群点的意思了),其他会员的状态不是很明显,所以考虑将 jake 这点去掉:

这样处理以后,除 jake 和 东方隐 以外的用户状态浮出。如果主观上增加“第二梯队”的概念(除去jake和东方隐两人,个人对头脑风暴论坛不是很熟悉,权且这么划分。当然也可以做个聚类啥的,不折腾了),那么属于这一梯队的ID包括

zcard2000、ruiaijun、黄淼鑫、计算士、Michael0607、天狮星11、飞鸟、yywwkk等。

问题来了,论坛上这些比较重要的actors是如何组织在一起(相互作用)的呢?

上图为重要节点的网络图,不难看出:jake 在头脑风暴论坛的地位是无可替代的,牢牢地占据论坛关系中最核心的位置,估计这种结构在COS论坛也同样存在,其中的核心不用我多言,哈~~

还有就是东方隐这个节点也非常有意思,需要关注。但详细的说明,这里就省略了,毕竟对头脑风暴论坛不像统计之都那么熟悉,硬搬着去解释,难免贻笑大方。简单陈述一下绘制关系图的原则:

  • 同计算士绘制的骨架图一样,这里也同样将一些不太重要的节点做了删除处理(subgraph),只留下了重要节点的骨架;
  • 骨架中的节点也并不是每一个都做了展示,而是通过 Eigenvector 和 Betweenness 的对比,将差异比较明显的节点做(名称)展示。而表示为红色的节点大小即为二者差异的大小。

写在最后

这篇文章实际上写的非常仓促,有很多细节考虑不是很完备,并且从数据上看,能够展现的也不止上面的一些信息(比如发帖时间的分析、还有一些条件密度类的内容,等等)。但与其无限期放在草稿箱里,不如直接放出来。因此这篇文章可能会有比较大的改动(主要是绘图部分),但什么时候,就不得而知了。如果有集智俱乐部的童鞋看到这篇文章的话,多多指正,并——欢迎在统计之都上讨论。

关于集智俱乐部

2003 年,集智俱乐部创始人张江(Jake)创办了集智俱乐部网站,该网站一直致力于宣传、普及、推广复杂系统科学,并展开广泛的跨学科交流,俱乐部渐渐聚集了一批有识之士。 5 年后的 2008 ,集智俱乐部的交流和活动开始从虚拟世界走向现实,并尝试发展一个现实世界中的学术组织。目前集智俱乐部的日常管理工作由集智核心成员负责,主要活动有开放式的讲座与交流,以及其它主题小组活动。……

前些天在准备中国第三届R语言会议(上海)的时候, 翻到以前记录在Google Notebook里的一些材料, 一篇是关于Google Codes关于R代码的规范,非常值得借鉴。

规范这个东西平时多多注意一些还是有好处的,就和作文一样,漂亮的字体总能有不错的加分。这里就不翻译原文了,摘一些 tips 供大家参考:

R风格规范

文件命名

以 .R 结尾的文件必须有实际意义,比如

GOOD: predict_ad_revenue.R 
BAD: foo.R

变量名和函数名

  • 变量名建议使用小写字母和dots,比如 variable.namevariableName 也是可以被接受的
  • 函数名起始字母为大写,不能包含dots,如 FunctionName

间隔和间距

  • 所有的二元运算符(=, +, -, <-, etc.)两端均需要有空格。
  • 不要在逗号前增加空格,但逗号后必须有一个

比如:

tab.prior <- table(df[df$days.from.opt < 0, "campaign.id"])
total <- sum(x[, 1])
total <- sum(x[1, ])
  • 在左括号前应增加空格,除了 function call 情况
1
2
3
4
5
# GOOD: 
if (debug)

# BAD:
if(debug)
  • 多余的空格是允许的,比如为了对齐增加可读性:

    plot(x = x.coord, y = data.mat[, MakeColName(metric, ptiles[1], "roiOpt")], ylim = ylim, xlab = "dates", ylab = metric, main = (paste(metric, " for 3 samples ", sep = "")))

大括号

左大括号不能独立成行,右大括号必须独立成行(除else情况),比如

if (is.null(ylim)) {
  ylim <- c(0, 0.06)
}

else情况的标准写法:

if (condition) {
  one or more lines
} else {
  one or more lines
}

行长度

不应超过80个字符

缩进

严格使用两个空格,不能使用 tabs

赋值

尽量使用 <-,而不要使用 =

一般性声明

如果我们遵循一致的声明,对代码的阅读和理解会更快更准确。这里包含

1. Copyright statement comment
2. Author comment
3. File description comment, including purpose of program, inputs, and outputs
4. source() and library() statements
5. Function definitions
6. Executed statements, if applicable (e.g., print, plot)

注释

  • 一定要注意在代码间增加你的注释。长注释以 # 开始,后跟一个空格
  • 短注释发生在代码后,两个空格间隔,# 开始,后跟一个空格
1
2
3
4
5
6
# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pct.spent,
breaks = "scott", # method for choosing number of buckets
main = "Histogram: fraction budget spent by campaignid",
xlab = "Fraction of budget spent",
ylab = "Frequency (count of campaignids)")

函数定义

  • 函数的定义,优先无默认参数值的参数,有参数值的参数在后。
  • 每行一个参数是允许的,但有参数值的赋值不能断开。
1
2
3
4
5
6
# GOOD:
PredictCTR <- function(query, property, num.days,
show.plot = TRUE)
# BAD:
PredictCTR <- function(query, property, num.days, show.plot =
TRUE)

函数文档

  • 函数在定义完成之后需要紧跟注释内容
  • 注释内容包含一句话对函数的描述,每个参数(arguments)的描述,用 Args 表示;以及返回值的描述,用 Returns 表示。
  • 注释必须非常清楚,调用者可以不用读后续任何代码就可直接调用。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {
# Computes the sample covariance between two vectors.
#
# Args:
# x: One of two vectors whose sample covariance is to be calculated.
# y: The other vector. x and y must have the same length, greater than one,
# with no missing values.
# verbose: If TRUE, prints sample covariance; if not, not. Default is TRUE.
#
# Returns:
# The sample covariance between x and y.
n <- length(x)
# Error handling
if (n <= 1 || n != length(y)) {
stop("Arguments x and y have different lengths: ",
length(x), " and ", length(y), ".")
}
if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
stop(" Arguments x and y must not have missing values.")
}
covariance <- var(x, y)
if (verbose)
cat("Covariance = ", round(covariance, 4), ".\n", sep = "")
return(covariance)
}

TODO注释

用于指明临时代码、短期解决方案或足够好但还不够完美的地方。username处写的是了解该问题详细情况的人的名字,并不是指实际解决该问题的人。因此,当你建立一个TODO时,写上你自己的名字就可以了。 例如:

1
# TODO(liusizhe): Remove this code after the NewService has been checked in.

R语言规范

attach

避免使用它

对象和方法

  • 在S语言体系下有两套对象的定义,S3和S4,且都可以在R中使用。
  • S3体系的方法更加灵活、交互性更好,S4更加正式和严格。两套体系方法可以参考这里
  • 尽量使用S3体系,除非有足够的理由使用S4
  • 绝对要避免混合使用 S3 和 S4 的情况
0%