Categories
经济、IT观察与思考

一些观察

随便写写,随便看看。

1. 关于研究方向。

读的paper多了,发现大多数人的研究路数无非两种:

  • 一种是锚定一个问题,然后用尽各种办法来看哪种可解。换个通俗的就是,车坏了,找出一堆工具来看看怎么可以修好。
  • 另一种则是,沿袭一套方法论的路数,试图解决越来越多的问题。通俗的讲,就是木工不满足于打打家具,还要去试试电工水工装修工。

你说孰优孰劣?没有高下之分。谁也说不好一篇好的研究到底是问题导向的还是方法论导向的。不过鉴于一般来讲方法论比较容易训练出来,所以有的时候看似包装的很漂亮的paper可能正是这个方法灵了然后倒回头来包装问题本身。

本以为这个只是看paper时候的感觉。后面发现,工作其实也不外乎如此。有的人凭着一门专业技能,比如编程,就可以在不同部门之间切换来切换去,反正总有需要用到编程的地方。有的人有一些具体问题,然后就广撒网找来各种背景的人帮忙解决。前者最后进化为技术专家,后者进化为大BOSS。

2. 关于建模

说到模型,反正上来都是那句至理名言:

没有模型是正确的,只有一些是有用的。

所以一切试图证明自己是真理的模型都是无用功。如果是真理,搞成体系那就叫他理论,可以慢慢证明就叫做定理,不证自明那就叫公理好了。反正我觉得说某个模型是正确的这种言论都是挺无聊的。

基于这一条,在实际商业环境中建模,就不要一开始给自己摆太高的期望。就跟上面说的,很多时候问题都是第一类人发现的,他们只是寻求有着不同技能的第二类人帮忙看一下,实践中谁好用就用谁。所以一群第二类人内部争来争去,什么机器学习流派啊、数理统计流派啊、计量帮啊、物理统计帮啊还是算命仙人这些其实都不那么重要...比如最近世界杯大家都在预测,那么不管你是章鱼还是小丸子还是霍金,只有预测对了大家才信你。

所以在学校里被某个流派洗脑洗的深入骨髓的,可以醒醒了。不要一上来就摆出自己是真理这样的架势。每个人在象牙塔里都是这么教的。

3. 关于统计建模

如果大家笃定就要用统计的方法了,那么要解决的问题就无非是:搜集数据(变量)、选择模型、修改参数以达到最优。

具体到项目,搜集数据这个肯定是大头。每个学过统计的都被教导过“garbage in, garbage out”。只可惜大部分老师讲完这句话之后,学生并没有多少机会实际的去搜集数据,或者更直接的去想要怎么搜集数据。大部分学校里面的训练(尤以网上数据挖掘竞赛之时)都是,数据集给定,怎么找个更好的模型来预测/评估/解释。真到了项目上需要搜集数据了,大部分人的做法无非就是先找张纸把想到的变量都分门别类列出来,然后把所有可能拿到的数据都扔进去试试,从简单的线性回归或者分类器开始,到非线性的各种模型都扔进去跑一遍,反正这年头计算能力不是瓶颈,总有合适的模型自己可以去做变量选择。

听到这里,貌似也挺好啊。是啊确实没什么不好,如果大家都有充足的时间慢慢玩的话。可惜的就是这种无脑流在大多数情况下都是受制约于时间的。于是为了省时间,要么就某些麻烦的数据不搜集了,要么就某些计算复杂的模型不去跑了。差不多就好了。解决问题了么?可能也差不多解决了70%-80%。

与此同时还有一类业务流派。这类人特别像医生似的,是某个具体领域的专家,专到什么程度呢?基本上他熟悉的地儿有个风吹草动都逃不过他的眼睛。直觉很准,或者说经验实在是太丰富了。跟这个流派的人一起工作很好玩,他们想到一个问题大概的给你指一个方向,大部分情况下八九不离十,差不多就可以把问题解决了。就算事后需要稍微建建数理模型多做一些分析和验证,基本也不会太麻烦。每当此时,不禁大呼一声畅快,瞬间觉得自己以前的思路真实的麻烦爆了。嗯,爽归爽,不过这种流派需要在一个领域浸淫比较长的时间,逃出他的领域就比较难说了。

4. 关于这些碎碎念

基本上就是想说,容易训练出来的都是不重要的...那些东西都进化很快,学术界不是白白养了一群人浪费的(虽然也挺浪费的),所以长江后浪一定会把前浪拍死在沙滩上。

与此同时,业务知识也不是那么重要的。经济环境变化太快,谁也不知道明天这个世界会变成什么样子。

那既然都是以不变应万变,那还是选一条比较开心的路子。总是需要合作的,这个世界已经复杂到没有可以一个人解决的问题了。

Categories
网络新发现

最新的一些经济学研究趋势...

今天闲着无聊抓了一下NBER最近一年的working paper数据看看。众所周知,econ现在发表周期越来越长,一两年都算少的,三五年也挺常见的。虽然跟跟AER什么的也是个比较好的指向,但多少还是“旧”了一点。

NBER覆盖的研究范围还是蛮广的,大部分发表的paper都能在这里找到working paper版本,所以一时没想到更好的抓数据的来源:

Aging(AG)
Asset Pricing(AP)
Children(CH)
Corporate Finance(CF)
Development Economics(DEV)
Development of the American Economy(DAE)
Economics of Education(ED)
Economic Fluctuations and Growth(EFG)
Environmental and Energy Economics (EEE)
Health Care(HC)
Health Economics(HE)
Industrial Organization(IO)
International Finance and Macroeconomics(IFM)
International Trade and Investment(ITI)
Labor Studies(LS)
Law and Economics(LE)
Monetary Economics(ME)
Political Economy(POL)
Productivity, Innovation, and Entrepreneurship Program(PR)
Public Economics(PE)

抓了一番之后,基本关键词热度如下。一些太没有意义的我就调透明了。(个人很讨厌word cloud这种东西,所以还是选择了bar chart)

[3/19更新] 和Bing里面的key words match了一下。貌似信息多了一些。

key_word

虽然数目不代表质量,但至少能看出来有多少人在某个领域耕耘。最突出的就是health这里了,很高(钱很多)。然后还有很多研究trade和growth的。然后risk和finance好像也蛮多的,crisis好像也挺多。Labor和IO一直也是热热的。研究方法上,随机试验还是最亮的。

没有进一步分析那些作者在高产,下次搞个“抱大腿”趋势好了。

代码在这里:

grab_url <- c("http://www.nber.org/new_archive/mar14.html",
              "http://www.nber.org/new_archive/dec13.html",
              "http://www.nber.org/new_archive/sep13.html",
              "http://www.nber.org/new_archive/jun13.html",
              "http://www.nber.org/new_archive/mar13.html")

library(RCurl)
require(XML)

grab_paper <- function (grab) {
  webpage <- getURLContent(grab)
  web_content <- htmlParse(webpage,asText = TRUE)
  paper_title <- sapply(getNodeSet(web_content, path="//li/a[1]"),xmlValue)
  author <- sapply(getNodeSet(web_content, path="//li/text()[1]") ,xmlValue)
  paper_author <- data.frame(paper_title = paper_title, author = author)
  return(paper_author)
}

library(plyr)
paper_all <- ldply(grab_url,grab_paper)

titles <- strsplit(as.character(paper_all$paper_title),split="[[:space:]|[:punct:]]")
titles <- unlist(titles)

library(tm)
library(SnowballC)
titles_short <- wordStem(titles)
Freq2 <- data.frame(table(titles_short))
Freq2 <- arrange(Freq2, desc(Freq))
Freq2 <- Freq2[nchar(as.character(Freq2$titles_short))>3,]
Freq2 <- subset(Freq2, !titles_short %in% stopwords("SMART"))
Freq2$word <- reorder(Freq2$titles_short,X = nrow(Freq2) - 1:nrow(Freq2))
Freq2$common <- Freq2$word %in% c("Evidenc","Effect","Econom","Impact","Experiment","Model","Measur","Rate","Economi",
                                  "High","Data","Long","Chang","Great","Estimat","Outcom","Program","Analysi","Busi"
                                  ,"Learn","More","What")
library(ggplot2)
ggplot(Freq2[1:100,])+geom_bar(aes(x=word,y=Freq,fill = common,alpha=!common))+coord_flip()

### get some keywords from Bing academic
start_id_Set = (0:5)*100+1
require(RCurl)
require(XML)
# start_id =1
# 

get_keywords_table <- function (start_id) {
  end_id = start_id+100-1
  keyword_url <- paste0("http://academic.research.microsoft.com/RankList?entitytype=8&topDomainID=7&subDomainID=0&last=0&start=",start_id,"&end=",end_id)
  keyword_page <- getURLContent(keyword_url)
  keyword_page <- htmlParse(keyword_page,asText = TRUE)
  keyword_table <- getNodeSet(keyword_page, path="id('ctl00_MainContent_divRankList')//table")
  table_df <- readHTMLTable(keyword_table[[1]])
  names(table_df) <- c("rowid","Keywords"   ,  "Publications" ,"Citations")
  return (table_df)
}

require(plyr)
keywords_set <- ldply(start_id_Set,get_keywords_table)

save(keywords_set, file="keywords_set.rdata")

最后更新的部分代码。效率偏低,见谅。

### map keywords
load("keywords_set.rdata")
load("NBER.rdata")
keys <- strsplit(as.character(keywords_set$Keywords), split=" ")
require(SnowballC)
keys_Stem <- lapply(keys,wordStem)

#get edges 
edge_Set <- data.frame()
for (word in Freq2$word){
#   print(word)
  for (key_id in 1:length(keys_Stem)){
#     print(keys_Stem[[key_id]])
    if (word %in% keys_Stem[[key_id]]) {
      edge <- data.frame(keywords = keywords_set[key_id,]$Keywords, kid = word)
      edge_Set <- rbind(edge_Set,edge)}
  }
}

#edge_Set
require(ggplot2)
kid_freq <- as.data.frame(table(edge_Set$kid))
require(plyr)
kid_freq <- arrange(kid_freq, desc(Freq))

edge_Set_sub <- subset(edge_Set, kid %in% Freq2[1:100,]$word)
edge_Set_sub$keywords <- as.character(edge_Set_sub$keywords)
# edge_Set_sub$kid <- as.character(edge_Set_sub$kid)

link_keys <- function(x) {paste(x$keywords,collapse = ", ")}

linked <- ddply(edge_Set_sub, .(kid), link_keys)

show_keys <- merge(Freq2[1:100,],linked, by.x="word",by.y="kid", all.x=T)
names(show_keys)[5] <- "linked"

ggplot(show_keys[!is.na(show_keys$linked),],aes(x=word,y=Freq))+
  geom_bar(aes(fill = common,alpha=!common),stat="identity",ymin=10)+coord_flip()+
  geom_text(aes(label=substr(linked,1,200),y = Freq, size = 1),hjust=0)