Categories
事儿关经济

我(对于统计方法)的一些偏见

Yihui写篇文章居然链到了我那篇吐槽文,瞬间亚历山大...我就是随便说说而已,一定要文责自负么?

其实我经常会有些自我的偏见在那里,而且有时候明明知道这些偏见的存在不好,还是很难说服自己改变它们。

比如,最深的偏见就是我对于计量经济学,我实在无法从根本上接受计量经济学属于经济学的这个事实...我对于它从统计观点出发搞的“因果推断”始终加上一个引号。

再比如,计量经济学内,我偏见最深的就是时间序列分析,我实在无法从根本上接受时间序列分析居然可以做因果推断,这东西更多的是预测的意味嘛,和机器学习的观点很像...

再再比如,机器学习各种模型中,我最不能接受的就是那些完全没有假设检验的...这东西至少也得能算个方差什么的才让人觉得靠谱些吧?

再再再比如,没有假设简单的那些机器学习模型中,我最最最最无法认同的就是最粗暴的把各种模型结果混合起来,用类似bootstrap的方法求得置信区间之类...这简直是就毫无办法之下的粗暴猜测嘛。

然后最后一个问题,施老师说,这个某种程度上反映了“群体智慧”。呃,好吧,就算每个模型都提取了一定的信息量,然后这么混合起来就是万灵药了?怎么听怎么像中药一锅煮的感觉,而不是西药那么配方分明...

其实我还讨厌的是“数据科学家”这个说法...努力的把science的帽子往自己脑袋上套,是大家都要遵循“科学发展观”的缘故么?就像我原来特别讨厌有人争论“经济学是硬科学还是软科学”一样,一定要沾上科学的边么?是为了好申请经费么?

如果科学,定义为消除我们对于世界的不确定性,那么无论是经济学还是统计学,不用争议多少,自然都是科学。如果科学,定义为探寻事物发展的因果规律,那么怕不是建立在演绎法逻辑之上的方法,都算不上科学了。我想说的只是,定义可能并不重要,如果定义是狭隘的,那么必然排除了一些有用的方法;如果定义是广阔的,那么必然包容了一些没用的方法。这东西又不是非黑即白的...

我只能说,科学在我这里的定义相对狭隘,宁缺勿滥,所以我的偏见有这么多...偏见越多,观点越偏颇,经常有过两年自己都不知道自己当年为什么那么幼稚和狭隘的感觉。所以大家一来请见谅落园文章的局限性,二来欢迎帮我突破局限性,用鲜明的观点和生动的例子来说服我——不仅仅是一些口头上关于定义之类的争论。

------------

照例跑题:确实如yihui所说,我的blog文章太多了,找起来难免不方便。尤其是对于不是常年订阅的读者来说。所以我决定对自己的blog主题动动手术了,瀑布流什么的最近蛮流行的,挺好的打算学习一下。

Categories
读书有感

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(七)

例行的废话。刚刚看了一下Google Analytics里面的统计,那篇七天搞定SAS果然不负众望的摘得了(单篇博文)点击量桂冠。意外的是居然有那么多人会点击到“关于我”这个页面...呃,对我这么好奇么?

2 /learning-sas-in-7-days-1/
3 /coursera上的r语言课程/
4 /r会议小记/
5 /使用lyxxetex编译中文tex和输出中文pdf/
6 /中文文本聚类小尝试(text-clustering-in-r)/
7 /me/
8 /?统计学习精要the-elements-of-statistical-learning?课堂笔记(一)/
9 /快速将word的doc文件转为latex!/
10 /?统计学习精要the-elements-of-statistical-learning?课堂笔记(三)/

不过他的后续就比较悲催了,点击量寥寥。然后还不出意外的,weibo超越google成为了流量来源第一:

1 weibo.com / referral
2 (direct) / (none)
3 baidu / organic
4 google / organic
5 rss / rss
6 r-ke.info / referral
7 cloudlychen.net / referral
8 h2w.iask.cn / referral
9 so.360.cn / referral
10 yihui.name / referral

果然最近墙发威比较厉害...google啊google...

另外,出乎意料的是一些旧文反而受欢迎,哎~还好看到《统计学习精要(The Elements of Statistical Learning)》课堂笔记系列一直有点击,也算是这一系列写的比较值得吧。今天继续。

----------------笔记开始-----------------

貌似是第五章,不过老师一直在讲一些非常基础的数学预备工具:基展开与正则化,其中用到泛函概念若干。我不知道该开心呢,还是不开心呢,还是开心呢,毕竟泛函学过,毕竟泛函忘得也差不多了...

1. 预备知识

在P维欧氏空间内,我们定义两个运算:加法(x+y)和数乘(),然后定义一下函数空间:上的平方可积函数,同样的定义加法和数乘:f+g和).

接下来还有若干概念...呜呼:

  • 线性组合:
  • 线性独立
  • 线性子空间:我们可以定义线性子空间, , 有.
  • 维数

这些概念连上运算加法和数乘一起,构成线性空间。进一步的,我们可以定义内积空间:

  • 内积:(离散)或连续
  • 之后的正交就很容易定义了:或者
  • 还可以定义正交基...
  • 还有正交子空间:
  • 正交补: , 使得,比如最简单的二维空间里面,X轴和Y轴...
  • 范数:

有了范数以后,我们就可以进一步的定义极限:如果 , 则 ;或者连续的,

然后就是闭子空间的概念了:如果 ,且 ,则必有 ,即极限点都在空间内。注,在有限维空间内,只有空集和全集既开又闭。

还有完备基...总之大致的就是一步步的:定义内积 ->; 内积空间 ->; 存在可数的完备正交基 ->; Hilbert空间(有限维完备空间)

2.B-splines(样条)

2.1 定义

B-splines更多的是一种用离散逼近连续的感觉...好吧我承认我是完全的没有接触过这个东西,扫盲中...

首先,我们有一个闭区间[a,b],然后有个点聚集在其中,且依次增大。然后我们就可以定义一个函数集合: ,然后对于d=0 ,定义分段函数 ,然后就可以递归的定义

举个例子呢,就有. 这样下去,有:

  • d=0,0阶的时候,只有一段函数上有非零值;
  • d=1,1阶的时候,有两段函数有非零值;
  • d=2,2阶的时候,有三段函数有非零值...

2.2 性质

  • 性质一: 是分段的d次多项式;
  • 性质二:局部性:, 当 或者
  • 性质三:光滑:是d-1阶光滑的多项式,即d-1阶导数都等于0;
  • 性质四:如果某一函数满足性质三,则必然和只相差一个常数因子。

2.3 d阶B-splines

我们可以用B-splines来逼近任意一个函数,则有,从这个角度看B-splines有点基底的味道。从分段多项式,到光滑的分段多项式,再到d-1阶光滑的d次多项式,我们就有了 d阶B-splines...

------笔记结束---------

讲了这么多,我一直在猜这些到底是用来干什么的呢...不知道接下来的哪些内容用到了完备内积空间、基展开和线性逼近呢?

Categories
事儿关经济

安逸的富二代

听着听着音乐,突然间想起一个人,索性捉起笔来,描绘一番。

想说的这个人是我曾经的一个客户,那还是那个上海温暖的象夏天的秋天,也是那个出差跑到陕北冰冻的象冬天的秋天。那是第一次去到陕西榆林的客户那里,第一次自然什么都不顺利,客户基本不怎么搭理我们,一副给你们个机会来办公室喝杯热茶就不错了的姿态。那个时候,可谓见识透了做市场的人的嘴脸变化之快,小心翼翼的陪着笑脸,生怕自己说错了什么被人拿住当作了把柄。事后,还在那里费尽心思的揣摩客户的心思,不知道为什么上午的太阳说变就变成了下午的阴云。天晓得那个时候对我的心理是一种多么大的折磨和考验,职场的水深自那时开始体会...我们那时的客户都是国企,里面明争暗斗派系不断,搞不好就是人为刀俎我为鱼肉,搞不好人家来笑嘻嘻的啃了你都不知道...

只是在那众多的客户中,有那么一个不同寻常的客户。他第一次见我们,特别不友好,是那种放在表面上的不友好。我心里一悸,不知道会不会下一秒就被毫不客气的扫地出门了,心里顿时生出了若干委屈,而奇怪的是那是我居然控制住了内心的万千波澜,还在那里堆满了笑容小心翼翼的询问着一些不得不问的问题。

估且称呼这个客户为度总吧。度总年纪不大,又是技术部门的领导,自然充满了技术范儿。度总是榆林当地人,西北汉子的性格爽朗的很,在这么一个不知道隔壁是不是就藏着暗箭的地儿,也是直来直去的,喜欢就是喜欢,不喜欢就是不喜欢,不加掩饰。也是这一点,让我后来越来越好生感激—其实很多时候这些部门的领导也是只能奉上面领导的指示行事的,有的时候跟你山路十八弯也只是一些不能做的事儿,绕来绕去的,害得我们只能不断的猜度,好生费力。度总则不会跟你浪费时间,说什么就是什么,爽快的很。

隔了一段时间,再去榆林,又见度总。这次上面大概是点头了,所以一路下来我们就只是操作一些具体事务。这个时候度总难得的,坐下来跟我们讨论技术的东西(我一直觉得做咨询尤其是纯乙方,两分技术,八分耐心与人交流),这些相比于人情那些我自然更熟络一些,所以聊起来倒也敞快。度总也是个数码玩具迷,当时正巧背着一个kindle还有一个ipad去了,就跟他相互鼓捣了好久这些玩意儿。还给我拷贝了一些音乐,这也是为什么突然听到这些音乐想起他来的缘故。

后来听说,度总开了一辆非常好的车来上班,大概仅次于他们老总。这显然不会是单位配的。联想到榆林那地儿暴发户甚多(煤炭发家),我们就揣测度总家里怕也是殷实的很。大致的人生轨迹无外乎是,上学,然后毕业家里找点关系塞进国企,舒舒服服的做个闲差头头,舒舒服服的过着小日子,买个几千块的耳机发发烧或者空运几罐普洱解解渴之类。一个三十出头的技术领导,低调而文艺的很~

这种富二代的人生,让人几乎无可指责和羡慕什么。极度的安逸,与世无争。可以喜欢什么玩弄什么,不喜欢就不理会,不用象我们乙方这样天塌下来也得陪着笑(这也是我为什么一度要离开乙方做甲方的推动力)。关键是,你不会觉得他无知,他傲气,你可以感受到他有自己喜欢的东西,只是不用像我们这样需要努力的养活自己而已。但不见得他不能养活自己,搞不好真正做起东西来比我们都要强得多。只是不需要吧。有种大隐隐于市的脱俗感。

不知道,若干年后有没有机会再去品品他沏的那壶温热的普洱,在那个寒冷的秋天唯一让我感到有所温存的普洱。在那个弱肉强食明枪暗箭的环境中,唯一让我敢放下心来细细品品茶的味道的普洱。

Categories
我的生活状态 读书有感

社会实验设计(一):应用回归模型常见的四个FAQs

有些东西,长时间不看不推导,难免就忘了。最近感觉不断的有人来问类似的问题,基本都是集中在实验设计阶段的(貌似很多时候学校里都不教大家怎么设计实验?只有设计好了才知道怎么评估嘛...)。索性趁着有点时间,复习一下计量经济学对付实验的一些方法。

其实已经不知道第多少次在落园说到社会实验的问题了,不过貌似都未曾从零开始系统的讲述过(其实有的时候基础的问题才是最大的问题)。还是乖乖的拿起「Mostly Harmless Econometrics」这本书和当年的笔记,乖乖的重新当一回虔诚的学徒...这本书是经济学家写的,所以例子大多是经典的经济学尤其是劳动经济学(Labor Economics)的例子。我会替换掉一些学术性比较强的例子,但是也会损失一些严格性,以保持直觉为第一要务。大家还请酌情依据自己的知识积累来有选择的吸收。

Mostly Harmless EconometricsMostly Harmless Econometrics

本文主要以读书笔记形式为主,但是会非常多的加入我个人的一些观点和点评。原文翻译部分会以引用形式标出。此外,发现读者们越来越喜欢“短平快”的东西了,我也只能试图把文字写的更加的深入浅出一点,笑点多一点...

p.s. 刚看到《机器学习那些事》这篇译文,想稍稍补充一下。计量经济学关注的不是预测,而是(统计上的)“因果推断”。所以衡量的标准什么的自然也有所不同,还请不要以预测的标准来看待下文。

-----------絮叨结束,笔记开始-----------

实证研究的四个FAQs

(废话一句,前段时间整理了一堆统计应用的问题,可惜现在不能发啊不能发,等答案来了一起发吧...) 做research的,大多会被四个问题所困扰:

1. 探究哪种程度的关系?

2. 理想的实验怎么设计?

3. 最佳的识别策略是什么?

4. 结果怎么解读?

这四个问题基本就是一项实证研究的四个步骤,找到一个自己感兴趣的问题,然后去找出一条路子回答它,再择选最优的数据分析策略,最后从数据回到直觉,来解读这些结果。这样,基本上从「直觉 -> 数据 -> 直觉」,一气呵成。前两天施老师一直在微博上感慨:

我觉的目前中国最奇缺的也不是数据分析师,也不是创造商业价值的想法。我觉得最缺的是独立思考和用事实与数据支持并表述自己想法的习惯和能力。

有点不谋而合的感觉。独立思考(直觉) -> 事实与数据 (数据) -> 支持并表述自己想法(直觉)。许多次,我在面试中被问及“为什么去学习那么多统计模型或者更直接的、为什么喜欢和数字打交道”的时候,总会说一句:

从数字中寻找直觉。

这句话从凯恩斯那里抄过来之后,一直被我奉若圭臬,不时拿出来提点自己一下也不错。说到底,我有点不是很喜欢数量分析模型的滥用,虽然现在已然是普遍现象...

一个一个来看。

第一个问题:为什么强调(统计上的)因果关系而不仅仅是相关关系?

无数次的回答过这个问题,尤其是在今年春天两次讲「别让数字吓到你」的时候...反例说过很多了,关键在于,我们一般观察到的相关性,为什么不能直接用于“政策设计”上的指导呢?套用一句经典的中文,相关性就是「知其然、而不知其所以然」。因此,大多数时候,能观测到的一些变量直接的相关性往往是在各种复杂的因素作用下自然形成的,你强行的去改变其中一个因素,往往不见得可以一并改变跟他高度相关的其他变量。比如,最近又在微博上看到一段经典的段子:

【每天睡8小时死得更快?睡多久才最健康】这项实验长达六年时间,由加州大学圣地亚哥药学院和美国癌症学会联手进行。研究发现每天仅睡6、7个小时的人,比每天睡超过8小时,或少于4小时的人死亡率要低很多。每天睡7小时的人死亡率最低,只睡5小时的人,这个系数也低于睡够8小时的人

还有一段类似的:

华尔街统计:每天睡4小时的人,年薪基本是400万以上。多睡1小时薪水就要除以4。比如说你每天睡5小时,你就只拿400万除以4=100万年薪。睡6小时,就只能拿最多25万了。每月挣5、6千的,一般都是每天需要睡七小时的…

我承认,从心理学的角度,这个段子或许有着极强的心理暗示作用,大家要勤劳要勤劳~但是,这东西最多看着欢乐一下而已,你改变自己的睡眠时间就能改变寿命和收入?呃,目测虽不是不可能,难度还是蛮大的...

第二个问题:哪些实验可以理想地捕捉到(统计上的)因果关系?

其实在这前面,还有一个问题需要大家的思考:为什么我们需要实验?实验经济学的方法这两年扩张的非常厉害,微观计量若是没有一个随机实验(或者准实验)为基础,那么几乎要被大家argue死掉了。业界也是,搞什么新的市场营销方法若没有个随机实验来证明一下,那么结果也基本没什么太高的可信度(业界俗称单因素实验为A/B Test,如果发现某人的LinkedIn 简历上有这个关键词,不要怀疑,她很有可能是做Marketing Analytics)。只能说,太多的时候各种经济因素的联系错综复杂,谁也没办法很好的disentangle 这些因素之间的脉络关系,所以有时候不得不借助对照实验的方法来“野蛮”且“轻巧”的回答一些因果关系(只要比一下就好嘛,多简单~)。从这个角度来看,实验不是万能的,也不是唯一的灵药,但却是Simple and Elegant的。

好吧,认可了做实验这种思路,你还要考虑是不是充裕的budget去做(实验肯定是有成本的哇,而且往往成本不低的),然后有没有“道德委员会”来判决你是不是人道呢?是的,有些实验肯定是不人道的,但是我会提前告诉你么?比如莫非你不知道,当别人拿到了100元的促销红包的时候你却连个邮件毛都没看到,只是因为你在营销人员的global control list里面,压根什么邮件都不会收到么?你问我凭什么?什么都不凭,要怪只能怪randomlization。或者一个更著名的例子:米尔格拉姆实验(Milgram experiment)

实验小组告诉参与者,他被随机挑选为担任“老师”,并拿到了一张“答案卷”。实验小组并向他说明隔壁被挑选为“学生”的参与者也拿到了一张“题目 卷”。但事实上两张纸都是“答案卷”,而所有真正的参与者都是担任“老师”。“老师”和“学生”分处不同房间,他们不能看到对方,但能隔着墙壁以声音互相 沟通。有一位参与者甚至被事先告知隔壁参与者患有心脏疾病

“老师”被给予一具据称从45伏特起跳的电击控 制器,控制器连结至一具发电机,并被告知这具控制器能使隔壁的“学生”受到电击。“老师”所取得的答案卷上列出了一些搭配好的单字,而“老师”的任务便是 教导隔壁的“学生”。老师会逐一朗读这些单字配对给学生听,朗读完毕后老师会开始考试,每个单字配对会念出四个单字选项让学生作答,学生会按下按钮以指出 正确答案。如果学生答对了,老师会继续测验其他单字。如果学生答错了,老师会对学生施以电击,每逢作答错误,电击的伏特数也会随之提升。

参与者将相信,学生每次作答错误会真的遭到电击,但事实上并没有真的进行电击。在隔壁房间里,由实验人员所假冒的学生打开录音机,录音机会搭配着发 电机的动作而播放预先录制的尖叫声,随着电击伏特数提升也会有更为惊人的尖叫声。当伏特数提升到一定程度后,假冒的学生会开始敲打墙壁,而在敲打墙壁数次 后则会开始抱怨他患有心脏疾病。接下来当伏特数继续提升一定程度后,学生将会突然保持沉默,停止作答、并停止尖叫和其他反应。

电压 “学生”的反应
75 V 嘟囔
120 V 痛叫
150 V 说,他想退出试验
200 V 大叫:“血管里的血都冻住了。”
300 V 拒绝回答问题
超过 330 V 静默

到这时许多参与者都表现出希望暂停实验以检查学生的状况。许多参与者在到达135伏特时暂停,并质疑这次实验的目的。一些人在获得了他们无须承担任何责任的保证后继续测验。一些人则在听到学生尖叫声时有点紧张地笑了出来。

若是参与者表示想要停止实验时,实验人员会依以下顺序这样子回复他:

  1. 请继续。
  2. 这个实验需要你继续进行,请继续。
  3. 你继续进行是必要的。
  4. 你没有选择,你必须继续。

如果经过四次回复的怂恿后,参与者仍然希望停止,那实验便会停止。否则,实验将继续进行,直到参与者施加的惩罚电流提升至最大的450伏特并持续三次后,实验才会停止。

你对实验结果怎么预测?(当然现在这个实验太知名了,你可能已经知道答案了)。一般说来,大家都不会觉得人们会这么残忍对吧?其实在进行实验之前,米尔格拉姆曾对他的心理学家同事们做了预测实验结果的测验,他们全都认为只有少数几个人—10分之1甚至是只有1%,会狠下心来继续惩罚直到最大伏特数。可是结果让很多人大跌眼镜:

在米尔格拉姆的第一次实验中,百分之65(40人中超过27人)的参与者都达到了最大的450伏特惩罚—尽管他们都表现出不太舒服;每个人都在伏特数到达某种程度时暂停并质疑这项实验,一些人甚至说他们想退回实验的报酬。没有参与者在到达300伏特之前坚持停止。后来米尔格拉姆自己以及许多全世界的心理学家也做了类似或有所差异的实验,但都得到了类似的结果。为了证实这项实验,也有许多更改了架构的实验产生。

马里兰大学巴尔的摩州立分校(University of Maryland Baltimore County)的Thomas Blass博士(也是米尔格拉姆的传记—《电醒全世界的人》的作者)在重复进行了多次实验后得出了整合分析(Meta-analysis)的结果,他发现无论实验的时间和地点,每次实验都有一定比率的参与者愿意施加致命的伏特数,约在61%至66%之间。

好吧我有点跑题了,只是想说其实在实验勾画的阶段,很多东西是可以展开丰富的想象的——你先假设所有问题都不是障碍,然后去想“怎么设计一个理想的实验呢?”,然后再去依据现实的障碍做一些调整(或者可行性评估)。

有句话叫做,“被广泛应用的一定都是有原因的”,所以业界最广泛应用的A/B test肯定也是最被认可(和易于实施)的。这一类实验很简单,只要随机的一分为二,一组什么都不做(或者采用传统做法),另一组采用新的做法,然后对比结果就可以了。可是,等等,有没有觉得,很多的时候我们并不能够这么简单的实现“新做法”?是啊,我可以一分为二的发邮件,但是如果我要研究的是类似于“不同殖民统治制度对于国家解放后发展的影响?”这种话题,难道我可以让时间倒回一二百年,重新命令所有的殖民者去随机划分殖民地,然后观察后续的国家发展?嗯,就算我可以穿越时间,那些殖民者也不会听我的随机划分地盘啊——凭什么随机啊,这些本来就都是老子抢来的,老子爱怎么折腾怎么折腾。我能苦口婆心的告诉他们,“这都是为了验证殖民统治对于经济发展的结果”么?他们会在意几百年后是不是有一篇惊世骇俗的经济学研究论文发表了么?来个眼中体(点击查看大图)

africa-econ

好了,恶搞够了...其实说到底,很多问题实验也是没法回答的(或者根本没法设计),这类问题我们称之为FUQ(fundamentally unidentified question, 基本上无法识别的问题)。比如,我们无法改变的还有人的性别、肤色等等(基因不是你想改,想改就能改~),不过聪明的办法是我们去改变“别人认为你是什么性别的”,比如虚构建立神马的。一个著名的例子是,2004年Bertrand and Mullainathan的paper就是虚构了简历中的肤色——改变应聘者的姓氏,然后其他工作经历等等基本一样,然后看招聘企业电面反应如何。这样的聪明的实验设计不禁让人拍手叫绝——真正起作用的到底是奥巴马黑黑的皮肤呢,还是他黑黑皮肤下面那颗白白的心呢?所谓黑白两道通吃,不外乎如此。

呃,还是认真一点,说一个本质上无法识别的问题(FUQ)吧。

比如,是不是让孩子晚上小学一点比较好?然后自然而然的,我们会想,这还不简单么?我随机找两群小孩,一群6岁,一群7岁,然后同一年入学。之后,比较他们的成绩就好了嘛。等等,你有没有觉得有什么不对的地方,这两群人本身就不一样哇。一般说来,7岁总比6岁的要更容易学习一点吧,这个搞不好是年龄因素,与入学时间其实并无关系呢。七岁的孩子无论是学一年级还是二年级的课程,应该都比六岁的孩子学得好。然后有人说了,那么就我们去看6岁上学的孩子二年级的成绩,然后比较7岁上学一年级的成绩不就好了,这样大家都是7岁呢。这不是更无语么,上了两年学的孩子肯定要多少优于只上了一年学的啊。总而言之,在这里我们没有办法区分开两种因素对于孩子的影响——是孩子年龄增长了了所以学习好呢,还是在学校的时间长所以学习好呢?如果我们真的要研究这个问题,那么显然考核的指标不应该是他们一年级的成绩,而是长大了之后比如说工作的薪酬等等。

所以说,我们一方面要让实验本身设计的精巧,另一方面也要避免去涉及FUQ类型的问题,要不就是真的自己跟自己过不去了。p.s. 另外请确保你没有漏掉什么实验过程中需要记录的变量值,要不就很痛苦了...

第三个问题:拿到实验数据以后,你的回归方程右边的X是哪些

先统一一下名词:计量经济学里面我们更常用identification strategy来称呼用于衡量因果关系的模型。换一句通俗而不怎么严格的话,这个identification strategy就是你怎么消灭回归方程右边的内生变量(endogenous variable)的。内生变量又是怎么定义的呢?简单而不严格的来说,我们一般希望了解的是X对于Y的因果效应,即X的变化导致了Y的变化,而不是Y导致了X,所以这里需要X是不受Y反过来影响的(即X的取值的决定与Y无关——比如一个学生分在测试组还是对照组是随机的,而不是根据他的身高或年龄)。如果X,Y本身就是相互影响的,那么我们的回归系数估计值反映的只是两者的相关性(correlation),而不是X对于Y的因果效应(casual effect)。有鉴于此,我们称合格的X为外生变量(在计量经济学的定义下)。

显然,如果是随机分组实验,且X的值代表是测试组还是对照组,那么这个X肯定是外生(给定);如果我们无法证实X是严格外生的,那么就需要利用工具变量等办法来寻找和X相关但是和Y不相关的其他外生变量来完成因果效用估计,这就是计量经济学里面常说的“工具变量法”(Instrument Variable Model)。

一般说来,我们有如下几种情形:

  • 随机分组实验:那么可以直接把分组变量作为X,估计出来的即为因果效应。这也就是最常见的A/B test或者multivariate test,只要保证分组是随机的。
  • 自然实验:有的时候我们没法人为设计并实践实验,那么就可以借助自然界的一些外部冲击。比如,在一篇著名的论文里面,他们利用相邻的两个州之间的最低工资政策变化,研究了快餐行业就业率的影响。其实idea满简单的,就是两个州本来就业率什么的差不多,然后一个州突然提升了最低工资(类似于一个自然实验),所以去看快餐业的服务员就业情况变化就可以了(有点difference in difference的味道)。还有利用地震、原子弹什么的研究经济发展的...参见:

    Card, David, and Alan B. Krueger. Minimum wages and employment: A case study of the fast food industry in New Jersey and Pennsylvania. No. w4509. National Bureau of Economic Research, 1993.和

    Card, David, and Alan B. Krueger. "Minimum wages and employment: a case study of the fast-food industry in New Jersey and Pennsylvania: reply." The American Economic Review 90, no. 5 (2000): 1397-1420.不过很多时候,自然实验还是需要借助工具变量的,如果我们想测量的X始终还是有些内生性考量的。这个后面详述。

  • 有条件的分组实验:这个就不是完全的随机分组实验了,有的时候我们会设一些条件,比如人均收入多少才可以申请xx补助,这样的话人均收入就成为了能不能享受政策的条件。对于这种分组实验,因为离条件很近的那些人其实也没差多少,我们假设一下连续性什么的,就可以对比他们的反应来做一些因果推断了。到时候采用的策略就是 regression discontinuity design, 即我们常说的RDD。

最后一个问题:你的统计推断模型是什么样子的?

这个问题更多的是具体问题具体分析与上述策略的结合:你需要研究的是哪些总体,什么样的样本,有什么样的一些假设?然后就是更多统计模型的问题了,比如,你是要用一般的OLS呢,还是需要robust regression(比如clustered stand errors),还是logit regression之类的。有句蛮好玩的话抄一下:

T-stat looks too good

Try clustered standard errors --

Significance gone

也好残忍是不是?至于什么时候需要用clustered standard error,后面会详细的解释。总而言之呢,随机分组实验是我们的一个benchmark,如果做不到就需要各种各样的修正方法,所以也还是蛮有挑战性的事情呢。不过我还真没在业界看到过robust regression呢...

--------------第一篇引论结束----------

另注:本连载系列可能会不定期更新,因为确实有些地方会稍稍深一些,我也得回头复习一下那些论文...只能说,这个和以往的所有偏technical的笔记都不一样,没有速成之道,只有一个个案例仔仔细细的研究下去,才可以得到一个比较全面的对于统计因果推断策略的概念。我会努力的认真的写,争取尽量少的犯学术错误...

Categories
日常应用

各种被Teradata摧残的应付招数:SAS,R,文本文件导入导出

这篇文章基本上就是我被Teradata折腾的辛酸血泪史...TD有TD的长处,但是还不足以应付所有的分析任务。所以不得不面对各种把数据折腾出来折腾出去的任务...(好吧我还没开始被Hadoop虐呢,到时候务必又是一番惨死景象)。

Teradata文本导入导出

Teradata SQL Assistance直接输入输出

这个适用于本地安装了Teradata SQL Assistance的windows系统,然后我个人的建议是不要下载多于10w行的数据,要不会很烦。也不要上传多于1w行的数据,要teradata-export-csv不会更烦。

导出文本(csv)比较简单,直接选定 File->Export Result就可以了,然后任何运行SQL的输出都会输出到文本文件里面,主要就是 SELECT 出来的结果。

这个时候,TD会有提示"Future results will be Exported to a file"。

teradata-export-csv-2

类似的,可以选择File->Import Data来读入数据,这个时候会让你选择一个现成的文本(csv)文件,然后告诉TD怎么读就可以了。

举个例子,比如我们有一些邮政编码和城市名称的数据,格式如下:

County,Town,ZIP_CODE
Bronx,Bronx,10451
Bronx,Bronx,10452
Bronx,Bronx,10453
Bronx,Bronx,10454
Bronx,Bronx,10455
Bronx,Bronx,10456
Bronx,Bronx,10457
Bronx,Bronx,10458
Bronx,Bronx,10459
Bronx,Bronx,10460
Bronx,Bronx,10461

那么相应的code就可以写成:

CREATE MULTISET TABLE liyun_NY_DA_ZIP (
county CHAR(20)
,town CHAR(20)
,ZIP_CODE CHAR(5)
)

Insert into liyun_NY_DA_ZIP values (?,?,?); /* import data from csv */

Teradata的FastExport

这个目前还只在linux下试验成功过...

一段代码长成这个样子:

.logtable p_r_test_t.exp_log;
.logon mozart/username,password;
.begin export sessions 20;
.export outfile usa_all.txt mode record format text;
select cast(cast(x.byr_id as decimal(18) format 'ZZZZZZZZZZZZZZZZ9') as CHAR(18)),
',' (char(1)),
cast(cast(x.recency as decimal(4) format 'ZZZ9') as CHAR(4)),
',' (char(1)),
cast(cast(x.frequency as decimal(4) format 'ZZZ9') as CHAR(4)),
',' (char(1)),
cast(cast(x.monetary as decimal(8) format 'ZZZZZZZ9') as CHAR(8))
from p_r_test_t.dw_mbl_rfm_all x;
.end export;
.logoff;

然后存成一个脚本文件,比如your_fast_export_script.txt, 之后就可以直接在Shell里面调用了。

fexp < your_fast_export_script.txt

需要注意的是如果报各种稀奇古怪的错误,可能是编码尤其是换行符的问题...

FastLoad还米有试过。

Teradata导入导出到R里面

Teradata导出数据到R里面

如果想省心,那么就直接用TeradataR这个包。然后可能需要安装一下TD的ODBC driver: http://downloads.teradata.com/download/connectivity/odbc-driver/windows

简单的配置之后,就可以直接调用TeradataR了。

library(teradataR)
TDuid <- "xxx"
TDpwd <- "xxx"
connect_mozart = tdConnect(dsn = "xxxxx", uid=TDuid, pwd=TDpwd, database = "xxx")
#download the table and run summary locally
data_open <- tdQuery(" select * from xxxx order by 1,2,3,4,5,6;")
tdClose()

但是可惜的是这个包里面不提供导入回TD,只能去调用RODBC的原始命令。

R里面数据导入Teradata

#upload data
connect_mozart = odbcConnect(dsn = "xxx", uid=TDuid, pwd=TDpwd)
summary(aim_data)
sqlQuery(connect_mozart, "drop table xxxx;") #如果已经有这个表了
sqlSave(connect_mozart, aim_data, tablename="xxxx",rownames=F,fast=T)
odbcClose(connect_mozart)

这样就可以了。不过速度真心不怎么快(fast=F)会更慢。不建议使用大于1k行的R data.frame。

Teradata导入导出到SAS里面

Teradata导出数据到SAS里面

鉴于SAS可以直接用FastExport和FastLoad,这个速度就相当可观了。

proc sql noprint;
Connect To Teradata (user=&user password="&pwd" database=access_views tdpid=mozart mode=teradata);
create table xxx.xxxx as select * from connection to Teradata
(
select * from Xxxx.xxxx order by 1,2,3,4,5,6;

);

SAS里面数据导入Teradata

类似的,可以很快的把数据从SAS导入TD。

proc sql noprint;
Connect To Teradata (user=&user password="&pwd" database=access_views tdpid=vivaldi mode=teradata);

execute (drop table xxxxx.xxxx) by teradata;

execute
(
create table xxxxx.xxxx
(
USER_ID DECIMAL(18,0),
CMC_ID INTEGER,
CMC_START_DT DATE FORMAT 'YYYY/MM/DD',
SEGM_GROUP VARCHAR(255) CHARACTER SET UNICODE NOT CASESPECIFIC,
CHANNEL VARCHAR(5) CHARACTER SET UNICODE NOT CASESPECIFIC
) PRIMARY INDEX(USER_ID, cmc_id)
) by teradata;

Disconnect From Teradata;
quit;

proc append base=vivaldi.xxxx(fastload = yes fbufsize = 32000)
data=mz_sas.xxxx force;
run;

由于调用了fastexport和fastload,这速度明显改善,实测2G数据大概在5分钟左右,蛮快的了(6M/s)呢。