通常我们在聚类问题中遇到的数据都是横截面数据,很少有需要对面板数据进行聚类的情况。下面我们本着Learn the hard way的态度,探讨一下面板数据聚类的基本方法。
目前文献中一般先将面板数据平面化,什么叫做平面化呢,比如一个面板数据,有30个实体(Firm),每个实体取2009-2018年共计10年的数据,每条数据包含15个特征。平面化就是把每个实体10年的数据“拍扁”,按顺序排成一行,这样就得到30行数据,每个实体(Firm)占据一行,每行151个特征(FirmID)。下面用plm包里的Grunfeld数据集写一个简单示例
data=data("Grunfeld")
grund=scale(Grunfeld[,3:5])
gf=data.table(Grunfeld$firm,Grunfeld$year,grund)
colnames(gf)=c('f','y','i','v','c')
dt=dcast(data=gf,formula = f~y,value.var = c('i','v','c'))
hc=hclust(d = dist(dt),method = 'ward.D2')
plot(hc)
rect.hclust(hc,k=5)
平面化通过dcast函数完成。
当然,上文的平面化是最基础的情况,实践中可能遇到更复杂的需求。比如先计算每个实体各项指标的年增长率,或者在各项指标同质的条件下,先求出每年的变异系数,再进行平面化。
firm=unique(gf$f)
gf=as.data.frame(gf)
dg=data.frame()
for (i in firm) {
df=gf[gf$f==i,]
r=nrow(df)
dftl=df[1:(r-1),]
dftp=df[2:r,]
dres=(dftp[,3:5]-dftl[,3:5])/dftl[,3:5]
dres$f=i
dres$y=dftp$y
dres=dres[,c(4,5,1,2,3)]
dg=rbind(dg,dres)
}
gd=as.data.table(dg)
dt1=dcast(data=gd,formula = f~y,value.var = c('i','v','c'))
hc1=hclust(d = dist(dt1),method = 'ward.D2')
plot(hc1)
rect.hclust(hc1,k=4)
unorm=function(x) {mean(x)/sd(x)}
X2SD=apply(gf[,3:5], MARGIN =1, FUN=unorm)
ge=data.table(f=gf$f,y=gf$y,m2sd=X2SD)
dt2=dcast(data=ge,formula = f~y,value.var = 'm2sd')
hc2=hclust(d = dist(dt2),method = 'ward.D2')
plot(hc2)
rect.hclust(hc2,k=4)
树状图.jpeg
网友评论