R语言实现熵权法代码

转载自知乎

1. 先定义归一化函数

默认是将正向指标归一化到 [0,1] :

## 定义归一化函数
rescale = function(x, type = "pos", a = 0, b = 1) {
  rng = range(x, na.rm = TRUE)
  switch (type,
          "pos" = (b - a) * (x - rng[1]) / (rng[2] - rng[1]) + a,
          "neg" = (b - a) * (rng[2] - x) / (rng[2] - rng[1]) + a)
}

测试函数:

x = c(1, 2, 3, NA, 5)
rescale(x)
rescale(x, type = "neg")

2. 定义熵权法赋权函数

因为熵权法归一化值不能出现 0 或 1,所以在做归一化时多往内收缩一下到 [0.002, 0.996], 需要的话可自行修改。

Entropy_Weight = function(X, index = NULL) {
  # 实现用熵权法计算各指标(列)的权重及各数据行的得分
  # X为原始指标数据, 一行代表一个样本, 每列对应一个指标
  # index指示各指标列的正负向, "pos"表示正向, "neg"表示负向, 默认都是正向指标
  # s返回各行(样本)得分,w返回各列权重
  if(is.null(index)) index = rep("pos", ncol(X))
  pos = which(index == "pos")
  neg = which(index == "neg")
  # 数据归一化
  X[,pos] = lapply(X[,pos, drop = FALSE], rescale, a = 0.002, b = 0.996)
  X[,neg] = lapply(X[,neg, drop = FALSE], rescale, type = "neg", a = 0.002, b = 0.996)
  # 计算第j个指标下,第i个样本占该指标的比重p(i,j)
  P = data.frame(lapply(X, \(x) x / sum(x)))
  # 计算第j个指标的熵值e(j)
  e = sapply(P, \(x) sum(x * log(x)) *(-1/log(nrow(P))))
  d = 1 - e          # 计算信息熵冗余度
  w = d / sum(d)    # 计算权重向量
  # 计算样本得分
  s = as.vector(100 * as.matrix(X) %*% w)
  list(w = w, s = s)
}

测试函数:

仍使用上一篇文章同样的数据:shang_datas.xlsx, 为 2014 年 31 个省份的就业与劳动保障数据, 包含 5 个指标:社会养老保险参保率、医疗保险参保率、失业保险参保率、工伤保险参保率、工伤事故发生率, 其中第 5 个指标为负向指标。

library(readxl)
data = read_xlsx("datas/shang_datas.xlsx")

X = data[, 2:6] 
ind = c(rep("pos",4), "neg")
Entropy_Weight(X, ind)

结果与上篇文章也完全一样。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安宁ᨐ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值