面板数据聚类的R实践

作者: 六胜一平 | 来源:发表于2020-03-02 22:33 被阅读0次

    通常我们在聚类问题中遇到的数据都是横截面数据,很少有需要对面板数据进行聚类的情况。下面我们本着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

    相关文章

      网友评论

        本文标题:面板数据聚类的R实践

        本文链接:https://www.haomeiwen.com/subject/mcxwkhtx.html