@fanxy
2016-09-11T06:44:55.000000Z
字数 6274
阅读 2674
樊潇彦 复旦大学经济学院 中级宏观
# 准备工作install.packages("readxl") # 读取excel数据install.packages("stringr") # 处理字符串install.packages("corrplot") # 作相关关系图install.packages("igraph") # 作网络图install.packages("forecast") # 作季节调整library(readxl) # 读取excel数据library(stringr) # 字符串处理library(corrplot)library(igraph)library(forecast)library(stats) # 基础包,不用安装直接调用library(dplyr)library(tidyr)library(data.table)library(foreign)library(readstata13)library(haven)library(ggplot2)library(ggrepel)library(dygraphs)library(plotrix)library(lubridate)library(zoo)library(mFilter)setwd("D:\\...") # 设定工作目录rm(list=ls())
gdp=read_excel("Ch02_Data.xlsx",col_names=T,sheet="gdp_idx") # 读取excel数据gdp=gdp%>%filter(year<=2014)%>%mutate(gdp_idx52=ifelse(year==1952,100,gdp_idx))%>%mutate(gdp_idx52=cumprod(gdp_idx52/100))%>% # 1952年为基期的实际GDP指数mutate(cg_idx52=ifelse(year==1952,100,gdpcg_gr+100))%>%mutate(cg_idx52=cumprod(cg_idx52/100))%>% # 实际最终消费指数mutate(i_idx52=ifelse(year==1952,100,gdpi_gr+100))%>%mutate(i_idx52=cumprod(i_idx52/100))%>% # 实际资本形成指数mutate(GDP52=gdp_idx52*gdp$GDP[1])%>% # 实际GDPmutate(deflator=GDP/GDP52) # GDP平减指数# 以下用HP滤波提取趋势和周期,年度数据lambda=100,季度和月度分别为1600和14400# HP滤波得到有10个元素的列表(list),把cycle提取出来gdp$gdp=hpfilter(log(gdp$gdp_idx52),drift=F,freq=100,type="lambda")$cyclegdp$cg=hpfilter(log(gdp$cg_idx52),drift=F,freq=100,type="lambda")$cyclegdp$i=hpfilter(log(gdp$i_idx52),drift=F,freq=100,type="lambda")$cyclegdp$def=hpfilter(log(gdp$deflator),drift=F,freq=100,type="lambda")$cycleround(cor(gdp[,c("gdp","cg","i","def")]),2) # 查看相关系数# 比较两种方法提取出来的周期因素gdp$gr=gdp$gdp_idx/100-1 # 计算实际GDP增长率twoord.plot(lx = gdp$year, ly = gdp$gdp,rx = gdp$year, ry = gdp$gr,main = '两种周期提取方法的结果比较', xlab = '',ylab = 'HP滤波', rylab = '实际GDP增长率',type = c('line','line'))
# 产出、最终消费和资本形成g_gdp=gdp%>%select(year,gdp:i)%>%gather(var,cycle,-year) # 选择要作图的数据ggplot(g_gdp,aes(year,cycle,color=var))+geom_line(size=1)+labs(title="产出、最终消费和资本形成",x="",y="")+scale_colour_manual(values= c("cg"="green","gdp"="black","i"="red"),labels = c('实际最终消费','实际GDP','实际资本形成'))+guides(color = guide_legend(title = NULL)) +theme_bw()+ theme(legend.position = 'bottom')# 产出和GDP平减指数g_gdp=gdp%>%select(year,gdp,def)%>%gather(var,cycle,-year)ggplot(g_gdp,aes(year,cycle,color=var))+geom_line(size=1)+labs(title="产出和GDP平减指数",x="",y="")+scale_colour_manual(values= c("def"="red","gdp"="black"),labels = c('GDP平减指数','实际GDP'))+guides(color = guide_legend(title = NULL)) +theme_bw()+ theme(legend.position = 'bottom')
# 财政支出G=read_excel("Ch02_Data.xlsx",col_names=T,sheet="G")str(G)G=G%>%mutate(year=year(year))%>%filter(year<=2014)%>%left_join(gdp,by="year")%>%mutate(all=`国家财政支出`/deflator)%>% # 计算实际值mutate(cen=`中央财政支出`/deflator)%>%mutate(loc=`地方财政支出`/deflator)%>%select(year,gdp,all,cen,loc)G$all=hpfilter(log(G$all),drift=F,freq=100,type="lambda")$cycleG$cen=hpfilter(log(G$cen),drift=F,freq=100,type="lambda")$cycleG$loc=hpfilter(log(G$loc),drift=F,freq=100,type="lambda")$cycleround(cor(G[,2:5]),2) # 查看相关系数G=G %>% select(year,gdp,all)%>%gather(var,cycle,-year)ggplot(G,aes(year,cycle,color=var))+geom_line(size=1)+labs(title="产出和财政支出",x="",y="")+scale_colour_manual(values= c("all"="red","gdp"="black"),labels = c('实际财政支出','实际GDP'))+guides(color = guide_legend(title = NULL)) +theme_bw()+ theme(legend.position = 'bottom')# 货币供给M=read_excel("Ch02_Data.xlsx",col_names=T,sheet="M")str(M)# 对GDP做季度调整后HP滤波gdp_ss=M%>%select(time,`GDP:累计值`)%>%mutate(time=as.yearmon(time))%>%arrange(time)%>%filter(!is.na(`GDP:累计值`))%>%mutate(gdp=ts(`GDP:累计值`,frequency=4, start=c(1992,3))) # 转换为ts对象lngdp_dec=stats::decompose(log(gdp_ss$gdp)) # 分解为趋势、季节和随机因素plot(lngdp_dec) # 分解结果作图lngdp_adj=seasadj(lngdp_dec) # 生成经季节调整的数据plot(log(gdp_ss$gdp)); lines(lngdp_adj, col="red") # 比较季节调整前后的数据gdp_ss$hp_gdp=hpfilter(lngdp_adj,drift=F,freq=1600,type="lambda")$cycle # 对季节调整数据作图plot(gdp_ss$hp_gdp) # HP滤波结果作图# 对货币供应做月度调整后HP滤波mon=M%>%select(time,`M0(流通中的现金):期末值`,`M2(货币和准货币):期末值`)%>%mutate(time=as.yearmon(time))%>%arrange(time)%>%filter(time>=1996)%>%mutate(m0=ts(`M0(流通中的现金):期末值`,frequency=12, start=c(1996,1)))%>% # 转换为ts对象mutate(m2=ts(`M2(货币和准货币):期末值`,frequency=12, start=c(1996,1)))str(mon)lnm0=stats::decompose(log(mon$m0)); plot(lnm0)mon$hp_m0=hpfilter(seasadj(lnm0),drift=F,freq=14400,type="lambda")$cyclelnm2=stats::decompose(log(mon$m2)); plot(lnm2)mon$hp_m2=hpfilter(seasadj(lnm2),drift=F,freq=14400,type="lambda")$cyclemon=mon%>%left_join(gdp_ss,by="time")%>%select(time, contains("hp_"))%>%mutate(hp_gdp=ifelse(is.na(hp_gdp),0,hp_gdp))ggplot(mon,aes(time,hp_gdp)) +geom_line(aes(time,hp_m0,color="M0"),size=1)+geom_line(aes(time,hp_m2,color="M2"),size=1)+scale_colour_manual(values= c("M0"="orange","M2"="red"),labels = c('M0','M2'))+geom_bar(stat="identity", position = "dodge",fill="gray40")+labs(title="产出和货币供给",x="",y="")+guides(color = guide_legend(title = NULL)) +theme_bw()+ theme(legend.position = 'bottom')
# 房地产市场与宏观经济Guofang=read_excel("Ch02_Data.xlsx",col_names=T,sheet="Guofang")str(Guofang)Guofang=Guofang%>%mutate(time=sub("月","",time))%>%mutate(time=sub("年","-",time))%>%mutate(time=as.yearmon(time))%>%gather(var,idx,-time)%>%arrange(var,time)ggplot(Guofang,aes(time,idx,color=var))+geom_line(size=1)+labs(title="国房景气指数和宏观经济景气指数",x="",y="")+guides(color = guide_legend(title = NULL)) +theme_bw()+ theme(legend.position = 'bottom')# 行业相关性indcor=read_excel("Ch02_Data.xlsx",col_names=T,sheet="indgdp_idx")indcor123=indcor%>%select(GDP,`第一产业`,`第二产业`,`第三产业`)round(cor(indcor123),2) # 查看相关性corr=cor(select(indcor,-year,-GDP,-`第二产业`,-`第三产业`))corrplot(corr = corr,type="upper",tl.pos="d",order="hclust",method="ellipse")corrplot(corr = corr,add=TRUE, type="lower", method="number",order="hclust",diag=FALSE,tl.pos="n", cl.pos="n")# 地区相关性gdpreg=read_excel("Ch02_Data.xlsx",col_names=T,sheet="reggdp_idx")gdpreg=gdpreg%>%filter(!is.na(reg))reginfo=gdpreg%>%mutate(regno=1:31)%>%select(reg,regno)regcor=gdpreg%>%gather(year,idx,-reg)%>%filter(year>1952)%>%spread(reg,idx)regcor=cor(select(regcor,-year))corrplot(corr = regcor,type="lower",tl.pos="d", # 地区相关关系图order="hclust",method="shade")# 每个地区选取与之相关性最高的地区,网络作图diag(regcor)=0maxregcor=data.frame(from=colnames(regcor),to=colnames(regcor)[apply(regcor,1,which.max)],cor=apply(regcor,1,max))rownames(maxregcor)=NULLg_regcor <- graph.data.frame(maxregcor, directed = T)summary(g_regcor)plot.igraph(g_regcor,vertex.size = g_regcor$weight,edge.arrow.size=0.5,edge.color = g_regcor$weight,edge.width= g_regcor$weight)