5 主成分赋权法
主成分分析(PCA),是一种多元统计分析方法,其核心思想是在损失很少信息的前提下,将多个原始指标转化为少数几个综合指标。这些转化后的综合指标称为主成分,每个主成分都是原始变量的线性组合,且彼此之间互不相关。这使得主成分在解释数据变异时具有更强的独立性和代表性。因此,主成分比原始变量在某些方面具有更为优越的性能。
主成分法赋权,是一种完全基于数据自身特征(如相关性、方差)来确定权重的客观赋权法。 其核心思想是:利用主成分的方差贡献率和载荷(特征向量)来综合确定各原始指标的权重。方差贡献率反映了主成分包含原始数据信息量的多少,载荷则反映了原始指标与主成分之间的相关程度。
当用于综合评价时,若选取的指标较多,且存在一定的相关性,那么不同指标所反映的信息可能具有一定程度的重叠。此时使用主成分法赋权,能够有效避免主观判断带来的随机干扰,同时减少指标间信息重复的问题,使评价体系更加科学、客观。
对于主成分分析,在所有线性组合中,第一主成分 \(F_1\) 是方差最大的组合,称为第一主成分;如果第一主成分不足以代表原始数据的全部信息,则引入第二主成分 \(F_2\),并要求 \(F_2\) 在包含尽可能多的新信息的同时,不再重复 \(F_1\) 的信息。用数学语言表示就是:\(COV(F_1, F_2) = 0\)。依此类推,可以构造出第 \(3\) 个、第 \(4\) 个……第 \(p\) 个主成分,直至累计方差贡献率达到满意水平。
关于主成分个数的选择:
- 使用全部主成分:主成分赋权的目的不是降维,如果数据质量较高,应该保留全部主成分,因为这样不丢失信息
- 按照 PCA 原则,选择部分主成分:好处是降噪和提高权重的解释性。
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 案例:河流水质数据
加载包:
5.2.1 准备数据
使用内置的 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() 函数实现用主成分法计算权重,该函数已内置标准化处理,基本语法:
-
index可以指定对哪些列做正向("+")、负向("-")、不做(NA)标准化; -
nfs选择主成分数,默认为全部主成分(即X的列数); -
varimax设置是否对载荷矩阵做正交最大旋转,默认为TRUE; -
method设置计算指标权重使用载荷的方法:"abs"(默认,绝对值法)、"squared"(平方法)。
两个已经归一化的指标仍做标准化,germ 为负向指标,选择 \(3\) 个主成分,做主成分赋权:
- 查看指标权重:
- 查看各个评价对象得分:
[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
- 对应到河流,增加排名列:
# 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\) 个主成分的累积贡献:
- 查看旋转的载荷矩阵:
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\) 个主成分(略)。