熵权法原理及操作方法
熵权法
数据波动越大,信息量就越大。 举例:语文成绩与数学成绩,通过不同努力程度,语文成绩提升变化不大,但是数学努力前后会有较大的变化。
熵权法赋权步骤
- 数据标准化 目的:让不同类型的数据可以进行比较 举例:第一组数 1001、1200、1300… 第二组数 0.0001、0.0002、0.0003… 2.求各个指标的信息熵
3.确定各指标权重
excel操作
初始数据,波动分别为小、大、中 进行标准化 对所有的数据除以100 求p,用每一个标准化的数值除以总计数值 把0改为0.000001,避免之后取对数出错,误差很小可以忽略不记。 求plnp,直接计算 如果不改0的花可以在计算结果出来后,手动将计算结果改成0 求e值,将所有plnp加起来乘 -k 即e = -SUM(plnp)/LN(6) 求d值,d = 1-e 计算权重w,w = di / SUM(di)
stata操作
模板代码如下
//cd "C:UsersAdministratorDesktop" //import excel using experiencedata.xlsx,first clear x16 x17 x18 x19 x23 x24 ///标准差标准化 global positive_var x1 x4 x6 x7 x8 x10 x12 x14 x15 global negative_var x2 x3 x5 x9 x11 x13 //下面的不变,包括正负项指标 global all_var $positive_var $negative_var foreach i in $positive_var { qui sum `i gen x_`i=(`i-r(min))/(r(max)-r(min)) } foreach i in $negative_var { qui sum `i gen x_`i=(r(max)-`i)/(r(max)-r(min)) } //计算各指标的比重 foreach i in $all_var { egen `i_sum=sum(x_`i) gen y_`i=x_`i/`i_sum } //根据比重计算各分量的信息熵 gen n=_N foreach i in $all_var { gen y_lny_`i=y_`i*ln(y_`i) replace y_lny_`i=0 if x_`i==0 } //求和 foreach i in $all_var { egen y_lny_`i_sum=sum(y_lny_`i) } //计算各指标的贡献总量。熵值ej foreach i in $all_var { gen E_`i= -1/ln(n)*y_lny_`i_sum } //计算各指标的权重,差异系数d foreach i in $all_var { gen d_`i= 1-E_`i } egen d_sum = rowtotal(d_*) foreach i in $all_var { gen W_`i= d_`i/d_sum } egen W=rowtotal(W_*) //计算综合得分 foreach i in $all_var { gen Score_`i= x_`i*W_`i } egen Score=rowtotal(Score_*)
在上述语数英成绩的代码使用如下:
global positive_var C M E global all_var $positive_var foreach i in $positive_var { qui sum `i gen x_`i=(`i-r(min))/(r(max)-r(min)) } foreach i in $all_var { egen `i_sum=sum(x_`i) gen y_`i=x_`i/`i_sum } gen n=_N foreach i in $all_var { gen y_lny_`i=y_`i*ln(y_`i) replace y_lny_`i=0 if x_`i==0 } foreach i in $all_var { egen y_lny_`i_sum=sum(y_lny_`i) } foreach i in $all_var { gen E_`i= -1/ln(n)*y_lny_`i_sum } //计算各指标的权重,差异系数d foreach i in $all_var { gen d_`i= 1-E_`i } egen d_sum = rowtotal(d_*) foreach i in $all_var { gen W_`i= d_`i/d_sum } egen W=rowtotal(W_*) //计算综合得分 foreach i in $all_var { gen Score_`i= x_`i*W_`i } egen Score=rowtotal(Score_*)