前言: 将多元统计分析课程上学到的知识以编程的形式展现。
"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 ')
结果:
变量是离散的。 在⼤多数变量对中,散点图变成⼏条平⾏线,并且⽆法观察到趋势。 根据图表,以下变量之间彼此存在线性趋势:
(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
污染数据具有较⼤的⼴义⽅差和较⼤的总⽅差。这主要是由于太阳辐射的相对较⼤的变化。
目前我学的是将这两种方法应用到多元正态分布的标准化与多元正态分布等高线的计算。
(1) 谱分解
这个其实就是用特征值和特征向量的组合表示矩阵,就不写代码了。谱分解的表达式如下:
Σ = ∑ j = 1 p λ j e j e j ′ \Sigma = \sum_{j=1}^{p} \lambda_j e_j e_j' Σ=j=1∑pλ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 Σ的特征向量相同,且都为对称矩阵。
关于谱分解我有几点想说的:
(2) Cholesky分解
Cholesky分解的表达式为:
Σ = T ′ T \Sigma = T'T Σ=T′T
其中 T T T为 Σ \Sigma Σ的Cholesky分解得到的非奇异上三角矩阵。此时平方根矩阵可以表示为 Σ 1 / 2 = T ′ \Sigma^{1/2}=T' Σ1/2=T′。
关于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分解要求矩阵是正定的,并且获得的矩阵是⾮奇异的上三⻆矩阵。