5  主成分赋权法

主成分分析(PCA),是一种多元统计分析方法,其核心思想是在损失很少信息的前提下,将多个原始指标转化为少数几个综合指标。这些转化后的综合指标称为主成分,每个主成分都是原始变量的线性组合,且彼此之间互不相关。这使得主成分在解释数据变异时具有更强的独立性和代表性。因此,主成分比原始变量在某些方面具有更为优越的性能。

主成分法赋权,是一种完全基于数据自身特征(如相关性、方差)来确定权重的客观赋权法。 其核心思想是:利用主成分的方差贡献率和载荷(特征向量)来综合确定各原始指标的权重。方差贡献率反映了主成分包含原始数据信息量的多少,载荷则反映了原始指标与主成分之间的相关程度。

当用于综合评价时,若选取的指标较多,且存在一定的相关性,那么不同指标所反映的信息可能具有一定程度的重叠。此时使用主成分法赋权,能够有效避免主观判断带来的随机干扰,同时减少指标间信息重复的问题,使评价体系更加科学、客观。

对于主成分分析,在所有线性组合中,第一主成分 \(F_1\) 是方差最大的组合,称为第一主成分;如果第一主成分不足以代表原始数据的全部信息,则引入第二主成分 \(F_2\),并要求 \(F_2\) 在包含尽可能多的新信息的同时,不再重复 \(F_1\) 的信息。用数学语言表示就是:\(COV(F_1, F_2) = 0\)。依此类推,可以构造出第 \(3\) 个、第 \(4\) 个……第 \(p\) 个主成分,直至累计方差贡献率达到满意水平。

关于主成分个数的选择:

5.1 算法步骤

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

(1) 无量纲处理:标准化

由于指标通常具有不同的量纲和数量级,必须对原始数据进行预处理以消除量纲影响。主成分分析通常使用标准化: \[ z_{ij} = \frac{x_{ij} - \mu_j}{\sigma_j} \] 其中,\(\mu_j\)\(\sigma_j\) 分别为第 \(j\) 个指标列的均值和标准差。

对于负向指标,通常建议在标准化后乘以 \(-1\) 进行正向化处理。

注意,这样做的目的是确保在后续的综合得分计算中,所有指标的方向一致(越大越好),避免因指标方向不一致导致综合得分逻辑错误。

这样就得到标准化数据矩阵 \(Z = (z_{ij})_{n \times m}\),每列均值为 \(0\),标准差为 \(1\)

(2) 计算协方差矩阵

计算标准化数据矩阵 \(Z\) 的协方差矩阵,也即原始数据矩阵的相关系数矩阵 \[ R = \frac{1}{n - 1} Z^T Z \]

(3) 特征分解

对矩阵 \(R\) 进行特征分解: \[ R=U\Lambda U^T \]

  • \(\Lambda = \mathrm{diag}(\lambda_1,\cdots,\lambda_m)\) 是特征值矩阵,满足 \(\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_m \geq 0\)
  • \(U=[u_1,\cdots,u_m]\) 是正交化单位特征向量矩阵,满足 \(U^T U = I\)

(4) 载荷矩阵

\[ A = [a_{ji}]_{m \times m} = \big[u_{ji} \sqrt{\lambda_i}\big]_{m \times m}, \qquad i,j =1,\cdots,m \] 其中,\(a_{ji}\) 表示指标 \(j\) 在主成分 \(i\) 上的载荷(相关系数)。

旋转后载荷矩阵(可选): \(A_\mathrm{rot} = \mathrm{Varimax}(A_m\times p)\)

  • 对前 \(p\leq m\) 个主成分的载荷矩阵 \(A_{m\times p}\) 应用 Varimax 旋转(若 \(p>1\) 且启用旋转)。

  • \(a_{ji}^\mathrm{rot}\) 是旋转后载荷,增强解释性。

  • 若无旋转或 \(p=1\),则 \(A_\mathrm{rot}=A_{m\times p}\)

注:PCA 通常取累计贡献率达到 \(85\%\) 以上,或特征值 \(>1\),或基于碎石图、平行分析,选择前 \(p\) 个主成分。

(5) 方差贡献率与累积方差贡献率

计算每个主成分的方差贡献率和前 \(p\) 个主成分的累计方差贡献率。 \[ \eta_j = \frac{\lambda_j}{\sum_{k=1}^m \lambda_k}, \quad j = 1,\cdots,m \] \[ \alpha_p = \sum\limits_{j=1}^p \eta_j \]

(6) 指标权重

依据指标载荷值(反映该指标与该主成分之间的相关性)和对应的方差贡献(衡量其在总方差中的占比),计算指标在所选主成分中的重要性,通常有两种做法:

绝对值法(更常用,平衡各指标贡献):\(\beta_j = \sum\limits_{i=1}^p \eta_i |a^{\text{rot}}_{ji}|\)

平方法(突出主导指标):\(\beta_j = \sum\limits_{i=1}^p \eta_i [a^{\text{rot}}_{ji}]^2\)

再归一化得到指标权重: \[ w_j = \dfrac{\beta_j}{\sum_{k=1}^m \beta_k}, \quad j=1,\cdots,m \]

(7) 综合得分

基于指标权重和标准化后的数据,计算各评价对象的综合得分: \[ s_i = \sum\limits_{j=1}^m w_j z_{ij}, \quad i=1,\cdots,n \]

5.2 案例:河流水质数据

加载包:

library(tidyverse)
library(mathmodels)

5.2.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\) 之间最佳(区间型指标)。

5.2.2 数据预处理

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

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

5.2.3 主成分赋权

pca_weight() 函数实现用主成分法计算权重,该函数已内置标准化处理,基本语法:

pca_weight(X, index = NULL, nfs = NULL, varimax = TRUE, method = "abs")
  • index 可以指定对哪些列做正向("+")、负向("-")、不做(NA)标准化;
  • nfs 选择主成分数,默认为全部主成分(即 X 的列数);
  • varimax 设置是否对载荷矩阵做正交最大旋转,默认为 TRUE
  • method 设置计算指标权重使用载荷的方法:"abs"(默认,绝对值法)、"squared"(平方法)。

两个已经归一化的指标仍做标准化,germ 为负向指标,选择 \(3\) 个主成分,做主成分赋权:

idx = c("+", "+", "-", "+")
res = pca_weight(df[-1], idx, nfs = 3)
  • 查看指标权重:
res$w
[1] 0.2295767 0.2649918 0.2441633 0.2612682
  • 查看各个评价对象得分:
res$s
 [1]  0.001198524 -0.320107088  0.217018493  0.195405945 -0.084231291
 [6] -0.238983664  0.307469102  0.070879636  0.625563844  0.558020048
[11]  0.593610342  0.178356317  0.131099010 -1.337577994  0.054638084
[16] -0.030864174 -0.269580866 -0.145513855 -0.565644280  0.059243867
  • 对应到河流,增加排名列:
tibble(ID = df$ID, score = res$s, rank = min_rank(-score)) |> 
  arrange(rank)
# A tibble: 20 × 3
      ID    score  rank
   <dbl>    <dbl> <int>
 1     9  0.626       1
 2    11  0.594       2
 3    10  0.558       3
 4     7  0.307       4
 5     3  0.217       5
 6     4  0.195       6
 7    12  0.178       7
 8    13  0.131       8
 9     8  0.0709      9
10    20  0.0592     10
11    15  0.0546     11
12     1  0.00120    12
13    16 -0.0309     13
14     5 -0.0842     14
15    18 -0.146      15
16     6 -0.239      16
17    17 -0.270      17
18     2 -0.320      18
19    19 -0.566      19
20    14 -1.34       20
  • 查看 \(3\) 个主成分的累积贡献:
res$cum_contrib
[1] 0.8400963
  • 查看旋转的载荷矩阵:
res$loading
                   PC1          PC2          PC3
O2       -0.0008082562 -0.001248033 -0.999822686
PH        0.7123628135  0.095775451 -0.013746300
germ      0.0009564714 -0.990774991 -0.001308225
nutrient -0.7018102691  0.095866694 -0.012803306

可以据此,解释这 \(3\) 个主成分(略)。