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这个指标的权重。
③该熵值严格意义来讲是截面熵值法,但也能用于面板。大家能找到的面板熵值法代码不建议用,面板熵值会让每个指标在不用地区不同年份都有不同的权重赋值,这样往往会导致结果趋势不理想。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。