【R语言】泰尔指数及其分解

2020-06-17 00:00:00 函数 差距 分组 分解 指数

张敬信:【数学建模】泰尔指数及分解的计算方法与Matlab实现zhuanlan.zhihu.com

之前写过用 Matlab 实现泰尔指数及其分解,再补充一个 R 语言实现(代码更加的简洁),同时做了改进,之前的函数说实话很难使用:指标数据和分组数据是分开的,而且还得注意顺序不能乱。

只实现上篇文章中的 TbTw() 函数(另两个完全多余),算法原理步骤看上面这篇文章就行,不再赘述。

定义泰尔指数及其分解的函数:

Theil_Index <- function (dat) {
  # 计算泰尔指数及其分解
  # 返回Tb为组间差距, Tw为组内差距, z为各个组内差距, 
  # 返回T为泰尔指数, Db为组间贡献率, Dw为各个组内贡献率
  # 泰尔指数T=Tb+Tw
  # dat包含指标列x和分组列Group
  
  dat$Group = as.factor(dat$Group)
  dat$xp = dat$x / sum(dat$x)       # 计算每个个体收入占总收入的比例
  
  grps = split(dat$xp, dat$Group)   # 对数据做分组
  
  n = nrow(dat)
  nk = table(dat$Group)
  
  y = sapply(grps, sum)            # 第k组总收入占总收入的比例
  Tb = sum(y *log(y / (nk / n)))   # 组间差距
  
  K = length(grps)
  z = vector("double", K)
  for (k in 1:K) {   
    z[k] = sum((grps[[k]] / y[k]) * log(nk[k] * grps[[k]] / y[k]))   # 第k组的组内差距
  }
  
  Tw = sum(y * z)      # 总的组内差距为各分组组内差距的加权和
  Theil = Tb + Tw      # 泰尔指数
  Db = Tb / Theil      # 组间贡献率
  Dw = y * z / Theil   # 各分组内的组内贡献率
  
  list(Tb=Tb, Tw=Tw, Theil=Theil, z=z, Db=Db, Dw=Dw)
}

相关文章