---
title: "改进熵权TOPSIS综合评价方法"
author: "Rui"
date: "2023-2-10"
categories: [R]
image: "buildings.png"
format:
html:
code-fold: true
code-tools: true
---
```{=html}
<style>
p{
font-face:"宋体"
font-size:16px;
line-height:1.5em;
text-indent:40px;
}
</style>
```
```{r setup, include = FALSE}
# 设置默认参数
knitr:: opts_chunk$ set (
echo = TRUE ,
fig.align = "center" ,
message = FALSE ,
warning = FALSE ,
collapse = TRUE
)
```
![](buildings.png)
# 文献综述
## 指标体系
孙红兵和向刚(2011):
选取四个直辖市和26个全国省会城市(去除拉萨市),共30个城市作为评价对象。以知识创新、技术创新、制度创新、中介服务创新、金融创新和创新环境构建指标体系。
陶雪飞(2013):
设计了以综合性、层次性、代表性和可靠性为原则,以技术创新体系能力为核心的"5位一体"(包括技术创新体系能力、知识创新体系能力、多元化创新体系能力、创新服务体系能力和政府科技管理体系能力)的科技创新能力一级评价指标和13个二级评价指标(科技活动人员数、新产品开发经费研究支出、高新技术产业值等)体系。
邓智团,屠启宇(2016):
选取的核心评价指标为科技投入、人才资源、创新载体、经济社会环境、成果产出和经济社会发展。
李斌等(2020):
在知识创新、技术创新、政府支持和服务、创新基础环境4个维度上对城市创新能力进行测度。
## 评价方法
颜莉(2011):
从创新业绩和创新效率两方面入手,构建五大城市区域创新投入、产出指数,使用DEA模型进行评价。
孙红兵和向刚(2011):
利用主成分分析法计算2005-2008年我国30个省会城市和直辖市的创新综合能力,利用综合因子得分对城市进行排名;进一步利用聚类分析动态考察各类的创新综合能力。
邓智团,屠启宇(2016):
对14个特大城市的创新能力进行评价,构建了"类型-阶段"的二维评价模型。其中,类型维度是将城市按照服务创新型和工业创新型进行分类,阶段维度是将城市创新能力的发展阶段分为启动、起飞和成熟阶段。
李斌等(2020):
使用熵权法在上述4个维度上计算出全国35个大中城市的创新能力指数,并对各年份总体创新能力指数进行动态分析,进一步使用全局莫兰指数和局部莫兰指数分析了城市创新能力的空间自相关性。
# 数据与指标
## 数据来源与指标选择
参考毛文峰和陆军(2020),使用[ 2019年全国区域创新创业指数 ](https://opendata.pku.edu.cn/dataset.xhtml?persistentId=doi:10.18170/DVN/PEFDAS) 数据,选取新建企业数、外来投资笔数、vcpe投资数目、发明专利授权数目、实用新型专利公开数目、外观专利公开数目和商标授权数目共计7个指标,对长三角25个地级市(不包括新加入的温州市和直辖市上海)的创新能力进行综合评价。
```{r 数据导入, attr.source='.numberLines', collapse=TRUE}
# 设置工作路径
setwd ("F: \\ RuiBlog \\ posts \\ R \\ 改进熵权TOPSIS综合评价方法" )
# 读取数据
library (knitr)
df <- read.csv (". \\ 数据 \\ 2019年长三角地区各地市创新创业指数.CSV" , header = TRUE , encoding = "UTF-8" )
knitr:: kable (
df[ , - 1 ],
digits = 4 ,
align = "lccccccc" ,
col.names = c (
"城市" , "新建企业进入" , "外来投资笔数" , "vcpe投资数" , "发明专利授权数" ,
"实用新型专利公开数" , "外观专利公开数" , "商标授权数"
)
) # 展示数据
```
::: callout-tip
kable的用法参见 <https://www.rdocumentation.org/packages/knitr/versions/1.39/topics/kable>
:::
原始数据矩阵记为$\mathbf{A}=(a_{ij})_{n \times m}$。
## 数据一致化与无量纲化
所谓一致化是极大型指标与极小型指标进行统一,比如全部转换为极大型指标。无量纲化消除原始指标的单位及其数值数量级影响。这里使用比例变换法得到评价矩阵$\mathbf{B}=(b_{ij})_{n \times m}$。
$$
b_{ij}=\displaystyle \frac{a_{ij}}{\mathop{\max}_{1\leqslant i \leqslant n}a_{ij}},
\\
b_{ij}=\displaystyle \frac{\mathop{\min}_{1\leqslant i \leqslant n}a_{ij}}{a_{ij}},
\\
i=1,2,\cdots,n,
\\
j=1,2,\cdots,m
$$
```{r 数据处理, attr.source='.numberLines'}
adcode <- df[ , 1 ] # 城市代码
city <- df[ , 2 ] # 城市名
a <- df[ , - c (1 , 2 )] # 删除第一列城市代码、第二列城市名
# 使用比例变换法
max_norm <- function (x) {
x / max (x)
} # 极大型指标
min_norm <- function (x) {
min (x) / x
} # 极小型指标
b <- apply (a, 2 , max_norm) # 全部为极大型指标
b <- data.matrix (b) # 初始评价矩阵
knitr:: kable (
b,
align = "ccccccc" ,
digits = 4 ,
col.names = c (
"新建企业进入" , "外来投资笔数" , "vcpe投资数" , "发明专利授权数" ,
"实用新型专利公开数" , "外观专利公开数" , "商标授权数"
)
) # 展示数据,保留4位小数
```
# 熵权TOPSIS
## 熵权法
在信息论中信息熵是信息不确定性的一种度量。一般来说,信息量越大,熵值越小,信息的效用值越大;反之,信息的效用值越小。而熵值法就是通过计算各指标观测值的信息熵,根据指标的相对变化程度对系统整体的影响来确定指标权重系数的一种赋权方法。计算过程如下:
1. 计算在第$j$项指标下的第$i$个评价对象的特征比重
$$
\begin{align}
& p_{ij}=
\left\{ \begin{array}{l}
\frac{b_{ij}}{\sum_{i=1}^{n}b_{ij}}, \quad if \quad b_{ij}>0 \\ [ 3mm ]
\frac{b_{ij}+1}{\sum_{i=1}^{n}(b_{ij}+1)}, \quad if \quad b_{ij}=0
\end{array}\right.\\ [ 3mm ]
& i=1,2,\cdots,n; \quad j = 1,2,\cdots,m
\end{align}
$$
2. 计算第$j$项指标的熵值
$$
\begin{align}
& e_{j} = - \frac{1}{\ln{n}}\sum_{i=1}^{n}p_{ij}\ln{p_{ij}} \\
& j = 1,2,\cdots,m
\end{align}
$$
不难看出,如果第$j$项指标的观测值差异较大,则熵值越小;反之,熵值越大。
3. 计算第$j$项指标的差异系数
$$
\begin{align}\
& g_{j}=1-e_{j} \\
& j = 1,2,\cdots,m
\end{align}
$$
如果第$j$项指标的观测差异值越大,则差异系数$g_{j}$就越大,第$j$项指标也就越重要。
4. 计算第$j$项指标的权重系数
$$
\begin{align}
& w_{j} =\frac{g_{j}}{\sum_{j=1}^{m}g_{j}} = \frac{1-e_{j}}{\sum_{j=1}^{m}(1-e_{j})} \\
& j = 1,2,\cdots,m
\end{align}
$$
5. 计算第$i$个评价对象的综合评价值
$$
f_{i} = \sum_{j=1}^{m}w_{j}p_{ij}
$$
也即:
$$
\mathbf{f} = \mathbf{P} \mathbf{w}
$$
其中$\mathbf{P} = (p_{ij})_{n \times m}$为特征比重矩阵,$\mathbf{w} = (w_1,w_2,\cdots,w_{m})^\top$为权重系数向量,$\mathbf{f} = (f_1,f_2,\cdots,f_{n})^\top$为评价值向量。评价值$f_{i}$越大越好。
```{r 熵权法, attr.source='.numberLines'}
# 计算特征比重矩阵
char_ratio <- function (data) {
x <- c (data)
for (i in 1 : length (data)) {
if (x[i] > 0 ) {
x[i] = data[i] / sum (data[])
} else {
x[i] = (data[i] + 1 ) / sum (data[] + 1 )
}
}
return (x)
}
p <- apply (b, 2 , char_ratio)
# 计算熵值
entropy <- function (data) {
x <- - sum (data * log (data)) / log (length (data))
return (x)
}
e <- apply (p, 2 , entropy)
# 计算权重系数
w <- (1 - e) / (length (e) - sum (e))
# 验算一下:求和应该等于1
if (abs (sum (w) - 1 ) < 1e+10 ) {print ("Done!" )} # 浮点运算是个坑!
# 或者
library (dplyr)
if (near (sum (w), 1 )) {print ("Done!" )} # 浮点运算是个坑!
```
权重系数衡量了指标的相对重要程度,排序结果为:
```{r 指标重要度排名}
names (w)[order (w, decreasing = TRUE )]
```
## TOPSIS
TOPSIS 法全称为理想解的排序方法(technique for order preference by similarity to ideal solution)。它借助于评价问题的正理想解和负理想解,对各评价对象进行排序。所谓正理想解是一个虚拟的最佳对象,其每个指标值都是所有评价对象中该指标的最好值;而负理想解则是另一个虚拟的最差对象,其每个指标值都是所有评价对象中该指标的最差值。求出各评价对象与正理想解和负理想解的距离,并以此对各评价对象进行优劣排序。
设综合评价问题含有$n$个评价对象、$m$个指标,相应的指标观测值为$a_{ij},i=1,2,\cdots,n;j=1,2,\cdots,m$。计算过程如下:
1. 将评价指标进行预处理
包括一致化(全部化为极大型指标)和无量纲化,并构造评价矩阵$\mathbf{B}=(b_{ij})_{n \times m}$
2. 确定正理想解$C^+$和负理想解$C^-$
$$
\begin{align}
& C^+ = (c_{1}^+,c_{2}^+,\cdots,c_{m}^+), \\ [ 3mm ]
& C^- = (c_{1}^-,c_{2}^-,\cdots,c_{m}^-), \\ [ 3mm ]
& c_{j}^+ = \mathop{\max}_{1\leqslant i \leqslant n}b_{ij}, \quad j = 1,2,\cdots,m, \\ [ 3mm ]
& c_{j}^- = \mathop{\min}_{1\leqslant i \leqslant n}b_{ij}, \quad j = 1,2,\cdots,m.
\end{align}
$$
3. 计算各评价对象到正理想解及到负理想解的距离
$$
s_{i}^+=\sqrt{\sum_{j=1}^{m}(b_{ij}-c_{j}^+)^2}, \quad i=1,2,\cdots,n,
\\ [ 20mm ]
s_{i}^-=\sqrt{\sum_{j=1}^{m}(b_{ij}-c_{j}^-)^2}, \quad i=1,2,\cdots,n.
$$
4. 计算各评价对象对理想解的相对接近度
$$
f_i = \frac{s_{i}^{-}}{s_{i}^{+}+s_{i}^{-}}, \quad i=1,2,\cdots,n
$$
5. 按$f_i$由大到小排列各评价对象的优劣次序
## 熵权TOPSIS
先利用熵权法求得权重系数向量$\mathbf{w} = (w_1,w_2,\cdots,w_{m})^\top$,再与评价矩阵$\mathbf{B}=(b_{ij})_{n \times m}$结合得到加权评价矩阵$\tilde{\mathbf{B}}=(\tilde{b_{ij}})_{n \times m}$,其中$\tilde{b_{ij}}=w_{j}b_{ij}$,然后对$\tilde{\mathbf{B}}$使用 TOPSIS 方法。
```{r 熵权TOPSIS, attr.source='.numberLines'}
# 加权评价矩阵
B <- matrix (nrow = nrow (b), ncol = ncol (b))
for (i in 1 : ncol (b)) {
B[ , i] <- b[ , i] * w[i]
}
# 计算相对接近程度
c_max <- apply (B, 2 , max)
c_min <- apply (B, 2 , min)
# 计算到理想解的欧式距离
s_positive_Eu <- vector (length = nrow (B))
s_negative_Eu <- vector (length = nrow (B))
for (i in 1 : nrow (B)) {
s_positive_Eu[i] <- sqrt (sum ((B[i, ] - c_max)^ 2 ))
s_negative_Eu[i] <- sqrt (sum ((B[i, ] - c_min)^ 2 ))
}
s <- s_negative_Eu / (s_positive_Eu + s_negative_Eu) # 基于欧式距离的熵权TOPSIS综合评价值
s_output <- data.frame ("adcode" = adcode, "city" = city, "topsis" = s) # 美化结果方便GeoDa读取
write.csv (s_output, ". \\ 数据 \\ 基于欧式距离的熵权TOPSIS结果.csv" , row.names = FALSE ) # 保存结果
output1 <- s_output[order (s_output$ topsis, decreasing = TRUE ), ][ , - 1 ] # 结果降序排列
knitr:: kable (output1, digits = 4 , align = "cc" ) # 对结果降序排列展示
```
# TOPSIS改进
## TOPSIS存在的问题
王先甲,汪磊(2012)与刘筱慧,王斌等(2021)的观点汇总如下:
1.各属性指标之间普遍存在线性相关,运用欧氏距离公式计算距离不合理。
2.到"正理想解"的负向距离和到"负理想解"的正向距离直接相加运算不合理。
TOPSIS 方法的相对接近度是根据被评价对象与"正理想解"和"负理想解"的距离合成的,其中$s_{i}^-$ 是一个正向指标,$s_{i}^+$是一个负向指标,二者直接相加是不合适的。
3.到"正理想解"和"负理想解"的两个距离的数量级差异问题。
TOPSIS 重点考虑的是被评价对象与"正理想解"和"负理想解"的距离,当被评价对象与"正理想解"和"负理想解"的距离不在同一数量级上,其中一个过小的数很可能对最后排序结果起不到任何作用。
## TOPSIS改进方法
1. 使用马氏距离替代欧式距离
王先甲,汪磊(2012):使用马氏距离代替欧式距离可以消除量纲影响以及变量间相关性。
$$
\begin{align}
&d_{i}^+ = [ (b_i -C^+)^\top \Sigma^{-1}(b_i -C^+) ] ^{\frac{1}{2}}, \\
&d_{i}^- = [ (b_i -C^-)^\top \Sigma^{-1}(b_i -C^-) ] ^{\frac{1}{2}}, \\
&b_i = (b_{i1},b_{i2},\cdots,b_{im})^\top, \\
&i=1,2,\cdots,n
\end{align}
$$
2. 密切值修正
刘筱慧,王斌等(2021):使用修正后的密切值代替原来的相对接近程度。
$$
\begin{align}
&D_{i}^+ = \frac{\mathop{\max}_{1\leqslant i \leqslant n}d_{i}^+ - d_{i}^+}
{\mathop{\max}_{1\leqslant i \leqslant n}d_{i}^+ - \mathop{\min}_{1\leqslant i \leqslant n}d_{i}^+} \\ [ 3mm ]
&D_{i}^- = \frac{d_{i}^- - \mathop{\min}_{1\leqslant i \leqslant n}d_{i}^-}
{\mathop{\max}_{1\leqslant i \leqslant n}d_{i}^- - \mathop{\min}_{1\leqslant i \leqslant n}d_{i}^-} \\ [ 3mm ]
&D_i = D_{i}^+ + D_{i}^-
\end{align}
$$
## 改进后的熵权TOPSIS
```{r 改进的熵权TOPSIS, attr.source='.numberLines'}
# 计算到理想解的马氏距离
s_positive_Mal <- vector (length = nrow (B))
s_negative_Mal <- vector (length = nrow (B))
sigma <- cov (B) # 计算协方差矩阵
for (i in 1 : nrow (B)) {
s_positive_Mal[i] <- sqrt (t (as.matrix (B[i, ] - c_max)) %*% solve (sigma) %*% as.matrix (B[i, ] - c_max))
s_negative_Mal[i] <- sqrt (t (as.matrix (B[i, ] - c_min)) %*% solve (sigma) %*% as.matrix (B[i, ] - c_min))
} # 利用马氏距离定义计算
# 对马氏距离的相对接近程度进行密切值修正
min_max_norm <- function (x) {
(x- min (x))/ (max (x)- min (x))
} # 极大型指标
max_min_norm <- function (x) {
(max (x)- x)/ (max (x)- min (x))
} # 极小型指标
d_positive_Mal <- max_min_norm (s_positive_Mal)
d_negative_Mal <- min_max_norm (s_negative_Mal)
D <- d_positive_Mal + d_negative_Mal # 基于马氏距离的改进的TOPSIS结果
D_output <- data.frame ("adcode" = adcode, "city" = city, "topsis" = D) # 美化结果方便GeoDa读取
write.csv (D_output, ". \\ 数据 \\ 基于马氏距离的改进的TOPSIS结果.csv" , row.names = FALSE ) # 保存结果
output2 <- D_output[order (D_output$ topsis, decreasing = TRUE ), ][ , - 1 ] # 结果降序排列
knitr:: kable (output2, digits = 4 , align = "cc" ) # 对结果降序排列展示
```
# 参考文献
孙红兵, 向刚. 城市创新系统的创新综合能力评价. 经济问题探索\[ J\] . 2011 (3): 97 - 103.
颜莉. 城市创新绩效综合评价体系及其实证应用. 经济地理\[ J\] . 2011 (9): 1470 - 1475.
陶雪飞. 城市科技创新综合能力评价指标体系及实证研究. 经济地理\[ J\] . 2013 (10): 16 - 19.
邓智团, 屠启宇. 特大城市创新能力评价模型的构建与应用--基于我国14个特大城市的实证研究. 科技管理研究\[ J\] . 2016 (12): 52 - 55.
李斌, 田秀林, 张所地, 赵华平. 城市创新能力评价及时空格局演化研究. 数理统计与管理\[ J\] . 2020 (1): 139 - 153.
毛文峰, 陆军. 土地要素错配如何影响中国的城市创新创业质量--来自地级市城市层面的经验证据. 农业经济研究\[ J\] . 2020 (3): 17 - 29.
王先甲, 汪磊. 基于马氏距离的改进型TOPSIS在供应商选择中的应用. 控制与决策\[ J\] . 2012 (10): 1566 - 1570.
刘筱慧, 王斌, 陈凯, 焦阳, 李刚. 基于密切值改进TOPSIS的低碳经济评价研究. 技术经济\[ J\] . 2021 (12): 74 - 84.