楼主: 冰清玉树
43212 115

[程序分享] Stata实证:熵值法的代码实现   [推广有奖]

71
UUYABC(未真实交易用户) 学生认证  发表于 2021-10-5 14:46:45
楼主您好,我在b站上看到一个视频也是讲stata实现熵权法,
https://www.bilibili.com/video/B ... id_from=333.999.0.0,看完以后我使用这个视频提供的代码跑了一下您的文件中提供的panel文件提供的数据,发现结果与您提供的代码跑出来的结果不一样,所以想请您看看按照视频给出的这份代码有什么问题吗


tsset id year

***设置变量集合
global alist "v2 v4 v6 v7 v8 v9 "
global blist "v1 v3 v5"
global xlist "v1 v2 v3 v4 v5 v6 v7 v8 v9"



***STEP1:标准化
****指标为正向指标的时候
foreach x of global alist {
egen min`x' = min(`x')
egen max`x' = max(`x')
gen standard`x' = (`x'-min`x')/(max`x'-min`x')
}

****指标为负向指标的时候
foreach x of global blist {
egen min`x' = min(`x')
egen max`x' = max(`x')
gen standard`x' = (max`x'-`x')/(max`x'-min`x')
}









***step2:计算第i年指标j的权重w1x(注意:w应该是一个三维指标ijt)
foreach x of global xlist{
egen sum`x' = total(standard`x')
gen w1`x' = standard`x'/sum`x'
}



***step3:计算指标的信息熵与冗余度
by id, sort:egen m = count (year)
foreach x of global xlist{
gen w`x' = w1`x' + 0.0000000001
egen e1`x' = total(w`x' * log(w`x'))
gen d`x' = 1 + 1/log(m) * e1`x'
}



***step4:计算指标权重w2x
gen sumd  = dv1+dv2+dv3+dv4+dv5+dv6+dv7+dv8+dv9
foreach x of global xlist{
gen w2`x' = d`x' / sumd
}




***step5:计算综合指标
foreach x of global xlist {
gen S`x' = standard`x' * w2`x'
}

gen SSS = Sv1+Sv2+Sv3+Sv4+Sv5+Sv6+Sv7+Sv8+Sv9


sum SSS   

72
冰清玉树(未真实交易用户) 发表于 2021-10-5 22:17:34
UUYABC 发表于 2021-10-5 14:46
楼主您好,我在b站上看到一个视频也是讲stata实现熵权法,
https://www.bilibili.com/video/BV12L4y1e7Xn ...
step3这里,计算信息熵方法不一样
gen d`x' = 1 + 1/log(m) * e1`x'

73
UUYABC(未真实交易用户) 学生认证  发表于 2021-10-6 20:19:31
冰清玉树 发表于 2021-10-5 22:17
step3这里,计算信息熵方法不一样
gen d`x' = 1 + 1/log(m) * e1`x'
感谢老师的解答,我把过程修改之后还是跑不出来您的结果,请问老师下面列的程序是不是一开始就存在什么逻辑问题呀

tsset id year


***设置变量集合
global alist "v2 v4 v6 v7 v8 v9 "
global blist "v1 v3 v5"
global xlist "v1 v2 v3 v4 v5 v6 v7 v8 v9"



***STEP1:标准化
****指标为正向指标的时候
foreach x of global alist {
egen min`x' = min(`x')
egen max`x' = max(`x')
gen standard`x' = (`x'-min`x')/(max`x'-min`x')
}

****指标为负向指标的时候
foreach x of global blist {
egen min`x' = min(`x')
egen max`x' = max(`x')
gen standard`x' = (max`x'-`x')/(max`x'-min`x')
}









***step2:计算第i年指标j的权重w1x(注意:w应该是一个三维指标ijt)
foreach x of global xlist{
egen sum`x' = total(standard`x')
gen w1`x' = standard`x'/sum`x'
}



***step3:计算指标的信息熵与冗余度
by id, sort:egen m = count (year)
foreach x of global xlist{
gen w`x' = w1`x' + 0.0000000001
egen e1`x' = total(w`x' * log(w`x'))
gen b`x' = -1/log(m) *e1`x'
gen d`x' = 1 - b`x'
}



***step4:计算指标权重w2x
gen sumd  = dv1+dv2+dv3+dv4+dv5+dv6+dv7+dv8+dv9
foreach x of global xlist{
gen w2`x' = d`x' / sumd
}




***step5:计算综合指标
foreach x of global xlist {
gen S`x' = standard`x' * w2`x'
}

gen SSS = Sv1+Sv2+Sv3+Sv4+Sv5+Sv6+Sv7+Sv8+Sv9


sum SSS   

74
冰清玉树(未真实交易用户) 发表于 2021-10-7 13:25:15
UUYABC 发表于 2021-10-6 20:19
感谢老师的解答,我把过程修改之后还是跑不出来您的结果,请问老师下面列的程序是不是一开始就存在什么逻 ...
你可以仔细看看程序的计算方法,应该与楼主还存在其他区别。

75
xgi8791841(未真实交易用户) 发表于 2021-10-10 09:14:01
fpd407218 发表于 2021-5-30 19:28
你好,感谢你的教程,非常详细!刚接触熵值法,不太熟悉,所以有一个问题。我看到最后生成的结果,同一指标 ...
你问的问题正是我想知道的 哈哈哈 请问你解决这个问题了吗

76
如一不倒翁(真实交易用户) 发表于 2021-10-15 14:27:01
请问我计算出的权重是负数,这个怎么处理呢

77
冰清玉树(未真实交易用户) 发表于 2021-10-15 14:51:23
如一不倒翁 发表于 2021-10-15 14:27
请问我计算出的权重是负数,这个怎么处理呢
为啥会出现这种情况?这个权重是怎么计算出来的?检查一下信息熵有没有计算错误。

78
如一不倒翁(真实交易用户) 发表于 2021-10-15 15:48:30
冰清玉树 发表于 2021-10-15 14:51
为啥会出现这种情况?这个权重是怎么计算出来的?检查一下信息熵有没有计算错误。
确实是计算过程出了错误,谢谢,已经解决了,不应该有负数呢

79
hengsi2015(未真实交易用户) 发表于 2021-10-22 14:48:44
冰清玉树 发表于 2021-8-30 18:12
假设有,A B C 三个二级指标,a1 a2 a3 b1 b2 b3 c1 c2 c3 9个三级指标,则A B C 各自的权重则分别由其三 ...
您好!我现在用您说的“另一种方法”在计算,在将三级指标使用熵权法处理为二级指标时,是需要各自处理吗(比如说ABC是二级指标,有9个三级指标,其中a1a2a3是A维度下的,我是需要单使用a1a2a3这三个指标用熵权法计算得出A的得分,还是直接9个指标一起用熵权法,然后计算ABC的得分)。非常感谢您的回复

80
冰清玉树(未真实交易用户) 发表于 2021-10-26 16:23:49
hengsi2015 发表于 2021-10-22 14:48
您好!我现在用您说的“另一种方法”在计算,在将三级指标使用熵权法处理为二级指标时,是需要各自处理吗 ...
分别计算时,肯定分别使用熵值法计算子指标的权重,且各指标的子指标的权重和为1.

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-9 14:51