Categories
日常应用

不说人话的R报错信息

此文为译文,谨此来纪念那些被R不知所云的稀奇古怪的报错折磨过的凄凉岁月...

Translating Weird R Errors
January 20, 2013
By Slawa Rokicki

原文写的很风趣,时间所限我就简单的翻译一下了。

1. 其实我只是拼错了变量名...

运行这段代码:

prob1<-as.data.frame(cbind(c(1,2,3),c(5,4,3)))
colnames(prob1)<-c("Education","Ethnicity")
table(prob1$education, prob1$Ethnicity)

然后R会报错:

all arguments must have the same length

莫名其妙有木有?其实正确的应该是:

table(prob1$Education, prob1$Ethnicity)

我只是忘了大写了...囧。

2. 我只是调用了不存在的变量....

比如我运行:

prob1$gender_recode <-as.numeric(prob1$Gender==2)

然后就会报错:

replacement has 0 rows, data has 3

但是这样就没问题:

prob1$Educ_recode<-as.numeric(prob1$Education==2)

原因只是gender这个变量不存在....你就不能直接告诉我找不到变量么?

3. 找不到变量?

我这次确保Education是有的,但是居然还是报错?

nrow(prob1[prob1$Education!=1])

报错:

undefined columns selected

而人家只是少打了一个逗号而已嘛...

nrow(prob1[prob1$Education!=1,])

哎,你就不能直接报语法错误嘛!

原文附下:

I love R. I think it's intuitive and clever and overall a great language. But I do get really annoyed sometimes at the completely ridiculous, cryptic error messages it often gives me. This post will go over some of those seemingly nonsensical errors so you don't have to go crazy trying to find the bug in your code.

1. all arguments must have the same length

To start with, I just make up some quick data:

prob1<-as.data.frame(cbind(c(1,2,3),c(5,4,3)))
colnames(prob1)<-c("Education","Ethnicity")

And now I just want to do a simple table but I get this error:

all arguments must have the same length

What the heck. I look back at my dataset and make sure that both those variables are the same length, which they do. The problem here is that I misspelled "Education". There's a missing "a" in there and instead of telling me that I referenced a variable that doesn't exist, R bizarrely tells me to check the length of my variables. Remember: Anytime you get an error, check to make sure you've spelled everything right.

If I do this, everything works out great:

table(prob1$Education, prob1$Ethnicity)

2. replacement has 0 rows, data has 3

A very similar problem, with a very different error message. Let's say I forgot what columns were in my prob1 data and I thought I had a Sex indicator in there. So I try to recode it like this:

This error message is also pretty unhelpful. The syntax is totally correct; the problem is that I just don't have a variable named Sex in my dataset. If I do this instead to recode education, a variable that exists, everything is fine:

prob1$Educ_recode<-as.numeric(prob1$Education==2)

3. undefined columns selected

Ironically, the error we so badly wanted before comes up but for a completely different reason. See if you can find the problem here. I'll take that same little dataset and I just want to know how many rows there are in which Education is not equal to 1.

So, if I want to know the number of rows of the dataframe prob1, I do:

nrow(prob1)

and if I want to know how many have a value of Education not equal to 1, I do the following (incorrectly) and get an error:

Now I check my variable name and I've definitely spelled Education right this time. The problem, actually, is not that I have referenced a column that doesn't exist but I've messed up the syntax to the nrow() function, in that I haven't defined what columns I want to subset. When I do,

prob1[prob1$Education!=1]

this doesn't make any sense, because I'm saying to subset prob1 but to do this I have to specify which rows I want and which columns I want. This just lists one condition in the brackets and it's unclear whether it's for the rows or columns. See my post on subsetting for more details on this.

If I do it the following way, all is good since I'm saying to subset prob1 with only rows with education !=1 and all columns:

nrow(prob1[prob1$Education!=1,])

 

Categories
互联网产业观察 经济、IT观察与思考

不一样的亚马逊和Amazon

我这篇文章倒不是想给Amazon做什么宣传,而只是借机说一下最近的一些最简单的购物经历,顺便感慨一下制度、诚信的缺失。

可能在国内被各种卖家欺骗惯了,尤其是在淘宝早年的时候,购物一般都是额外的小心的。只是前几天还是不小心上了一次当。要做学历认证嘛,要翻译件嘛,还不能自己翻译,就找了一家很近的翻译公司做这个事情,价格也不便宜,但是想着事情那么多还是花钱买时间吧,于是就爽快的付了翻译费。然后翻译件拿到了,跑到认证地点去,人家却说这个翻译件不符合要求^#%#。无奈啊,只能又掏钱去做一次翻译,哗哗的人民币流出去还是觉得心疼的,毕竟自己赚的钱知道赚钱的辛苦之处啊。而后自然不甘心,去找第一家翻译公司,百般推卸责任,后来直接粗鲁的视而不见。我也没有太多的时间跟他们耗着,于是315打个电话,又想到当时是用的信用卡所以也找到了信用卡发卡行,毕竟国外的信用卡消费还都是有保障的,可以在服务不到位、商家诚信有问题的时候通过银行交涉退款什么的。

315自然是两边打个电话说了一遍,然后就一副事不关己高高挂起,把皮球踢给其他部门。呃,也罢,本来也没指着消费者权益被他们保护。信用卡发卡行自然是态度好的多,一路绿灯帮我调单之类的,但是最后也很无奈,通过银联的交易他们也没有办法退款什么的,只能按照我的投诉做一个不良记录,但商家还是建行那边的,他们也只能反映给银联。这个,也罢了,维权成本这么高的情况下我也犯不着发什么律师信之类的。权当花钱买教训了。

也许是在欧洲太习惯了人们之间默认的诚信,没有什么怀疑的。同时,这几天同样发生在我身上的另一件事则让我觉得实在是太过于鲜明的对比了。8月份的时候在Amazon买了两本英文书,当时怕丢选的还是稍贵一点的运输方式,本来说是预计9月底能寄到,结果现在都还没有收到。忍不住,就给Amazon发了个Email,看看能不能有什么音信,至少能给我个包裹号码之类的跟踪一下嘛。结果很快Amazon就给我回邮件了,还主动的退还了25刀的运费到我的信用卡里面!信中各种抱歉、还说一个月之后再没有收到就可以帮我重新寄或者退款之类的。我只是昨天忍不住小小的抱怨一下嘛,连电话都懒的打,没想到态度居然这么好!

其实倒也不意外,联想到7月份的时候换新Kindle的百般顺利,当时就对Amazon刮目相看。当我爸妈看到我几个电话就很快的拿到一个全新的kindle的时候,那种惊讶啊!是啊,在国内买个东西要是想退货,那难免和销售人员口水交涉一番。哪有Amazon这种顾客为上的服务态度。

除了态度之外,背后更多的是一些诚信问题。还是说美国好了,一系列的诚信体制让每个人、公司都知道违反诚信的高昂代价。信用卡的核心是信用,而不是国内理解的“透支”功能,否则不过是一张简单的贷记卡而已。其实我对招商银行的印象蛮好的,信用卡一直用的很舒服,但是客服也跟我很无奈的承认在国内信用卡机制的不健全和跟国外的差距,我们也只能容忍和谅解。我只是百无聊赖的抱怨了一句,信用卡的信用评分什么的对我们持卡人有这么全面严格的要求,却对商户没什么要求,真的是不公平啊!

联想到最近淘宝商城热热闹闹的“起义”活动,我就觉得真的是不能不涉及诚信体制的问题了。这东西,本科的第一篇论文就论及与此,没想到现在还在这么热热闹闹的上演。我从来都是支持淘宝提高进入门槛的,这才有利于过滤掉一些竞争力不足、打诚信擦边球的商家(虽然相比于完美市场会有效率损失,但这正是信息不对称下我们为信息付出的成本)。很多人不敢去淘宝买东西,我就说一句很简单的,去淘宝商城嘛!至少,不会有什么太多的假货。当然,商城本身的其他问题就不多说了,也难怪最近这么大力的整合凡客等垂直B2C网站。现在,淘宝已经拿自己的顾客资源来卖钱了,可见这么多年的市场培育还是有价值的。

只是,太多太多事情折射出来的都是背后的诚信体制的缺失:人们习惯了有空子就钻、有便宜不占白不占。如果说中国经济增长未来有什么大的阻力,我觉得诚信体制可以算是一个。良好的诚信体制有利于市场资源科学合理的流动,而诚信体制的缺失只会让这个市场越来越“柠檬”,资源的配置被扭曲、买卖双方的交易成本被大幅增加。虽然诚信体制对于越小的经济活动越关键,但是不积小流、无以成江河,底层微观经济活动诚信的缺失,必然可期宏观层面的更多问题。

至于为什么我说“亚马逊”不是Amazon,大家可以搜搜最近卓越亚马逊的新闻,貌似也有诚信危机啊!果然,什么国际公司到了中国都是难免“常在河边走,哪有不湿鞋”?

不过,至于华尔街,那就另当别论吧。少数聪明人认为自己可以玩转地球,自然有童话破灭的时候。

Categories
网络新发现

开放课程(Open Course)

最近这东西貌似在网上挺火的,我注意到它就是看新闻的时候,猛然间冒出来长达几分钟的介绍,惹得我心里长草便去网上搜了搜。果然,在国内的电驴社区这东西已经热得发烫。

看了一下,是Yale的为主,可能是因为有视频吧。记得以前MIT的开放课程做得挺早的,东西也很多,就是没有视频可以下,可能这也是为啥一直不温不火的缘故吧。这次Yale的视频可是极大的触动了国内某些习惯吃免费的午餐的同仁们的神经,几大字幕组也开始抢这个蛋糕。不过,说实话,以前看电视剧的时候对字幕组的翻译质量不太在意,反正大差不大就OK了。可是这次看了一下课程之一的博弈论,对其听译水平顿感怀疑……尤其是某些专业词汇的翻译,呃,一看就不是学经济学出身的。有句话怎么说来着,翻译专业书籍,该领域的人士往往比纯外语专业的翻译的好。举个让人很无奈的例子吧,当时我看的是一愣一愣的。

罪证在这儿这儿,不知道谁抄的谁,惊人的一致。其实其他的还好,就这个让我受不了:

14 Backward induction: commitment, spies, and first-mover advantages 落后的感应:承诺,间谍,和先行者优势
15 Backward induction: chess, strategies, and credible threats 落后的感应:国际象棋,战略和可信的威胁
16 Backward induction: reputation and duels 落后的感应:声誉和决斗
17 Backward induction: ultimatums and bargaining 落后的感应:最后通牒和讨价还价

这个?我开始一看中文就楞在那儿而了,想想自己的博弈论真的是白学了,不知道啥是"落后的感应"。后来看了英文,才有点啼笑皆非的明白,原来是”逆向归纳法“……晕啊。这种词儿,翻译者若是有心的搜搜,应该不难找到大家广为接受的译法。其他的就无伤大雅了,比如可置信的威胁(credible threats)之类的。

感觉他们讲的满全面的,比如最后一课24 Asymmetric information: auctions and the winner's curse,居然说到winner's course,这个东西我只在博弈论的课本上看到例子过却对其模型记忆不太深刻。还有热的发烫的拍卖理论……真是的,我们博弈论课程都没讲这么多,可怜啊~我一直怀疑这到底是Yale的经济系本科生的课程还是面向全校的通选课,后来想了想国外有这么迂腐么,什么课大家喜欢就去选应该就可以吧。至少应该不会是数学院的博弈论,那么多证明可是真的会让人疯掉的。

哦,还有一个和经济有关的课程是金融市场,此外还有一些社科等等的例如”死亡“。这个地址就不一一列出了,请移步http://oyc.yale.edu/。之所以给这个地址是对现在的翻译有点,呃,疑虑,还是原版吧。别的不说,我真喜欢那个大讲堂的(算个Hall?),上起课来蛮有感觉的。当然,我更喜欢小讨论室,呵呵~人少话多而不是被强行灌输了。

Categories
事儿关经济

政治经济学还是新政治经济学?

昨天班级里聚会,很神奇的到了近50个人,基本全了,不仅对组织者的敬业深表钦佩。席间觥筹交错,连我这种不胜酒力的人都在此种热烈的气氛下不得不开怀痛饮,幸好吃喝节奏有度,只喝未醉。

席间听闻一同学考取了人大经院的研究生,不过美中不足的是原来报的西方经济学调剂成了政治经济学。他言辞之中颇有失望之意,大抵源于那里更多的是从马克思的角度去做东西,故他还打算看一遍资本论。当然,资本论是一定要看的,只是我没勇气读完。不过说到政治经济学,我眼前一亮。记得前阵子写毕业论文的时候(参见:[cref %e7%bb%8f%e6%b5%8e%e5%ad%a6%e5%ae%b6%e4%bb%ac%e7%9a%84%e7%a4%be%e4%bc%9a%e7%bd%91%e7%bb%9c%ef%bc%88%e5%ad%a6%e6%9c%af%e5%9c%88%ef%bc%89]),还曾顺带看了一下top的研究者们都是分属那些领域的,结果十有五六是political economy,这不禁让人觉得有点惊讶。不过后来继续看下去,也不觉得惊讶了。越来越多的微观和宏观建模的方法引入了政治经济学,国内做的比较多的貌似是中央政府和地方政府的委托代理模型,国外则更关注一些社会问题(这话其实说了等于没说)。

从这个意义上来说,国内国外现在政治经济学都很热。国内的热体现于任何一个院校的经济学学生都要学习至少一个学期的政治经济学,像我们都要学整整一年。甚至连不是经济学专业的学生都要至少学习一个学期的政治经济学,作为大学生思想政治课的一部分。可以说,马克思的剩余价值理论在当代大学生内是无孔不入。而国外的热更多的体现于这个领域关注的人很多,做出来的东西也多。

不过详细的看起来,却又觉得很讽刺。申请出国的时候,翻译成绩单我就很犹豫“政治经济学”该怎么翻,翻成"political economics"总觉得底气不足,还占据了8个学分,只有自己心里清楚这课学的是什么。不过幸好我们的初级宏微观不叫“西方经济学(宏/微观)”,要不翻成"western economics"老外们看了估计会觉得更诡异了。所以,虽然政治经济学在国内外都很热,但是很显然,在国内做的政治经济学应该更确切的称为“基于劳动价值论的马克思主义政治经济学”,至少我觉得我那个要去人大读政治经济学的同学要做的会是这个东西。

依稀记得去年此时让我们提课程改革建议,当然有点走形式,但是我们还是说了很多真话(参见:[cref %e6%b2%a1%e6%9c%89%e6%95%b0%e5%ad%a6%e7%9a%84%e7%bb%8f%e6%b5%8e%e5%ad%a63rd-week-june])。当时我们一直主张在经济学专业开一门“新政治经济学”,至少作为专业限选课。后来大概是没老师愿意去讲,就这么搁浅了。而大家一直意见很大的“大一开一年政治经济学”却没法取消。我一直认为,现在国外在做的政治经济学应该在国内称为“新政治经济学”,这样才有利于学生们了解什么是当代政治经济学关注的问题。不过话说回来,中国的政治体制确实是有着中国特色的,所以照搬国外的方法和思路可能是一件颇为危险的事情。Anyway,聊胜于无,至少应该知道人家是怎么想的。

现在国内好像有点一边倒的看轻马克思主义经济学的感觉,最鲜明的感觉是在人大经济论坛上,马克思主义版几乎成为了口水仗聚集地。我个人感觉马克思看问题的层次已经远不是表面,那些打口水战的人却正是只看到表面的人。一直觉得像国内本科这样的教育模式、把马克思经济学的思路强行灌输给大家(所有专业的学生),并不见得对其思想的普及有正面作用。学完劳动价值论,却不知道别人是怎么争论这个问题的,又怎么可以去真正理解劳动价值论的精华所在?毕竟这东西只是一家之言,而不是常识和共识,不宜当作公理一般的介绍给大家。

不知谁说的,“其实凯恩斯、熊彼特他们已经把经济学看得很透了,可能比现代大多数学者看得都透”。我想对于马克思主义,也只有看透的人才能讲清楚吧。

h

ttp://www.loyhome.cn/961.html961

Categories
事儿关经济

写论文 or 写程序?

毕业论文写了几天了,越写越痛苦,时间太紧,很多东西来不及细致的想想只能先加上去,唉。

这次的论文比较的,诡异。我第一次感觉到写一篇经济学论文需要用这么多代码。以前写论文的时候,最多有几个方程需要解一下,或者一些数据扔到计量软件里面几行命令跑一下就OK。所以就算我算法很烂,写程序的水准也很懒,但是还是可以勉强应付的。但是这一次,因为算一个概率和期望算不出来,只好求助taiyun。没想到很快的taiyun就给了我一个程序,用来模拟结果。虽然模拟的不是真实值,但是大致的趋势出来了,很漂亮~

接着,我又突发奇想,来个“蜂窝状”的东西。搜了半天不知道蜂窝图对应的矩阵格式应该怎么写,于是乎就开始求助另一个程序高手——X。此人不愧是学计算机的,一边比着编程大赛,一边三下五除二就把程序写出来了。可是问题是,他用的是C语言,我机子上却没装C的编译器……我琢磨了半天想把它改成R的,结果死活有问题。X很仗义的开始帮我改,先是自己安了个R(嘿嘿,怎么我也成功一次诱惑/强迫别人装上了R),又开始研究R的语法(X语录:我这代码服务真到位...)。最后在我俩都快面临崩溃的时候,他说,要不给我个编译完的C程序,我自己调用吧。我想了想,OK啊,只要输出的是文本文件,我在R里面读入就可以了嘛。于是乎,他很快的给了我一个很好用的程序,然后我就开始舒舒服服的输出txt,最后开始舒舒服服在R里面舞蹈弄枪,望着出来的蜂窝图傻傻的嘿嘿笑。

到最后我也不知道我是在写论文还是在玩乐了,把程序的参数调一下,然后自己就嘿嘿的对着屏幕听着CPU小风扇转悠的声音美滋滋的看结果。在几张图的衬托下,很快论文就写了七八页了。不过不知道最后能不能交英文的论文啊,我怕自己偷懒就一直用英文写下来的,要不用中文写完了肯定不会脑子抽风的翻译成英文。天知道……其实我觉得最boring的事儿就是把自己写的英文的东西翻译成中文,这不是一边翻译一边让自己鄙视自己的英文表达能力多么差么?看着中文那飞舞的流光溢彩,再瞅瞅干巴巴的英文句子,只想说“我不认识写文章那个人”。特别能体会到一句话,貌似是老舍还是茅盾或者谁谁说的,“翻译体现的是一个人使用译过来的语言的能力和文化底蕴”。一个中文积蕴深厚且能读懂英文的人,往往比一个中文平平而英文出口成章的,更能译出好的中文文章。不过话说回来,论文这种东西,不就是干巴巴的么?除非你对某个模型感兴趣,否则我估计没几个人会愿意读一篇学术论文的——真的很boring。说起来翻译,暑假如果有时间,我真的很想翻译一本书啊,但是不知道有没有出版社肯去买版权,呃……这年头,我理想主义,不代表就能找到理想主义的出版商来搞定这事儿。

最后,这一次深深的接受了“题目要起小一点”——从初中开始学习写作文的时候老师就一直唠叨的话。这次很豪气干云的写了一个很简短的题目,写完了就知道自己挖了个坑只能自己跳下去了。很显然,能把这么简单的题目论述好是一件很难很难的事儿。于是乎,假惺惺的写了一句“this is the first part”。反正只是我的manuscript嘛,别人也看不到。别人看到的肯定是包装好的。本来模型中想加入动态啊,博弈啊,不确定性啊等等时髦的东西,后来发现还是一个“代表性人物”分析起来比较简单,于是乎就跟博弈没关系了。“不确定性”加不加似乎也没啥影响,反正我只能模拟结果又不能真正用扰动项去表达啥。至于动态……好吧,一个贴现因子搞定。本来还很复杂的设什么时间之类的,后来发现还不如一个贴现因子delta好用。于是就狠狠的把一大片的废话论述“注释”掉了(还是没舍得一口气删了,不过在lyx里面注释标签一闭合,也能做到眼不见为净)。

写着写着,和自己起初的想法有点越走越远,每次写论文都是这样,最后写出来的肯定不是自己打谱要写的——除非写实证。不知道能不能够应付毕业……唉。其实还是很想研究研究元胞自动机的,taiyun一提这个东西我就精神起来了,看了半天介绍好像有点眉目了,但是想不出怎么拿来玩玩。于是乎,先扔到那里吧,看看毕业论文怎么能应付交差再说。