4  CRITIC 法

CRITIC 法,是一种相较于熵权法和标准离差法更为先进的客观赋权方法 。

它基于评价指标的对比强度和指标之间的冲突性来综合确定各指标的权重,不仅考虑了指标自身的变异程度(即数据波动性),还引入了指标间的相关性信息,从而更全面地反映指标在评价体系中的重要性。

与“数值越大越重要”的主观判断不同,CRITIC 法完全依赖于数据本身的客观特征进行科学赋权。

变异性(对比强度),是指同一指标在不同评价方案间的取值差异大小,通常以标准差的形式表示。标准差越大,说明该指标在不同方案间的差异越显著,其权重也相应越高。

冲突性,则通过指标间的相关系数来衡量。若两个指标之间存在较强的正相关关系(相关系数接近 \(1\)),说明它们在评价中提供的是相似的信息,彼此之间冲突性小,因此在权重分配上应适当降低;反之,若指标间相关性较弱或呈负相关,则表明其冲突性较强,权重相应提高。

从CRITIC法的角度来看,在标准差保持不变的前提下:

4.1 算法步骤

设有 \(n\) 个评价对象,\(m\) 个评价指标,形成原始指标数据矩阵,其中 \(x_{ij}\) 表示第 \(i\) 个评价对象第 \(j\) 个指标的值。

(1) 无量纲化处理

为消除因量纲不同对评价结果的影响,需要对各指标进行无量纲化处理处理。

CRITIC 法一般使用正向或负向归一化处理,不建议使用标准化处理,否则标准差全部都变成数值 \(1\),即所有指标的标准差完全一致,这就导致变异性指标没有意义。

  • 对于正向指标(越大越好): \[ x'_{ij} = \dfrac{x_{ij} - \min\limits_i x_{ij}}{\max\limits_i x_{ij} - \min\limits_i x_{ij}} \]

  • 对于负向指标(越小越好): \[ x'_{ij} = \dfrac{\max\limits_i x_{ij} - x_{ij} }{\max\limits_i x_{ij} - \min\limits_i x_{ij}} \] 其中, \(\min_{i} x_{ij}\)\(\max_{i} x_{ij}\) 分别是第 \(j\) 个指标所有样本值中的最小值和最大值。

为了方便起见, 归一化后的数据 \(x_{ij}'\) 仍记为 \(x_{ij}\)

(2) 指标变异性

在 CRITIC 法中使用标准差来表示各指标的内取值的差异波动情况: \[ S_j=\sqrt{\dfrac{\sum_{i=1}^n(x_{ij}-\bar{x}_j)^2}{n-1}} \] 标准差越大表示该指标的数值差异越大,越能放映出更多的信息,该指标本身的评价强度也就越强,应该给该指标分配更多的权重。

(3) 指标冲突性

根据相关系数计算: \[ R_j=\sum\limits_{i=1}^p(1-r_{ij}) \] 其中,\(r_{ij}\) 表示指标 \(i\)\(j\) 之间的相关系数。

使用相关系数来表示指标间的相关性,与其他指标的相关性越强,则该指标就与其他指标的冲突性越小,反映出相同的信息越多,所能体现的评价内容就越有重复之处,一定程度上也就削弱了该指标的评价强度,应该减少对该指标分配的权重。

(4) 信息量

\[ C_j = S_j \times R_j \]

其中,\(C_j\) 越大,第 \(j\) 个指标在整个评价指标体系中的作用越大,就应该给其分配更多的权重。

(5) 将信息量归一化,得到权重

\[ w_j=\frac{C_j}{\sum_{j=1}^pC_j} \]

4.2 改进:熵-CRITIC法与不同相关系数

标准 CRITIC 法中,指标变异性是用标准差刻画的,完全可以借鉴熵权法,换成是基于的刻画:

计算每个指标的熵,再计算信息量: \[ e_j=-\dfrac{1}{\ln(n)} \sum\limits_{i=1}^np_{ij} \ln(p_{ij}) \] \[ S_j = 1-e_j \] 其中,\(p_{ij}=\dfrac{x_{ij}}{\sum_{i=1}^nx_{ij}}\)(归一化后的概率)。熵越小,信息量越大(熵权法逻辑)。

相比熵权法,熵-CRITIC 法的优点:

  • 结合信息熵(数据不确定性)和指标冲突性(相关性),比单纯熵权法更稳健。
  • 适用于数据分布不均匀但指标间存在相关性的情况

另外,标准 CRITIC 法中,冲突性是用 Pearson 相关系数刻画的,也可以根据数据的特点,相应地换成 SpearmanKendall 相关系数。

4.3 案例:河流水质数据

加载包:

library(tidyverse)
library(mathmodels)

4.3.1 准备数据

使用内置的 water_quality 数据来演示:

water_quality
# A tibble: 20 × 5
      ID    O2    PH  germ nutrient
   <dbl> <dbl> <dbl> <dbl>    <dbl>
 1     1  4.69  6.59    51    11.9 
 2     2  2.03  7.86    19     6.46
 3     3  9.11  6.31    46     8.91
 4     4  8.61  7.05    46    26.4 
 5     5  7.13  6.5     50    23.6 
 6     6  2.39  6.77    38    24.6 
 7     7  7.69  6.79    38     6.01
 8     8  9.3   6.81    27    31.6 
 9     9  5.45  7.62     5    18.5 
10    10  6.19  7.27    17     7.51
11    11  7.93  7.53     9     6.52
12    12  4.4   7.28    17    25.3 
13    13  7.46  8.24    23    14.4 
14    14  2.01  5.55    47    26.3 
15    15  2.04  6.4     23    17.9 
16    16  7.73  6.14    52    15.7 
17    17  6.35  7.58    25    29.5 
18    18  8.29  8.41    39    12.0 
19    19  3.54  7.27    54     3.16
20    20  7.44  6.26     8    28.4 

这是 \(20\) 条河流的水质数据,含氧量越高越好(正向指标);PH 值越接近 \(7\) 越好(居中型指标);细菌总数越少越好(负向指标);植物性营养物量介于 \(10 \sim 20\) 之间最佳(区间型指标)。

4.3.2 数据预处理

借助 mathmodels 包提供的预处理函数,使用 mutate() 修改列即可。只需要处理居中型和区间型指标,因为指标归一化已内置到 CRITIC 赋权法函数。

df = water_quality |>
  mutate(PH = rescale_middle(PH, 7), 
         nutrient = rescale_interval(nutrient, 10, 20))
df
# A tibble: 20 × 5
      ID    O2     PH  germ nutrient
   <dbl> <dbl>  <dbl> <dbl>    <dbl>
 1     1  4.69 0.717     51    1    
 2     2  2.03 0.407     19    0.694
 3     3  9.11 0.524     46    0.906
 4     4  8.61 0.966     46    0.444
 5     5  7.13 0.655     50    0.691
 6     6  2.39 0.841     38    0.601
 7     7  7.69 0.855     38    0.655
 8     8  9.3  0.869     27    0    
 9     9  5.45 0.572      5    1    
10    10  6.19 0.814     17    0.785
11    11  7.93 0.634      9    0.699
12    12  4.4  0.807     17    0.542
13    13  7.46 0.145     23    1    
14    14  2.01 0         47    0.455
15    15  2.04 0.586     23    1    
16    16  7.73 0.407     52    1    
17    17  6.35 0.6       25    0.182
18    18  8.29 0.0276    39    1    
19    19  3.54 0.814     54    0.409
20    20  7.44 0.490      8    0.273

4.3.3 CRITIC 及其改进权重

critic_weight() 函数实现用 CRITIC 法及其改进计算权重,该函数已内置归一化处理,基本语法:

critic_weight(
  X,
  index = NULL,
  method = "std",
  cor_method = "pearson",
  epsilon = 0.002)
  • index 可以指定对哪些列做正向("+")、负向("-")、不做(NA)归一化,,默认 index = NULL 表示,所有列都不做归一化。
  • method 可以选择计算变异性的方法,是基于标准差("std")还是熵("entropy");
  • cor_method 可以选择计算哪种相关系数:"pearson""spearman""kendall"
  • epsilon 是选择基于熵的话,对 \(0\)\(1\) 值的微调量。

本例已对指标列 PHnutrient 事先做了归一化,故将指标方向设置为 NA,以不再重复做归一化,若使用基于熵的方法,则微调 \(0\)\(1\) 值,避免计算熵时出现 \(\ln(0)\)

(1) 标准 CRITIC 权重

idx = c("+", NA, "-", NA)
res = critic_weight(df[-1], idx)     # 默认基于标准差
  • 查看各指标权重
res$w
       O2        PH      germ  nutrient 
0.2561818 0.2257389 0.2539392 0.2641401 
  • 查看各评价对象的综合得分:
res$s
 [1] 53.57760 45.72631 64.85384 60.86933 53.11902 44.48714 64.86180 59.22668
 [9] 76.81822 72.96404 76.91674 60.10287 64.90101 15.63614 55.81794 56.73669
[17] 48.64189 56.87927 34.54560 61.18867
  • 对应到河流,增加排名列:
tibble(ID = df$ID, score = res$s, rank = min_rank(-score)) |> 
  arrange(rank)
# A tibble: 20 × 3
      ID score  rank
   <dbl> <dbl> <int>
 1    11  76.9     1
 2     9  76.8     2
 3    10  73.0     3
 4    13  64.9     4
 5     7  64.9     5
 6     3  64.9     6
 7    20  61.2     7
 8     4  60.9     8
 9    12  60.1     9
10     8  59.2    10
11    18  56.9    11
12    16  56.7    12
13    15  55.8    13
14     1  53.6    14
15     5  53.1    15
16    17  48.6    16
17     2  45.7    17
18     6  44.5    18
19    19  34.5    19
20    14  15.6    20

(2) 熵-CRITIC 权重

res = critic_weight(df[-1], idx, method = "entropy")    # 基于熵
res$w
       O2        PH      germ  nutrient 
0.3013685 0.1866990 0.3438015 0.1681310 
  • 改用 "spearman" 相关系数:
# 基于熵、spearman相关系数
res = critic_weight(df[-1], idx, method = "entropy", 
                    cor_method = "spearman")
res$w
       O2        PH      germ  nutrient 
0.2932186 0.1924354 0.3486399 0.1657060