r语言实现svm代码怎么实现把gene表达分出高低两组

[转载]GEO&:&Affymetrix&CEL文件&CDF文件&R语言处理方法
背景介绍:
1)Affymetrix:
Affymetrix的探针(proble)一般是长为25碱基的寡聚核苷酸;探针总是以perfect match
和mismatch成对出现,其信号值称为PM和MM,成对的perfect match
和mismatch有一个共同的affyID。
CEL文件:信号值和定位信息。
CDF文件:探针对在芯片上的定位信息
Affymetrix exon array :Affymetrix的外显子芯片
2)exonmap包:
用来分析Affymetrix的外显子芯片(需要用到affy包)。(;)
3) affy包:
分析Affymetrix寡聚核苷酸芯片的包 ()。
3)X:MAP数据库:
利用Ensemble数据库和Affymetrix的注释数据,实现探针,外显子,基因,转录产物之间的转换。()
4)CDF包:
是Bioconductor的metadata包中的一种,从CDF文件中提取探针在芯片上的定位信息,然后存在CDF包中。更多的metadata包见:。
外显子芯片的CDF包可从下载。
准备工作:
1)安装并导入包:exonmap,affy, CDF包(如:exon.pmcdf)。
2)数据(*.CEL文件)和数据描述文件(空白符分隔的文件,默认名为covdesc)放在一个文件夹中,并设置这个文件夹为R的当前目录。covdesc的第一列是CEL文件的名称,其它列是实验的描述信息(如:正常,疾病)。注意:covdesc的第一列没有列标题,而其它列有列标题。
数据分析:
1)读取数据:
read.exon()函数用来读取CEL文件的数据;exon.pmcdf是Human的外显子CDF包;rma是affy包里的函数,用Robust
Multi-Array Average expression measure方法把AffyBatch
格式的数据转换成exprSet。示例程序:
raw.data &- read.exon()
if (exists(raw.data)) {
raw.data@cdfName &- "exon.pmcdf"
x.rma &- rma(raw.data)
2)挑选差异表达的探针:
pc()函数返回一个PC类的对象,包括两部分fc和tt,fc是log2 fold
change,而tt是t检验的P值。示例程序:
pc.rma &- pc(x.rma, "group", c("a", "b"))
sigs &- names(fc(pc.exonmap))[abs(fc(pc.exonmap)) & 1 & tt(pc.exonmap) &1e-04]
3)探针,外显子,基因,转录产物之间的转换:
需要用到X:MAP数据库。示例程序:&&
xmapDatabase("Human")
sig.exons &- probeset.to.exon(sigs)
sig.genes &- probeset.to.gene(sigs)
函数probeset.details,exon.details,transcript.details
和gene.details可用来提取细节的注释信息。
4)探针过滤:
探针根据其匹配到基因组上的次数和质量被分为四类,select.probewise()和exclude.probewise()函数可用来选择和去掉某类的探针。示例程序:
select.probewise(sigs, filter = "intronic")
sigs.nomt &- exclude.probewise(sigs, filter = "multitarget")
四类探针:
"intronic": 匹配上1个基因,但没匹配上外显子。
“exonic”: 在基因组上仅匹配上一次,且匹配上1个基因里的1个外显子。
"multitarget":至少一个探针在基因组上有两次匹配。
“intergenic”: 在基因组上仅匹配上一次,且没有匹配到基因。
5)基因的图形展示:
plot.gene()函数用来图形展示基因,还可以根据信号值,fold
change,t检验的P值使用不同的颜色。其它的画图函数:plot.gene.graph(),gene.strip()。示例程序:
plot.gene("ENSG")
plot.gene("ENSG", x.rma, 1:3, 4:6)
plot.gene.graph("ENSG", x.rma, 4:6, 1:3, draw.exon.border = F,
scale.to.gene = F, ylim = c(0, 16), type = "median-int")
gene.strip(c("ENSG", "ENSG"), x.rma, 1:3, 4:6, type = "mean-fc")
6)可变剪切(Splicing index和Splicing ANOVA):
index是外显子探针和基因表达值得比值,可用来衡量两类样本间外显子的特异表达。Splanova()函数用MIDAS()方法,衡量多类样本间的可变剪切,给出探针的F值和显著性。示例程序:
si &- splicing.index(x.rma, c("ENSG", "ENSG"), "group", c("a", "b"))
更细节的关于Splicing index和Splicing ANOVA的说明,见:Affymetrix的文档“Alternative
transcript analysis methods for exon arrays”.()。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。苹果/安卓/wp
苹果/安卓/wp
积分 394, 距离下一级还需 56 积分
权限: 自定义头衔, 签名中使用图片
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡下一级可获得
道具: 抢沙发
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
开心签到天数: 4 天连续签到: 2 天[LV.2]偶尔看看I
Motivation:最近常常被院里(经济学院)的本科生问起究竟应该选择那种统计软件,例如R/SAS/STATA/Matlab/Eviews/SPASS,比较极客一点本科生甚至考虑学习numpy/scipy/pandas这种基于python的数据处理包。另外,随着最近互联网金融大热,许多人对于网络爬虫产生了兴趣,总是想着能从淘宝之类的网站爬点数据研究研究,但爬虫对于完全没有编程基础的经济学学生而言学习曲线却很陡。楼主对数据处理和爬虫方面的问题也算小有心得,但是总觉得当时给学弟学妹的回答不够全面,怕误人子弟,所以决心专门开一贴把自己这么多年来使用统计软件的心得给好好总结一下。此外,经济学研究中遇到的编程工作基本上都是I/O(INPUT/OUTPUT) intensive以及interactive的,这和一般的编程需求很不一样,楼主所有的编程和计算机知识都是自学的,因而知道对于一个非计算机科班出身的经济学人来说,什么东西最该学,什么东西最难学。当然楼主深知吾生有涯而知无涯,本帖的目的主要是给那些对于统计软件、爬虫、数据库等感兴趣的学弟学妹分享经验。楼主既非计算机科班出身,在这发帖已经做好了被打脸的准备……
楼主学术背景:从本科到博士都经济学上来的,从本科开始算起,使用SAS已经快有<font color="#年了,SAS很多模块(ACCESS/EM/IML/HPA等)也都玩过,但是最近基本都投入到了R的怀抱,几乎所有数据处理都使用R。此外,基于兴趣和研究需要,楼主还涉猎了爬虫(python/scrapy)、数据挖掘(java/weka,python/scikit-learn)、数据库(MySQL)等领域。在项目上,基本上各种奇葩的数据类型也都处理过,自己也在实验室搭建了具有几十亿条观测的数据库,爬虫——数据清洗——入库——文本挖掘——可视化也能一个人搞定。当然以上全部都是学术需要的level,真正生产环境的项目楼主是没接触过的,不过对于大多数小伙伴们而言,有多少人的最终目标是开发一款商业化的软件呢?
楼主性格:性格和编程能力本无关系,但在学习上,有时一点点完美主义能够让你比别人学得更加深刻。秉承处女座光荣的完美主义传统,楼主在遇到问题时总是竭尽全力希望弄个明白而不是似懂非懂能用就行,写程序也不断追求更加efficient的版本,这也部分导致楼主对软件的原理与背景比别人钻研的更深一些(对,楼主知道“局部优化是恶魔”,你不用再提醒我了)。例如,楼主一开始学习SAS,花了大量的时间在了解PDV(programdata vector)的工作原理上,虽然起步看似慢了,但掌握PDV是成为SAS高手的必经之路。又如楼主学习R, 最初看的是“the art of R programming”,初看之后觉得R弱爆了,每次引用一个data.frame的变量都要带上data.frame的名字,例如“df$myvar”,而且 performance貌似比SAS要低很多。然而楼主随后花了大量时间在stackoverflow等论坛上翻阅R相关的帖子,最终发现了RevolutionAnalytics开发的RRO,以及dtata.table、dplyr、doParalle等简直可以称作“life-saver”的包,顿时觉得R不仅在语法上比SAS灵活太多,而且performance也惶不多让!再例如,MySQL语法其实非常简单,可能一天就能熟练运用了(感兴趣的小伙伴可以去看“samteaches you mysql in 24 hours”),但数据库的精髓在优化,学习数据库最好能学习一些优化的知识。例如,如果稍微懂一点SQL中索引的B-tree原理,那么很多时候你就知道什么时候该建索引什么时候不该建,这对程序的performance至关重要,而且对于你学习其他软件具有巨大的帮助。总之,楼主这段说了这么多,核心思想就是处女座其实挺好的……
好了,水了这么多,咱们进入正题吧。本帖主要讨论以下几个方面:1)你需要什么样的统计软件:SAS or R,2)爬虫与数据库,3)python与其他
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
总评分:&经验 + 100&
论坛币 + 100&
学术水平 + 1&
热心指数 + 1&
本帖被以下文库推荐
& |主题: 247, 订阅: 110
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
本帖最后由 iRoss2007 于
23:32 编辑
一、你需要什么样的统计软件:SAS or R
我被问得最多的问题是“xx软件好用吗?”、“xx软件难不难”之类。其实会xx软件的人都清楚,这种问题是最难回答的,毕竟难者不会,会者不难。楼主认为,初学者应该改变自己最初的问题,与其问一个软件难不难,不如问“我要实现xx需求,xx软件能满足我吗?如何满足?语法是否灵活简介?性能是否足够?商业/社区支持是否充分?”。这些问题基本决定了你适合学习什么软件,由于统计软件的使用具有强大的路径依赖性,同时使用多个软件远不如精通一门来得高效,所以在选择你的语言之前,仔细思考以上问题对你大有裨益。楼主比较熟练的有SAS与R,故下文主要就这两门语言进行讨论,期间会偶尔涉及到其他语言,例如MySQL、python、Matlab,以及非常小众但迅速发展的Julia。此外再次重申,下文所有比较与结论都仅针对大多数的经济学研究
语法灵活性(syntax)
对于90%的人的90%的需求,其实绝大多数语言都可以胜任,关键在于寻找语法最简洁、最灵活的那一种语言。假设解决你的问题有两种方法:第一种,使用半个小时来编写直观、易懂、简短的程序,然后花一个小时来运行;第二种,使用一个小时来写一段晦涩的代码,然后只要30分钟就能跑出结果,你选择哪一种?这几年论文写作与数据处理的经验告诉我:在syntax(readability)和performance之间,我宁愿选择前者,这也是我现在从SAS阵营转战到R阵营的最大原因。(另外原因包括楼主英文名以R开头,以及微软收购了商业化R语言公司RevolutionAnalytics。对,楼主是微软脑残粉,写python的IDE都用的是VisualStudio,所以微软看上的都是好东西(捂脸)……)
为什么楼主认为在经济学的研究中,SAS的代码会更长更晦涩?还是从我们的需求看起,经济学研究中用到的数据处理,主要有两个特点:I/O intensive以及interactive,而R语法的灵活非常适合应对这两个特点。先来看I/O intensive,我们进行的数据处理,大致可以分为CPU intensive与I/O intensive两类。顾名思义,前者需要大量的CPU运算,这在模拟中非常常见,后者需要大量的磁盘读写操作,这在数据清洗中非常常见。绝大多数的经济学研究中遇到的数据处理需求是I/O intensive的,这由学科性质所决定:社会科学注定要搜集大量原始的“脏”数据并进行诸如删除缺失值、连接表(table join)等各种I/O操作(你想想看你自己写代码的时候是不是把绝大部分时间花在这些事上了),而自然科学的数据一般更加规范,它们会花更多时间在计算上,你看matlab的字符串函数远不如SAS的字符串函数强大就知道理工科其实对于数据处理的要求远没社会科学多。
其次,我们的编程活动又可以分为interactive与programmatic(在SAS中称为batch mode)两类,前者是一个探索的过程,这在我们写论文的时候很常见。因为几乎没有时候我们一开始就知道模型应该如何设定,大牛们写文章也是各种“play with your data”、“try-and-error”过来的,因此我们需要不断尝试与修改我们的代码,往往在所有coding时间中,95%的是用来调试,而只有5%的时间是用来复用最终版本的代码。甚至在我们获得那个“最终版本”的代码后,我们的文章也写完了,代码也就没用了。相反,在生产环境中,更多需要的是programmatic的编程,比如程序员花了5%的时间在开发环境中写完了一段代码,剩下95%的时间都是这段代码在生产环境中的不断复用。
为什么说这两大特征使得R的语法产生优势了呢?首先,I/O intensive决定了你大多数coding的时间都会花在数据清洗上,因而你需要寻找一门在data manipulation上语法非常简洁的语言;其次,interactive的编程需要你拥有快速将想法转化为代码的能力,转化代码的时间越少,转化后的代码越短,越有利于你思考问题。在这两方面,R都具有优势。
举特例子,现在我有全国每个省的GDP,然后我想比较下每个省和全国的均值相差多少。如果用SAS,那么我首先需要用proc means来统计全国的均值,然后通过output语句将结果输出,假设输出数据集是means吧,然后我还得把数据集means给join回原来的数据集,关键是在join的过程中还要用到 if _n_ eq 1 then set...这种非常tricky的技巧,这对于初学者和不懂PDV的人简直是噩梦啊!更关键的是,类似的操作我可能经常进行,每次都走一遍proc means – output – join的过程不仅非常繁琐,还可能出错。楼主在coding的过程中经常写了一半回过头看前面,就已经不知道前面的代码是要干什么的了,因为满满的全是proc means和proc sort,这时更别说回过头去看十天半个月前些的代码了,这时唯一能做的就是keep my head beating against the wall了啊!另外作为一个完美主义者,楼主希望每个数据集都能被优雅地、有意义地命名,但是看着那么多proc means输出的数据集楼主真是想死的心都有了啊!逼死强迫症啊!更加更加关键的是,也是我在此着重强调的:不到万不得已,千万不要join table!因为跨表操作,例如join,其过程往往非常抽象,你需要考虑一对多,多对一,多对多这几种SAS中会出现的情况,如果你以前学过SQL,那么可能还会和inner join、outer join、Cartesian product等各种情况搅和在一起,绝对让你欲哭无泪!
那么R是如何解决的呢?如果你使用了R/data.table,那么一行代码就可以搞定:
Dt[,gdp_delta := gdp – means(gdp)]
另外一个SAS中常遇到的问题是“retain/sort的诅咒”(我自创的词,囧)。我们都知道,SAS基本上是逐条处理数据的(sequentially access)的,处理过的数据就被丢弃,如果需要用到前几条的数据,不得不用retain/by或者lag语句,而为了使用retain/by语句,必须提前做一个proc sort步。但可谓成也萧何败也萧何,这种特性给予了SAS处理无限大数据的可能,但是严重影响了语句的灵活性。举一个最简单的例子,我现在有个数据集,记录了某人每天的消费,然后我想建立一个变量统计他的“累计”消费,在SAS中需要用到retain语句,如果有很多个人,我可能还要按照个人ID分组,然后使用first与last变量,代码如下:
procsort data =by id,
& && &retain cum 0;
& && &if first.date thencum = 0;
& && &cum +
而在R中也只需一行代码:
Dt[,sum := cumsum(expense), by = id]
为了实现一个小小的需求,我不得不多写8行代码,在写这8行代码的过程中,可能我就忘了当初是要做什么了。大家因此可以看出语法的简洁对于interactive编程来说是多么重要。原来,由于SAS语法在处理有些数据的时候不是那么简洁,楼主是MySQL语法和SAS语法混着用的(在SAS中调用SAS/ACCESS访问MySQL),现在,除了数据实在太大放不进内存只好用SQL语法,楼主处理数据已经全部换成了R。这种转换带来的最直观的变化是代码行数要少了很多,这为我日后回顾代码带来了巨大的便利。
以上是我一直在强调经济学研究编程I/O intensive与interactive特性的原因:虽然SAS data step – proc step的philosophy可能在总体上有着更好的performance和robustness,但是毕竟我的目标是学术探索,代码是我思考的工具而不是卖给别人的产品,因此我需要有一种语法尽可能直观简介地表达我的需求,而不是某种运行更快但是冗长的语法,我在coding上花的时间越少,我在research上花的时间就越多。我在这引用R社区开发大神HadleyWickha的话,这个戴耳钉的assistant professor在谈到为什么会开发plyr、dplyr等包的时候说到:“程序员都说数据挖掘中70%的时间都花在数据清洗上面了,数据清洗不仅是数据挖掘的第一步,而且还会在整个数据挖掘的过程中不断重复,但是似乎专门研究如何减少这70%的数据清洗时间的研究还很少。我的plyr/dplyr/tidyr包就是为此而生的。我希望你们能用宝贵的时间去做更多更重要的事。”Thanks Hadley,thanks Matt, both of you you save my life.
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
本帖最后由 iRoss2007 于
23:32 编辑
2. 性能与并行计算(performance & parallelcomputation)
相对于syntax,performance相对而言不怎么受到经济学研究者的关注,因为一般来说(对于我所见的50%以上的研究生),经济学所要处理的数据都没有大到需要考虑performance的地步,而且因为上文提到过的I/O intensive特性,数据处理的瓶颈在磁盘,而除了使用大内存与SSD,貌似也没有什么特别好的提高I/O性能的方法(是的,所以楼主现在码字用的是32G内存 + 1TB SSD的地球人)。但话虽如此,performance总归是完美主义者追求的目标,而且对于那些经常做simulation以及quantitive trading的童鞋,performance还是很重要的。
要提高性能,最常见的办法就是并行计算了。并行计算可以在一个CPU的多个核上运行,也可以组建计算机集群多CPU进行,楼主的研究因为对于计算的要求不是那么大,因而只试过在单CPU的多个核上面进行并行运算,下文也就在此范围内展开讨论。SAS和R在这个方面可谓各有特色,伯仲之间吧。SAS的并行计算是被做到特定的proc步中的,而与数据处理最相关的data步都不支持并行计算。这就导致在SAS中能用得上并行计算的时候很少。当然现在SAS出了一个HPA(highperformance analytics)模块,支持将数据分散存储在不同的磁盘/分区中(strip storage),这样在读取的时候可以做到某种程度上的并行。楼主当年曾经很Geek地在一台四硬盘RAID 0的机子上体验了一下这个功能,发现对于中规模的数据(&=5G),没有明显速度上的提升,反而增加了操作的复杂性,故最终放弃。
至于R,并行计算主要是靠各种包,例如SNOW、doParalle等,部署这些包很简单,门槛比SAS要低很多,然而R的并行计算应用范围也比较特定,主要就是用在simulation上,比如各种Monte Carlo,此时速度提升是非常明显的。除此以外的应用场景,和SAS的data步一样,R并不怎么支持并行计算。其实并行计算也会产生很多headover,盲目追求并行的效果并不好。
另一点需要强调的是,R的performance很大程度上受使用者水平的限制,如果你安装了RRO(Revolution R Open,一个内置了Intel并行计算库的R版本)并且掌握了data.table、doParalle等包(在“(4)关于开源包”中详述),那么R的性能绝对让你放心,但如果你不知道这些包或不懂得如何正确配置,那么R的性能是远远比不上SAS的。而SAS就不一样了,它的并行计算整合在proc步中,只要你正常使用,你总会享受到它带来的便利。
总体而言,楼主觉得SAS和R在performance上面可以打个平手,不过想想SAS的数据存在磁盘中,而R的数据存在内存里,两者能打个平手,SAS Inc.的优化能力真是恐怖。需要注意的是,楼主并没有对两者的performance做过严格的对比,网上有一篇RevolutionAnalytics写的白皮书,宣称在同样使用集群计算(SAS/Grid与商业化的RRE)的情况下,R在性能上打败了SAS,是其10x ~ 300x。这个结果着实令人震惊,但是楼主对此保持谨慎态度,感兴趣的小伙伴请戳/whitepaper/revolution-r-enterprise-faster-sas。
3. 商业/社区支持(Support)
这方面可能关注的人更少了,但楼主觉得在选择一门语言中,商业/社区支持这一因素可能比该语言的性能更加重要!(如果没有APP store,你会买iphone吗?)和其他统计软件相比,SAS与R的商业/社区支持让其他软件望尘莫及。相对而言,SAS的支持比R要好,毕竟是商业软件,有大量mannual甚至book可以参考,我估计光写SAS/STAT模块的书可能就近百本了吧,而且这些文档都是well documented(楼主看SAS/help的时候简直是种享受)。然而R就不一样了,虽然有CRAN,但是每个包的mannual感觉都没“说透”,特别是example,和SAS比起来,简直称得上简陋。楼主第一次看R mannual的感觉就像一个用惯了VisualStudio的程序员突然只能用写字板写程序,心中有万头神兽奔过。然而使用了一段时间R以后,也就渐渐习惯了这种“简朴”的mannual风格。
其实,楼主写这段的目的不是比较两种语言的support孰优孰劣,而是告诉大家在选择语言的时候,一定要选择well supported的。那么,什么样的语言算是well supported的呢?遇到问题,我们又可以去哪里找帮助呢?
1.& &官方文档。常常见到很多菜鸟在论坛里求教:xx问题怎么办?在线等!这时老鸟一般都拽拽地给出一个关键词,然后说“自己去mannual”里找。楼主只能说这是一个50%负责任的回答。说其负责任,因为的确所有问题都可以从mannual里找到答案,而且mannual里面讲的是最清楚的。说其不负责任,因为对于菜鸟而言,基本操作都还不会,怎么看得懂如此深奥晦涩的mannual呢?在这里楼主的建议是:如果软件的文档写的非常好,比如SAS,那么多看看里面的example对于解决你的问题很有帮助,如果文档比较难懂,那我们还有其他方法——
2.& &Introduction/vignette/book/paper。对于绝大多数初学者而言,直接读mannual肯定不是最佳选择。这时往往可以先找一些introduction或者某个模块/包的专题文章来读。一般这样的“甜点”文章都是为初学者写的,或者只讨论某一个很小的功能,读起来门槛不大,但是能让人快速对软件有个大致了解。对于SAS而言,除了help,还有各种官方白皮书,以及SUGI paper。SUGI paper是SAS使用者大会上的投稿的collection,里面往往介绍了一些非常实用的工具或者对于某些常见问题的处理方法,楼主非常多的SAS技巧是从里面学的。对于R而言,就是那些vignette了,一般使用广泛的R包都拥有不止一篇的vignette,甚至还拥有自己的网站。所以当你不知道要选哪个包时候,果断选vignette最多的,这至少说明这个包还拥有旺盛的生命力,许多人在用他。
3.& &Stackoverflow/google/blog
Stackoverflow(SO)“是个神奇的网站”。作为世界上最大的程序员问答网站,宅男们在论坛上彬彬有礼地发言却不是为了拿种子,而是为了解决bug!(笑)SO有着严格的发帖质量控制程序,上面的问题很多都是现实中经常碰到的问题,而且在上面提问的人非常有礼貌。因此楼主建议你有问题了先别谷歌,而是先在SO上找找看。往往SO上的回答比谷歌上面良莠不齐的回答要好得多。楼主现在不仅把SO当作一个问答,还把他当成在线课堂,有事没事了就上去看看最近多了什么有意思的问题,顺便学几招。当SO也不能回答你的时候,你就只能依靠bing/google/baidu了,这时你的问题被回答的概率就靠你的搜索技巧了……
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
本帖最后由 iRoss2007 于
23:33 编辑
4. 关于开源包的一些想法
其实对于开源包的讨论应该归到上面对于商业/社区支持的讨论中,然而由于这个问题实在在太重要,楼主希望单独拿出来讲。总的来说,在体验过SAS的完美商业支持与R无所不包的开源包之后,楼主感觉对于学术研究而言,还是开源软件有优势。
开源软件的优势首先自然是免费啦。就拿楼主自己的经历说吧,当年有篇论文需要做文本挖掘,那时作为坚定的SASor,楼主首先想到的当然是SAS/EM,但楼主学校没有买EM(EnterpriseMining)模块,于是只能通过各种“你懂的”方法去寻找,花了好几天的时间,甚至尝试过把SAS9.2的EM模块移植到9.3中,最后好不容易装上了EM。然而一用楼主傻眼了,原来SAS对于每种语言的text mining模块都单独授权,我找到的那个连捷克语都有了,就是没有中文,然后对SID文件进行各种hacking也没用,当时真是万念俱灰。最后甚至落魄到决定先把中文分词之后转换成带声调的罗马字母与数字组合然后放到EM里面去跑,然而结果还是非常不理想。最后的最后,楼主看到了广为采用的基于JAVA的文本挖掘包WEKA,然后下决心从零开始学JAVA。楼主虽然当时对SAS已经很熟练了,但是对于c/java/c#/python之类的programmatic language还是一窍不通,可能这是很多经济学研究生普遍存在的问题吧!当然使用weka也不是一帆风顺,最大的问题就在于java孱弱的性能,还有令人头疼的读取文件问题,不过最终还是把问题解决了,虽然方法极其ugly……现在改用python下面的scikit-learn包,感觉很流畅,没出过什么问题。
开源软件第二大优势,也是我更为看重的,是它能够拥有众多接口,也就是说,能够在不脱离自身语言的情况下去调用/交互其它工具(因此使用者就不需要学习新的工具了)。是的,大多数人都希望能够尽可能用已经掌握的工具去处理问题而不是学习新的工具,很可惜,商业性的SAS在这点上先天不足,这尤其体现在如下三点:1)访问操作系统的磁盘管理系统,2)访问网络,3)与其他语言交互。举一个很简单的例子,我希望能够读取某个文件夹下的特定文件。这里面涉及到两个问题,一个是访问OS的文件管理系统,一个是用正则表达式选取符合要求的特定文件名。如果是SAS,首先必须使用x command来访问OS的文件,这一步就非常tricky,因为你首先需要了解一些DOS的文件命令,而很多人已经不会DOS了;其次x command会中断当前的SAS进程,而且其界面非常难看,常被作为外貌协会的楼主吐槽;最后,你还需要把获得的文件名存在宏变量中,而SAS的宏语言对初学者而言可能不是那么轻松。但挑战不止如此,获得所有文件的变量名后,你还需要使用正则表达式之类的工具提取出你想要的文件名,而对一个宏变量使用正则表达式,貌似需要先建立一个null数据集,总之前前后后查了N必应成功导入文件后,research的思路可能早就没了。
其次,SAS对于http的访问也是一大痛点。在SAS那个时代,人们对于统计软件访问网络的需求并不迫切,然而现在对于网络的访问几乎是统计软件必备的功能。SAS的file命令其实也能访问http,但基于SAS封闭的体系,能够自定义的地方实在太少。楼主最初接触爬虫,苦于不会其他语言,于是就只能用SAS写。记得当时写了一个抓取气象局网站每日PM2.5的爬虫,采用的策略是最笨的先用file命令download所有html文本,然后用正则表达式一个一个找要用的tag,连xpath都没用上(貌似SAS里也没xpath),现在看来二得惨不忍睹。当时看SAS/SUGI的文章,说SAS团队有意推出SAS/PIPE模块专门用于爬虫,不知现在有没有出来,反正楼主也不太看好(当时可真是盼星星盼月亮盼它出来啊)。可能有人说我又不是要用SAS去写爬虫,楼主举的这个例子没有意义,但是要知道,你以后越来越多的数据将从网上获得,你的成果也越来越多的会通过网络展现,访问http的能力对于统计软件而言是必备的。
这里说句题外话,貌似看到有专门用R做爬虫的包,楼主对这些包的态度是:估计比SAS要强(楼主没用过),但真的要做爬虫的话,还是用Python或者Java吧。因为爬虫的需求和写论文时的需求很不一样,写论文时,最主要目标是语法简洁明了且性能够用,因而面向对象(object oriented,OO)的设计没什么用,反而增加了思考的障碍,然而爬虫作为一种非常程序化的应用,OO的特点是非常必要的,因而楼主怀疑用R写的爬虫,除了那些trivial的应用场景,究竟能有多少用。对于R和python对于“面向对象”这一问题采用了截然不同的设计态度,网上多有讨论,在“二、爬虫与python”中楼主将具体展开,感兴趣的可以看这个帖子//r-beats-python-r-beats-julia-anyone-else-wanna-challenge-r/。
最后,讨论下为什么与其他软件交互的能力对于一门统计软件如此重要,以及SAS和R在这方面的表现。在这里引用python下最著名的绘图包matplotlib的作者John Hunter()的话,在谈到为什么要开发matplotlib时,Hunter说到:“以前,我的所有数据处理工作都是在matlib上完成的,matlib拥有非常强大的绘图能力,我非常喜欢他。然而,当我的工作不断扩展时,我发现matlib封闭的架构使得软件之间的交互非常困难。例如,我希望从SQL数据库中读取数据然后将变量绘制出来,但我发现matlib对SQL数据库并不是那么友好。其次,一些大规模的项目常常需要团队协作以及多个系统协同工作,例如前端的网页与后端的数据库,还有大大小小其他系统,matlib对他们的支持同样让人沮丧。因而,我不得不采用python(python胶水语言的称号很多小伙伴都听过吧?),但是python上又没有matlib上面那么棒的绘图工具,所以我决心自己开发一个。”
Hunter的话其实已经说得很明白了,SAS就类似于matlib,在它专精的那个方面,可能真的很好,然而时代的发展要求我们不得不使用不同的工具完成不同的任务,这时交互性就尤为重要。可能这时有小伙伴说反正我也就是用软件跑跑回归,连数据库都用不着,考虑这么多干什么?其实,楼主当年也是这么想的,但随着你研究的不断深入,你的研究任务将不断复杂化(楼主当年绝笔想不到自己以后研究会要用到爬虫和文本挖掘的那一天),你势必将综合运用多种工具,这时你将会发现你的统计工具如果非常封闭的话是一件多么痛苦的事情。这就好比楼主初一时刚买电脑,正值磁记录技术取得了突破,硬盘容量普遍从原来的20G涨到了40~80G,当时楼主看着80G的磁盘还担心这么多容量该放什么啊,现在想来真是图样图森破……
当然开源毕竟也有开源的毛病,否则微软前CEO鲍莫尔也不会留下“开源即毒瘤”的话了。楼主对此感触最深的一点是同样从MySQL读取5个G的数据,用SAS只要5~10秒左右,而R可能就要好几分钟,不过和R语法的巨大优势比起来,这点已经可以忽略了。
太晚了,剩下关于爬虫/数据库的部分就改天写完再补吧……
二、爬虫与数据库
1.Julia——未来的R?
2.关于编码的惨痛经历
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
二、爬虫与数据库
<font color="#. 爬虫
最近很多小伙伴对爬虫提起了兴趣,感觉web上一座座金矿,只要养几只小爬虫,就能帮你把黄金搬进自己腰包了。其实,作为一项工程应用而非基础理论,爬虫本身不难,但是对于广大经济学的学生而言,说爬虫是外星科技也不为过。楼主见过好多本科的学弟学妹想要爬一些股票论坛或者SNS,但是没头苍蝇一样网上搜了半天,最终还以为爬虫是一个exe程序,点了就能用的……楼主自己也从菜鸟过来的(现在也很一般),深知初学者的无助,在这里晒一下自己的学习经历,希望给大家提供写参考。
首先,假设你的研究一定需要爬虫,你要回答的第一个问题就是:是否需要我自己写爬虫?因为对于绝大多数只是偶尔在研究中用到爬虫的人来说,学习与掌握爬虫的成本实在有些大,一个毫无编程基础的人在缺少指导的情况下,最快也需要好几个星期才能上手。如果你确定要自己写爬虫,那么大致有两种选择:<font color="#)使用带GUI的爬虫工具,例如GooSeeker、火车头采集器等。<font color="#)自己用python/java/等语言写爬虫脚本。楼主建议首先尝试GUI工具,等发现它已经无法满足你的需求时,再来学习自己写爬虫。
GUI工具自然难度更低,不需要自己写代码,只需要鼠标点击操作,也是楼主向大多数人推荐的。一般经济学研究中需要用到爬虫的地方多是爬一些论坛、电商网页等,这些网页使用GUI工具完全足够。(至于微博这种采用Ajax的网页可能就不得不自己写爬虫了)楼主最初爬淘宝,每天爬一遍,日记录大概有几百万行,也是靠这种GUI工具。但是这种工具存在一个普遍的问题:由于爬下的数据多存成plain text,因而处理时还需要导入,非常麻烦。此外,这种GUI工具可定制的功能比较少,举个例子,你只想爬论坛中某些特定人发的帖子,如果是自己写代码,那么一个if语句就可以搞定,如果是GUI工具,可能就不得不把所有的帖子爬下来然后再筛选了,时间上显然非常没有效率。此外,如果遇到网站ban你的爬虫,GUI工具也缺乏应对的办法。
所以这时你可能就产生了自己写爬虫的冲动,如果你愿意花上一两个月的时间学习,那就开始干吧!楼主强烈推荐python下面的爬虫框架scrapy,和其他语言比起来,python的易用性是不需要多说的,scrapy又是当前用户非常广泛的爬虫包,拥有广大的社区支持。据说一淘当年也是采用scrapy+webkit的架构来搭建自己的爬虫的,有一个系列博文介绍了相关情况,大家可以详见http://blog.csdn.net/u/article/details/。scrapy本身入门非常快,只要具备一定的python基础就可以了。然而很多经济学的学生并不具备python基础,如何尽快入门python呢?楼主推荐以下资源:一个是,作为learning-by-doing类的在线编程学习网站,codeacademy为学习者提供了学习、练习、巩固一体化的学习体验,另外一本是“learningpython the hard way”,全书通过几百个小例子来帮读者巩固所学知识。此外,爬虫不比写论文时写的那些交互式代码,爬虫的结构性很强,非常依赖于各种“类”,因而需要使用者首先具备一定的面向对象编程的知识。这也是楼主认为R可能不适合写爬虫的原因,R作为一门函数式编程的语言,没有OO的概念,在应对爬虫这种系统性工程时可能显得力不从心。
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
<font color="#. 数据库
对很多经济学研究者而言,估计说到MySQL之类的关系型数据库(RDBMS)还很陌生,至于MonoDB、Hadoop之类的分布式数据库可能就更不了解了(楼主也没用过……)。其实,如果你的数据本身不多,不用数据库也没什么问题,但是当你的数据不断增长时,你会发现excel远远无法满足数据积累/更新的要求,那种<font color="#万多行的excel表,操作维护起来的难度只能说你懂的。楼主认为,以下两种情形,使用数据库(这里指MySQL之类的关系型数据库)绝对让你事半功倍:
你在使用爬虫使用爬虫不得不用到数据库,因为爬虫数据要求频繁更新、读取、比较,不用数据库只能说作死。楼主一开始不想学MySQL,因而一直使用SAS来管理更新爬虫数据。虽然SAS作为统计软件,其文件磁盘管理系统已经在同类中无出其右(索引系统很强大),但体验过数据库给数据管理带来的便捷之后,楼主再也不想回到SAS了。撇开performance、robustness、access control这些数据库带给你的便利,使用数据库最大的好处就在与于数据库强迫你科学地思考你的数据结构,从而让你更深刻地了解你的数据。具体而言,以前你获得数据,可能把所有变量都放在一个xls/txt/csv文件就完事了,而数据库则会要求你思考这些变量之间的关系(请大家bing一下“数据库/第一范式/第二范式/第三范式”),比如,有些变量如ID/NAME/IPO_DATE,对于每个公司来说都是唯一的,这些变量应该放在一个表里,而每日的开高低收价则应该存在另外一个表里,两个表通过股票ID进行对应。通过这种思考,你可以了解你的数据中哪些变量是重要的、哪些是需要频繁更新的、哪些又是重复的,这对你未来的研究绝对大有裨益。你将把经济学研究作为你的职业,并期望在未来不断扩充你的私人数据库不只听到一个老师重复“数据是最重要的,以后你们如果走上学术的道路,我只有一条建议可以留给你们——尽一切办法搜集任何你可以获得的数据”。的确,我们应该都看到过这样的文章:方法其实挺简单易懂,但就是数据来源拍案叫绝,结果写出了非常beautiful的story。因此,每个搞经济的都应该建立你的私人数据库,并且将搜集与扩充你的私人数据库作为一项终身任务。在你漫长的学术生涯中,你会遇到各种各样的数据,有的会长久更新,有的可能就没有后续,无论哪一种,用OS的文件管理系统来保存你的私人数据库都是非常不负责任与幼稚的。设想一下,你积累了多年的数据,可能已经有上百个表,有的表只有几十行,有的表几亿行,如果都存成excel或者csv,每次打开可能都要长时间等待或者经历繁琐的导入过程,而且这些散落在各个文件夹的沉睡数据表,你不仅无法快速、统一地检索与维护(这是数据库的使命所在!),更可能因为不小心按了一个delete灰飞烟灭。IT行业有句老话,硬盘有价,数据无价,对于经济学研究者而言,这句话同样适用。另外楼主再讲个题外话,大家的学校都买了许多官方数据库,我们每次要用都得去里面下载,十分麻烦,有没有一种一劳永逸的方法呢?这个楼主只能说,你懂的。因为商业数据库也是一个数据库,如果你觉得里面几张表特别常用想要全部down下来,本地对应的存储方式最好也是数据库的形式。好了,楼主觉得已经说得太多了……天生带Geek基因但错投胎到经济学的人楼主空有Geek之心但无Geek之力,高数统计什么的也就普通水平,如果你真的又有Geek之心又有Geek之力,楼主只能说:苟富贵,勿相忘!
那么,如何选择/学习使用数据库呢?可能有些童鞋最近听说什么Hadoop很火非关系型数据库很火,以为上来就要搞这些,这对初学者是严重的误导,楼主只能说,这些东西可能在我们以后的生命中都不会有交集。你要想,当年MySQL数据库都能用在淘宝的数据平台上,我们这种区区几百万最多十几亿行的数据,哪儿需要动用Hadoop?所以说,选择数据库,还是选择SQL Server/MySQL/SQLite/Oracle这种关系型数据库为好。那么问题来了,究竟选择哪一种?和上文对于SAS和R的讨论类似,我们可以从语法、性能、商业/社区支持这几方面来分析。
首先是语法,其实所有关系型数据库的语法无非是SQL语法的超集,互相之间的区别可能都没C和C++之间的区别大,因而就语法而言选择哪种都可以。其次是性能,基本上所有这些数据库都能满足我们的要求(SQLite因为实在太轻量级,所以如果你要做爬虫而且爬的网站比较多的话,或许其他几个是更好的选择)。因此,唯一影响我们的就是商业/社区支持了。其中,Oracle和SQL Server都是商业软件,但提供个人的免费版本,但是两者的安装真的是要人老命,为了安装卸载两者楼主已经系统重装无数回了,故虽然两个逼格很高,只能pass。接下来是开源的,例如MySQL,SQLite,对此根据楼主上文提出的谁用户多就用谁的原则,楼主最终选择了MySQL。MySQL作为使用最广泛的开源数据库,有一大帮的支持文件,遇到问题了又有许多技术大牛的博客可以查,而且MySQL性能足够但相对轻量级,一两百兆的文件安装卸载也方便,这对非科班出身的楼主来说至关重要。此外,不管是R还是python还是什么语言,你不可能找不到对应的MySQL API。这就类似你觉得虽然macbook可能用着更顺手但在日常生活中你还是不得不在里面装个windows虚拟机或双系统一样——使用MySQL,至少你不会有种遇到问题孤立无援的感觉。
至于如何学习MySQL,其实网上教材教材很多,楼主推荐“sam teaches you mysql in 24 hours”这本书,国内的翻译貌似比国外要落后一两个版本,因此推荐看原版,网上都有。至于必备的GUI,Navicat也许是个不错的选择,简单易用功能全,绝对是那些讨厌命令行的初学者的救星。
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
<font color="#. 关于Julia——未来的R?
现在有一门尚在婴儿期的语言,叫做Julia,被认为是未来挑战R宝座的语言之一。你可能要问,现在Julia的生态尚未成熟,开源包也没R多,Julia凭什么挑战?无他,惟performan尔。有用过R和Python的人都知道,如果你想要提高程序的执行效率,除了并行计算,剩下的就只能依靠用C重写代码了。Python下面最著名的科学计算包numpy和scipy,其最大的优势就在于将python里常见的函数,比如向量求和之类,用C重写了一遍,从而大幅提高了执行效率。R也是一样,初学者被不断警告要少用for循环而用向量化取代,因为很多向量化的函数在R中是用C写的,执行起来比for循环快几十乃至几百倍。Rcpp包的诞生则使得把C引入R更加方便。这种用C改写语言的做法是如此普遍,以至于有人发问:如果把R/Python的核心代码也用C改写,是不是就一劳永逸地解决问题了呢?有没有什么方法既能保留语言的简单易用,又能不损失性能?还真有人这样做了,这就是Python的pypy计划,这一计划对python核心的修改如此深入,以至于pypy甚至都无法与常见的numpy和scipy包兼容——而后者几乎是所有python科学计算的起点。在这种情况下,执行效率的提高又有多大意义?
可以看出,为了提高某种语言的执行效率,人们不断用C重写它,以至于到最后改得都面目全非了——那还不如重新写一门语言呢!仿佛听到这个号召,Julia诞生了,据说(楼主没有体验过Julia)Julia能够让人们在不抛弃直观的for循环的基础上取得和C一样的运行效率,R也能达到相仿的效率,但是在编程中需要使用向量化的方法,代码没有Julia那么直观。
以上所有对Python/Julia的讨论主要来自这则帖子:R beats python, R beats julia, anyone else wanna challenge R? //r-beats-python-r-beats-julia-anyone-else-wanna-challenge-r/,楼主在这权当帮大家翻译+梳理了一下,其实这篇帖子里面还涉及到很多其他问题,各路阵营在里面也剑拔弩张,推荐一阅。
<font color="#. 关于编码的惨痛经历
如果你常导入导出数据,特别是在使用python以及数据库的情况下,那么我保证因为编码不对而产生的问题绝对是你常见的噩梦之一。楼主过去、现在、估计未来也将在编码上面浪费大量的人生。关于编码方面的教训太多,放在这里也不太合适,在此就提供几个小tips给大家:<font color="#)所有外部的文件,选择编码的时候都选择UTF-8,你不用探究UTF-8是什么,你只要知道它是目前使用最多、兼容性最好的编码就可以了。<font color="#)当UTF-8不行的时候,试试GBK/GB2312/CP936,这三个差不多,都是中国的国标编码,windows系统也采用这一套编码。<font color="#)当第三方调用mysql时,记得一定要在连接建立后加一句“set names GBK”,这条语句能解决非常多mysql中文乱码的情况。
文(伪)科(码)男(农), 弹幕爱好者,微软脑残粉,萧亚轩脑残
谢谢楼主。
不过,R作为开源软件,网上的东西有点乱,同样的方法,不同学科的人叫法有时还不一样,找都不好找!
感谢楼主 先mark放假再看
有点长,先码了再说,顺便说一句,我之前工作上都是用SAS的但是用到的不多,现在准备公司不准备买SAS了,所以迫于无奈转投R的怀抱,现在满世界找资料学习
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师}

我要回帖

更多关于 r语言实现卡方检验 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信