R语言学习——多元数据统计特征的分析(含马氏距离的计算及矩阵分解)

前言: 将多元统计分析课程上学到的知识以编程的形式展现。

  • 本篇博客使用到的数据如下:
"Wind" "Solar radiation" "CO" "NO" "NO2" "O3" "HC"
8 98 7 2 12 8 2
7 107 4 3 9 5 3
7 103 4 3 5 6 3
10 88 5 2 8 15 4
6 91 4 2 8 10 3
8 90 5 2 12 12 4
9 84 7 4 12 15 5
5 72 6 4 21 14 4
7 82 5 1 11 11 3
8 64 5 2 13 9 4
6 71 5 4 10 3 3
6 91 4 2 12 7 3
7 72 7 4 18 10 3
10 70 4 2 11 7 3
10 72 4 1 8 10 3
9 77 4 1 9 10 3
8 76 4 1 7 7 3
8 71 5 3 16 4 4
9 67 4 2 13 2 3
9 69 3 3 9 5 3
10 62 5 3 14 4 4
9 88 4 2 7 6 3
8 80 4 2 13 11 4
5 30 3 3 5 2 3
6 83 5 1 10 23 4
8 84 3 2 7 6 3
6 78 4 2 11 11 3
8 79 2 1 7 10 3
6 62 4 3 9 8 3
10 37 3 1 7 2 3
8 71 4 1 10 7 3
7 52 4 1 12 8 4
5 48 6 5 8 4 3
6 75 4 1 10 24 3
10 35 4 1 6 9 2
8 85 4 1 9 10 2
5 86 3 1 6 12 2
5 86 7 2 13 18 2
7 79 7 4 9 25 3
7 79 5 2 8 6 2
6 68 6 2 11 14 3
8 40 4 3 6 5 2
  • 数据读取及初步分析
AirPollution <- read.table('DATA_pollution.txt',header = TRUE)
pairs(AirPollution,main='Scatterplot Matrix for Airpollution ')

结果:
R语言学习——多元数据统计特征的分析(含马氏距离的计算及矩阵分解)_第1张图片
变量是离散的。 在⼤多数变量对中,散点图变成⼏条平⾏线,并且⽆法观察到趋势。 根据图表,以下变量之间彼此存在线性趋势:

  1. Solar radiation and N O 2 NO_2 NO2
  2. Solar radiation and O 3 O_3 O3
  • 初步统计特征分析

(1) 均值向量

# 均值
Mean = colMeans(AirPollution);   # 对每一列取平均值
round(Mean,2)    # 四舍五入并保留两位小数

Result:
           Wind Solar.radiation              CO              NO 
           7.50           73.86            4.55            2.19 
            NO2              O3              HC 
          10.05            9.40            3.10 

(2) 协方差矩阵

# 协方差矩阵
Cov <- cov(AirPollution)
round(Cov,2)

Result:
                 Wind Solar.radiation    CO    NO   NO2    O3   HC
Wind             2.50           -2.78 -0.38 -0.46 -0.59 -2.23 0.17
Solar.radiation -2.78          300.52  3.91 -1.39  6.76 30.79 0.62
CO              -0.38            3.91  1.52  0.67  2.31  2.82 0.14
NO              -0.46           -1.39  0.67  1.18  1.09 -0.81 0.18
NO2             -0.59            6.76  2.31  1.09 11.36  3.13 1.04
O3              -2.23           30.79  2.82 -0.81  3.13 30.98 0.59
HC               0.17            0.62  0.14  0.18  1.04  0.59 0.48

(3) 相关系数矩阵

# 相关系数矩阵
Cor <- cor(AirPollution)
round(Cor,2)

Result:
                 Wind Solar.radiation    CO    NO   NO2    O3   HC
Wind             1.00           -0.10 -0.19 -0.27 -0.11 -0.25 0.16
Solar.radiation -0.10            1.00  0.18 -0.07  0.12  0.32 0.05
CO              -0.19            0.18  1.00  0.50  0.56  0.41 0.17
NO              -0.27           -0.07  0.50  1.00  0.30 -0.13 0.23
NO2             -0.11            0.12  0.56  0.30  1.00  0.17 0.45
O3              -0.25            0.32  0.41 -0.13  0.17  1.00 0.15
HC               0.16            0.05  0.17  0.23  0.45  0.15 1.00

第i⾏和第j列中的数字表⽰第i个和第j个变量之间的样本相关性。 例如,以下相关矩阵的第⼀⾏和第三列中的数字 R[1,3] 表⽰Wind和CO之间的相关性。

  • 欧式与马氏距离的计算

(1) 欧式距离

# 前5天数据之间的欧式距离
ED <- dist(AirPollution[1:5,]);
round(ED,2)

Result:
      1     2     3     4
2 10.54                  
3  9.49  5.74            
4 13.30 21.77 18.08      
5  9.11 16.85 13.08  7.21

(2) 马氏距离

简单讲解一下以下代码:前4行其实是将协方差矩阵 ( Σ 1 / 2 ) − 1 (\Sigma^{1/2})^{-1} (Σ1/2)1做了个谱分解,拿这个矩阵去乘以其他矩阵可以起到标准化的作用。而我们知道,各分量不相关的马氏距离即为各分量经标准化后的欧氏距离。值得注意的是, ( Σ 1 / 2 ) − 1 (\Sigma^{1/2})^{-1} (Σ1/2)1左乘或者右乘数据矩阵得到的马氏距离是一样的,说明标准化的结果是一样的。

# 马氏距离
eCov <- eigen(Cov)   # 计算Cov矩阵的特征值与特征向量
SrDIV <- diag(eCov$values^(-1/2)) # 用特征值的-1/2次方生成对角矩阵
U <- eCov$vectors   # Cov矩阵的特征向量
SrDIV <- U %*% SrDIV %*% t(U)
Y <- as.matrix(AirPollution[1:5,]) %*% SrDIV
MD <- dist(Y)
round(MD,2)

Result:
     1    2    3    4
2 4.22               
3 4.52 1.63          
4 4.69 3.81 3.40     
5 4.10 2.06 2.10 3.31

通过标准化,⻢⽒距离消除了变量规模差异及其相关性的影响。

  • 广义方差与总方差

(1) 广义方差

# 行列式
Gv <- det(Cov)
round(Gv,2)

Result:
35307.53

(2) 总方差

# 迹
Tv <- sum(diag(Cov));
round(Tv,2)

Result:
348.54

污染数据具有较⼤的⼴义⽅差和较⼤的总⽅差。这主要是由于太阳辐射的相对较⼤的变化。

  • 矩阵的谱分解与Cholesky分解

目前我学的是将这两种方法应用到多元正态分布的标准化与多元正态分布等高线的计算。
(1) 谱分解
这个其实就是用特征值和特征向量的组合表示矩阵,就不写代码了。谱分解的表达式如下:

Σ = ∑ j = 1 p λ j e j e j ′ \Sigma = \sum_{j=1}^{p} \lambda_j e_j e_j' Σ=j=1pλjejej
其中 e j ( j = 1 , 2 , ⋯   , p ) e_j(j=1,2,\cdots,p) ej(j=1,2,,p)为正交单位向量组,且 Σ 1 / 2 \Sigma^{1/2} Σ1/2 Σ \Sigma Σ的特征向量相同,且都为对称矩阵。

关于谱分解我有几点想说的:

  • 谱分解其实就是利用相似对角化的定义得来的, P − 1 Σ P = Λ P^{-1}\Sigma P=\Lambda P1ΣP=Λ => Σ = P Λ P − 1 \Sigma = P \Lambda P^{-1} Σ=PΛP1,再将 P Λ P − 1 P \Lambda P^{-1} PΛP1展开便可得到谱分解的表达式。
  • 做谱分解的前提是矩阵为对称矩阵,因为这样肯定可以相似对角化。

(2) Cholesky分解
Cholesky分解的表达式为:
Σ = T ′ T \Sigma = T'T Σ=TT
其中 T T T Σ \Sigma Σ的Cholesky分解得到的非奇异上三角矩阵。此时平方根矩阵可以表示为 Σ 1 / 2 = T ′ \Sigma^{1/2}=T' Σ1/2=T

关于Cholesky分解我有几点想说的:

  • Cholesky分解适用于正定矩阵,且得到的 T T T对角线元素为正数(正定矩阵一定为对称矩阵)。
  • Cholesky分解类似于平方的定义,因此也好理解为什么Cholesky分解适用于正定矩阵。至于为什么对角线元素都为正数,我的理解是Cholesky表达式两边的行列式想等,左边为正数,右边自然也得为正数。
# Cholesky分解
PP <- chol(Cov);
round(PP,2)

Result:
                Wind Solar.radiation    CO    NO   NO2    O3   HC
Wind            1.58           -1.76 -0.24 -0.29 -0.37 -1.41 0.11
Solar.radiation 0.00           17.25  0.20 -0.11  0.35  1.64 0.05
CO              0.00            0.00  1.19  0.52  1.81  1.80 0.13
NO              0.00            0.00  0.00  0.90  0.08 -2.21 0.16
NO2             0.00            0.00  0.00  0.00  2.80 -0.38 0.29
O3              0.00            0.00  0.00  0.00  0.00  4.24 0.21
HC              0.00            0.00  0.00  0.00  0.00  0.00 0.54

谱分解利⽤特征值和特征向量,它可以应⽤于任何对称矩阵.Cholesky分解要求矩阵是正定的,并且获得的矩阵是⾮奇异的上三⻆矩阵。

你可能感兴趣的:(R语言随笔)