Quantcast
Channel: 统计之都 » SAS

我的求学之路:经济学、软件工程、SAS

$
0
0

这个青年的经历,只代表他个人,没有任何群体的意义。

我想写下一段自白,这自白既是我个人的,也具有普遍意义,因为一个人经历过的事情所有的人都可以经历。

/*跟武汉博文视点合作,召集些身边的朋友,2009应届生,计算机背景,在毕业之前,讲讲自己求学、实习、找工作等的经历与感悟,文章将由电子工业出版社结集出版,在今天秋季学期开学之前出来。我是主编,也是作者之一,刚好经历跟大伙有重叠:经济学、软件工程、SAS、统计学、数据挖掘,文章贴出来,大伙多拍砖头。文中我提到COS,COS让我长见识,又结识不少好朋友。*/

想启蒙至今,我的学习重心从文史哲转到经济学,最后以软件工程收场;在行业方面,在一家软件公司实习了一年多,找工作以药厂收场——用一个朋友的话讲,“背景是复杂得一塌糊涂”。虽然我常以“学一行,爱一行;做一行,爱一行”自勉,有时也不免回首,想想以前经历过的所有分岔口,玩味些那些没有走过的路,无论当时我多么坚决或者犹豫,一条路被选中,然后一路曲折至今。很多事情,很多选择,可能只有以后才能适合评说,现在我选择把它们记下来,在这么一个时点,我就要毕业,我有一个安身立命的去处,我有规划,但我不知道以后生活会给我什么样的分岔口,就跟我以前遭遇的一样。

——————我的人生轨迹—————

项羽,“学书不成,去;学剑,又不成”。

                      —-《史记·项羽本纪

1.高中:文科生,喜文史
              |
              |高考
            /    \
           /      \
学文史不成,去     2.经济学,北京工商大学
                   |考研
                   / \
                 /   \
学经济学不成,去     3.软件工程(金融信息工程),北京大学
                           | 知识转型
                          / \
                         /   \
学C/C++、Java不成,去        攻SAS与信用评分、数据挖掘
                                     |
                                     |实习
                                   / \
                                 /    \
                                      4.SAS中国研发中心
                                           |工作
                                          / \
                                       /       \
                                    /             \
                                          5. Sanofi Pasteur,SAS程序员
——————我的人生轨迹—————

小学

我是在村小学、乡镇初中和县城高中完成大学之前的学业。家位于江西东北部,父母都是农民,小学文化(未毕业),对我的教育,强调的有几条,与人和气,不要打架,然后就是好好念书。在我们的社会,正如一些学者所说,“农民”更多是一个身份的指称,而不仅仅是一份职业。我愿意提起这个,因为,一旦开始思考,就会觉得没有什么会比它更重要。以前一个在学校负责“北大调查”的朋友跟我讲,在北大的所有在校生中,农村背景的,大概占10%,——大伙可以根据自己的经验,估计一下农村背景的学生在所有大学生中的比例。尽管被有意无意忽略,这却是中国的最大现实。

在农村的局限显而易见,所有的父母都期望他们的子女能够摆脱农民身份。在高三之前,我只做(坐)过一次火车,上大学才开始认真说普通话——或许还可以提一句,在大二,我开始穿上我人生中的第一条牛仔裤。农村有很多淳朴的东西,也有很多粗俗的东西,现在想来,跟童年的伙伴相比,我可能更敏感,更喜欢反观自身——我阅读,大量阅读。我父亲只有小学三年级的文化,但识字很多,喜欢读各种演义和建国历史(包括野史)。记得小时候在家里翻箱倒柜,也能翻出几本小说来,有一本是现在仍让我头大的《红楼梦》,后来就找不到了,可能让我给撕了折纸玩了吧。我读的第一本书,现在仍然印象深刻(好像自己大学以前读的每一本书,印象都比较深刻)。是小学二年级,一个雨天,在家里翻出一本破烂的《说岳全传》,前后都有大量缺页,我只能从朱仙镇读到风波亭,中间也偶有一两页找不到——真是悬念重重啊。虽然有大量生字,也顾不上查《新华字典》,窝在家里,读得是津津有味。来回翻几遍,记下来每一位武将趁手的兵刃,真是非常有成就感(这就是我最初的知识储备)。

自从有了这个体验,就跟“曾经沧海难为水”一样,就不愿意过没有书的日子了。家里没什么藏书,就向语文老师借,在村里淘——伙伴家里还是会有些印刷品的。那时,能够读到的书,以小说特别是通俗演义和武侠小说为主,我为数不多的几本言情,大概也是那时读的(《菟丝草》?)。《格林童话》之类说适合少年看的读物,我是在高中才补的。当时应付学业还比较轻松,所以没有什么来自父母和老师的压力,当然,武侠小说还是偷偷读的。我第一本武侠小说,大概是沧浪客的《一剑平江湖》,上册。高中时老师有一事比较头疼,一些喜欢读书的同学迷上了武侠小说,导致学业下降(那时网络不普及,让学生沉迷的大概只有游戏机和武侠小说)。那时我已经不读武侠,老师就喜欢拿我做例子,说我好读书而不读武侠云云。

一上来就是刀光剑影的阅读,现在真不忍心评价它对我的成长是好是坏。无论怎么样,它让我养成了读书的习惯,并且每到一个地方,都能找到有书的地方。那时候,是带汉字的纸条也爱读啊。

初中

初中比较幸运。在我那乡镇中学,居然有一个不对学生开放的图书室,管理员正好是我的语文老师,于是就有自由出入图书室的特权了。这时读的书,就比较文艺一些,以散文与诗歌为主,语言比较精致,就常常是一本书一本书抄下来。那阵子开始接触鲁迅、林语堂、胡适、梁实秋、梁遇春、哈代、毛姆等作家,还包括一些当时比较知名,现在可能不怎么闻名的,比如刘定中、徐刚、乔麦等等,乔麦是做报告文学的,徐刚写所谓九行诗,刘定中有一部散文诗集。

有过农村中学读书经历的朋友可能都有共识,那阵子的中学真是比较乱,打架的事比较多。那时我忙于抄写《朦胧诗集》之类的东西,心里有许多向往的东西,其他事就顾及不上了。

整个初中,就买过一本书,托在县城读书的朋友,带回一本《水浒传》,岳麓书社的普及本,十六块钱。

高中

书一路读过来,到高中就有偏科的倾向,后来索性就转读文科。高中是自己读书的黄金时期,现在都觉得是把所有够得着的地方都淘遍了:校图书馆、朋友和亲戚家的私人藏书、县城所有的书店所有的书摊所有的报刊亭,还去过市里的几家书店,来过北京一次(第一次坐火车那次),在海淀图书城的中国书店买了几本哲学历史书回来。以前写过一系列博文,甚至列出了自己在高中读过的近百本书和杂志的名字,包括每本书的来源,是来自书店、图书馆还是借自个人(具体见这里)。那时住校,每个月可以向家里要些生活费。经常省下几顿,留下钱来买些书,但也还在抄书,以古文为主,《论语》、《古文观止》之类。高中毕业时,手头居然也有一柜子的藏书。

大学我念的是经济学,其实也不突兀。美国计量经济学家赫克曼和麦克法登得诺贝尔奖那年,学校旁边的邮政报刊亭不知道怎么就出现了一本《读书》杂志(的确只是一本),刚好有对他们的介绍。这新的领域,对我也是有很大的吸引力。以后读书,就觉得旁边也居然有好些经济学相关的材料,除了《读书》杂志经常刊登些,《青年文摘》、《读者》也还会有些类似《爱情经济学》的经济学随笔。

不过总的来说,高中我对自己的期望,还是人文方面的作家。他们的作品和生平,给我非常多的激励。

本科,经济学,北京工商大学

本科我在北京工商大学念经济学。第一志愿是北大中文系,算是我人生第一个遗憾吧。大一我还准备过一段时间,要考北大哲学系的研究生。现在还偶尔胡思乱想,我的气质和兴趣,在文科方面,说不准会有更大的发展呢。高中抄过一首美国诗人弗罗斯特的《未走过的路》,现在读来,仍然唏嘘不已:

深黄的林子里有两条岔开的路,
很遗憾,我,一个过路人,
没法同时踏上两条征途,
伫立好久,我向一条路远远望去,
直到它打弯,视线被灌木丛挡住。

于是我选了另一条,不比那条差,
也许我还能说出更好的理由,
因为它绿草茸茸,等待人去践踏——
其实讲到留下了来往的足迹,
两条路,说不上差别有多大。

那天早晨,有两条路,相差无几,
都埋在还没被踩过的落叶底下。
啊,我把那第一条路留给另一天!
可我知道,一条路又接上另一条,
将来能否重回旧地,这就难言。

隔了多少岁月,流逝了多少时光,
我将叹一口气,提起当年的旧事:
林子里有两条路,朝着两个方向,
而我——我走上一条更少人迹的路,
于是带来完全不同的一番景象。

大一时几乎以每天一本书的速度,想掏空学校图书馆人文社科类的好书——那时评判好书的标准也足够简单,一是成书久远,二就是来自大社。不过到大二,对念经济学的兴趣,就比较坚定了。那时开始到北大中国经济研究中心(CCER)听课,CCER当时是中国所有经济学学子向往的地方。现我在北大读研究生,说起来,在北大校园停留的时间,还真没有本科时多。我学校在航天桥,到北大有近二十里的路,大二和大三两年,几乎每周都骑车过去,一周大概两三天。

大学时有印象的,是在位于白石桥的国家图书馆停留过不少时间,很多时候是跟女朋友一起,她在人大念中文。学校图书馆藏书比较少,里面几乎每一本社科类新书的书皮我都翻过。泡国图,我的成就是,把它的两个阅览室——一楼的社科室和六楼的文学室——所有的书皮也都摸过一遍。现在在书店,我也是喜欢在书架中穿梭,手指在书脊上一本本划过,感兴趣的就抽出来翻翻。——我现在对北大图书馆的挖掘,相比功夫下得不足。

大学时自己比较浮躁。我知道自己所处的环境不够好,也积极向最好的地方靠拢,比如坚持去CCER听课。但心里很多东西,都割舍不下,像对文史哲等的喜好,贪多务得,细大不捐,花的时间不会比经济学少。我爱好很广泛,但感兴趣的,可能并不是自己所擅长的——这个我到后来才慢慢体会到,不过已经付出了很多的时间和精力。考研我就一心冲着北大中国经济研究中心(CCER),两次都被拒掉。这对我触动很大,很长一段时间我都在想,自己到底适合做什么。

后来我又申请北大的深圳商学院以及软件与微电子学院。继续读商学院,可以延续我在经济学方面的训练,可是这方面,我已经有所怀疑。读软院,会是一个全新的开始,在技术方面会有所提升,而且其中的金融信息工程专业,还可以与我以前的教育背景交叉,但风险是,我一个文科生,在技术领域,到底能够走多远,这个选择会不会只是一个折腾?

这两个选择,几乎没有可比性,不可能精确地估计出它们的利弊。有时我想,(像这样比较困难的)决策不是“全面地”做出来的,而(可能)是“偏颇地”做出来的。综合考虑各种因素,你无法得出一个让自己信服的方案:考虑这个因素,我会继续读经济学,但考虑到另一个因素,读软件工程可能就是很好的选择。商学院还是软件学院?把它们各自的利弊摆在一起,我真是不好抉择。最后选择软院,真的是“偏颇”地做出选择的,不是因为我考虑到软院对对我更好,而是因为,我就一个劲想着我读软院对我知识体系带来的提升,我在技术领域可能的突破——这些也让我激动不已。商学院也很好,不过就是另一番景象了——我心里又在默念弗罗斯特的《未走过的路》。我偶尔想那些为走过的路,不是因为我后悔现在走的路,而是因为,这人生的种种可能,玩味起来,感触就深。

我本科的知识积累,对研究生的课程,有用的是,数学和统计学,还有金融学的基础知识。可能最重要的是,我对很多科目都感兴趣,虽然没接触过,但我不排斥计算机的相关课程。

研究生,软件工程,北京大学

2006年9月开始了我的软院求学历程。第一个挑战是:我该如何在软院生存下去?我本科背景,计算机的底子只是会操作计算机。第一堂Java课上,如何设置和为什么要设置环境变量就让我困扰不已。我人生第一个”Hello World”,也是手慌脚乱好几次才出来的。

我一边在开始学Java和C++,但心里也清楚,在这块,我很难赶上我身边已经有四年科班训练的同学。研一上学期有一门课让我看到了些曙光,万事达卡组织(MasterCard)的一位资深顾问冯慧博士给我们开信用评分课。申请贷款时,比如,申请信用卡(透支,可以看作是贷款),我们需要填上自己的各种信息。简单地说,信用评分技术就是利用这些申请资料和其他信息,通过各种数学与统计模型,对申请人的风险状况赋予一定的分数,以区别出哪些是好客户,哪些是坏客户。在金融领域,数据量都是非常庞大的,信用评分就是这么一个计算量密集的技术。在信用评分领域,一个标准语言就是SAS,一门解释性语言——有金融,有计算,这是我感兴趣的。

这门课我学得很认真,查看了不少资料,并写了不少信用评分技术相关的读书笔记与同学分享。另外就是自学SAS,它的语法结构类似C。虽然SAS跟Java/C++一样,我都是第一次接触,但我学习SAS的劲头和主动性就高多了。信用评分建模需要用到大量的数据挖掘算法,但我们金融信息工程系没有相关的课程。研一下学期,我就去语言信息工程系修了一门理论性较强的课程,《机器学习》,主要的应用背景是自然语言处理。那个课堂上,我大概是唯一的外系生。这门课我修得比较苦,成绩也不是很理想,就是及格那种。不过有了这门课的底子,接下来我修应用性的课程《数据挖掘与CRM》就轻松多了。

SAS在数据挖掘领域也是行业标准,对它的学习,也是一直没有断。同时我还花时间学习Java和C++,毕竟要拿的是软件工程的学位,不过掌握程度,自是比不上SAS。

这个时候我开始写跟SAS编程与数据挖掘相关的技术博客,记录我学习过程中的点点滴滴。很高兴有些朋友喜欢我的技术博客,有时候认识些新朋友,他提一句:我看过你的SAS博客,就觉得非常亲切。我还开始关注国内SAS相关的论坛(mysas.netsasor.feoh.net等),又订阅了全球SAS用户最活跃的邮件列表SAS-L,偶尔也会加入讨论,尽量让自己往这个群体靠拢。从中结识不少志同道合的朋友,是非常愉快的一件事情。

通过网络认识了人大经济论坛的SAS版主朱杰,他是上海师范大学的一位青年教师,在培养学生学习SAS方面是不遗余力。一次聊天,他说,你喜欢SAS,又有金融背景,为什么不去直接跟清华金融系的朱世武老师学呢。于是,朱杰把我介绍给朱老师,我开始在清华旁听朱老师的SAS与金融计算的相关课程。

朱老师是几本SAS与金融计算相关书籍的作者,有统计学和金融工程的专业背景。朱老师说他用SAS几十年,什么工作都用SAS完成。通过课程学习和与朱老师的私下交流,当时自觉自己的SAS功底精进不少。

2007年我开始在学校主持北大SAS俱乐部,它是北大应用统计研究会下属的专业社团,也是国内高校第一个SAS社团,聚集了很多北大和周边高校SAS爱好者。我们通过培训、讲座等活动提高会员的SAS编程技能,促进会员与企业专家的沟通。另外,作为第一批会员,我还参加了“SAS用户与爱好者俱乐部”,它是一个SAS中国用户交流的非商业性组织,并致力于打造成一个SAS中国的user group。SAS在国内还不是很流行,能够投身于SAS推广的活动当中,心情是充满了自豪感。

拓展:SAS、统计学、数据挖掘、商务智能(BI)

在更为广泛的意义上,数据挖掘是商务智能(Business Intelligence, BI)的一个分支。BI行业的主要厂商是SAP、Oracle、IBM、Microsoft、SAS等。通过对SAS的了解,我对这整个行业也感兴趣起来,参加了国内一些活跃BI社区的线上线下交流活动,比如TTNN、Bicubes、Bihuman等,从中结识很多业界的朋友。另外,我还加入了国内高校里最活跃的统计社区,“统计之都”(cos.name),并成为活跃作者之一。

学习技能,我从自己学习SAS、数据挖掘和统计学的经验中,可以总结几条:

学习期间,有任何问题,首先不要想着去论坛发问,教科书或Google能解决你大部分问题。或者干脆找到一个懂行的人,直接去问。人要爱惜自己的羽毛,在论坛问一些傻瓜问题,会损害你在社区的名誉。自己解决问题,会让自己变得更强壮。

还有就是不要过于积极地去网上找学习资料。资料太多,人生太短,对大部分人来说,需要的几本书,国内都有引进,找一本搁案头翻阅就是。几本难得的电子书,赶紧打印了出来,从此不再网上瞎整。以前我把硬盘塞满时,突然警惕。疯狂收集电子书自有乐趣,你会沉浸在这种乐趣之中,而忽略真正有用的东西和真正要做的事情。

最后多认识几位专业相关的朋友,让自己时刻清醒,自己还是这个领域的门外汉,以保持必要的谦逊。

实习,SAS中国研发中心

2007年年底,一次BI社区的线下聚会,我认识了一位在SAS中国研发中心工作的朋友。我向他问了很多关于SAS产品以及SAS公司的问题,聊得很愉快。一直向往SAS公司,没想到它离我也可以这么近。回来就想,为什么不尝试一下直接体验一下SAS公司呢?于是我就向SAS中国研发中心发了一封应聘实习生的求职信,很快得到回复。

面试官是SAS中国研发中心的总经理Alfred,他简单介绍了下自己就说我们来聊聊。接下来的时间,开始我在讲,讲自己的一些背景,尤其是学习SAS的经历,以及对SAS公司的关注和了解,然后是一些互动,Alfred介绍下公司以及中国研发中心的状况。最后Alfred问我C++学得怎么样。这个只好老实说我只是一个初学者。

整个过程很轻松,不像一般面试常有的challenge。我喜欢这样的氛围,或者向往这样的氛围,我们都是成年人,我们都是professional,气氛就应该是平等宽容轻松愉快的。

SAS是一家私人公司(private),是全球商务智能与分析领域的领袖。在美国,有一句话:“如果你掌握了SAS编程,你将不愁失去工作。”SAS的专长在于数据整理和数据分析,包括统计分析、数据挖掘、预测建模、决策分析等。SAS程序员在国外,是跟C/C++程序员、Java程序员等并立的工种,市场需求比较大,尤其是医药行业、政府部门、金融机构等。我在那一年,几乎是全职状态。第一次开通自己的工作邮箱,真的可以算是自己学生生涯的一个分水岭:你要拿更稳健的做事方式要求自己,就跟自己的同事一样。我参与的是SAS信用评分解决方案的客户化测试项目——信用评分、数据挖掘,也正是我所感兴趣的。

值得一提的是,SAS公司的学习气氛很浓,经常有各种培训、workshop、knowledge share等活动。作为一名实习生,除了第一个月的全天候技术培训外,在以后的日子里,我还参加了商务英语写作、应用统计学、数据挖掘(讲师是印度的同事)等培训。另外,公司还提供大量的网络培训教程(Web Live Training),涉及SAS技术的方方面面,这个只能挑选自己感兴趣的领域去学了。在SAS技术方面,这一年能感觉到自己是越来越strong。

现在我虽然离开了SAS公司,有机会还是很乐意介绍些实习机会向师弟师妹推荐。在网上随时注意些老东家的新闻,并为曾经为它服务而感到自豪。

工作,赛诺菲巴斯德(Sanofi Pasteur)

2009年年初,当时我还在SAS中国研发中心实习,我收到一个猎头朋友的邮件,说一个什么world’s leading company需要SAS Programmer,问我感不感兴趣。

2008年秋季学期开始,我也在考虑工作的事情,当时金融危机已经影响到应届生就业市场了。一开始我也跟风,网申那些著名的投行,后来才慢慢知道它们其实根本不招人,或者名额极少。通过修改简历,分析自我等准备工作,慢慢也更了解自己的兴趣所在和优势所在。被诸多投行拒掉,心里也不着急。

校园招聘我走的不是很积极。因为招聘的旺季,我还在SAS中国研发中心,保持着几乎全职的实习状态,所以SAS也成了我找工作的一个标杆。我的观察是,比SAS好的公司,大概也不多;跟它一样好,但更适合我的,就更少了。

之前也跟猎头接触过。第一次比较搞笑,一个女声打电话过来,拨的是我办公室的电话,报了一个英文名,说是北京的一家猎头公司。先问我是不是SAS中国研发中心,我说是,接着她说要为微软的一个数据库项目招人。我说现在不方便,她就要了我的手机号,说下次再联系。因为第一次接到猎头的电话,心里难免有些激动。中午吃饭时跟几个要好的同事提到这事,原来他们也都接到这个的电话,唉,这就没什么好谈的了。我们想下次其他组的同事也要陆续接到这个电话,于是一起打趣,这猎头,大概是拿着我们的名单,一个个打过去的。

这次猎头跟我联系,我知道它是一家知名的医药公司,赛诺菲巴斯德(Sanofi Pasteur),总部法国,是世界上最大的疫苗公司。以前一些CRO跟我联系,我都不是很感兴趣。现在却是一家药厂自己的研发中心需要SAS Programmer(又叫Statistical Programmer),这让我有些心动。在SAS中国研发中心,除了SAS语言,我接触更多的是SAS的各种产品和解决方案,都是在类似实验室的环境里运用。学SAS这么久,也想把它运用在某个行业里面。我回复猎头公司,说我愿意跟潜在的东家谈一谈。

当时把简历寄过去后,我就回老家过年去了。跟公司的接触,也饶有趣味。在家里,就收到现在老板的一个电话,先用中文说明来意,再简单聊一下,然后问我可不可以用英文聊聊。当时也只好硬着头皮说了,——这个真是非常的不适应,在老家,我连说普通话都不自在,更不用说是英语了,让父母听着别扭。这次电面后,约好年后回北京再面谈。

公司在国贸。年后我过去,进老板的办公室,笑着点头去握手,老板却先来一句nice to meet you。我暗想惨了,一上来就英语啊。我是准备了英语面试,心里却是还想要些缓冲。老板在美国念的博士,在国外工作数十年,这次回国是来负责筹建北京的研发中心。这次全英文面试,也说是随便聊聊,大概持续了一个小时。虽然我英语不是很好,但英文面试,倒是不惧,以前也真刀真枪面对过数回,从俄克拉何马的英语到印度的英语,当然还有中国的英语,屡战屡败屡败屡战这么一路过来,当然丝毫不怕。面试结束,老板笑着说了句我的英语真是不咋地。听了这句,我心里倒舒坦起来,觉得有了被认同的感觉。果然,老板给我留了个名片,约好下次再联系。——说到名片,我在学校做社团时就准备了些。在一些有业内人士出没的技术交流活动里,我是顽强地递过不少名片,给自己争取了些工作机会。

说口语,我觉得对我们技术背景的朋友来说,准备多少都不为过。在实习工作中,每天阅读很多技术文档,还有发邮件,英文阅读和写作问题都不大,但口语实践的机会不多——大多数外企,其实也多是中国人扎堆。我觉得自己口语的突破,不是来自外教,也不是自己私下里在大声背些范文,而是以前几次越洋的电话面试,让我实在躲不开,硬着头皮说上几小时。这坎一旦跨过去,以后就都轻松了,遗憾的是口音还没有跟着有显著提升。接下来公司给我安排了一次电面,面试官是美国那边的programming head和statistics head。那次是晚上十一二点,口语再烂,聊的都是我熟悉的话题,蜿蜒曲折也能沟通下去。

提到面试,我比较幸运,因为面试过程中,需要我说的,都是我所熟悉的和我感兴趣的,关于我的学术背景,以及工作本身需要的技能。作为一个求职者,我知道,这能给我提供一个真正平等的智力环境。

这么几番接触,公司唯一放心不下的,是我背景这么复杂(经济、金融、软件),兴趣又这么广泛,我如何能够保持恰当的commitment?

这时我心里,其实也很多激荡。又到了考虑自己的背景和兴趣的时候,——可能又是要默念《未走过的路》了。我的兴趣和背景,要留在IT业,也不赖。转去医药公司,这对我来说又是一个全新的行业,里面只有SAS编程是我熟悉的。除了想提高自己的SAS应用水平,当时还有几个因素,影响着我的决策。我是要加入一个新开设的研发中心,感觉机会会多一些,以后如果能够承担更多的责任,我的经管背景,或许还能用得上。另外,在与公司的来回接触中,感觉它非常人性化,自己在各个流程都受到了极大的尊重,这与校园招聘中被赶鸭子一般赶来赶去的感觉完全不一样。

我跟老板说,我会珍惜自己的职业前程。如果我加入一家公司,进入一个行业,不会随便跳出,知道那样会损害自己在业内的声誉。老板说大伙都是聪明人,那公司也就没有什么疑虑了。

关于找工作。我给原东家挑过简历,在公司也参与过面试几个候选人,对师弟师妹要讲的是,找工作,不妨站在雇主的立场上考虑些问题,然后反观自己的准备。要知道,公司招人是要花成本的,你是你这个职位所要求的技术领域的专家,你可以想象,雇主需要什么样的人,以及用什么样的方式合适展现出来。比如,写简历时,就该多想着HR或部门会如何看待自己的简历和措辞。

我有很多朋友,像刘未鹏、谢益辉,都非常积极维护自己的技术博客,这种展示最为从容。我看这是最有效的自我营销的方式之一,潜在的雇主可能很早就能够了解你,而且HR、猎头也都会积极去网络上收罗候选人。除了博客,在专业社交网站如LinkedIn等推销自己,也能够建立自己在劳动市场上的良好声誉。

在学术圈子,每一个博士候选人都会积极参加各种专业会议,以期与潜在的东家尽早建立联系。这个思路,放在大学生找工作方面,也是非常有效,特别是我们的IT领域。可以通过论坛讨论、技术会议等各种渠道,积极接触你感兴趣的行业、公司和人。这个应该不难,都2.0了,我们可以通过博客、社交网站、Twitter以及老师朋友推荐认识你感兴趣的业界人士。跟这个行业的人接触了,以后跟雇潜在雇主打交道时就能更有自信。

后记

老罗说彪悍的人生不需要解释。在我求学的这些年,每一个重要阶段,我都要向朋友们解释一遍我正在做什么。进大学,我向很多高中朋友说我去念经济学了,读研后我对大学同学说我修的是软件工程,现在快毕业了,我要对我那群进软件公司的同学说,我去药厂了。以前听孟岩讲过,你做什么,而不是你想什么,决定你要成为什么样的人。我进入一个新的领域,这或将成为我人生诸多折腾的一个了结,我的时间,我的精力,都花在这里,我以后的骄傲也会在这里。

2009-6-27,二稿

推荐网址:

SAS

1. SAS-L(SAS全球用户最活跃的电子邮件组,英文,推荐用Gmail订阅) https://groups.google.com/group/comp.soft-sys.sas/

2. SAS用户与爱好者俱乐部(SAS中国用户组,由SAS中国公司赞助)http://www.sas.com/offices/asiapacific/china/events/2008/2008q3/20080917.htm

以下是两个活跃的SAS中文论坛:

3. SAS中文论坛,http://www.mysas.net/forum/

4. SASor,http://sasor.feoh.net/

统计学、商务智能

5. 统计之都(应用统计学、数据挖掘,群体博客),http://cos.name/

6. TTNN BI观点(商务智能电子邮件组,中文),https://groups.google.com/group/ttnn


Think SAS(一)

$
0
0

think_SAS 为什么你应该学SAS?本文不想卷入SAS与R,或者与SPSS、S-Plus、Matlab等统计软件孰优孰劣的争论中去,我是说,作为一个有志于投身工业界的统计分析人员,你为什么应该把SAS纳入你的分析工具箱?这会是一篇动员贴,尤其是对广大对数据分析感兴趣的在校生。在默认统计编程语言是R的“统计之都”,我需要拿上面这幅图来吸引眼球:学SAS吧。

R是好东西,不只是在COS,现在全世界的统计系和统计学生当中,R是主导性的学术语言。但不妙的是,国内高校学生中,学SAS的明显少了,医药、金融等行业经常苦于招不到合适的SAS程序员。在统计分析领域,SAS是主导性的工业语言,它与R,不应该是此消彼长的关系。工业界与学院的隔膜,现在我感觉是非常明显。下面讲的就是,关于SAS,我们在学院可能不太关注的事实。

0. SAS是什么?

这是一个问题,SAS已经不是你所想象的那个样子。作为一家年收入超过20亿美元的、全球最大的独立BI/分析厂商,SAS就是那家由Dr. Jim Goodnight领导的私人公司。作为一个庞大的软件系统,以下只是SAS系统的一个不完整、不系统的介绍:

1.传统SAS(编程驱动)

1-1 基础模块(Base SAS):包括类似于PL/L的第四代编程语言data steps、SQL、ODS、XML Engine、Macro以及大量的内置函数(支持Perl 正则表达式)和过程步(procedures)等。对一个SAS程序员来说,这个BASE模块几乎就是全部(说学SAS,就是先学这个,这不需要统计背景或者计算机背景)。又,狭义的SAS Base仅指data steps。

1-2 数据存取模块(SAS/ACCESS):支持大量的PC文件(除文本文件外,还包括Excel、SPSS的.sav、Stata的.dta等等)以及所有主流的关系数据库及ERP系统(Oracle、SAP、SQL Server、DB2、MySQL等等)

1-3 作图模块(SAS/GRAPH):SAS作图功能强大,只是模样够土。新版SAS 9.2在这块有不少让人兴奋的改进,比如支持ODS、TrueColor、ActiveX、SVG(Scalable Vector Graphics)等,另外还加了一个graph editor,新潮不少。

1-4 统计分析模块(SAS/STAT ) :包括回归模型、方差分析模型、混合模型、贝叶斯分析、分类数据分析、多元分析(主成分和因子分析等)、判别分析、聚类分析、生存分析、非参数分析等,多是我不熟悉的领域,只管罗列。有个Stat Studio支持R。

1-5 时间序列与计量经济学模块(SAS/ETS ):同上,X11、X12、ARIMA、PANEL、AUTOREG、……。又,做资产组合等投资分析也是在这个模块。

1-6 矩阵运算模块(SAS/IML) 1-7 运筹学模块(SAS/OR) 1-8 地理信息系统模块(SAS/GIS) …… 以上部分是大部分SAS高校用户能接触到的东西,主要用命令行实现功能。下面则是有GUI的客户端工具,一般都用它们作计算引擎。

2. 客户端工具

2-1 元数据管理(SAS Management Console,SMC):元数据(metadata)就是关于数据的数据。最简单的,一个数据集的变量属性就是metadata。SMC是SAS产品元数据管理的统一中心。

2-2 ETL工具(SAS Data Integration Studio):ETL就是数据抽取(Extract)、转换(Transform)和加载(Load)。完成企业数据处理的工具还有SAS OLAP Cube Studio、SAS Information Map Studio等。

2-3 数据挖掘模块(SAS Enterprise Miner,EM) :SAS的重磅产品之一。5以上是Java客户端版本,用户体验增进不少。

2-4 综合分析工具包(SAS Enterprise Guide,EG): 有完善的GUI界面,完成SAS从数据整合、分析到报表的一系列功能。EG与JMP,是SAS公司的两个明星产品。 ……

3. 其他

3-1 统计探索软件包JMP:这是一个独立于Base SAS的软件,由SAS公司的二把手John Sall主管,界面很炫,功能很强,让业务人员爱不释手那种。JMP9支持R。 ……

以及,由以上SAS产品整合打包、再加上业务规则支持形成的各种SAS行业解决方案,广泛运用于金融、通信、能源、政府、医药、保险、制造、零售等各个行业。 SAS不仅仅是一款统计软件,它的官方定位是“商务分析和商务智能软件”(Business Analytics and Business Intelligence Software, BA & BI)。现在我们的重点放回SAS 1.1 即Base SAS上来。

1. SAS是最流行的数据分析类语言

我们看一个编程语言4月份的排名,来自TIOBETIOBE编程语言排名是各种程序语言流行程度的指标,每月更新。它参考全球范围内的技术工程师、培训师以及第三方厂商的意见,通过google、MSN、Yahoo!等常用的搜索引擎搜索结果来计算每种编程语言的流行指数。这个排行榜是程序员查看自己掌握的编程技能是否过时的权威参考之一。具体的评分标准,可以参阅其官分评分文档。现在最新的排行榜是(前20名,2010年4月):

rank_201004

这个TIOBE排名,有它自身的局限。比如,Google新推出的Go,一时广受追捧,4月的排名噌就上去了,但这并不能代表它的实际流行程度。但长期看来,模式还是很明显,比如,通用型的编程语言C/C++、Java、Perl、Python等一直占据这个榜单的榜首,而SAS,则一直是数据分析类语言的龙头,与Oracle数据库内置的PL/SQL语言不分上下。在2010年4月这份榜单中,我们可以把常见的统计分析类语言(关于“统计分析类语言”,这里表述不够精确,比如Matlab,可以作为统计分析工具用,但更多用在科学计算方面。得其大意了。)单独摘出来做一份表单(Maple、Mathematica、R和SPSS由于在榜单上差异不大,故按字母顺序排序):

统计分析语言 TIOBE排名2010年4月
1 SAS 13
2 Matlab 18
3 Fortran 34
4 Maple #51 to #100
5 Mathematica #51 to #100
6 R #51 to #100
7 SPSS #51 to #100

SAS是工业界最流行的统计分析语言。以前,号称有工业用途的三个统计软件是SAS、S-plus和SPSS,它们都是二十世纪七十年代问世的。S-plus与R同源,根正苗红,前身是上世纪七十年代末诞生于AT&T的贝尔实验室(Bell Labs)的S语言,八十年代末由StatSci公司运作,九十年代初转主MathSoft,2001年公司改组,改名叫Insightful,前年(2008),Insightful又被BI产商Tibco收购,从此,江湖上再也听不到S-plus的名号,它被融入Tibco的一个叫TIBCO Spotfire的分析平台。

再说SPSS,它的历史最早,1968年就有第一个发行版,由当时斯坦福大学的研究生Norman Nie等人发明,原意是Statistical Package for the Social Sciences。1975年SPSS公司成立,1993年上市。2009年,SPSS公司被IBM以12亿美元收购。现在,这家公司称作”SPSS: An IBM Company”,那个软件,叫做PASW (Predictive Analytics SoftWare) 。我们默认的那个SPSS也已经不复存在。

2009年,SAS公司的全球收入是23亿美元,它创立于1976年,比SPSS公司还晚一年。SAS软件1972年就有一个较稳定的发行版。随着BO等BI公司、SPSS等数据分析工具提供商一个个被IT巨头收购,SAS现在是全球最大的独立的BI/分析厂商,迄今没有上市。

2. R和SAS

这里要单独说下R。R现在被认为是SAS的一个潜在竞争者。SAS公司在细分市场上的主要竞争对手是SAP、Oracle、IBM、Microsoft、Teradata、SunGard、Unica等IT厂商。R对SAS的(潜在)威胁,不是体现在软件本身,而是体现在用户尤其是高校用户上。前面提到,R现在是学院里的标准统计语言。随便揪一个统计系的学生问:“为什么学R”。答:“因为课程项目用。”“为什么课程项目用?”答:“因为老师用。”或者“因为谢益辉在用。”

那我们再问R的传道者像谢益辉,“为什么用R?”答:“因为R开源”、“因为R统计功能强大,算法日新月异”、“因为某某大佬用R”等等。——通常,你不会因为,比如“R比SAS好”便去学R,或者“SAS比R好”便去学SAS。但是,假如一个人的时间精力只允许他/她学一门语言,那么,由于学院派益辉同学等的大声疾呼,R的确抢走了SAS的很多高校用户。但如果一个在校生还有额外的时间精力,而且他的志向不限于学院,那么,他或许应该再听听工业界的呼吁。

前面提到“算法日新月异”是R的一个优势,这对学院研究颇有吸引力,但工业界相对就保守些,对新算法的需求就小些。——平常听起来“保守”似乎是一个不太积极向上的词,但想想,一个法官应该是保守的,在统计学的假设检验里,遵守的其实也是一个保守原则。举个例子,在学院研究中,Bayesian(贝叶斯分析)在概念上已经不是那么新潮了,但在医药行业(就是那个由保守的药监局如FDA监管的行业),现在用的还是传统的Frequentist方法(参见ICH E9,Statistical Principles for Clinical Trials)。学院里的优势不必然是工业界的优势,那么你为什么不额外再学一门SAS,这个工业界的金标准?以前说过,R的不足刚好是SAS所长,反之亦然。

又,有在校生说,R免费,而SAS是商业软件,故学R,——这是一个不成熟的、人云亦云的说法。你在学校实验室能免费学到SAS,以后你的东家自然会为SAS软件买单。费用不是你应该考虑的问题。

3. SAS可以作为一门职业

从实际的角度来说,有一个工种就叫做SAS程序员(SAS Programer, 或叫做Statistical SAS Programmer、Statistical Analyst)。在全球最大的求职网站www.monster.com,分别以SAS等作为skill关键词,搜索结果如下(测试时间:2010-04-13,你现在看到的会有细微的差别):

1645 SAS jobs

577 Matlab jobs

329 SPSS jobs

87 Fortran jobs

59 STATA jobs

59 Maple jobs

24 Mathematica jobs

这是英语世界的大致情况。说说我们身边的机会。SAS使用者大多集中在医药、金融等行业。现在国际上的大药厂(辉瑞、拜耳、诺华,……)纷纷在中国开研发中心,对生物统计师(Biostatistician,包括统计师和程序员。程序员就是SAS程序员,而SAS编程也是统计师的基本要求之一)的需求渐长。在金融领域,拿我稍熟悉的信用评分领域来讲,熟悉SAS和数据挖掘的人才也很短缺。另外,广泛的机会还能在国内如火如荼的互联网公司和通信行业找到。

其实,即使不把SAS作为一门职业,对一份分析类的工作,你简历中出现SAS也会比出现其他类似的东西(Excel、……)更能吸引雇主的眼球。SAS被普遍认为是一种重量级的工具。 对于统计系的学生,我知道R是你的首选。你需要再学习一门SAS的理由是,SAS是工业界的流行语言。 对社会学、经济学等社科类的专业学生来说,你们需要学习SAS,还有一个额外的理由,SAS会让你的背景显得更硬朗一些,大白话就是说,能让文科气息稍微淡一些。 对IT类学生来说,学习SAS不会占用你太多时间,然后在就业市场,你的选择会宽广很多。(待续)

从中心极限定理的模拟到正态分布

$
0
0

昨日翻看朱世武老师的《金融计算与建模》幻灯片(来源,幻灯片“13随机模拟基础”),其中提到了中心极限定理(Central Limit Theorem,下文简称CLT)及其SAS模拟实现。由于我一直觉得我们看到的大多数对CLT的模拟都有共同的误导性,因此在此撰文讲述我的观点,希望能说清楚CLT的真实面目,让读者对它有更深刻的理解。

一、中心极限定理说了什么

从广义的角度来讲,CLT说的是一些随机变量之和(在n趋于无穷的时候)趋于正态分布,条件是这些随机变量之间相关性不要太严重,每个随机变量自身的方差相对来说不要太大。我们平时看到的都是CLT的最简单的形式:随机变量独立同分布,方差有限。实际上独立同分布不是必要的条件。要理解这段话,我们就得去思考一下Lindeberg条件或Liapounov条件的含义,以及非独立情况下的CLT。而CLT为什么偏偏选中了正态分布呢?这主要是泰勒展开的功劳(注1),加上特征函数作为“催化剂”,捣鼓半天,最后一看,特征函数的极限形式正是正态分布。本文不打算走到这样偏僻的数学角落,只是先介绍一下CLT的前世今生,当我们在统计理论上犯迷糊的时候,回溯到事情的最原始状态,往往能让头脑更清醒(注2)。

即使是最简单的CLT,我觉得几乎所有做模拟的人都走入了一个误区,就是把钟形密度曲线解释为正态分布。给一个非正态的总体分布,重复计算若干次样本均值,把密度以直方图或密度曲线的形式画出来,给观众们说,看:钟形曲线!群众们一看,哇,原本是左偏/右偏/水平的密度,现在真的变成了对称的钟形曲线。于是乎不得不信服CLT的魔力。

二、中心极限定理的模拟

我们缺的不是钟形曲线,而是样本均值的分布和正态分布差多少的指标。这一点在下面第3小节中再谈,先看几个常见的模拟例子。

1、对称的钟形曲线不代表正态分布

很多人喜欢用掷骰子的例子来讲中心极限定理,大意是将两次独立掷骰子的结果加起来,看这个和的分布。我犹记当年人大一位老师给我们上抽样就举了这个例子说明CLT的魔力:看,即使样本量为2,得到的分布也是正态分布!恰好昨天在朱老师的幻灯片中又看到这个例子,不禁感叹这样一个糟糕的例子竟然经久不衰。这个例子的骗局在哪儿呢?其实很简单:在于掷骰子得到的结果的“对称性”,换句话说,结果是1、2、3、4、5、6,这6个数字围绕其均值3.5左右对称,因此两次骰子的结果加起来也围绕7对称,再画个图,两边低,中间高,看似正态分布好像出来了。朱老师的SAS代码如下:

data a;
do x1=1 to 6;
do x2=1 to 6;
output;
end;
end;  /*模拟掷骰子两次,生成36行数据*/
data a;
set a;
x=sum(x1,x2);
proc univariate data=a noprint;
var x;
histogram/normal (mu=est sigma=est);
run;

先跑题说一处细节:这段代码中的直方图不合适,因为我们知道结果x只可能是整数,而(SAS)直方图默认的分组也会以整数为边界,每个边界上的整数都被归到右边的条中去了,而这个所谓的直方图其实只是个条形图:展示每种结果的频数。所以这种情况下认为指定非整数的分组边界才能显示数据真实的分布。以下是R代码:

x = rowSums(expand.grid(1:6, 1:6))
hist(x, breaks = seq(min(x) - 0.5, max(x) + 0.5, 1), main = "")
两次掷骰子得到的结果之和的分布

两次掷骰子得到的结果之和的分布

样本量为2的时候真的得到正态分布了么?CLT确实有它的神奇之处,但还没那么神奇。以上结果如我前文所说,仅仅是由于样本空间中的元素的对称性,所以得到了一副对称的图形,看起来像是正态分布,如果我们再用另外6个数字试验一下,马上就看穿这种迷惑了,我把最后一个数字换成15再看直方图:

d = c(1, 2, 3, 4, 5, 15)
x = rowSums(expand.grid(d, d))
hist(x, breaks = seq(min(x) - 0.5, max(x) + 0.5, 1), main = "")
6个数字中2个样本之和的分布

6个数字中2个样本之和的分布

如何?“正态分布”哪里去了?客官是否能看清骰子中的中心极限定理谎言了?

2、直方图上添加正态密度曲线有误导性

在我还会用SPSS的年代(大约是SPSS 15.0),我就发现SPSS的一个荒唐之处,它的直方图有个选项,可以控制是否添加正态密度曲线。我们被“正态”毒害得多深,从这些软件设置就可以看出来。为什么只能加正态密度曲线,而不能加数据自身反映出来的核密度估计曲线?换句话说,数据的分布一定要是正态么?

我们看CLT的模拟,很多人也喜欢在直方图上加上正态分布密度曲线,这有一定道理:可以看直方图跟正态密度的差异有多大。然而,我们却很少见直方图上的核密度曲线(注3)。既然是要作比较,就拿最可比的去比,比如曲线对曲线,直方图对直方图,人眼本来就是不精确的测量工具,那么制图者就应该提供尽量准确而方便的参照系。

3、给出拟合好坏的指标

综上,我在两年多以前已经把这些CLT模拟的想法写成函数收录在R包animation中,参见函数clt.ani()。代码及输出如下:

if (!require(animation)) install.packages("animation")
library(animation)
ani.options(interval = 0.1, nmax = 100)
par(mar = c(4, 4, 1, 0.5))
clt.ani()
中心极限定理模拟:从指数分布到正态分布

中心极限定理模拟:从指数分布到正态分布

这个CLT模拟的过程很简单:给一个总体分布(默认为右偏的指数分布),在给定样本量n时不断重复抽样分别计算样本均值,一直这样计算obs个均值,并画出它们的直方图和相应的核密度估计曲线;然后随着n增大,看相应的样本均值分布如何。此外,我使用了Shapiro正态性检验来检验这些均值的正态性,并把P值取出来画在下半幅图中。这样我们就很清楚地知道,对于每一种样本量(n = 1, …, 100),我们的样本均值究竟离正态分布多远。此处P值就充当了一个拟合好坏的指标。可以看出,上面的动画中,当样本量n超过20之后,P值会普遍偏大,也就是样本均值的分布和正态分布比较接近(严格来说,是“不能拒绝正态分布”),但也不能保证样本量大就一定意味着正态分布,譬如上图中n=40的时候P值就很小。

三、小结

正态分布在统计中的地位如此之重要,以至于人们几乎认为正态是一种自然而然的分布,本文想说明的是,正态有它的自然性(参见注1),但我们不能逮着两边低中间高的东西都叫正态(参见小学课文《小蝌蚪找妈妈》);做模型或分析数据之前,先清空脑子里的这种“正态教义”,用事实说话。

另外,前面胡江堂挖了个大坑,大家跳进去争论了半天SAS和R的问题,我在这里也挖个小坑:就模拟而言,如果有SAS用户愿意研究一下,我想知道朱老师的SAS模拟代码是否有改进的余地。SAS自70年代创立,过了二十多年才引进“函数”这种杀人越货编程必备之工具,一直以来都是“宏”的天下,说它“恐龙”应该也不冤枉吧。朱老师幻灯片中的长篇SAS代码,如果用R改写,应该都不会超过三五行甚至一行(注4),而反过来可能就麻烦了,比如上面的动画(用SAS怎么写?),它用R之所以方便,是因为R大量的统计相关的函数可任意调用,而图形也很灵活,可以把P值动态写在图例的位置,也可以愿意把样本量n作为下标动态写在$\bar{X}$旁边。

脚注

注1:以我的浅见,统计学中绝大多数极限正态分布的来源都是泰勒展开,主要是因为泰勒展开中有一个平方项,这个东西和正态分布的密度函数(或特征函数)看起来形式相似,再加上一些对高次项的假设(使它们在极限中消去),正态分布也就来了。另一个典型例子是极大似然估计的渐近正态性:泰勒展开中一阶导数为零,剩下二阶像正态。此外,正态分布有个独特的特点,就是它的密度函数和特征函数长得很像,冥冥之中也主导了很多统计量的分布(这一点我还没太想清楚)。

注2:我很少见统计学家强调这种想法的重要性,仿佛大家都埋在公式堆里都推导得倍儿高兴。有两个例外:一个是Brian Ripley教授,我在看他的一份幻灯片Selecting amongst large classes of models的时候发现他竟然回顾了AIC的假设条件——这是我见过的唯一一个讲模型选择时会回到数学根源的人;另一个是Ripley的老搭档,Bill Venables,他在他那著名的手稿Exegeses on Linear Models中竟然从泰勒展开来说线性模型的来历,这也是我在所有我读过的线性模型相关的文章和书中看到的唯一一份从泰勒展开角度谈线性模型的材料。我个人并不喜欢数学,但我喜欢看思路。

注3:我的观点是,画直方图尽量加上核密度估计曲线,因为它能刻画数据在任意位置上的密度大小,而直方图的形状则完全受制于分组边界的位置。当然,核密度估计曲线也取决于核函数,但大多数情况下,核函数不会对曲线的形状有太大的影响。不过邱怡轩在前面“有边界区间上的核密度估计”一文中提到的问题很值得注意。

注4:伯努利随机变量之和的分布。SAS代码:

symbol;
goptions ftext= ctext= htext=;

%macro a(n);
data rv;
retain _seed_ 0;
do _i_ = 1 to &n;
binom1 = ranbin(_seed_,&n,0.8); /*ranbin函数返回以seed、n、0.8为参数的二项分布随机变量*/
output;
end;
drop _seed_ _i_;
run;
%mend;

%a(100);

proc univariate data=rv noprint;
var binom1;
histogram/normal( mu=est sigma=est);
inset normal ;
run;

R代码:

a = function(n) hist(rbinom(n, n, 0.8))

什么叫向量化编程?这就是R它爹S语言诞生的原因之一:统计学的编程不应该涉及到那么多繁琐的循环。

北京数据管理与生物统计论坛(BBF)第三次聚会见闻录

$
0
0

9月4号下午,周六,去北大医学部参加了北京数据管理与生物统计论坛(Beijing Biometrics Forum, BBF)的第三次聚会,这次活动由SAS China北京大学临床研究所赞助。这里写些会议见闻和一些零散的感想,不算是会议的正式“纪要”。东西贴这,大致想给“统计之都”(COS)的朋友交流下北京SAS技术社区的氛围、工作市场情况以及一些相关技术评论等等。

1. 话题

西安杨森的薛富波博士做的开幕致辞,他也是BBF的召集人。SAS China的市场部总监罗威先生代表SAS公司做了欢迎致辞。下面是六位主题发言人的演讲简介以及我的一些杂感。

1.1 SAS程序编写规范(Good SAS Programming Development Practices)

演讲者是赛诺菲-安万特的李友先生,也是本次活动的主持人。除了行业监管规范(如21 CFR Part 11),李还提到SAS的代码规范,如花盒子注释(程序头)、代码结构、缩进、命名规则、可重用性和效率等等议题。这些问题,各个公司各个程序员可能都有不同的风格不同的偏好,但李给的这个较为全面的梳理,还是非常有启发意义的。

对传统程序员(C/C++、Java、Perl、……)来说,代码风格、质量以及重构都是很好理解的事情,但这些却是大量SAS程序员需要补的课。SAS程序员背景多样,主要以统计、数学、生物、医学为主,大多缺少这方面的训练,认为写出的代码能够完成工作就万事大吉。这里除了对SAS运行机制的理解层次不一样,还有一个代码品味的问题。如果把整页整页的代码看成一篇散文,从观感上,相信每个人都能判断出,哪些代码至少“看上去”像是非常好代码。

李提到他幻灯片里介绍SAS软件的部分,参考了“统计之都”的博文——原来也有同行在看这里的文字。国内SAS程序员散布四处,有些在COS潜水,有些在mysas.net灌水,有些喜欢类似BBF的线下交流,浮出水面,可能大伙看着都脸熟。

关于代码规范。还有一个比较少见但却是非常有意思的可能,那就是,“非不能也,实不为也。”怎么说?咱不是水平不行,也不是品味极差,但为了保住饭碗,俺就是要把代码写得极怪,以使后人无法接手维护,从而保证了自己的不可替代性。这种人被称作Job Security Specialist。有点可笑了,呆伯特有一句说得好,笑笑:

Don’t be irreplaceable, if you can’t be replaced, you can’t be promoted.

1.2 PROC SQL在临床试验中的应用(PROC SQL Applied in Biometrics)

演讲者是RPS的吴崇胜先生,介绍的是PROC SQL在临床数据分析中的应用,包括数据校验、数据汇总等,强调了PROC SQL跟data steps(数据步)相比对列进行处理的优势。

一个SAS程序员的工具箱分为两类,一是传统SAS的data steps,二就是SQL。——说到这里,我要先提一下“SAS程序员”和“SAS使用者”的区别:

  • SAS程序员在文本编辑器里写代码,里面主要是data steps和SQL,穿插以Macro(宏)和其他procs(程序步)等等,总之,一个“SAS程序员”几乎就是一个“SAS/BASE程序员”。
  • 而“SAS使用者”,他们或者单纯使用SAS的客户端工具,如Enterprise Guider、Analyst、SAS Add-In for Microsoft Office,或者也写主要以procs为主的代码(显然,有的SAS使用者会成长为SAS程序员,有的SAS程序员也会转化成SAS使用者)。

SAS的PROC SQL是标准SQL(SQL-92)的一个实现,你可以把在其他任何场合学到的大部分SQL知识不加修改地移植到PROC SQL里面来。这也能提供一部分的解释,为什么以前是统计系学生专场的SAS程序员群体,有越来越多的IT背景的人员加入。

data steps跟SQL是左青龙右白虎,混合使用,扬长避短,才能相得益彰。SAS data steps脱胎于PL/1,是一门过程式的语言,而SQL呢?它的全称是Structured Query Language(结构式查询语言),但其实,SQL既不是结构式的,也不仅仅是用来查询的,最后,从图灵完全的角度,它也不能算作一门“语言”(比如,标准SQL就做不了循环)。

1.3 PROC FCMP介绍

演讲者是我的前同事,SAS R&D的覃龙先生。有了PROC FCMP,你就可以像其他语言一样,定义自己的函数了,而不是只用SAS Macro定义一个“类似函数的”宏。覃的报告分为两部分,一是用PROC FCMP的数据功能(array),实现类似SAS/IML的矩阵运算,二就是用PROC FCMP自定义函数了。

PROC FCMP是SAS 9.2版本的一个亮点,其实在9.1.3也有它一个实验版本,可以拿来练练手。又,覃提到SAS Macro不能做递归,其实它是可以的,也不是很麻烦(当然不如在PROC FCMP里写着顺畅)。

1.4 让SAS作图变得更容易:%GraphLineplt (%GraphLineplt: Made Graph Easy)

演讲者是赛诺菲-安万特的李华丹先生。%GraphLineplt是李开发的一套多功能的作图程序,整个发言就是讲解这套宏的构架与使用。我对作图没有特别的研究,对着文档照葫芦画瓢而已。主要印象,一是作图元素的分解,二是用data steps辅助(annotate功能)。听这个演讲,至少知道,以后有问题,可以直接找谁请教了。

1.5 一些SAS小技巧(Tricks Make Life Easy)

演讲者是诺和诺德的于文博先生,去年在CDISC Interchange 2009的培训会场见过。于介绍了SAS的两个实用小技巧,一是Add Abbreviation,二是Record Keyboard Macros。当然,他发言的精华不在这里。展示完这些小技巧后,于说道:

all tricks are in the dust. 所有技巧都是过眼云烟。

接着于就展示了质量控制专家戴明著名的“戴明环”(Deming Cycle),一个计划、执行、检查、处理的闭环。虽然衔接得有些无厘头,于还是有效地把会场的气氛大大提升了一把。戴明环对项目管理很有启发意义。

1.6 医药行业SAS程序员职业发展探讨(Career path of SAS programmer in pharmaceutical industry)

演讲者是Covance的邓亚中先生。邓这次演讲带了很多干货:

  • SAS程序员在医药行业的分工
  • SAS程序员的职业转向(技术专家、咨询顾问、管理、培训等等)
  • 国内药厂和CRO统计师和SAS程序员的数量和分布(有图有真相,整整两页胶片,大伙看着都是非常感兴趣)

关于SAS程序员,现在国际上的大药厂以及CRO纷纷在中国设点,邓说,就今年国内还有100个缺口(邓在发言中也顺便给他们公司招聘做做话题广告):这100个人,往哪里找啊?国内高校,SAS教育的状况不容乐观。李友后来插一句,就仰仗各位帮扶带了。

2. 人物

2.1 薛富波(Bruce Xue)

第一感觉就是,比我印象中年轻多了(Bruce,在我印象中,你也不“老”,只是……)。我06年开始学习SAS(版本9.13),跟那时很多初学者一样,手头也都摆了Bruce的《SAS宏语言基础》以及他与上海张文彤等人合著的《SAS 8.2统计应用教程 》(2004)。当时他还在西安,第四军医大。怎么说?印象中Bruce有我老师般的年龄,见面却是我经理的年龄,——俗语一句,闻名不如见面,见面更胜闻名呀。

提到国内SAS教育的先行者,北大统计系的高惠璇老师已经退休,上面提到的张文彤,也离开了复旦,最近在淘宝网的数据门户看到一则消息,说他已经转入上海一家市场研究公司。在北京,如果嫌自学SAS不好玩,可以去高校找找现在还活跃的老师:

  • 军事医学科学院的胡良平教授,这个秋季学期在中科院研究生院开SAS课;
  • 按照朱世武教授的一贯安排,这个秋季学期他也会在清华大学经管学院开两三门SAS与金融计算的课程,本科高年级和研究生两种水平类别;
  • 北大统计系李东风教授这个秋季学期会开一门“临床试验SAS高级编程”(SAS Programming in Clinical Trials)的选修课,针对大四毕业生。同时,这个秋季学期,北大统计系还开有一门“临床试验设计与分析”(Clinical trial design and analysis)。个人感觉,这是北大统计系对最近几年国内生物统计市场蓬勃发展的一个反应。真很可贵的尝试。

另外,按照人大统计系的某些实用主义传统,这个秋季学期或者明年春季学期,也会开设相应的SAS的课程。大学乃社会公器,认为未注册的人来蹭课会“扰乱教学秩序”只是大学的“教务部观点”,而非大学的“教授观点”。讲讲北大的氛围,假设,80人的教室刚好容纳80位注册学生,然后一共有100人来听课,你就不知道坐在位子上的80位、后排站着的10位、还有前排地板坐着的10位谁是注册生谁是旁听生。老师继续上课,相安无事。然后,教室再挤来20位蹭课的。课堂终于混乱了,教授说:“我们再换一个大点的教室吧。”上次回学校,图书馆迎新生,拉了一个条幅,上书“得天下英才而教之,遍读经典以传承”,居然感动地一塌糊涂。

2.2 tangyh

tangyh是“统计之都”(COS)SAS版的版主,现在中科院读研,数据挖掘方向,刚在赛诺菲巴斯德生物统计部结束暑期实习,是解决问题能力很强的SAS好手,会上也有猎头过来问候。想,等两三年后,如果tangyh对工业界感兴趣,我要第一个给他打电话。

2.3 hopewell

hopewell是国内最火的SAS中文论坛mysas.net的版主,最近几年在mysas.net上写代码是写得风生水起。之前我们简单沟通过,正好趁着这个聚会混个脸熟。

讲个小插曲。hopewell下午来的时候,手机刚好停电,我就在会场冲着感觉像他的面孔招手。后来hopewell同学通过组织会议的一位朋友找到我,自我介绍说是hopewell,我那朋友看着没反应,我差点叫出来,hopewell这个ID都不认识。唉,不是所有的SAS程序员都上mysas.net的。虽然SAS公司的laosunny在mysas.net发了本次活动的预告,但感觉BBF跟mysas.net沟通不多。这次BBF大体上是一个通过工作邮箱召集的活动。

回到hopewell同学,一起海聊了。瞅个话档,我又厚颜无耻地问他对我公司感不感兴趣。碰到高手,我的第一个反应就是能不能邀请过来做同事,噫。

假设检验初步

$
0
0

准备尝试一下,用大白话叙述一遍统计推断中最基础的东西(假设检验、P值、……),算是把这段时间的阅读和思考做个梳理(东西不难,思考侧重在如何表述和展示)。这次打算用一种“迂回的”表达方式,比如,本文从我们的日常逻辑推理开始说起。

0.普通逻辑

复习一下普通逻辑的基本思路。假设以下陈述为真:

你打了某种疫苗P,就不会得某种流行病Q。

我们把这个先决条件表述如下:

如果P 则非Q

其中,

P表示打了疫苗P,

Q表示得流行病Q

或者,更形式化一点:

if P then NOT Q

然后,如果观察到你得了流行病Q,那么就可以推出你没有打疫苗P——这个推断只不过是上述前提条件的逆反命题而已。我们把以上推理过程表述如下:

if P then NOT Q (先决条件)

Q (前提)

———————–

then NOT P (结论)

还有,如果你没有得流行病Q,就能推断出你打了疫苗P吗?显然不能。打疫苗P是不得流行病Q的充分条件,但非必要条件:你没有得流行病Q,可能是因为打了疫苗P,也可以是因为其他任何原因。即,if P then NOT Q,不能够推出if NOT Q then P。

到此为止没有任何令人惊奇的地方。下面将表明,假设检验背后的统计推断规则也只不过是我们以上日常逻辑推理的一个衍生而已。这只需要思维的一次小小的“跳跃”。

1.假设检验

在统计推断中,我们不说“你打了疫苗P,就不会得流行病Q”,而是说,比如,“你打了疫苗P,就有95%的把握不会得流行病Q”,即if P then probably NOT Q。把上面的逻辑推理规则改写成统计推断规则:

if P then probably NOT Q    (先决条件)

Q                                                     (前提)

———————–

then probably NOT P         (结论)

回到以前“万能”的硬币实验,我们做实验来考察一枚硬币是不是均匀的。改写成现在我们熟悉的形式:

P:硬币是均匀的。

Q:在100次投掷中,得到90次正面,10次反面。

我们说,如果是一个均匀的硬币,就不太可能发生这样的情形:投100次,出现90次正面,10次反面(if P then probably NOT Q)。现在如果在100次投掷实验中,观察到出现90次正面,10次反面(Q),那就可以有把握地说,这个硬币不是均匀的(NOT P)。这个推理可以写成与上面一致的统计推断的形式,其中,P是原假设H0,NOT P是备择假设Ha:

H0:硬币是均匀的  (P

Ha:硬币是有偏的 (NOT P

如果原假设为真,即硬币是均匀的,就不太可能发生这样极端的事情,比如:在100次投掷实验中,观察到出现90次正面,10次反面(Q)。如果真的观察到这样极端的事情,你就有把握认为硬币不是均匀的,即拒绝原假设(P),接受备择假设(NOT P)。

另外,如果在100次投掷实验中,观察到60个正面,40个反面(NOT Q)。这时你就不好下结论了,因为一个均匀的硬币可能投出这样的结果,一个有偏的硬币也可能投出这样的结果。最后,你只能说,如果实验结果是这样的,那就没有把握拒绝原假设。这枚硬币是否有偏,需要更多的证据来证明(这通常意味着更多的实验,比如,再投1000次)。

总结一下。在搜集数据之前,我们把想证明的结论写成备择假设,把想拒绝的结论写成原假设。之所以写成这个形式,因为从上面不厌其烦的讨论中得知,这是方便逻辑/统计推断的形式:当我们难以拒绝原假设时,只能得到结论,原假设也许是真的,现在还不能拒绝它;而当我们能够拒绝原假设时,结论是:它就很有把握是不真的。注意,在看到数据之前,我们不知道自己想证明的结论是否能够被证据所支持。

在确定假设检验的形式的同时,我们对之前一直随意说的“把握”、“可能”也做一个限定,即指定一个显著性水平α(significance level),也叫犯第一类错误的概率(type I error,在上面的硬币实验中,就是否定一个均匀硬币的错误,也叫“弃真”错误)。

根据某些保守或稳健的原则(比如,我们认为,把一个无辜的人判决为有罪,比放掉一个有罪的人,后果更为严重),我们要尽量把犯“弃真”错误的概率控制在一个很小的水平里。通常α=0.05,这时候就是说,如果拒绝了原假设,你就有95%的把握说原假设是不真的。这里,95%(=1-α)就是置信水平(confidence level)。

又,放掉一个有罪的人,即把一个有罪的人判为无罪,这犯的是第二类错误β(type II error,在硬币实验中,就是把一个有偏的硬币当成均匀硬币的错误,也叫“取伪”错误)。关于第一类和第二类错误之间的权衡取舍(trade off),详见《决策与风险》。在我们的假设检验里,我们认为犯一类错误的后果比犯第二类错误的后果更为严重。

需要注意的是,在这里,我强调的是先提出需要检验的假设,然后再搜集收据。这是统计推断的原则之一。如果看到了数据之后再提出假设,你几乎可以得到所有你想要的结果,这是不好的机会主义的倾向。强调这些,是因为在学校里,我们大多是看了别人搜集好的数据之后再做统计练习。

事先确定好你想拒绝/证明的假设,在看到数据之前,你不知道结果如何。

2.P值(P Value)

上面提到“极端”事件,比如,在100次硬币投掷实验中,观察到出现90次正面,10次反面(Q)。怎么样的事件才是“极端的”?简单地说,一个事件很极端,那么少比它本身“更极端”的事件就非常少(比如,只有“91次正面,9次反面”、“91次反面,9次正面”等情况才比它更极端)。

但这个Q只是从一次实验中得出的。我们可以重复做这个实验,比如100次,每次都投掷100次,记录下的正面数X,它构成一个二项分布,X~B(n,p),其中,n=100,p=0.5。根据某个中心极限定理,正态分布是二项分布的极限分布,上面的二项分布可以由均值为np=50,方差为np(1-p)=25的正态分布来近似。我们在这个近似的正态分布的两端来考察所谓“更极端”的事件,那就是正面数大于90或者小于10。

重复一遍,“P值就是当原假设为真时,所得到的样本观察结果更极端的结果出现的概率”。如果P值很小,就表明,在原假设为真的情况下出现的那个分布里面,只有很小的部分,比出现的这个事件(比如,Q)更为极端。没多少事件比Q更极端,那就很有把握说原假设不对了。

在上述近似的正态分布中,P值就等于X>90 或 X<10的概率值(记做,P{X>90 or X<10})。根据对称性,这个概率值等于2*P{X<10}=1.2442E-15。

上面我们的确求出了一个非常小的P值,但如何不含糊地确定它就是很“极端”呢? 事先确定的显著性水平α,本身就是一个判定法则。只要P值小于显著性水平α,我们就认为,在认为原假设为真的情况下出现的事件Q,是如此地极端,以至于我们不再相信原假设本身。一句话,我们的判定法则是:

P值小于显著性水平α,拒绝原假设。

3.一个手算示例

用一个双侧的单样本T检验做例子。假设我们想知道,螃蟹的平均温度,跟空气的温度(24.3)有没有统计差别(α=0.05)。事先确定的假设检验的形式表达如下:

零假设(H0):   μ=24.3°C

备择假设(Ha):  μ≠24.3°C

以下是25只螃蟹在温度为24.3°C下的体温(单位:°C):

25.8    24.6    26.1    22.9    25.1
27.3    24        24.5    23.9    26.2
24.3    24.6    23.3    25.5    28.1
24.8    23.5    26.3    25.4    25.5
23.9    27        24.8    22.9    25.4

一些基本的算术结果:

样本均值:$\bar{X}=25.3$

样本量:n=25

样本方差:$s^2$=1.8

样本均值的标准误差:$s(\bar{X})=\sqrt{s^2/n}=0.27$

这里T检验的思路如下:

  1. 我们先假设H0为真,即认为螃蟹的平均温度跟空气温度没有差异(P),  μ=24.3°C。有一个极端事件Q,如果原假设H0成立,Q就不成立(if H0 then probably NOT Q);但如果在原假设为真的情况下,出现了这么一个Q,那我们就有把握拒绝原假设。
  2. 样本均值:$\bar{X}$是总体均值μ的最好的估计,在本例中,$\bar{X}=25.03$。
  3. 这个样本均值只是一个估计值。它只是从总体的一个随机样本中得到的(样本是上述25只螃蟹)。我们不知道这次实验结果是不是“极端”事件。而判断一个事件是不是极端事件,根据第二节的讨论,我们可以重复做上述实验,比如100次,每次都抓25只螃蟹,都在空气温度24.3的状态下测量其体温,然后也各自求出一个样本均值来。
  4. 容易得出,这种实验出来样本均值,辅以适当的数学形式,就服从一个自由度为24(=25-1)的t分布,即$(\bar{X}-\mu)/s(\bar{X})\sim t(24)$。
  5. 样本均值$\bar{X}=25.03$,在这个自由度为24的t分布下,有一个对应的t值,t=25.03-24.3/0.27=2.704。现在我们可以在整个分布里考察这个t值。在这个自由度为24的t分布里,我们看 t=2.704是不是一个“极端”事件Q。根据对称性,比Q更极端的是那些大于2.704或者小于-2.704的点。

t

从上图可以看到,在这个t分布里,比t=2.704更“极端”的点占整个分布的0.0124。这个0.0124就是我们要求的P值。这个P值小于我们事先选定的显著性水平α=0.05,因此我们可以拒绝原假设,认为这批螃蟹的平均体温不等于空气温度。

这个双侧P值可以手算如下:

在SAS里,P=2*(1-probt(t,df))=2*(1-probt(2.704,24))=0.012392

在R里,     P=2*(1-pt(t,df))=2*(1-pt(2.704,24))=0.012392

———-

以上是用P值作为判定条件。一个等价的做法是用临界值来判断。我们事先给定的显著性水平α=0.05,在这个自由度为24的t分布里,就对应着一个临界t值2.064。下图的阴影部分,也称作拒绝区域。上面求出的跟样本均值$\bar{X}=25.03$对应的t值=2.704,处在这个拒绝区域内(2.704>2.064),于是我们一样拒绝原假设。

t2

又,上述临界值可以手算(或查表)如下:

在SAS里,tCritic=tinv(1-alpha/tail,df)=2.06390

其中,alpha=0.05,tail=2表示双侧检验,df=24.

在R里,tCritic=qt(1-alpha/tail,df)=2.063899

4.注

本文是对近期阅读做的一个笔记。作为一个非统计科班出身的程序员,我一直在思考,如何来理解统计概念,以及如何把自己的理解向同行传达。关于用日常逻辑推理来理解假设检验的思路,来自

Common Statistical Methods for Clinical Research with SAS Examples(2nd edition, SAS Inc., 2002, by Glenn A. Walker)

关于决策与风险的讨论,参考了

维恩堡《数理统计初级教程》(常学将等译,太原:山西人民出版社,1986,Statistics: An Intuitive Approach By George H. Weinberg and John Abraham Schumaker)

第三节示例的数据,来自

Biostatistical Analysis (5th Edition) by Jerrold H. Zar, Prentice Hall, 2009

第三节的t分布图,来自一个在线的t分布生成器(很好用):

http://onlinestatbook.com/analysis_lab/t_dist.html

附录: 用SAS来计算

上面的文字尽量做到“平台无关”。这里附出SAS例子,是想把以上的手算结果跟机器结果做个对照,让读者更有信心一些。 欢迎读者贴出自己趁手的工具得出的结果。

/*data*/
data body;
input temp @@;
h0=24.3;
diff=temp-h0;
datalines;
25.8    24.6    26.1    22.9    25.1
27.3    24      24.5    23.9    26.2
24.3    24.6    23.3    25.5    28.1
24.8    23.5    26.3    25.4    25.5
23.9    27      24.8    22.9    25.4
;

/*method 1: use proc means*/
proc means data=body T PRT;
var diff ;
run;

结果是:

t Value    Pr > |t|
——————-
2.71      0.0121
——————-

上面的t Value 就是计算出来的t值,Pr > |t| 就是P值(这里的|t|就是上面计算出来的t值2.704,Pr > |t|求的是比t值更极端的概率,即P值)。proc means没有提供临界t值(即通常说的查表得出的t值),下同。

/*method 2 (prefered): use proc ttest*/
proc ttest data=body h0=24.3 alpha=0.05;
var temp;
run;

proc ttest的结果更为丰富:

N      Mean     Std Dev  Std Err    Minimum   Maximum

25     25.0280      1.3418      0.2684 22.9000        28.1000

Mean     95% CL     Mean       Std Dev     95% CL   Std Dev

25.0280 24.4741  25.5819            1.3418             1.0477   1.8667

DF    t Value    Pr > |t|

24       2.71           0.0121

Think SAS(二)

$
0
0

 

有个老本家,著有《白话文学史》(上卷)、《中国哲学史大纲》(上卷),——你知道他叫胡适。然后有朋友这个“Think SAS”系列有没有下文,我自然不敢托大,“半卷先生”不能做,还是老老实实地把这个系列往前推吧。

第一篇“Think SAS”中的“Think”,纯粹做“考虑”解,说,诸君如果为工作计,不妨考虑下SAS。下面说些关于SAS本身的一些思考与认识。俗话说,人类一思考,上帝就拍砖。上一篇是纯劝导型,这一篇就是求拍砖型。

0.总结与回应

在展开讨论之前,希望大伙对“事实问题”而不是“价值问题”能有一个统一的认识,这也是我对上篇各位的评论的一个总结与回应。

0.1 功能:SAS 与R

一些朋友询问SAS或R或其他软件功能的优劣,然后决定自己应该着手学哪个。这是一个伪问题,或至少也是一个不好的问题。一般来说,没有不好的问题,只有不好的回答,——但那的确是一个不好的问题。

一门编程语言(本文讨论的是统计编程语言),只要能实现分支(if . . . then . . .)和循环(for/while/do . . . loops),就能够完成几乎所有的运算。这样说来,单问SAS是不是比R强大,或者R是不是比SAS强大就是一个意义不大的问题。它们都能较好地完成大多数的任务,强不强大的区别,在于背后的用户。一些更好的问题或许是,比如,它们的某些模块相比起来如何,它们的扩展性相比如何、它们的运算效率相比如何等等。个人认为,最好的问题是,在我现在如此这般的情况下,哪一款软件最适合我?这些问题也仁者见仁智者见智,但都能讨论出有意思的东西出来。

我认为讨论软件优劣不是一个好问题,还有一个基于经验的理由,就是一般在这种情形下,你需要的不是一个答案,而是不管基于什么理由而迅速选择一门语言,然后沉浸下去。时间和精力不能浪费在观望上面。R如何,SAS又如何,如果还停留在询问探索阶段,它们都不是你的(套用一句话,不学进去,神马都是浮云)。

以前说过,大多时候,你选择一门语言,不是因为你经过比较,认为A比B好故选A。你在图书馆看到哪本书,你旁边的朋友、同事、老师在使用哪个,或者更直接的,你被要求用哪个。无论是什么,学下去了都能胜任你大多数的日常工作。如果发现不够用,那恭喜你,你就处在一种知识/技能上的饥渴状态,我相信无论是哪一种新的语言,你都能迅速上手。

0.2  工具:SAS与统计

提到SAS,一些学统计出身的朋友很不屑:不就工具吗?统计思想才是王道!

都说到思想了,我想认真回应下。在做统计分析时,SAS编程是工具。但在做决策时,统计本身也是辅助工具。因为处在上下游的关系而相互轻视,这不是一种开放的心态。

oloolo对行业顶尖的统计师有一个非常好的总结,就是“对业务敏感,对统计老到,对编程熟练”。要是业务人员嘲笑统计师不懂业务,统计师嘲笑程序员不懂统计,程序员反过来嘲笑他们其实什么啥都做不了,这生态圈的境界未免就低了些。

0.3 SAS 与FDA以及“路径依赖”

作为一家标榜平台无关的监管机构,FDA没有要求药厂必须用SAS作为统计分析工具。但是,FDA要求所有的临床数据,都必须用SAS公司研发出来的一种开放数据格式提交(SAS transport file,后缀是.xpt)。还有,FDA的统计师的PC上装有SAS软件。这样,你大概就能理解为啥这行业都用SAS了。

或者有人说,SAS被广泛使用,是因为它出道早,抢了个先机,倒不是因为它本身如何如何好。这个诘难在我看来是很软弱的:

–首先,SAS并不是出道最早的,SPSS就比它早。S-plus也跟它是一个时代的产物。

–关于“强了个先机”(路径依赖)。有时候你不能过高相信了用户的忠诚度。想想,你换了几种输入法、几种浏览器、几种搜索引擎?几十年来大浪淘沙,一个产品或服务始终占优,单单一个用户忠诚度是不能完全解释的。

举个例子,比如FDA要求所有的临床数据用xpt格式提交,这个不是一成不变的。以前也提到,SAS的优势根本就不在数据存储上,XML就比xpt好,而且就是将来的方向。但是在药厂,程序员们还是将继续使用SAS来生成各种XML文件(包括define.xml)。SAS或许不是处理XML文件的最好工具,但至少在功能上没有任何问题,它可以是SAS程序员的最好工具(参见本文0.1)。

下面回到正题,说说SAS本身。

1. “巨无霸”SAS

下面这幅图,取自SYSTAT的创始人Leland Wilkinson的文章,The Future of Statistical Computing,大概按照几种标准对市场上存在的统计软件做了个聚类。一些统计软件的特点是将数据全部读入内存,在处理完了才跟磁盘交换数据,比如Stata、R等;Minitab、Statistica和SAS的JMP归为一类是因为它们都专注于质量控制领域;SPSS和SYSTAT在框架和用户界面比较类似(而且它们的归宿也类似,SYSTAT卖给了SPSS,后来SPSS又把它转手卖给印度。后来啊,SPSS本身又被IBM给买了);Google和Microsoft归在一起,因为它们不是专注做统计软件的公司,但又有用户界面非常人性化的统计分析产品(轻客户端,比如Google Analytics)。

SAS呢?SAS跟它们都不一样。上文只好根据安装介质最大这条标准,把SAS单独归为一类(图中SAS的字号最大,是因为这家公司在分析领域收入最高)。

SASetc

 

“巨无霸”的确是SAS给人的第一个鲜明的印象。所以在大多数场合,拿它跟其他统计软件相比,就有以大欺小之嫌,SAS早已经不仅仅是Statistical Analysis System(具体的可参见本系列第一篇之“SAS是什么?”)。

1.1 SAS的编程元素

SAS的"巨无霸"特点,表现在它的产品线的多样化(功能/行业),也表现在它编程元素的多样化

–-它主要是一门过程式的语言(循环、分支、数组,……),但其中也不乏面对对象的特性:

  —首先,SAS/AF就是一门完全面对对象的应用开发语言。

  —在SAS/Base中,–通过Data Step Component Interface,你可以在数据步里建立纯OOP 的Java对象。

  —在DDS中,有一个类似的DDS Data Step Object

  —最后,在Macro中,一样可以体现出以上提到的各种OO特性

 

–对C/C++程序员来说,它提供了一个SAS/C Complier

–-对Java程序员,它有一个基于Eclipse的开发环境SAS AppDev Studio,可以方便地利用SAS的计算引擎开发各种应用,

–-矩阵运算一块,SAS的矩阵语言IML与Matlab、R等相比也不弱

–-字符处理,除了大量的字符函数,SAS也支持Perl正则表达式

–-支持标准SQL语句

–-支持Hash表

–-为XML数据提供了XML引擎

–……

SAS的这种“杂糅”风格,也受到不少批评。一个感觉就是似乎有些“粗”(大象能不能跳舞?),比如,很明显,S语言就比它精细许多。在统计分析一块,S语言是SAS的主要竞争者,我先绕开讲个故事。

1.2 SAS vs S: AK47 vs M16:一个类比

在枪械史上,有两款步枪最受人瞩目,而且经常拿来做对比,它们就是AK47和M16(以下关于这两款步枪的材料来自网络)。

AK47出自前苏联一名坦克车长卡拉什尼科夫上士之手。1942年他回家养伤,跟一个火车司机在一个小工棚里打磨了一支自动步枪。以后不断改进,1946年,他的AK46送去靶场接受极限测试:连续射击子弹1.5万发,枪管打红了,射击精度却没有什么大的变化。以后这支步枪就以AK47的名字扬名天下,它结构简单,结实耐用,故障极少,造价低廉,威力巨大,能在寒冷、炎热、风雨、沙漠甚至水中都能使用。

M16最早出现在上世纪60年代,设计师是美国知名的枪械大师斯通纳。他在M16的各个部件上广泛采用了铝合金和塑料等轻型材料,制造工艺非常先进,枪身也更精致时尚。另外,M16口径稍小,射击精度有所提高,但它对射击的环境要求很高,枪管不能进水,有时下雨受潮也影响射击精度。再加上性能不稳定,连续打出4500发以上的子弹,就造成某些零件的断裂。

讲到这里,大家都应该能猜到我想说什么。除了价格因素,在比喻的意义上,SAS就是AK47(:这里的SAS指其与S相对应的部分,下同;整个SAS系统是一个武器库而不是一个单兵武器),S语系就是M16,或者保险一点,与M16相比,SAS更像AK47;与AK47相比,S语系更像M16。S语言出身名门(贝尔实验室),设计精巧,获过ACM大奖。SAS语言则出自于一位物理学背景的程序员之手(Tony Barr),当时他所在的机构急需解决方差分析等问题。接下来的故事大伙都很清楚了,AK47成了战场上使用最受欢迎的步枪。

1.3 SAS的优缺点,以及关于其编译器的一些讨论

SAS的设计,很多是基于商业世界的要求。比如,对于数值型变量,SAS只提供一种浮点型格式,这让它在计算性能方面有些吃亏(想想看,就连1+1,SAS都要当成两个浮点数来计算,习惯于首先声明”int x”的C/C++程序员看了大概要不爽),但是,比如,关于日期格式(format和informat),SAS却提供了近百种供选择。纯浮点数让系统开销大一些,但是在设计方面可以简化不少,但是全世界各种不同的日期格式却丝毫不能省略。SAS系统一路“堆积”至此,是考虑,有时甚至是迎合了市场的需要。

在比喻的基础上做进一步的引申会很危险。SAS语言脱胎于PL/1。与其他过程式编程语言相比,往好里说,PL/1在异常处理方面强过Ada,在文本处理方面强过Basic,在输入输出管理方面强过Cobol,在计算方面强过Fortran,在流程控制方面强过Pascal,在内存管理方面强过C,当然,在宏替换方面强过汇编。SAS无意在系统编程或算法实现跟其他语言一较长短,但它在数据访问、数据管理、报表展示、数据分析以及编程灵活和易用性方面的强大优势(详见下),使得它在商业世界一直长盛不衰。

当然,SAS的缺点也非常明显。比如, 直到SAS9.2它才能够在数据步(data step)里自定义函数,你会想,作为一门过程式的语言,以前不能自定义函数的日子怎么过?毫无疑问,这是一个限制。但是,在SAS中,你还以通过其他方式完成类似的功能。首先,SAS有大量的内置函数,在你想自定义函数之前,先麻烦查一下函数手册;然后,你可以定义一个“类似函数的”宏(Macro),这是应用最广泛的方式;或者,你也可以直接在SAS的矩阵语言IML定义函数。

说到IML,这是一个好东西,但是,这么多年了,这家伙居然不能够实现递归!!毫无疑问,这也是一个限制。但是,首先,所有的递归都可以写成一个等价的循环,而且循环的效率还高些;其次,你可以在Macro里实现递归;而且,好消息是,SAS9.2的自定义函数完全支持递归调用。

讨论SAS本身的优点跟缺点,不得不提一下系统底层的东西。比如,Tony Barr在设计SAS系统的时候(上世纪六七十年代),它的编译器用的就是一个递归下降解析器(recursive descent parser),这是一种自上而下的编译方式。深入讨论这个话题超出了本文的范围,简单说一下这种编译方式的优点和缺点。

它的突出优点是:它超级简单,跟AK47一样,意思是说它超级稳健(robust)。它的缺点也很明显,超级简单的一个代价就是,有时候它不够精确。想想看,假设你跑一段代码,然后查日志文件(log),发现报错信息是在第2011行。一个建议是,比如,你最好从2009行开始查看你的代码。

1.4 关于SAS与S语系的一些展望

上面多次提到了S语系。我不熟悉它,但也非常看好它。冒着危险再讲个故事。

战后卡拉什尼科夫访问过美国,跟斯通纳玩了个友谊赛,他用M16,斯通纳用AK47。两位对手中的步枪评价都很高。他们都认为,未来步枪将会向向小口径、轻型化、通用性方向发展(S?!);当然,其前提仍然是性能可靠,适合各种复杂多变和条件恶劣的自然气候(SAS?!)。

再一次,我鼓吹的是SAS与S的融合。现在SAS系统有好几个部分兼容R,你可以在Stat Studio和JMP里跑R代码。作为一个SAS程序员,我觉着这样还不够,最好是在SAS Base里整合一个与PROC SQL、PROC IML平行的PROC R。

2. Programming SAS(用SAS编程!)

SAS中文社区神龙见首不见尾的高手,SAS_Dream,在2004年抛出一篇《SAS语言管窥》,梳理SAS 的各种语系,如BASE、STAT、AF等,多读多有启发。

下面讨论的也是SAS的编程特点。有一个区分,SAS程序员(SAS Programmer)和SAS用户(SAS User)。一个纯SAS程序员更多使用SAS的编程模块(SAS Base、SAS/AF等),一个纯SAS用户更多使用SAS的非编程模块,比如统计分析模块SAS/STAT、SAS的GUI工具SAS Enterprise Guide、SAS Enterprise Miner等。从这个角度来说,跟SAS_Dream的看法不一样,我把SAS/STAT等分析模块从SAS编程语言的范畴中剔除出去了。那些模块需要的更多的是业务知识(比如统计学),没有丝毫的编程乐趣。当然,一个人可能倾向于是SAS程序员或者SAS用户,或者有时候是SAS程序员,有时候是SAS用户。

2.1 Data Steps

data steps(数据步)是SAS最核心的东西,一种第四代过程式编程语言,脱胎于PL/1

一些人认为SAS的语法结构怪异,其实这是很大的误解。作为一门通用性的过程式语言,它在顺序语句、分支、循环方面跟其他过程式语言(或过程式/结构式编程方式)没什么太大区别。

SAS data step跟其他语言最大的区别,在于它的内置循环。举个例子,在d盘里有一个数据文件,data.dat,存有三个数字:

1
2
3

用SAS读取这个文件并计算它们的和是很简单的事情。先看看其他语言是如何操作的,比如C++。C++是一门过程式兼面对对象的语言,下面的例子展示的是C++过程式的编程风格(不熟悉C++语法的朋友,可以只看中间加粗的部分):

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
     int x;
     int sum=0;
     ifstream inFile;
     inFile.open("d:data.dat");   
     inFile >> x;    

   
     while (!inFile.eof( ))     
     {
         cout<<x<<endl; 
         sum = sum + x;
         inFile >> x;              
     }


     inFile.close( );
     cout << "Sum = " << sum << endl;     
     return 0;
}

中间加粗的部分是一个循环,在没有到达数据末尾时(即“3”那个数字,代码中的条件是!inFile.eof(),其中,感叹号是not的意思,eof就是end of file。),持续输出文件里的数字并累加,结果就是

1
2
3
sum=6

以下的SAS代码产生同样的结果:

data _null_;
    infile "d:\data.dat" end=eof;
    input x;

    sum+x;

    put x;
    if eof then put sum=;
run;

上面的SAS代码,同样是运行直到文件的末尾,但它并不需要一个显式的循环来读取那文件里的3个数字(内置循环,说的就是这个)。理解SAS data step内置循环的特点,是SAS进阶的关键。详细的,可见Overview of DATA Step Processing

—————-

写不动了,下期预告,大伙新年愉快。

2.2 SAS BASE

SAS BASE不是门语言,而是一系列编程语言的大杂烩。它是在data step的基础上,加上其他编程元素,如SQL、Macro、ODS和一些proc steps等。只有最顽固(可能也是最骄傲)的SAS程序员仍然坚持2.1的风格,大多数SAS程序员都是使用SAS BASE进行混合编程。当我们是SAS编程语言的时候,一般说的就是这个SAS BASE。它是SAS系统的一个模块(或软件),与SAS/STAT等模块并列。

2.2.1 PROC SQL

2.2.2 过程步(PROCs steps)

2.2.3 宏(Macro)

(to be continued)

R与SAS的集成

$
0
0

一、为什么R与SAS要集成?

一位优秀的分析师不仅要有深厚的理论功底、丰富的实战经验,还要熟悉几款常用的分析软件,并有一款自己精通的软件。就像武林高手既有独门秘器,又要熟悉各门各派,这样才能博采众长,兼收并蓄,为己所用。

竞争促进创新,合作带来双赢。R与SAS各有优势,也各有问题,国内外网上骂战得多,思考如何将两者集成并能拿出可行方案的人则少之又少,即便有也基本都是老外或者外籍华人想出来的。这里不想贬低国人,只想建议大家多一些独创和研究精神。

有人会问,为何要集成?这里引用网上一位作者给出的观点,虽是一面之词,但不妨参考,有些观点还是比较中肯的。

I work in an environment dominated by SAS, and I am looking to integrate R into our environment.

Why would I want to do such a thing? First, I do not want to get rid of SAS. That would not only take away most of our investment in SAS training and hiring good quality SAS programmers, but it would also remove the advantages of SAS from our environment. These advantages include the following:

•Many years of collective experience in pharmaceutical data management, analysis, and reporting
•Workflow that is second to none (with the exception of reproducible research, where R excels)
•Reporting tools based on ODS that are second to none
•SAS has much better validation tools than R, unless you get a commercial version of R (which makes IT folks happy)
•SAS automatically does parallel processing for several common functions

So, if SAS is so great, why do I want R?

•SAS’s pricing model makes it so that if I get a package that does everything I want, I pay thousands of dollars per year more than the basic package and end up with a system that does way more than I need. For example, if I want to do a CART analysis, I have to buy Enterprise Miner, which does way more than I would need.
•R is more agile and flexible than SAS
•R more easily integrates with Fortran and C++ than SAS (I’ve tried the SAS integration with DLLs, and it’s doable, but hard)
•R is better at custom algorithms than SAS, unless you delve into the world of IML (which is sometimes a good solution).

原文地址:http://www.r-bloggers.com/integrating-r-into-a-sas-shop/ 

二、集成的方式有哪些?

R与SAS的集成方式主要有以下几种:

1)SAS官方的支持:通过 SAS/IML 在SAS里面提交R代码

优点:

  • 因为R代码本质上是在R里运行,所以全面支持R的各种模型和函数。
  • 支持32位或64位的Windows、Linux操作系统
  • 数据交换、错误捕获等方面表现不错,支持SAS Format(关于Format是从资料上看到的,我没验证这个)。

缺点:

  • 需要购买 SAS/IML(9.22版本或更高版本),成本高

2)SAS官方的支持:通过 SAS Model Manager 将R模型导出生成的PMML文件翻译成SAS代码

优点:

  • 可以将生成的SAS代码快速集成到各种基于SAS开发的应用系统中
  • 可以将R模型和SAS模型进行预测性能方面的比较
  • 可以对R模型和SAS模型进行性能监测

缺点:

  • 需要购买 SAS Model Manager(12.1版本),成本高
  • 目前仅支持几种常用的PMML模型

3)民间研发:通过宏 Proc_R 实现在SAS里面提交R代码

PROC_R 于2012年发表在 Journal of Statistical Software 上,是一位华人 Wei Xin 在美国罗氏制药公司工作期间发表的。

优点:

  • 因为R代码本质上是在R里运行,所以全面支持R的各种模型和函数。
  • 不需要购买 SAS/IML,成本低。

缺点:

  • 只支持 Windows 系统,使用者如果有一定编程功底,可以将源代码改造成Linux可用的版本。
  • 数据交换通过 csv 文件实现,可能不支持 SAS FORMAT(有待验证)。
  • 错误捕获等方面略弱

4)民间研发:将R生成的神经网络和决策树模型翻译成SAS代码

优点:

  • 可以将生成的SAS代码快速集成到各种基于SAS开发的应用系统中
  • Windows、Linux都支持
  • 不需要购买SAS/IML或者SAS/EM,成本低。

缺点:

  • 目前只支持神经网络和决策树模型
  • 没有处理自变量取值缺失的情况

三、集成方式的详细介绍

以上四种方式我在下面的文章中有详细的介绍,有兴趣的同学可以阅读。

R与SAS的集成(一)

R与SAS的集成(二)

R与SAS的集成(三)

R与SAS的集成(四)

关联规则:R与SAS的比较

$
0
0

啤酒和尿布的故事是关联分析方法最经典的案例,而用于关联分析的Apriori算法更是十大数据挖掘算法之一(http://www.cs.uvm.edu/~icdm/algorithms/index.shtml,这个排名虽然是几年前的调查结果,但是其重要性仍可见一斑)。本文以《R and Data Mining》书中使用的泰坦尼克号人员的生存数据为例,介绍如何使用R和SAS的Apriori算法进行关联分析,比较两者的建模结果并对结果中存在的差异进行解释分析。

一、关联分析

网上有很多资料介绍关联分析算法,本文就不再赘述。我自己看的是《Introduction to Data Mining》(有对应的中文版,人民邮电出版社的《数据挖掘导论》),愿意看英文的同学可以访问:http://www-users.cs.umn.edu/~kumar/dmbook/ch6.pdf。网上其他的资料我也大致翻过,对比之后感觉这本书是一本相当不错的教材,算法方面介绍地比较全面且有一定深度。我本人不建议大家去看那些非专业人士总结的关联分析算法介绍,虽然浅显易懂,但是内容片面,容易误导初学者,错把树木当成了森林。

对于关联分析在行业应用中的经验分享、初学者的误区和最佳实践方面的资料很少,唯一能找到的一本好书是清华大学出版社的《啤酒与尿布》,主要介绍购物篮分析在零售行业的应用。我始终认为分析师除了算法和软件,还需要了解行业背景,不然挖出的只是模式,而不是切实可行并且能带来商业价值的模式,甚至还有可能是错误的模式。 

二、软件

我只用过R和SAS,其他的软件没碰过,所以只能对这两个软件进行比较。

算法 R/ARULES SAS/EM
Apriori Yes Yes
ECLAT Yes No
FP-Growth No No

据网友说Excel也能做关联分析,但是因为其对数据进行了抽样,所以每次运行的结果都不一样。SPSS的Modeler不知道怎么样,有用过的同学请分享一下经验,最好使用泰坦尼克号的数据进行分析,这样可以比较一下各软件的结果是否相同。

三、R的代码和结果

R的代码主要来自《R and Data Mining》,我只加了下载数据的代码和对代码的中文说明。

1)下载泰坦尼克数据

setInternet2(TRUE)
con <- url(“http://www.rdatamining.com/data/titanic.raw.rdata“)
load(con)
close(con) # url() always opens the connection
str(titanic.raw)

2)关联分析

library(arules)
# find association rules with default settings
rules <- apriori(titanic.raw)
inspect(rules)

3)只保留结果中包含生存变量的关联规则

# rules with rhs containing “Survived” only
rules <- apriori(titanic.raw, parameter = list(minlen=2, supp=0.005, conf=0.8), appearance = list(rhs=c(“Survived=No”, “Survived=Yes”), default=”lhs”),control = list(verbose=F))
rules.sorted <- sort(rules, by=”lift”)
inspect(rules.sorted)

R 总共生成了12条跟人员生存相关的规则:
lhs       rhs      support      confidence      lift
1 {Class=2nd, Age=Child}                         => {Survived=Yes}
0.010904134 1.0000000 3.095640
2 {Class=2nd, Sex=Female, Age=Child}  => {Survived=Yes}
0.005906406 1.0000000 3.095640
3 {Class=1st, Sex=Female}                      => {Survived=Yes}
0.064061790 0.9724138 3.010243
4 {Class=1st, Sex=Female, Age=Adult}    => {Survived=Yes}
0.063607451 0.9722222 3.009650
5 {Class=2nd, Sex=Male, Age=Adult}        => {Survived=No}
0.069968196 0.9166667 1.354083
6 {Class=2nd, Sex=Female}                      => {Survived=Yes}
0.042253521 0.8773585 2.715986
7 {Class=Crew, Sex=Female}                   => {Survived=Yes}
0.009086779 0.8695652 2.691861
8 {Class=Crew, Sex=Female, Age=Adult} => {Survived=Yes}
0.009086779 0.8695652 2.691861
9 {Class=2nd, Sex=Male}                           => {Survived=No}
0.069968196 0.8603352 1.270871
10 {Class=2nd, Sex=Female, Age=Adult}  => {Survived=Yes}
0.036347115 0.8602151 2.662916
11 {Class=3rd, Sex=Male, Age=Adult}       => {Survived=No}
0.175829169 0.8376623 1.237379
12 {Class=3rd, Sex=Male}                          => {Survived=No}
0.191731031 0.8274510 1.222295

4)去除冗余的规则

# find redundant rules
subset.matrix <- is.subset(rules.sorted, rules.sorted)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
which(redundant)

# remove redundant rules
rules.pruned <- rules.sorted[!redundant]
inspect(rules.pruned)

去除冗余的规则后剩下8条规则:
lhs       rhs      support      confidence      lift
1 {Class=2nd, Age=Child}                   => {Survived=Yes}
0.010904134  1.0000000 3.095640
2 {Class=1st, Sex=Female}                => {Survived=Yes}
0.064061790  0.9724138 3.010243
3 {Class=2nd, Sex=Female}               => {Survived=Yes}
0.042253521  0.8773585 2.715986
4 {Class=Crew, Sex=Female}            => {Survived=Yes}
0.009086779  0.8695652 2.691861
5 {Class=2nd, Sex=Male, Age=Adult} => {Survived=No}
0.069968196  0.9166667 1.354083
6 {Class=2nd, Sex=Male}                   => {Survived=No}
0.069968196  0.8603352 1.270871
7 {Class=3rd, Sex=Male, Age=Adult}  => {Survived=No}
0.175829169  0.8376623 1.237379
8 {Class=3rd, Sex=Male}                    => {Survived=No}
0.191731031  0.8274510 1.222295

5)结果的解释

对于结果的解释,一定要慎重,千万不要盲目下结论。从下面的四条规则看,好像确实像电影中描述的那样:妇女和儿童优先。

1 {Class=2nd, Age=Child}              => {Survived=Yes} 0.010904134  1.0000000 3.095640
2 {Class=1st, Sex=Female}           => {Survived=Yes} 0.064061790  0.9724138 3.010243
3 {Class=2nd, Sex=Female}          => {Survived=Yes} 0.042253521  0.8773585 2.715986
4 {Class=Crew, Sex=Female}       => {Survived=Yes} 0.009086779  0.8695652 2.691861

如果我们减小最小支持率和置信度的阈值,则能看到更多的真相。

rules <- apriori(titanic.raw, parameter = list(minlen=3, supp=0.002, conf=0.2), appearance = list(rhs=c(“Survived=Yes”), lhs=c(“Class=1st”, “Class=2nd”, “Class=3rd”, “Age=Child”, “Age=Adult”), default=”none”), control = list(verbose=F))
rules.sorted <- sort(rules, by=”confidence”)
inspect(rules.sorted)

lhs                        rhs           support     confidence lift
1 {Class=2nd, Age=Child} => {Survived=Yes} 0.010904134 1.0000000 3.0956399
2 {Class=1st, Age=Child} => {Survived=Yes} 0.002726034 1.0000000 3.0956399
3 {Class=1st, Age=Adult} => {Survived=Yes} 0.089504771 0.6175549 1.9117275
4 {Class=2nd, Age=Adult} => {Survived=Yes} 0.042707860 0.3601533 1.1149048
5 {Class=3rd, Age=Child} => {Survived=Yes} 0.012267151 0.3417722 1.0580035
6 {Class=3rd, Age=Adult} => {Survived=Yes} 0.068605179 0.2408293 0.7455209

从规则3和规则5以及之前的规则2和3可以看出泰坦尼克号获得优先权的主要是头等舱、二等舱的妇孺。

据统计,头等舱男乘客的生还率比三等舱中儿童的生还率还稍高一点。美国新泽西州州立大学教授、著名社会学家戴维·波普诺研究后毫不客气地修改了曾使英国人颇感“安慰”的“社会规范”(妇女和儿童优先):“在泰坦尼克号上实践的社会规范这样表述可能更准确一些:‘头等舱和二等舱的妇女和儿童优先’。”

这些是关于泰坦尼克号生存数据分析的资料:
泰坦尼克号逃生真相:“妇女儿童优先”只是个传说
历史没有那么温暖

6)可视化

# visualize rules
library(arulesViz)
plot(rules)
plot(rules, method=”graph”, control=list(type=”items”))
plot(rules, method=”paracoord”, control=list(reorder=TRUE))

对于不熟悉R的SAS用户,可以阅读以下资料学习R以及ARULES包:
http://cran.r-project.org/web/packages/arules/vignettes/arules.pdf
https://science.nature.nps.gov/im/datamgmt/statistics/R/documents/R_for_SAS_SPSS_users.pdf

四、SAS代码和结果

1)下载泰坦尼克数据

proc iml;
submit /R;
setInternet2(TRUE)
con <- url(http://www.rdatamining.com/data/titanic.raw.rdata)
load(con)
close(con) # url() always opens the connection
endsubmit;

call ImportDataSetFromR(“Work.titanic”, “titanic.raw”);
run;quit;

2)将数据转换成SAS/EM要求的格式

data items2;
set titanic;
length tid 8;
length item $8;
tid = _n_;
item = class;
output;
item = sex;
output;
item = age;
output;
item = survived;
output;
keep tid item;
run;

3)关联分析

proc dmdb data=items2 dmdbcat=dbcat;
class tid item;
run; quit;

proc assoc data=items2 dmdbcat=dbcat pctsup=0.5 out=frequentItems;
id tid;
target item;
run;

proc rulegen in=frequentItems dmdbcat=dbcat out=rules minconf=80;
run ;

proc sort data=rules;
by descending conf;
run ;

4) 只保留结果中包含生存变量的关联规则

data surviverules;
set rules(where=(set_size>1 and (_rhand=‘Yes’ or _rhand=‘No’)));
run;

proc print data=surviverules;
var conf support lift rule ;
run ;

SAS 结果:

Obs CONF SUPPORT LIFT RULE
1 100.00 1.09 3.10 2nd & Child ==> Yes
2 100.00 0.59 3.10 2nd & Child & Female ==> Yes
3 100.00 0.50 3.10 2nd & Child & Male ==> Yes
4 97.24 6.41 3.01 1st & Female ==> Yes
5 97.22 6.36 3.01 1st & Adult & Female ==> Yes
6 91.67 7.00 1.35 2nd & Adult & Male ==> No
7 87.74 4.23 2.72 2nd & Female ==> Yes
8 86.96 0.91 2.69 Crew & Female ==> Yes
9 86.96 0.91 2.69 Adult & Crew & Female ==> Yes
10 86.03 7.00 1.27 2nd & Male ==> No
11 86.02 3.63 2.66 2nd & Adult & Female ==> Yes
12 83.77 17.58 1.24 3rd & Adult & Male ==> No
13 82.75 19.17 1.22 3rd & Male ==> No

有关SAS/EM关联分析的公开资料很少,产品的在线帮助文档大概从4.3以后的版本就设置了访问权限,只有SAS/EM的用户才能阅读,新版本的功能和界面跟4.3版本有很大差别。这里只能给大家一些4.3的帮助文档,主要是上面代码中用到的几个过程步:http://support.sas.com/documentation/onlinedoc/miner/em43/dmdb.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/assoc.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/sequence.pdf
http://support.sas.com/documentation/onlinedoc/miner/em43/rulegen.pdf

mbscore(购物篮数据的预测,是EM 6.1/SAS 9.2 时新引入的过程步,支持层次关联<Hierarchical Association>)

五、结果比较

从上面的结果看,R生成了12条规则,而SAS生成了13条规则,对比每条规则后,发现SAS的第3条规则在R中没有。

3 100.00 0.50 3.10 2nd & Child & Male ==> Yes

我猜测原因是两个软件对最小支持度的处理不太一样,SAS可能是对最小支持度百分比乘以总记录条数后取整了。此处,泰坦尼克数据总共有2201条记录,最小支持度百分比为 0.5%,两者相乘积为11.005,而 2nd & Child & Male ==> Yes 这条规则总共出现过11次,如果严格按照实数大小比较,不应该出现在最后的结果中,但是如果按照整数部分比较,则结果正确。打算将SAS模型切换到R或者将R模型切换到SAS的同学要注意这个差异,结果有时不完全一样!

data min_support;
set frequentItems;
if count=int(2201*0.005);
run;

proc print data=min_support;
run;quit; 

Obs SET_SIZE COUNT ITEM1 ITEM2 ITEM3 ITEM4 ITEM5 ITEM6
1 3 11 2nd Child Male      
2 4 11 2nd Child Male Yes    

相比SAS,R关联分析中比较吸引人的功能就是从规则集中去除冗余的规则,这一功能SAS里面好像没有(我没找到)。SAS用户如果想要使用R的这个功能,我找到的唯一办法就是将SAS的关联规则导出成PMML文件,然后再将PMML文件导入R生成对应的Rule对象,但是这个方法因为我的环境有点问题,所以我自己没试。

有兴趣的同学,可以看看下面的资料:
1)如何将PMML文件导入R生成Rule对象
2)如何在SAS EMM 中使用PMML?

附:PMML技术的未来

对于模型的部署和使用,尤其是跨软件、平台的使用场景下或者对于大数据的分析,PMML是一个可行的解决方案,有一些厂商已经在自己的产品中通过PMML这种方式来实现对大数据的分析预测。

Zementis:
Deploying Predictive Analytics with PMML, R evolution R, and ADAPA
PMML: Accelerating the Time to Value for Predictive Analytics in the Big Data Era

IBM:Database Mining Guide


2012年SAS公司博客排名

$
0
0

想要了解和学习 SAS 产品的同学,一定要看看这个博客排名,因为这里有你需要的绝大部分资料,从数据处理、图形显示、分析、培训到最新的技术和产品信息。

前10名:

1. The Do Loop
Rick Wicklin, 博士, SAS 公司计算统计学方面资深研发人员,PROC IML 和 SAS/IML Studio 的首席开发工程师。精通计算统计学、统计图形、现代统计分析方法,是 Statistical Programming with SAS/IML Software 这本书的作者。

博客热词:
Bootstrap and Resampling Data Analysis Efficiency Getting Started Just for Fun Matrix Computations Numerical Analysis Reading and Writing Data Sampling and Simulation SAS/IML Studio SAS Programming Statistical Graphics Statistical Programming Statistical Thinking Tips and Techniques

2. The SAS Dummy
Chris Hemedinger, SAS 公司全球服务部门的技术架构师,隶属于 SAS 专家服务部门。他是畅销书 SAS for Dummies 的作者之一(该书国内有卖,但是没有翻译成中文),并且是 SAS® Enterprise Guide® discussion forum 的积极参与者。

SAS 公司 JMP 软件的官方博客,博客内容由 JMP 研发、市场、培训、技术支持和销售团队全力打造。JMP 是一款深受客户喜爱的产品,从其博客排名也可看出这点。
4. The SAS Training Post
SAS 公司各种培训资料和信息,包括一些分析会议的信息。

博客热词:
analytics analytics conference business intelligence career Cary certification custom customizing data analysis data mining data step e-Learning email enterprise guide estimate statement excel exchanging ideas forecasting gmap graphics how to learn sas JMP jobs macros map maps miss sas answers ods ods document ods pdf proc sql programming programming efficiency sas sas/graph sas global forum SAS Jedi SAS macro sas ondemand for professionals sas programming 1: essentials sas training SAS Web Report Studio statistical training statistics tips and tricks

5. SAS Voices
去过 SAS China 的人恐怕都看到过 SAS COM 这本杂志,这个博客的内容远多于 SAS COM。

6. The SAS Book Shelf
SAS 公司出版发行的书讯,就是书比较贵,钱少的同学可以去百度文库上搜搜电子书。

7. Real BI for Real Users
Angela Hall,SAS Solutions On-Demand 部门,管理一个团队,负责 SAS Fraud Framework(欺诈管理框架)开发。  Angela 是 Building Business Intelligence using SAS: Content Development ExamplesThe 50 Keys to Learning SAS Stored Processes 这两本书的作者之一。

博客热词:
Access Engine Add-In to MS Office Administration Analysis BI Dashboard Business Intelligence DI Studio Enterprise Guide GRID IIS Information Maps Installations jBoss Management Console Maps Metadata ODS OLAP Portal Prompts SAS 9.2 SAS 9.3 SAS BI Book SASGF Security SGF Stored Processes Twitter Web Report Studio

8. SAS Users Group
面向 SAS 全球用户组,内容涉及全球用户大会、发表的论文等等。

博客热词:
analytics big data business analytics business intelligence call for papers chris hemedinger data mining data step Debbie Buck Friday’s Innovation Inspiration high-performance analytics IFSUG Inside SAS Global Forum local users groups macro MWSUG NESUG papers & presentations personal agenda builder PharmaSUG posters proc programming SAS-L SAS Administrators sascommunity.org sas enterprise guide SAS Global Forum sas presenters series SAS Rock Stars sas training scsug SESUG sneak peek social media social media analytics statistics student ambassador program student scholarship programs tips & techniques twitter Unofficial Official Guide US Regional Conferences video wuss

9. Graphically Speaking
SAS 公司图形显示方面专业的博客,内容由多名 SAS 专家提供。图形显示是一个既有创新又有行业标准的工作,想用 SAS 生成各种漂亮专业的图形,从这里开始可以令你事半功倍。

博客热词:
AE timeline Axis Offsets Band Plot BarChart Bar Chart Box Plot Clinical Graphs Cluster Cluster Groups DiscreteLegend Discrete Offset Dot Plot Forest Plot Groups GTL Heatmap HighLow Plot Histogram Layout Lattice Layout Overlay Log axis MarkerChar MarkerCharacter NBSP non-proportional Font ODS Graphics ODS Graphics Designer Overlay Pie Chart Proc SGPANEL Scatter Scatter Plot ScatterPlot Scatter Plot Matrix Series Series Plot SGPLOT SGPLOT procedure SG Procedures Tips VBAR VBARPARM Vector Plot XAxis YAxis

10. Information Architect
SAS 公司数据整合产品对外的博客,上面有关于数据整合、Dataflux 产品、大数据、高性能分析等所有跟数据处理相关的内容。

博客热词:
allanalytics analytic center of excellence analytics Anne Milley Becky Graebe big data Big data analytics business analytics business intelligence business IT alignment CIO cloud collaboration data driven decision making data federation dataflux data governance data integration Data Integration Studio data management data migration data preperation data quality data storage gartner hadoop high-performance analytics high-performance computing information management information overload information strategy innovation insurance IT Mark Troester mobile nrf power series retail risk SaaS sas sas/access Stuart Rose TDWI

COS访谈第四期:谢梁(微软)

$
0
0

xie-liang-pic
【COS编辑部按】受访人:谢梁

简介:谢梁,现微软(西雅图)高级数据科学家,在各大SAS论坛混迹的朋友也许不知道他的真名,但oloolo这个id可能大家都非常熟悉。本站小编谢益辉有幸在西雅图得遇谢梁真身:本家相逢,又是同行;把酒言欢,各自买单;幸甚至哉,采访即来。谢梁的个人技术博客。(因为现在不用SAS了,目前更新速度比较慢),更多信息,参见LinkedIn页面

1. 请介绍一下你自己

我2000年从西南财经大学金融系毕业,毕业后到中国工商银行工作。一年后辞职到纽约州立大学Binghamton分校学习应用计量经济学。我博士导师Subal Kumbhakar主要研究领域是生产力分析和应用计量经济学,包括面板数据分析和随机边界分析,不过我对一般统计方法更感兴趣。研究兴趣主要是各种混合模型(mixed model)和数据挖掘的方法,还有就是挖掘SAS的潜力。。。。这些也跟我的工作有关。最好的工作就是你感兴趣的工作,我觉得这方面我很幸运,每天的把自己的兴趣爱好抽一块出来就完成工作了。

平时爱好越野和户外活动,对美式轻卡和各类越野车兴趣很大。上网灌水也是爱好之一,在SAS论坛帮人解决编程问题并且学习别人的经验也是我自己SAS编程水平提高最快的途径。

2. 请谈谈当初为什么选择进入统计或数据分析领域

我在中国工商银行从事信贷评估,算是很不错的工作,但是因为两个原因选择出国进修。一是确实不胜酒力,身体吃不消;另外自己本科时候就对数量分析兴趣很大,本科毕业论文用回归分析研究货币流通速度对通货膨胀的影响,虽然只是把课本上的样本模型运用中国的数据跑了一遍,但是觉得是很神奇强大的工具,有必要深入了解;后来在从事了信贷评估工作以后发现实证数量分析确实是商业价值巨大,于是选择出国学习计量经济学。

研究生计量经济学头两门课是我博士导师授课,用的是William Greene那本著名的计量经济分析,因为他是我老板的好友。不过个人感觉这本书当做参考书更合适J。虽然上课都在推导公式,不过对于公式的来龙去脉没有更深入的讲解,我觉得没有学通,于是跑到数学系旁听统计课(SUNY-Binghamton的统计学在数学系里面),我导师也鼓励我去数学系跟班学习更深入的理论。虽然跟他们的博士生一起学习考试压力山大,但是这方面打好的基础对我以后进一步扩展自己的知识面帮助很大。在数学系修了测度论和很基础的抽象代数,因为起点低,学得时候很痛苦,但是学完了以后再看本专业论文就有从一目一行变一目十行的感觉,这个变化我觉得很神奇。

学术上自然是受博士导师影响最大,最重要的一点就是要博闻广记,相关的领域都要涉猎一下,看看别人在他们的领域有没有跟自己类似的问题要处理,如果有别人是用了什么理论,方法和工具,自己能怎么改进一下。拿来主义换一种说法就是交叉学科。。。当然这个是我的理解。

3. 请谈谈你的研究成果、贡献

我不是从事科研工作,所以谈不上什么研究成果和贡献。最近我跟俄亥俄州立大学的Laurence Madden教授合作的一篇论文刚被Journal  of Statistical Software(JSS)接受了,是基于SAS的HPMIXED写的解大规模广义线性混合模型的%HPGLIMMIX宏模块,对植物学,基因学以及实验设计需要用到大规模广义线性混合模型的研究人员应该有用。相对于R的LME4包,因为HPMIXED对固定要素和随机要素的设计矩阵都应用了稀疏矩阵的算法,而LME4目前只对随机要素的设计矩阵应用了稀疏阵算法,所以对于很多含有大量固定要素的实际问题还是没我们的%HPGLIMMIX宏快。在SAS/STAT 12.1里面,HPLMIXED既支持分布式计算也支持多核多线程,这个宏稍加改造就能用这个最新的分布式计算高性能过程,所以在速度和模型规模上近期能保持对LME4的一些优势。

至于项目嘛,厚脸皮地自夸一下,我做的都很成功,就简单的谈一个。我在一家能源公司做高级分析师的时候,需要帮他们分析智能电表汇总的数据。智能电表每隔15分钟把用户的用电量回传给我们的服务器。当时管理层知道有这个数据,但是不知道怎么把这些数据变为有用的资产,于是我就领命,负责规划一个商业案例,把这些数据用起来。这个有两个难点。一是从业务上这是个开放式问题,没有具体的问题要解答,也没人能给与指导,大家都等着看我搞出个东西来;二是相对所使用的硬件,在技术上这个也算个big data了,因为我们有50万住户1年多的数据,每人每天15分钟一个观测值,大约30个GB,而我只有一台普通DELL 商用电脑,4GB内存不过是32位windows操作系统,硬盘虽然有两个,但是都是5400转的。还好我有SAS和R。我在R里面把用SAS随机选出来的1万名用户每天的总计用电量处理以后画了一个光栅图,发现和基因表达研究里面的microarray很像,后来应用了2001年PNAS上Orly Alter, Patrick Brown, David Botstein的一篇文章里介绍的用奇异值分解矩阵降维去噪,再用基于第二三个特征向量和观测值的相关系数做聚类分析的方法研究了数据,发现了潜在的商业价值。具体的计算是用SAS解决并R验证,画图是用的R,因为公司没有买SAS图形模块。

扎实的数据分析、漂亮的图表帮助我把这个项目成功地向管理层推销了出去。从构思商业案例到寻找分析手段并且在比较落后的平台上实施再向管理层推销花了我不少心思,也让我学到了很多东西,受益匪浅。

4. 你常用什么模型以及软件?

我本科时候用SPSS,毕业以后再也没碰过。研究生的时候主要就用SAS,博士论文的模型计算都在SAS里面编程,我不得不说如果当时用R,我的论文写作会轻松许多。后来在工作中用了R,觉得比SAS/IML方便,一是整个框架比SAS/IML先进,二是现成的统计包很多,对于很多东西能够信手拈来直接用,节约很多编程的时间。R的绘图比SAS要更简便,驱动好。现在主要用C#和微软内部的一种系统,有时候用R和Python。公司没买SAS给我,就不用SAS了。当然SAS在处理低于10GB级别的数据上还是很有优势。而且SAS按行处理数据的方式比较符合大数据时代的编程模式。值得提的一点就是我一直在用的分析软件当属EXCEL 无疑。微软最新推出的PowerPivot和PowerView给与Excel2013非常强大的数据分析能力。

我对统计模型没有偏好,哪个适用于我的分析我就用哪个。我的工作有时候需要很复杂的数学模型,有时候只需要按照类别算几个简单的平均数,具体情况具体分析,这个能力本身也是工作技能之一。

说到底软件和统计模型都只是解决具体问题的工具而已,了解这些工具,学会选择用什么工具是一个很重要的技能。

5. 从面试官的角度来说,统计和相关专业的应聘者参加面试时应该注意哪些方面?

统计或者相关专业本身是个辅助角色,是为决策者定下决心提供参考意见的一方。从这方面考虑,对这些专业的面试者就有几个要求。

第一,理论上对本专业的基础要扎实,特别是不能只知道推导公式,而是要知道如果应用了某一个统计概念,那么就必须对这个概念背后的背景知识,假设和利弊,以及典型案例都有深入的了解。了解背景知识和典型案例有助于向没有任何统计背景的决策者解释如何理解你提供的参考意见;知道假设条件和利弊有助于对别人可能的疑问做到心里有数,被问到才不慌,人不慌才能给决策者信任感,有了决策者的信任感,你的成果才能推而广之。

第二,从技术层面,现在最重要的是要有较强的编程能力,很多人都说自己会SAS,会R,会python,几年经验,但是这些软件涵盖的范围都很广,需要学一些计算机算法的东西,并且集中把几个方面的东西都学得比较深入,就是能达到茴字有几种写法的程度。很多人觉得没必要,我个人觉得其实很有必要,特别是对于面试来说。那么我就来谈谈面试。

面试的时候,必须要带着面试官走,而不能被面试官带着走。这需要两方面能力。一是自己掌握很扎实的知识和技能;二是面试的技巧,缺一不可。面试技巧很多,讲解的文章和书籍也很多,我只谈一方面。在面试官问了一个问题以后,不要急着回答,而是要先分析他为啥问这个问题,然后从这个问题可能涉及的背景出来来回答。举例说明:面试官小明问面试人韩美美,如何知道在美国各种颜色的轿车占什么比率?如果韩美美一上来就回答具体怎么做不算好的回答。相反,如果韩美美先向小明指出他问的这个问题属于估计总体的问题,就能给面试官一种高屋建瓴的感觉;然后具体指出针对估计类问题,可以应用采样的统计手段,而统计采样就可以多种多样了,比如可以到选取几个典型的大购物场的停车场去采样,看看各种颜色轿车的比率;也可以上网查阅销售数据,也可以给各个汽车公司发调查表格等。最后再解释一下各种方法在实施上以及效能上的利弊,那么这才算一个完整的答案,而且是牵着面试官沿着你的思维在走,可以有备而来;否则面试官可能针对任何一点提出完全意向不到的问题,情况就很容易失控。

在统计分析中,很多问题有很多种分析角度和方法,对照着研究学习就能了解不同方法之间的差异。平时练习茴字有几种写法其实就是这么一个过程,帮助自己深入了解和比较所学理论和工具的优劣,从而达到对整个体系融会贯通的目的,那么无论面试官怎么问,你都可以变被动为主动,从容引导面试官顺着你的思路来认识你的优点,顺利拿到工作。

6. 对统计之都有什么意见/建议?

我还没资格统计之都提意见。统计之都搞得有声有色,红红火火,好文章越来越多,名气越来越响。作为读者和粉丝希望能看到更多更贴近商业应用,贴近最新技术发展的文章,尤其是现在统计分析和大规模计算越来越密不可分,这方面的专题会吸引很多读者,比如最近的RHadoop就很不错。另外做一些比较客观的统计软件功能比较也许很有趣。

7. 牛排你通常要几分熟的?

Medium rare