stata 代码实现熵值法计算 含常见问题解答

我是章汕呐 2024-08-25 08:33:06 阅读 73

适用:面板数据均可

stata版本:无要求

例如,使用了一个10年的省级面板数据,含15个指标,现在来计算各地区的熵值法得分。其中,x1 x2 x3 x4 x6 x7 x8 x9 x11 x12 x13 x14 x15是正向指标;而x5 x10是负向指标。

1.定义面板,定义指标的正负。

<code>tsset id year

global xlist1 "x1 x2 x3 x4 x6 x7 x8 x9 x11 x12 x13 x14 x15"

global xlist2 "x5 x10"

2.标准化

①正向指标

foreach x of global xlist1{

egen min`x'=min (`x')

egen max`x'=max (`x')

gen standard`x'=(`x'-min`x')/(max`x'-min`x')

}

②负向指标

foreach x of global xlist2{

egen min`x'=min (`x')

egen max`x'=max (`x')

gen standard`x'=(max`x'-`x')/(max`x'-min`x')

}

3.计算第i年变量j的权重

①正向指标

foreach x of global xlist1 {

egen sum`x' =total(standard`x')

gen w1`x'=standard`x' /sum`x'

}

②负向指标

foreach x of global xlist2 {

egen sum`x' =total(standard`x')

gen w1`x'=standard`x' /sum`x'

}

4.信息熵与冗余度

①正向指标

by id, sort: egen m1 =count (year)

foreach x of global xlist1{

**(归一化处理)

gen w`x'=w1`x'+0.0000000001

egen e1`x'=total (w`x' * log(w`x'))

gen d`x'=1+1/log(m1)*e1`x'

}

②负向指标

by id, sort: egen m2 =count (year)

foreach x of global xlist2{

gen w`x'=w1`x'+0.0000000001

egen e1`x'=total (w`x' * log(w`x'))

gen d`x'=1+1/log(m2)*e1`x'

}

5.计算权重(需要改的地方)

gen sumd1 =dx1+dx2+dx3+dx4+dx5+dx6+dx7+dx8+dx9+dx10+dx11+dx12+dx13+dx14+dx15

foreach x of global xlist1{

gen w2`x'=d`x' /sumd1

}

foreach x of global xlist2{

gen w2`x'=d`x' /sumd1

}

需要更改的地方就是第一排,改成自己的指标。

6.计算总指数(需要改的地方)

foreach x of global xlist1{

gen score_`x'=standard`x' * w2`x'

}

foreach x of global xlist2{

gen score_`x'=standard`x' * w2`x'

}

gen score=score_x1+score_x2+score_x3+score_x4+score_x5+score_x6+score_x7+score_x8+score_x9+score_x10+score_x11+score_x12+score_x13+score_x14+score_x15

需要更改的地方就是最后一排,改成自己的指标即可。

常见问题:

①运行完毕后,最后一列score即是熵值法最终得分。

②很多小伙伴关心的各个指标权重, w2`x'列就是权重。比如,w2x6就是x6这个指标的权重。

③该熵值严格意义来讲是截面熵值法,但也能用于面板。大家能找到的面板熵值法代码不建议用,面板熵值会让每个指标在不用地区不同年份都有不同的权重赋值,这样往往会导致结果趋势不理想。

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。