熵权法
数据波动越大,信息量就越大。
举例:语文成绩与数学成绩,通过不同努力程度,语文成绩提升变化不大,但是数学努力前后会有较大的变化。
熵权法赋权步骤
- 数据标准化
目的:让不同类型的数据可以进行比较
举例:第一组数 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:\Users\Administrator\Desktop"
//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_*)