请选择 进入手机版 | 继续访问电脑版
楼主: zhjx19
17657 11

泰尔指数及分解公式的计算方法与Matlab实现 [推广有奖]

  • 7关注
  • 26粉丝

讲师

76%

还不是VIP/贵宾

-

威望
0
论坛币
4876 个
通用积分
799.0096
学术水平
61 点
热心指数
66 点
信用等级
60 点
经验
5733 点
帖子
121
精华
1
在线时间
908 小时
注册时间
2013-4-26
最后登录
2024-4-8

zhjx19 发表于 2016-11-13 15:39:04 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前言

最近查一点泰尔指数的资料,发现无论是公式还是软件实现,都说的特别乱,看不出所以然。

特整理了该内容,并用Matlab软件给出了实现的代码。


一、泰尔指数


泰尔指数(Theil index)或者泰尔熵标准(Theil’s entropy measure)泰是由泰尔(Theil,1967)利用信息理论中的熵概念来计算收入不平等而得名。

熵在信息论中被称为平均信息量。在信息理论中,假定某事件E将以某概率p发生,而后收到一条确定消息证实该事件E的发生,则此消息所包含的信息量用公式可以表示为:

\[h(p)=ln(\frac{1}{p})\]

设某完备事件组由各自发生概率依次为p1,p2,...,p_n由n个事件E1,E2,...,E_n构成,则有\[\sum_{i=1}^n p_i =1\],熵或者期望信息量等于各事件的信息量与其相应概率乘积的总和:

\[H(x)=\sum_{i=1}^n p_i h(p_i) = \sum_{i=1}^n p_i \ln\big(\frac{1}{p_i}\big) = -\sum_{i=1}^n p_i \ln(p_i)\]      (1)

将信息理论中的熵指数概念用于收入差距的测度时,可将收入差距的测度解释为将人口份额转化为收入份额(类似于洛伦兹曲线中将人口累计百分比信息转化为收入累计百分比)的消息所包含的信息量。而泰尔指数只是熵指数中的一个应用最广泛的特例。泰尔指数的表达式为:

\[T=\frac{1}{n} \sum_{i=1}^n \frac{y_i}{\bar{y}} \ln\big(\frac{y_i}{\bar{y}}\big)\]               (2)

其中,T为收入差距程度的测度泰尔指数,y_i表示第i个个体的收入,\[\bar{y}\]表示所有个体的平均收入。

对于分组数据,泰尔指数有另一种表达式:

\[T=\sum_{k=1}^K w_k \ln\big( \frac{w_k}{e_k} \big)\]                 (3)

其中,w_k表示第k组收入占总收入的比重,e_k表示第k组人口数占总人口数的比重。

1.

111.jpg


(I)    按公式(2)计算

  1. function T=Theil2(x)
  2. %函数Theil2()计算泰尔指数, 反映收入水平的差异
  3. %其中,x为n个个体的收入
  4. xx=x./mean(x);
  5. T=mean(xx.*log(xx));
复制代码

主程序

  1. y2=[10 10 8 8 8 8 6 6 6 6 6 6 4 4 4 4 2 2];
  2. %每个个体的收入(万美元)
  3. T2=Theil2(y2)
复制代码

运行结果

T2 =  0.0791

(II)   按公式(3)计算

  1. function T=Theil(y,p)
  2. %函数Theil()计算泰尔指数, 反映收入水平的差异
  3. %其中,y为各组的平均收入; p为各组包含的个体数
  4. w=y.*p/sum(y.*p);
  5. e=p./sum(p);
  6. T=sum(w.*log(w./e));
复制代码

主程序

  1. y=[10 8 6 4 2]; %各组的平均收入(万美元)
  2. p=[2 4 6 4 2]; %各组包含的个体数
  3. T=Theil(y,p)
复制代码

运行结果

T =  0.0791


. 泰尔指数分解法

泰尔指数作为收入不平等程度的测度指标具备良好的可分解性质,即将样本分为多个群组时,泰尔指数可以分别衡量组内差距与组间差距对总差距的贡献。假设包含n个个体的样本被分为K个群组,每组分别为\[g_k, (k=1,\cdots,K)\],第k组g_k中的个体数目为n_k,则有\[\sum_{k=1}^K n_k =n\],

y_i表示个体i的收入份额(占总收入的比例), y_k表示第k组的收入份额(占总收入的比例),记T_b与T_w分别为组间差距和组内差距,则可将泰尔指数分解如下:

\[T=T_b+T_w=\sum_{k=1}^K y_k \ln\big(\frac{y_k}{n_k /n} \big) + \sum_{k=1}^K y_k \Big(\sum_{i \in g_k} \frac{y_i}{y_k} \ln \frac{y_i / y_k}{1/n_k} \Big)\]     (4)

在上式中组间差距T_b与组内差距T_w分别有如下表达式:

\[T_b=\sum_{k=1}^K y_k \ln\big(\frac{y_k}{n_k /n} \big) \]                           (5)


\[T_w = \sum_{k=1}^K y_k \Big(\sum_{i \in g_k} \frac{y_i}{y_k} \ln \frac{y_i / y_k}{1/n_k} \Big)\]      (6)

另外,值得注意的是组内差距项分别由各组的组内差距之和构成,各组的组内差距的计算公式与样本总体的计算公式并无二致,只是将样本容量控制在第k组的个体数目n_k。


2 还是1的数据,计算组间差距T_b与组内差距T_w,验证泰尔指数T=T_b+T_w


  1. function [Tb,Tw]=TbTw(x,n)
  2. %函数TbTw()计算泰尔指数分解, 返回Tb为组间差距, Tw为组内差距
  3. %泰尔指数T=Tb+Tw
  4. %x为N个个体的收入向量, 依次分为K个分组
  5. %n=[n1,...,nK]为各分组的个体数向量, sum(n)=N
  6. K=length(n);
  7. s=[0,cumsum(n)];
  8. for k=1:K
  9.     X{k}=x(s(k)+1:s(k+1))./sum(x);
  10. %X{k}为第k个分组的nk个个体的收入份额(占总收入的比例)
  11.     y(k)=sum(X{k}); %y(k)为第k组的收入份额(占总收入的比例)
  12. end
  13. Tb=sum(y.*log(y./(n./length(x)))); %组间差距
  14. for k=1:K
  15.     z(k)=sum((X{k}./y(k)).*log(n(k)*X{k}./y(k)));
  16. %第k组的组内差距
  17. end
  18. Tw=sum(y.*z); %总的组内差距为各分组组内差距的加权和
复制代码

主程序

  1. x=[10 10 8 8 8 8 6 6 6 6 6 6 4 4 4 4 2 2];
  2. %每个个体的收入(万美元)
  3. n=[2 4 6 4 2]; %各分组的个体数
  4. [Tb,Tw]=TbTw(x,n)
复制代码

    运行结果

Tb=  0.0791

Tw=  -3.7007e-17


说明:由于该例中,每个分组内各个个体的收入是相同的,故每个分组的组内差距为0,总的组内差距Tw也为0,结果中的-3.7007e-17是由于Matlab中的双精度误差造成的,相当于是0.


3 修改1中的数据,让各分组的个体收入不相等,继续测试上述算法。

原第1组:10、10,改为9.5、10.5

原第2组:8、8、8、8,改为7、9、7.5、8.5

原第3组:6、6、6、6、6、6改为5、7、5.5、6.5、6、6

原第4组:4、4、4、4改为3、5、3.5、4.5

原第5组:1.5、2.5


主程序

  1. x2=[9.5 10.5 7 9 7.5 8.5 5 7 5.5 6.5 6 6 3 5 3.5 4.5 1.5 2.5]; %每个个体的收入(万美元)
  2. n=[2 4 6 4 2]; %各分组的个体数
  3. [Tb,Tw]=TbTw(x2,n)
  4. T=Theil2(x2)
  5. Tb+Tw
复制代码

运行结果

Tb=  0.0791

Tw=  0.0077

T=   0.0868

ans=  0.0868


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:matlab实现 MATLAB matla atlab 泰尔指数 泰尔指数 泰尔指数分解 代码实现 Matlab

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
happy_287422301 + 100 热心帮助其他会员
liujianfang + 100 + 5 + 5 + 5 精彩帖子
nuomin + 20 + 20 + 1 + 5 + 1 精彩帖子

总评分: 经验 + 120  论坛币 + 120  学术水平 + 6  热心指数 + 10  信用等级 + 6   查看全部评分

本帖被以下文库推荐

lunwenz0 发表于 2017-3-28 20:03:14 |显示全部楼层 |坛友微信交流群
运行出来的程序好像是错误的啊

使用道具

幻月黄昏 发表于 2017-7-26 22:58:07 |显示全部楼层 |坛友微信交流群
楼主能否提供matlab数据文件呢?感谢

使用道具

zhjx19 发表于 2017-7-27 12:11:27 |显示全部楼层 |坛友微信交流群
幻月黄昏 发表于 2017-7-26 22:58
楼主能否提供matlab数据文件呢?感谢
数据就在代码里面啊

使用道具

farina27 发表于 2017-7-27 17:41:04 |显示全部楼层 |坛友微信交流群
楼主你好,我认真阅读了您的代码,看到x{1}存储的是[0.0925925925925926,0.0925925925925926]这样一个数组,请问一下,如果做二阶分解的话,不知道x{k}能不能存储三层数据啊?比如x{1}存储的数组里面第一个数据0.0925925925925926,能不能用来存储第三层中的一个数组?不知道我讲清楚了没有,请多多指教!

使用道具

幻月黄昏 发表于 2017-7-27 23:56:02 |显示全部楼层 |坛友微信交流群
问题已解决,谢谢楼主

使用道具

幻月黄昏 发表于 2017-7-28 00:41:35 |显示全部楼层 |坛友微信交流群
楼主,出现了新问题。

x=[1.154062        0.985147        0.983094        0.708012        1.184635        0.93766 1.115254 1.026582 1.187553 0.807315 0.851514        1.091385        1.059443]; %数值

n=[6 2 5]; %以上数值各分组的个数

每组计算结果为 0.0129    0.0009    0.0108,相加后并不等于Tw的值0.0101

使用matlab和stata都是这个结果,而其他论文上都应该等于Tw的值才对。请问是什么原因呢?应该如何修改?谢谢

使用道具

zhjx19 发表于 2017-7-30 17:50:03 |显示全部楼层 |坛友微信交流群
幻月黄昏 发表于 2017-7-28 00:41
楼主,出现了新问题。

x=[1.154062        0.985147        0.983094        0.708012        1.184635  ...
本来就是不相等,这里不同于泰尔指数分解那里。
我后来又对代码做了改进,可以计算更多的量出来,你可以参考一下:
https://zhuanlan.zhihu.com/p/23627010

使用道具

幻月黄昏 发表于 2017-7-30 19:36:37 |显示全部楼层 |坛友微信交流群
zhjx19 发表于 2017-7-30 17:50
本来就是不相等,这里不同于泰尔指数分解那里。
我后来又对代码做了改进,可以计算更多的量出来,你可以 ...
原来您就是张敬信老师,老师您好,matlab代码参考的就是您给地址的那一篇,前面的计算结果就是Z值。
看了很多论文计算区域内泰尔指数时用的是区域A泰尔指数+区域B泰尔指数+区域C泰尔指数=区域内泰尔指数总和(Tw),然后Tw+Tb=T。请问老师如何用Matlab计算泰尔指数分解?尝试过单独计算每个区域的泰尔指数,结果和Z值一样。

(PS:老师能否留个微信或者QQ,目前在学习Matlab,希望能得到您的指点,感激不尽)

使用道具

nannan2430 发表于 2018-1-29 17:11:22 |显示全部楼层 |坛友微信交流群
想知道如何运用泰尔指数对医疗资源分布公平性解释?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 09:55