11章1节:深度讲解用R进行主成分分析(上)

在临床研究中,由于人体病理生理的复杂性,大多数情况下需要对患者进行多个指标的综合评价,以便对疾病进行全面评估和发现潜在规律。这种多维度的分析可以为研究和医疗应用提供更全面的信息。然而,采集大量数据不仅增加了工作量和医疗成本,更重要的是许多指标之间可能存在一定的相关性,导致问题分析的复杂性增加。

例如,针对长寿老人的综合性指标来反映其健康状况是当前老年学领域亟需解决的问题之一。如果仅使用单一的生理指标来评估百岁老人的健康状况,往往会产生片面性,甚至在不同的生理指标之间可能产生相互矛盾的结论。因此,能否找到一种合理的方法,既能减少指标的数量,又能保留大部分信息,成为一个关键问题。主成分分析(Principal Component Analysis, PCA)作为一种降维方法,可以将多个相关的指标简化为少数几个不相关的综合指标,找到能够全面反映百岁老人健康状况的代表性指标组合。

一、认识主成分分析

1、主成分分析

主成分分析(Principal Component Analysis,PCA)是一种在确保数据信息损失最小的原则下,将多个指标转化为少数几个不相关的综合指标的数据降维方法。它的基本思想是在不失信息的可靠度的条件下,使用少数新变量尽可能多地包含原始变量的信息,这些新变量能够对原变量进行更直观的表达和解释。PCA 的目的是在减少数据维度的同时保留尽可能多的原始数据信息,使得数据更加简洁易懂,便于分析和可视化。

PCA 由 Hotelling 于 1933 年推广,其核心是“降维”,即将高维数据有效地转化为低维数据,以解释变量之间的内在联系,进而分析解决实际问题。随着数据科学的发展,各领域的研究人员面临着处理大量复杂数据的挑战。PCA 作为一种数据降维的方法,帮助我们更好地理解变量之间的关系,发现数据中的潜在结构。

在多维数据中,许多变量可能存在较高的相关性,这意味着不同变量之间包含了相似的信息。如果直接使用所有变量进行分析,不仅增加了计算的复杂性,还可能导致“维度灾难”,即因变量过多而造成的分析困难。PCA 通过将原始变量线性组合成少数不相关的综合指标(称为“主成分”),可以有效减少数据的维度,提高分析的效率和准确性。

主成分分析的应用场景非常广泛,如临床研究中的变量筛选、经济数据的分析与预测、信号处理等。在这些领域,通过主成分分析,研究者可以找出主要影响因素,减少噪声干扰,从而获得更加准确和有效的结果。

2、PCA 的步骤

数据标准化:主成分分析要求变量之间具有可比性,因此通常需要对原始数据进行标准化处理。

计算协方差矩阵或相关系数矩阵:根据标准化后的数据,计算其协方差矩阵或相关系数矩阵,以衡量变量之间的线性关系。

特征值分解:对协方差矩阵或相关系数矩阵进行特征值分解,得到特征值和对应的特征向量。

确定主成分个数:根据特征值的大小,计算各主成分的方差解释率,选择合适的主成分个数。

构建主成分:使用选定的特征向量构建主成分,并计算各样本在主成分上的得分。

值得注意的是,主成分分析要求被分析的变量之间具有较强的相关性,否则主成分分析的效果将大大降低,甚至失去原有的意义。PCA 的核心思想是通过构造线性组合,将相关的变量转化为少数几个不相关的主成分。如果变量之间缺乏相关性,意味着每个变量所含的信息独立且互不重复,此时通过线性组合难以有效减少数据的维度,因为每个变量的特征无法通过其他变量加以概括。这种情况下,主成分分析可能无法提取有意义的主成分,且降维后的数据保留的信息量有限,导致分析结果不具备代表性。因此,在应用主成分分析之前,通常需要通过计算变量之间的相关系数矩阵来评估各变量的相关性,以确保主成分分析的适用性。

此外,主成分分析假设变量服从正态分布,即变量的分布呈对称的钟形分布。这一假设的目的是使得主成分的推导和统计性质更为明确,尤其是在特征值和特征向量的计算过程中,正态分布有助于保证结果的稳定性。然而,这条假设并不是特别严格,在实际应用中,即使变量并非完全服从正态分布,PCA 仍然可以取得较好的效果。主成分分析的稳健性较高,只要数据的偏态和峰度不显著偏离正态分布,PCA 的结果通常仍然具有合理的解释性和较高的准确性。对于高度偏态或具有异常值的数据,可以考虑对数据进行预处理,如对数变换、平方根变换等,以减小偏态程度,从而提高主成分分析的效果。

二、用R进行主成分分析

1、数据相关性的探索

数据分析的一个重要步骤是探索变量之间的相关性,以更好地理解数据的内在结构。我们在这里使用R语言的主成分分析方法,通过Factoextra扩展包中的decathlon2数据集,来探索运动员在两项体育赛事(Desctar和OlympicG)中的表现。

Factoextra 扩展包主要用于数据的多变量分析与可视化,尤其是在主成分分析(PCA)、聚类分析(Clustering)、因子分析(Factor Analysis)等方面提供了直观的可视化工具。它能够帮助用户轻松地提取和解释数据分析的结果,并通过一系列易于理解的图形来展示数据的特征,使得数据分析过程更加直观和高效。Factoextra支持各种类型的数据,可用于探索、总结和解释数据中的潜在模式。

在这篇文章中,我们使用了Factoextra扩展包中的decathlon2数据集。该数据集包含27个运动员在两项体育赛事中的13个变量的描述。在进行主成分分析时,我们选择了前10个连续变量作为新的数据集data.decathlon,用于分析运动员在不同项目中的表现。

# 加载factoextra包,用于多变量分析和可视化
library(factoextra)

# 从decathlon2数据集中提取前10个连续变量,形成新的数据集data.decathlon
data.decathlon <- decathlon2[, 1:10]

# 使用str()函数查看data.decathlon数据集的结构,包含每个变量的类型和样本的数量
str(data.decathlon)

数据可见:

'data.frame':	27 obs. of  10 variables:
 $ X100m       : num  11 10.8 11 11.3 11.1 ...
 $ Long.jump   : num  7.58 7.4 7.23 7.09 7.3 7.31 6.81 7.56 6.97 7.27 ...
 $ Shot.put    : num  14.8 14.3 14.2 15.2 13.5 ...
 $ High.jump   : num  2.07 1.86 1.92 2.1 2.01 2.13 1.95 1.86 1.95 1.98 ...
 $ X400m       : num  49.8 49.4 48.9 50.4 48.6 ...
 $ X110m.hurdle: num  14.7 14.1 15 15.3 14.2 ...
 $ Discus      : num  43.8 50.7 40.9 46.3 45.7 ...
 $ Pole.vault  : num  5.02 4.92 5.32 4.72 4.42 4.42 4.92 4.82 4.72 4.62 ...
 $ Javeline    : num  63.2 60.1 62.8 63.4 55.4 ...
 $ X1500m      : num  292 302 280 276 268 ...

数据集data.decathlon包含10个变量,分别是:X100m(100米赛跑时间)、Long.jump(跳远成绩)、Shot.put(铅球成绩)、High.jump(跳高成绩)、X400m(400米赛跑时间)、X110m.hurdle(110米栏时间)、Discus(铁饼成绩)、Pole.vault(撑杆跳成绩)、Javeline(标枪成绩)、X1500m(1500米赛跑时间)。

2、原始数据的标准化

由于不同变量的量纲不同,例如100米赛跑时间的单位为秒,而跳远成绩的单位为米,直接将这些变量放入PCA模型中会导致方差较大的变量对结果有更大的影响。为了避免这种情况,我们对数据进行标准化处理,使每个变量的平均值为0,标准差为1。这样可以确保所有变量在同一个量级上,具有可比性。

可以通过R的scale()函数来对数据进行标准化处理:

# 使用scale()函数对data.decathlon数据集进行标准化处理,生成新的标准化数据集sac.decathlon
sac.decathlon <- scale(data.decathlon, center = TRUE, scale = TRUE)

# 参数center = TRUE表示对每个变量进行去中心化处理,即每个变量的每个值减去该变量的均值,使数据的均值为0
# 参数scale = TRUE表示对每个变量按标准差进行缩放处理,即将每个变量的每个值除以该变量的标准差,使数据的标准差为1
# 这样处理的目的是消除不同量纲之间的差异,使各个变量在相同的尺度上,便于后续的主成分分析

参看前10行的情况

head(sac.decathlon,10)

结果为:

                X100m  Long.jump    Shot.put  High.jump       X400m X110m.hurdle      Discus  Pole.vault
SEBRLE     0.16961999  0.7309898  0.34273202  0.7516136  0.51314871   0.41119004 -0.31969777  0.70789965
CLAY      -0.82443206  0.1195250 -0.33874677 -1.4451128  0.06291188  -0.94999079  1.70943959  0.32409863
BERNARD    0.09861628 -0.4579695 -0.35070253 -0.8174767 -0.38732495   1.04924356 -1.15813616  1.85930269
YURKOV     1.23467576 -0.9335532  0.77313968  1.0654317  1.13734067   1.72983397  0.41102458 -0.44350339
ZSIVOCZKY  0.48913672 -0.2201776 -1.27129669  0.1239775 -0.70453726  -0.69476938  0.23926116 -1.59490643
McMULLEN  -0.57591905 -0.1862074 -0.93653518  1.3792498  0.61547526  -0.24813192 -0.12755563 -1.59490643
MARTINEAU  2.29973153 -1.8847206  0.03188205 -0.5036586  0.85082633   0.92163285  0.80113133  0.32409863
HERNU      1.34118134  0.6630493 -0.15941024 -1.4451128  1.83316122   1.19812271  0.04129654 -0.05970238
BARRAS     1.19917390 -1.3411964 -0.54199483 -0.5036586  0.17547109  -0.03544742 -0.80005309 -0.44350339
NOOL       1.19917390 -0.3220884 -2.22775815 -0.1898406 -0.11104326   1.68729707 -2.01695326 -0.82730441
            Javeline     X1500m
SEBRLE     0.9313823  1.2914594
CLAY       0.3502507  2.2516981
BERNARD    0.8510944  0.1548503
YURKOV     0.9791728 -0.2076888
ZSIVOCZKY -0.5635022 -1.0307506
McMULLEN  -0.3723405  0.6447680
MARTINEAU -1.1446338 -1.6088535
HERNU     -0.2155879  0.6447680
BARRAS    -0.5577674  0.3410190
NOOL      -0.1677975 -1.1679275

为了更好地了解标准化后的数据分布,我们可以使用plot()函数结合density()函数来呈现数据的密度分布:

plot(density(sac.decathlon))

上述代码将标准化后的数据进行可视化,生成密度图。

上图是标准化后的数据集 sac.decathlon 的密度曲线图。它展示了数据集中所有变量的标准化后值的密度分布。

横轴 (X 轴) 表示标准化后的数据值。标准化后的数据均值为 0,标准差为 1,因此横轴上显示的是标准化后的标准分数 (z-scores),范围大致在 -3 到 3 之间。这些分数表示标准化后各变量相对于其均值的偏离程度,例如,-1 表示数据点比均值低一个标准差,而 2 表示数据点比均值高两个标准差。

纵轴 (Y 轴) 表示密度 (Density),表示每个标准化值附近的概率密度。这个密度的目的是描述数据在各个标准化值区域的分布情况。纵轴的数值可以理解为某个标准化值的频率的相对比例,但不是绝对频率。

曲线的形状 图中的密度曲线呈现出一个单峰的钟形,类似于标准正态分布。这表明标准化后的数据大致符合正态分布,数据集中大多数标准化值集中在 0 附近,表示大部分运动员的表现接近平均水平。两侧逐渐下降的曲线则代表有较少的运动员表现明显优于或低于平均水平。

峰值 密度曲线的峰值位于接近 0 的位置,表示大多数数据点集中在标准化后的均值附近。这符合标准化处理的预期,说明数据的中心位置在 0,且经过缩放后,变量的分布较为对称。

宽度 曲线的宽度表示数据的离散程度,数据分布越宽,表明标准化后的数据离散程度越大;越窄则表明数据的集中程度更高。从图中可以看到,数据集中约 95% 的值位于 -2 和 2 之间,这也符合标准正态分布的 95% 范围。

另外,N = 270 表示数据集中总共有 270 个观测值(27 个运动员 × 10 个变量)。Bandwidth = 0.2821: 表示密度估计时使用的带宽 (bandwidth) 参数。带宽控制了密度曲线的平滑程度,值越小曲线越细致,值越大曲线越平滑。在此图中,带宽的值为 0.2821,说明曲线是经过适度平滑处理的,以便更好地显示数据的整体趋势。

这张密度图用于直观地检查数据标准化后的分布情况。标准化的目标是消除不同量纲的影响,使得各变量在同一尺度上进行比较。图中呈现出的接近正态分布的形状,表明标准化处理有效地将数据平衡在了同一个尺度上,便于后续进行主成分分析等进一步的多变量分析。

通过观察该密度图,我们可以验证标准化的效果是否符合预期,并为后续的分析提供基础。如果密度分布明显偏斜或有多个峰值,这可能提示我们数据中存在异常值或不同类别的样本,这需要进一步的处理或分类分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据科学和人工智能兴趣组

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值