matlab画基尼系数,Dagum基尼系数分解的MATLAB程序代码(更新)

很多同学在初次使用Dagum基尼系数法做研究时苦于找不到计算软件,手动计算又耗时费力。去年写论文时,参考Dagum(1997)论文中提供的算例,自己编写了一个MATLAB版的计算程序,在这里分享给大家。转载和使用请注明出处!

一、Dagum基尼系数分解简介

1、总体基尼系数

math?formula=G%3D%5Cfrac%7B1%7D%7B2%20%5Cbar%7By%7D%20n%5E%7B2%7D%7D%5Cleft(%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Csum_%7Br%3D1%7D%5E%7Bn%7D%5Cleft%7Cy_%7Bi%7D-y_%7Br%7D%5Cright%7C%5Cright)%3D%5Csum_%7Bj%3D1%7D%5E%7Bk%7D%20%5Csum_%7Bh%3D1%7D%5E%7Bk%7D%20%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bj%7D%7D%20%5Csum_%7Br%3D1%7D%5E%7Bn_%7Bh%7D%7D%5Cleft%7Cy_%7Bj%20i%7D-y_%7Bh%20r%7D%5Cright%7C%20%2F%202%20n%5E%7B2%7D%20%5Cbar%7By%7D

2、子群内部基尼系数

math?formula=%5Cmathrm%7BG%7D_%7B%5Cmathrm%7Bjj%7D%7D%3D%5Cfrac%7B1%7D%7B2%20%5Cbar%7By%7D_%7Bj%7D%7D%5Cleft(%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bj%7D%7D%20%5Csum_%7Br%3D1%7D%5E%7Bn_%7Bj%7D%7D%5Cleft%7Cy_%7Bj%20i%7D-y_%7Bj%20r%7D%5Cright%7C%5Cright)%20%2F%20n_%7Bj%7D%5E%7B2%7D

3、子群内差异对总体基尼系数的贡献

math?formula=G_%7Bw%7D%3D%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bj%7D%7D%20G_%7Bj%20j%7D%20P_%7Bj%7D%20S_%7Bj%7D

4、子群h和子群j之间的基尼系数

math?formula=%5Cmathrm%7BG%7D_%7B%5Cmathrm%7Bjh%7D%7D%3D%5Cleft(%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bj%7D%7D%20%5Csum_%7Br%3D1%7D%5E%7Bn_%7Bh%7D%7D%5Cleft%7Cy_%7Bj%20i%7D-y_%7Bh%20r%7D%5Cright%7C%5Cright)%20%2F%20n_%7Bj%7D%20n_%7Bh%7D%5Cleft(%5Cbar%7By%7D_%7Bj%7D%2B%5Cbar%7By%7D_%7Bh%7D%5Cright)

5、子群间净值差距对总体基尼系数的贡献度

math?formula=G_%7Bn%20b%7D%3D%5Csum_%7Bj%3D1%7D%5E%7Bk%7D%20%5Csum_%7Bh%3D1%7D%5E%7Bj-1%7D%20%5Cmathrm%7BG%7D_%7B%5Cmathrm%7Bjh%7D%7D%5Cleft(P_%7Bj%7D%20S_%7Bh%7D%2BP_%7Bh%7D%20S_%7Bj%7D%5Cright)%20D_%7Bj%20h%7D

6、超变密度的贡献

math?formula=%5Cmathrm%7BG%7D_%7B%5Cmathrm%7Bt%7D%7D%3D%5Csum_%7Bj%3D1%7D%5E%7Bk%7D%20%5Csum_%7Bh%3D1%7D%5E%7Bj-1%7D%20%5Cmathrm%7BG%7D_%7B%5Cmathrm%7Bjh%7D%7D%5Cleft(P_%7Bj%7D%20S_%7Bh%7D%2BP_%7Bh%7D%20S_%7Bj%7D%5Cright)%5Cleft(1-D_%7Bj%20h%7D%5Cright)

其中:

math?formula=D_%7Bj%20h%7D%3D%5Cfrac%7Bd_%7Bj%20h%7D-p_%7Bj%20h%7D%7D%7Bd_%7Bj%20h%7D%2Bp_%7Bj%20h%7D%7D

math?formula=d_%7Bj%20h%7D%3D%5Cint_%7B0%7D%5E%7B%5Cinfty%7D%20d%20F_%7Bj%7D(y)%20%5Cint_%7B0%7D%5E%7By%7D(y-x)%20d%20F_%7Bh%7D(x)

math?formula=p_%7Bj%20h%7D%3D%5Cint_%7B0%7D%5E%7B%5Cinfty%7D%20d_%7Bh%7D(y)%20%5Cint_%7B0%7D%5E%7By%7D(y-x)%20d_%7Bj%7D(x)

二、Dagum基尼系数代码

1、主函数文件(Dagum_Gini.m)

%Dagum基尼系数分解主函数文件

function [G_Total,G_W,G_sub,G_nb,G_jh,G_t,G_test]=Dagum_Gini(varargin)

%% 输入变量和输出变量说明

%

% 输入变量:假定有子群:A,B,C,...,首先,按各子群均值由大到小排序,

% 如:B的均值>A的均值>C的均值>...,则输入命令为:Dagum_Gini(B,A,C,...)

% 注:所有子群变量均以列向量形式输入。

%

% 输出变量:

% G_Total: 总体基尼系数

% G_W: 子群内差异贡献

% G_sub: 子群内基尼系数

% G_nb: 子群间差异贡献

% G_jh: 子群间基尼系数

% G_t: 超变密度贡献

% G_test: 检验G_W+G_nb+G_t是否等于G_T

%% 检查变量输入格式

n_sub_group=nargin; %输入变量数(子群数)

all_sub_group=varargin; %输入的所有子群(以元胞数组形式存储)

for i_group=1:n_sub_group

[~,check_size]=size(all_sub_group{i_group});

if check_size~=1

error('输入格式错误:输入的各变量必须为列向量!')

end

end

for i_group=1:n_sub_group-1

if mean(all_sub_group{i_group})>=mean(all_sub_group{i_group+1})

%disp('输入格式正确!')

else

error('输入格式错误:请按子群均值从大到小依次输入变量!')

end

end

%% 计算整体和子群的样本数、均值,子群样本数占整体比重等

Total_group=cell2mat(all_sub_group'); %将子群合并成总体

n_T=length(Total_group); %总体样本数

m_T=mean(Total_group); %总体均值

% 预分配内存

n_sample_sub_group=zeros(n_sub_group,1); %存储各子群样本数量

m_sub_group=n_sample_sub_group; %存储各子群均值

P=n_sample_sub_group; %存储各子群样本数占总体样本数比重

S=n_sample_sub_group; %存储各子群元素之和占总体元素之和的比重

for i_group=1:n_sub_group

n_sample_sub_group(i_group)=length(all_sub_group{i_group});%b{i}是矩阵(列向量)

m_sub_group(i_group)=mean(all_sub_group{i_group});

P(i_group)=length(all_sub_group{i_group})/n_T;

S(i_group)=length(all_sub_group{i_group})*mean(all_sub_group{i_group})/(n_T*m_T);

end

%% 载入基尼系数求解函数

my_GINI=GINI_COMPUTE;

%% 计算各子群基尼系数

G_sub=zeros(n_sub_group,1);%预分配内存

for i_group=1:n_sub_group

%循环计算各子群的基尼系数,并将结果存储在G_sub矩阵中

G_sub(i_group)=my_GINI.GINI_1(all_sub_group{i_group},all_sub_group{i_group});

end

%% 使用for循环+矩阵上三角化计算G_jh、D_jh和P_S

G_jh_T=zeros(n_sub_group,n_sub_group);

D_jh_T=zeros(n_sub_group,n_sub_group);

P_S_T=zeros(n_sub_group,n_sub_group);

for i_group=1:n_sub_group

for j_group=1:n_sub_group

%循环计算子群间基尼系数矩阵

G_jh_T(i_group,j_group)=my_GINI.GINI_1(all_sub_group{i_group},all_sub_group{j_group});

%循环计算子群间的相对影响矩阵

D_jh_T(i_group,j_group)=my_GINI.D_jh(all_sub_group{i_group},all_sub_group{j_group});

%循环计算权重矩阵

P_S_T(i_group,j_group)=P(i_group)*S(j_group);

end

end

% G_jh、D_jh和P_S的矩阵上三角化

G_jh=triu(G_jh_T,1);

D_jh=triu(D_jh_T,1);

D_jh_1=1-D_jh;

D_jh_1=triu(D_jh_1,1);

P_S=triu(P_S_T,1)+triu(P_S_T',1); %(重要的一步)原矩阵与转置矩阵相加

%% 计算基尼系数分解结果

G_Total=my_GINI.GINI_1(Total_group,Total_group); %计算总体基尼系数

G_nb=sum(sum(P_S.*D_jh.*G_jh)); %计算子群间差异贡献额

G_t=sum(sum(P_S.*D_jh_1.*G_jh)); %计算超变密度

G_W=sum(P.*S.*G_sub); %计算组内基尼系数

G_test=G_W+G_nb+G_t; %检验总体基尼系数(G_T)是否等于G_W+G_nb+G_t

%% 显示计算结果

disp('%%%%%%%%%%%%%%%%Dagum基尼系数分解结果%%%%%%%%%%%%%%%')

disp(' ')

disp(['总体基尼系数(G_T): ',num2str(G_Total)])

disp(' ')

disp(['子群内差异贡献(G_W): ',num2str(G_W)])

disp('------------各子群基尼系数------------')

for i_group=1:n_sub_group

disp(['子群内基尼系数','(G_sub(',num2str(i_group),')):', num2str(G_sub(i_group))])

end

disp('-----------------------------------')

disp(' ')

disp([char('子群间差异贡献(G_nb): ') num2str(G_nb)])

disp('------------子群间基尼系数------------')

for i_group=1:n_sub_group

for j_group=1:n_sub_group

if j_group>i_group

disp(['子群间基尼系数','(G_jh_',num2str(i_group),'_',num2str(j_group),'):', num2str(G_jh(i_group,j_group))])

end

end

end

disp('-----------------------------------')

disp(' ')

disp([char('超变密度贡献(G_t): ') num2str(G_t)])

disp(' ')

disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')

end

2、子函数文件(GINI_COMPUTE.m)

%% 计算整体、子群内、子群间基尼系数和子群间相对影响

function GINI_MAIN=GINI_COMPUTE

%将一组功能独立的函数写在同一个函数文件中

%主函数GINI_MAIN(输出)=GINI_COMPUTE(输入)

%注1:运行该函数时可使用:my_GINI=GINI_COMPUTE

%注2:对应的子函数输入形式为:my_GINI.GINI_1

GINI_MAIN.GINI_1=@GINI_1;%计算整体、子群内和子群间间基尼系数

GINI_MAIN.D_jh=@D_jh; %计算子群间相对影响(D_ij)

end

%% 子函数1:计算整体、子群内和子群间基尼系数

function GINI1=GINI_1(xx,yy)

n1=length(xx);

n2=length(yy);

m1=mean(xx);

m2=mean(yy);

D_ij_2=zeros(n1,n2);

for ii=1:n1

for jj=1:n2

D_ij_2(ii,jj)=xx(ii)-yy(jj);%列向量元素两两相减的差值矩阵

end

end

sum_d2=sum(sum(abs(D_ij_2))); %对矩阵所有元素先取绝对值,然后求和

GINI1=sum_d2/(n1*n2*(m1+m2)); %计算总体、组内和组间基尼系数

end

%% 子函数2:计算子群j和子群h变量的相对影响D_jh

function D_jh1=D_jh(xx,yy)

n1=length(xx);

n2=length(yy);

D_ij_3=zeros(n1,n2);

for ii=1:n1

for jj=1:n2

D_ij_3(ii,jj)=xx(ii)-yy(jj);

end

end

%从矩阵中找出数值大于0的元素

E11=sort(D_ij_3(find(D_ij_3>0)));

%子群j和子群h间差值(算术平均)

d_jh=sum(E11)/(n1*n2);

%从矩阵中找出数值小于0的元素并对他们取绝对值

E12=abs(sort(D_ij_3(find(D_ij_3<0))));

%超变一阶矩(算术平均)

p_jh=sum(E12)/(n1*n2);

%j区域和h区域变量的相对影响

D_jh1=(d_jh-p_jh)/(d_jh+p_jh);

%注1:若子群j的样本均值和子群h的样本均值相同,则D_jh1=0

%注2:若子群j的所有元素均大于子群子群h的元素,则D_jh1=1

%注3:其他情况下,0

end

三、示例:

将一个整体区域划分为三个子区域A、B、C,计算该整体区域人均GDP的Dagum基尼系数分解。

复制上述主函数文件和子函数文件的代码分别保存到两个MATLAB脚本文件中(保存在同一文件夹)。然后,在MATLAB的命令行窗口中输入下列代码:

%子群A人均GDP(列向量)

A=[62905,45056,64746,43965,66318,30137,19014,30432,41683,26687,52590,50474,38357,32047,43442,39605,29063,30105,27566,10814,42063,25933,13077,40116,10949,10589]';

%子群B人均GDP(列向量)

B=[35500,19409,20263,5891,8828,10099,20355,8001,14157,14478,33711,20387,19171,17799,10020,15901,12232,11493,30460,12590,16899,20156,25013,9478,17241,8228,9570,8559]';

%子群C人均GDP(列向量)

C=[16629,30006,394,403,648,673,304,374,452,508,343,529,338,176,373,510]';

%经计算A的均值>B的均值>C的均值,所以Dagum基尼系数分解的输入指令如下:

Dagum_Gini(A,B,C);

输出结果:

bca653fd62ee?utm_campaign=haruki

输出结果1.png

注1:G_sub(1)为子群A基尼系数,G_sub(2)为子群B基尼系数。按变量输入顺序逐一对应。

注2:G_jh_1_2为A和B的子群间基尼系数,G_jh_1_3为A和C的子群间基尼系数。同样按输入变量顺序逐一对应。

注3:上述计算结果仅为单一年份的结果,要计算不同年份的基尼系数分解结果,需根据每年的子群数据逐一使用该程序计算。

注4:该程序支持3个以上的子群划分。例如存在A、B、C、D四个子群,且有B的均值>A的均值>D的均值>C的均值,则输入Dagum_Gini(B,A,D,C)即可。

四、特殊情形

1、子群的分布完全不重合:

例如,有A、B、C三个子群,子群C的所有元素均大于子群B的元素,子群B的所有元素均大于子群A的元素。此时,子群间的相对影响

math?formula=D_%7Bjh%7D%3D1,超变密度

math?formula=G_%7Bt%7D%3D0

测试代码:

A=[1:0.5:10]';

B=[11:0.8:20]';

C=[21:0.6:30]';

%C的均值>B的均值>A的均值

Dagum_Gini(C,B,A);

输出结果:

bca653fd62ee?utm_campaign=haruki

输出结果2.png

2、子群的均值相同:

例如,有A、B、C三个子群,存在

math?formula=%5Coverline%20A%3D%5Coverline%20B%3D%5Coverline%20C,则,子群间相对影响

math?formula=D_%7Bjh%7D%3D0,组间差异贡献

math?formula=G_%7Bnb%7D%3D0

测试代码:

a=magic(10);%生成魔方矩阵(每一列均值都相等)

A=a(:,1);

B=a(:,2);

C=a(:,3);

%A的均值=B的均值=C的均值

Dagum_Gini(A,B,C);

输出结果

bca653fd62ee?utm_campaign=haruki

输出结果3.png

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值