【R语言】泰尔指数及其分解
张敬信:【数学建模】泰尔指数及分解的计算方法与Matlab实现
之前写过用 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)
}
相关文章