Categories
读书有感

降维模型若干感悟

前几天集中爆发了一些email,直到最后和Frank兄提起,他说我应该去看一下 Adaptive Lasso,我才终于痛下决心开始看这方面的东西。先说说为啥开始看Lasso。

需求。大数据时代,任务有很多:

  • 理论层面,要有适应大数据的模型。一方面是数据量的增加(表现为个体记录的增长),一方面是数据维度的增加(简单的说就是回归方程右边的变量),让大数据这个任务变得格外艰巨(p.s. 这个不是我总结的,照抄上次ShanghaiR沙龙时候Ming的原话...话说我别的没记住,就这句话深深的印在脑海了,哎~)。
    • 数据量的增加,对应的是大样本理论。这个好玩的有很多,暂且不表。
    • 数据维数的增加,则需要相应的降维模型。你总不能在回归方程右边放入几千个变量,“维数灾难”啊...所以变量选择是个很好玩的话题。
  • 应用层面,一个模型性质再漂亮,你也要能算得出来才行是不是?
    • 首先就是要有个好的算法,比如在「统计学习那些事」中提及的LAR对于Lasso的巨大贡献。
    • 其次,什么分布式计算啊,并行计算啊,都成为热呼呼的实践问题(当然我还是go against那些不管三七二十一、直接软件中调用模型的。任何一个模型的假设和局限性都是应该首先考虑的,要不真不知道预测到哪里去了呢~)。

好吧,好久没用这么多层级了。只是昨天稍稍理了理思路,顺便写在这里,算作「感悟一」。

然后,说到底统计学还是为其他学科服务的(好吧,我是想说数据不是无源之水,总归有自己的背景,总归有在这个背景领域的人希望借助数据来解决的问题)。那么作为一种empirical method,统计模型关心的是什么呢?在被计量经济学熏陶外加祸害了若干年后,发现它本质还是为了经济学研究的一些目的服务的,所以关注的更多是consistency,大家张口闭口就是“变量外生性”...而这多少有些直觉+经验判断的东西。显然,统计模型不仅仅是计量经济学,昨天看「The Elements of Statistical Learning: Data Mining, Inference, and Prediction」,大致的关于统计模型关心的判断标准的「感悟二」总结在这里:

  • consistency:这个还是逃不掉的,一致性在大样本下虽然比小样本的无偏要求来的弱得多(plim毕竟比期望算子好“操作”一些)。其实有一段时间我一直很抵触把计量经济学里面的causality叫做因果关系,学习计量模型的过程基本就是保证估计一致性的推导过程...想说的只是,真正的因果关系不是统计学就可以定义的,还是要回到学科本身。consistency更多包含着“internal validity”的味道,即一个结果可以期望在样本本身内重复实现。个人感觉,从经济学理论与实证研究的角度,这大概是计量经济学能达到的最多的程度了吧。再苛刻的因果真的就是经济理论本身的问题了。
  • accuracy: 统计还有一大任务,做预测。我们都知道OLS有的时候可以很简单的给出一个consistent的估计量,但是仅仅是均值意义上的估计还是不够的,对你还得给出个方差。这个方差就刻画了你的估计值是不是飘来飘去。我们当然希望一个方差比较小的估计量,所以大多数时候OLS是不能满足这样的要求的(顺便复习一下BLUE的那些条件)。
  • implementable: 有的时候我们可以用现有的数据、花费大量的时间,来拟合一个漂亮的模型。但是,模型不是放在那里就可以的,在实际应用中大家更关心的是,模型建立之后对于日后决策的指导作用。可能1000个自变量拟合出来的模型比20个好10%到20%,但是在实际应用中,20个变量显然更实用...同理,有些非线性模型漂亮的一塌糊涂,但是计算复杂度可能远远不是多项式级别的。这个时候,退而求其次也不失为一记良策。说到底,有的时候并不要求最完美的模型,总要在性能和效率之间取得一个平衡。
  • 当然说到prediction,这里更多的就有statistical learning的味道了。回归多少还算是supervised learning,至少脑海里大致有个印象什么是回归方程那一边的y。更多的时候,连y是什么都没有概念,所以就有了基于similarity的模型,比如clustering,比如协同过滤...不过有句话确实说的好(摘抄自「统计学习那些事」):

立新老师曾经有这么一句话:“If a method works well in practice, there must be some theoretical reasons for its success.” 如果一个模型在实践中表现的很好,那么一定有它好的原因。

所以基于上述三点(当然还有可能有更多的考虑),不同的模型对于不同的标准有着不同的达标水平。大家各有所长,用哪个还真得看实际任务的需求了。

「感悟三」,则是statistical learning (统计学习,有点机器学习的味道)的任务,这个是从「The Elements of Statistical Learning: Data Mining, Inference, and Prediction」上照抄的:

  • 预测准确性要高:和上面的accuracy对应。
  • 发现有价值的预测变量:更有可能从归纳法回溯到演绎法,给出更多的insights。

最后的,稍稍偏数学一点。「The Elements of Statistical Learning: Data Mining, Inference, and Prediction」里面第三章讲了很多Shrinkage Methods,关心的是varible selection(生物统计中feature selection)的问题。从大家最耳熟能详的stepwise(逐步回归),到ridge regression(岭回归),再到Lasso(或者把LAR也算进来)。基本说来,ridge和Lasso是在OLS基础上一个很有意思的变化。

  • OLS求解的最优化问题是:
  • ridge regression则是加了一个L2惩罚项,即 ,其中t是一个给定常数参数。
  • Lasso则是把这个L2变成了L1,即

就这么一个简简单单的变化,就有了后面那么多神奇的性质。「感悟四」就是,原来Lasso思想并不是那么复杂啊。

Categories
网络新发现

无意闯入...

偶然间,无意闯入一个孩子的轻博客,大概介于blog和微博之间吧,有长有短,跟长短词似的,约束少很多。

无意中看到这个孩子对于过去的缅怀,轻柔的文字之下,不知道有一段什么样子的故事。于是就这么冒昧的,把人家的轻博客从头翻到尾。我是不是应该检讨一下...虽然网络很发达,但显然很多文字并不是写给我们这种陌路相逢之人的。

好吧,我只能宣传一下这个孩子的blog,嗯,他有个专门写数学知识的blog。貌似最近在研究泛函,我就又没忍住读完了(还好就那么寥寥几篇)...

www.artofproblemsolving.com/Forum/blog.php?u=152939

我是有多么的八卦啊...唉。为什么看着看着就想起了曾经认识的某人呢...嗯,气质确实有点相仿。都是大牛的雏形哎~

Categories
日常应用

探索R包reshape2:揉数据的最佳伴侣

前几天放出来的那个R的展示中,有说到其实学R的过程更多的就是熟悉各种函数的过程(学习统计模型不在此列...我个人还是倾向于不要借助软件来学习理论知识,虽然可以直接看codes...笔和纸上的推导还是不可或缺的基本功),然后各种基础函数熟悉了之后很多被打包好的函数就是缩短代码长度的利器了。

excel里面有神奇的“数据透视表(pivot table)”,其实很多时候真的已经很神奇了....不过我还是喜欢R,喜欢R直接输出csv或者xlsx的简洁。揉数据呢(学名貌似叫数据整理),我也还是喜欢写出来代码的形式,而不是直接向excel那样面对结果。只是感觉更加不容易出错吧。

揉数据,顾名思义,就是在原有的数据格式基础上,变化出来其他的形式。比如,长长的时间序列变成宽一点的~当然这个可以简单的借助reshape()函数了。可惜我还是不死心,想找一个更好用的,于是就自然而然的看到了reshape2这个包。

这个包里面函数精华在melt()*cast()。说实话melt()耗了我一段时间来理解,尤其是为什么需要先melt再cast...后来发现这个步骤简直是无敌啊,什么样的形状都变得更加容易揉了,大赞。

warm-up完毕,还是回到正题吧,怎么用reshape2揉数据呢?虽然reshape2支持array, list和data.frame,但是我一般还是习惯于用data.frame,所以还是说说这东西怎么揉吧。揉数据的第一步就是调用melt()函数,不用担心你的input是什么格式,这个函数array, list和data.frame通吃。然后,要告诉他哪些变量是(唯一)识别一个个体的,这句话是什么意思呢?我们先看melt()的参数:

 melt(data, id.vars, measure.vars,
    variable.name = "variable", ..., na.rm = FALSE,
    value.name = "value")

其中id.vars可以指定一系列变量,然后measure.vars就可以留空了,这样生成的新数据会保留id.vars的所有列,然后增加两个新列:variable和value,一个存储变量的名称一个存储变量值。这样就相当于面板数据的长格式了。直接拷一个作者给出的例子:

原数据:

head(airquality)
  ozone solar.r wind temp month day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
dim(airquality)
[1] 153   6

然后我们将month和day作为识别个体记录的变量,调用melt(airquality, id=c("month", "day"))

head(melt(airquality, id=c("month", "day")))
  month day variable value
1     5   1    ozone    41
2     5   2    ozone    36
3     5   3    ozone    12
4     5   4    ozone    18
5     5   5    ozone    NA
6     5   6    ozone    28
dim(melt(airquality, id=c("month", "day")))
[1] 612   4

嗯,这样数据就变长了~然后,就可以随意的cast了...dcast()会给出宽格式的数据,比如我们想把day作为唯一的识别,那么:

names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
head(dcast(aqm, day ~ variable+month))
  day ozone_5 ozone_6 ozone_7 ozone_8 ozone_9 solar.r_5 solar.r_6 solar.r_7 solar.r_8 solar.r_9 wind_5 wind_6 wind_7 wind_8 wind_9 temp_5 temp_6
1   1      41      NA     135      39      96       190       286       269        83       167    7.4    8.6    4.1    6.9    6.9     67     78
2   2      36      NA      49       9      78       118       287       248        24       197    8.0    9.7    9.2   13.8    5.1     72     74
3   3      12      NA      32      16      73       149       242       236        77       183   12.6   16.1    9.2    7.4    2.8     74     67
4   4      18      NA      NA      78      91       313       186       101        NA       189   11.5    9.2   10.9    6.9    4.6     62     84
5   5      NA      NA      64      35      47        NA       220       175        NA        95   14.3    8.6    4.6    7.4    7.4     56     85
6   6      28      NA      40      66      32        NA       264       314        NA        92   14.9   14.3   10.9    4.6   15.5     66     79
  temp_7 temp_8 temp_9
1     84     81     91
2     85     81     92
3     81     82     93
4     84     86     93
5     83     85     87
6     83     87     84

或者对于每个月,求平均数:

 head(dcast(aqm, month ~ variable, mean, margins = c("month", "variable")))
  month    ozone  solar.r      wind     temp    (all)
1     5 23.61538 181.2963 11.622581 65.54839 68.70696
2     6 29.44444 190.1667 10.266667 79.10000 87.38384
3     7 59.11538 216.4839  8.941935 83.90323 93.49748
4     8 59.96154 171.8571  8.793548 83.96774 79.71207
5     9 31.44828 167.4333 10.180000 76.90000 71.82689
6 (all) 42.12931 185.9315  9.957516 77.88235 80.05722

当然还有更强大的acast(),配合.函数:

library(plyr) # needed to access . function
acast(aqm, variable ~ month, mean, subset = .(variable == "ozone"))
             5        6        7        8        9
ozone 23.61538 29.44444 59.11538 59.96154 31.44828

嗯,基本上数据就可以这么揉来揉去了...哈哈。怎么感觉有点像数据透视表捏?只是更加灵活,还可以自定义函数。

此外还有recast()可以一步到位,只是返回的是list;colsplit()可以分割变量名...函数不多,却精华的很啊。

--------------------
题外废话:我的小册子哎~只能这样零零碎碎的写一些了,事后再统一整理进去好了。不要鄙视...

Categories
事儿关经济 读书有感

声誉溢价让资本市场波动愈演愈烈?

按说我一个不怎么研究finance的人,是没什么太多积淀来对这篇paper评头论足的。只是翻这一期AER的时候看到这篇文章了,感觉有点意思,所以简单的说说他的观点。感觉在成熟的资本市场(不包括中国),对于波动性的研究已经越来越细致,各种可能的因素对于市场的冲击都在其中。相比而言,不成熟的市场就有更多匪夷所思的套利机会,这也是很多量化工具切入点吧……不懂乱说,finance我总喜欢用寡头博弈去理解嗯。

Guerrieri, Veronica, and Péter Kondor. 2012. "Fund Managers, Career Concerns, and Asset Price Volatility." American Economic Review, 102(5): 1986–2017.

working paper版本可以直接点击上面的标题链接下载。

前几天的那篇讨论薪酬的paper类似,这篇只是更直接的在说基金经理的报酬,当然随着市场的不同有些假设也不大一样。

先说假设。可能大家都知道,金融圈有两种基金经理,靠数量模型的和靠搞市场关系的。前一种基本就是天天对着计算机,后一种则天天到处跑,然后做的就是去找企业的内幕消息。在这样的现实下,肯定有一部分经理对某些企业的违约情况有着更多的信息。

可惜市场永远是信息不对称的。投资者并不知道哪些人确切的有这些内部信息,他们只能参照这些基金经理以往的业绩来决定投资与否。久而久之,我们就见到了很多所谓的“大牌经理”,做到极致的有庞氏骗局的创立者Ponzi,当然他是直接融资了。随着时间的积累,基金经理之间形成了一些声誉之类的信息,可以向外传递。这东西和我们在淘宝买东西时候看到的卖家评价别无二致——亲,这个经理以前没赔过哦~ 很简单的道理,很多人为了规避风险往往会在淘宝选择大卖家,这样大卖家就借助自己既有的声誉可以设置更高的价格(关于在位者与进入者的博弈模型暂时不考虑,那个更符合最近京东和苏宁的故事,有空另外讲~),这就是所谓的“声誉溢价”了。声誉溢价会对基金经理有着正的激励,所以出于对职业发展的考虑他们的投资决策会有所影响——比如当风险极高的时候,一般会选择保守策略。

这篇文章很有意思,一般说来“高风险高收益”,换成人话就是“舍不得孩子套不住狼”,当企业的违约风险比较高的时候,其对应的(不违约时候)收益也应该比较高,这样就可以补偿这些基金经理被炒鱿鱼的风险。可是这不是一个静态的过程嘛,随着时间的流逝,大牌经理的声誉溢价会越来越多的影响投资者的决策,进而更多的影响基金经理的投资偏好(高风险还是低风险金融产品),进而“小流汇江海”,声誉溢价会带来金融市场本身波动的放大,于是我们看到金融市场的一起起风起云涌浪潮波动愈演愈烈。市场的过激反应,便有可能来源于这种声誉溢价。

简单的说,这篇文章得出的就是这么一个结论。放大冲击的波动示意图见下。

2013-12-09 16_55_23-guerrierikondor_nov7.pdf - Adobe Reader

让我简单的评价的话...嗯,就算有这么个channel,我们也无力从机制设计上改变什么。市场自然演化的结果。

Categories
日常应用 网络新发现

颇具Geek精神的impress.js

好吧,感谢@乐天诗人 童鞋的推荐,让我见识到了这么震撼的presentation template。面对这种东西,完全没有抵抗力5555。什么powerpoint,什么beamer...什么pandoc自带的那几个破烂HTML5...一切都定格在impress.js。不要问我这是什么,如果你连自己搜都不会,就太不符合geek精神了。作者超级霸气,比如在帮助文档里面...

HOW TO USE IT

Use the source, Luke 😉

If you have no idea what I mean by that, or you just clicked that link above and got very confused by all these strange characters that got displayed on your screen, it's a sign, that impress.js is not for you.

Sorry.

然后乖乖的看源代码,好不容易看完几百行废话连篇自恋不已的说明,悍然发现:

Oh, you've already cloned the code from GitHub?

You have it open in text editor?

Stop right there!

That's not how you create awesome presentations. This is only a code. Implementation of the idea that first needs to grow in your mind.

So if you want to build great presentation take a pencil and piece of paper. And turn off the computer.

Sketch, draw and write. Brainstorm your ideas on a paper. Try to build a mind-map of what you'd like to present. It will get you closer and closer to the layout you'll build later with impress.js.

Get back to the code only when you have your presentation ready on a paper. It doesn't make sense to do it earlier, because you'll only waste your time fighting with positioning of useless points.

If you think I'm crazy, please put your hands on a book called "Presentation Zen". It's all about creating awesome and engaging presentations.

伤不起啊...还是乖乖的去找“Presentation Zen”这个东西吧。在书到手之前,乖乖的先弄一点东西应付一下接下来的presentation。可惜没搞定knitr,总是报错。只能手动拷代码进去了,sigh。

impress

BTW,这里有个impress.js制作的稍稍潦草的slides,大家凑活着看一下,嘻嘻: http://loyhome.com/impress/ 注:中文默认用“冬青黑体”,没有的自己看着办吧....