其他
R 语言|旋转 PCA 以提高轴的解释性(案例)
(点击 👉 即可跳转。)
目录
引言
1 包和数据
2 主成分分析并旋转
3 可视化
结语
引言
看到一篇 Ecology Letter 的文章,里面对植物根系性状数据做了主成分分析(PCA),为了说明 PCA 图中潜在的两个梯度,作者绘制了两条辅助线,
即 conservation 和 collaboration 梯度(类似文末图 a)。
🌟 The plant root economics space in relation to nutrient limitation in Eurasian herbaceous plant communities
还有一个办法是对 PCA 做旋转,这可以使旋转后的轴更清晰地呈现潜在梯度。
下面的例子,可以清晰地看到 PCA 加上旋转,如何提高成分(Components)的可解释性(图 b)。
通过旋转,可以使每个主成分更集中地与一组原始变量相关联,而不是分散地与多个变量相关联。
这样,每个主成分代表了数据中的一个更加清晰和易于解释的维度。
1 包和数据
加载包,
library(psych)
数据,
# 数据
prepr4 <- read.csv("prepr4.csv", header = TRUE)
# 显示前 20 行
head(prepr4, 20)
D RN RTD SRL
1 0.2866022572 0.29945711 -0.14686399 -0.5421955
2 -0.5813583286 0.57575755 -0.75833114 0.2595445
3 0.3054830504 1.33520896 -0.29958186 -0.2997606
4 -0.4520775184 0.46371948 -0.89275488 -0.4088783
5 -1.8422628487 -3.05157284 1.51835333 1.8501258
6 0.7819614122 0.83942720 0.06609513 0.2274113
7 0.6106631611 0.20005067 -0.09256328 0.4168647
8 -0.0101542962 0.42352161 1.08111844 0.8711306
9 -0.2644881654 -0.80188274 -0.48444987 0.8870761
10 -0.1403610809 -0.04489861 -0.10040116 0.5194476
11 0.5435033466 0.45103212 -0.63821554 0.1676892
12 -0.3854182253 -0.14223216 -0.07676849 1.5004325
13 -0.0002490499 0.02800901 -0.08330517 0.6229860
14 -0.1579546676 -0.49948904 0.73805032 -0.5020935
15 -1.0590409296 0.31475331 1.02695427 -0.4784395
16 -1.0485487444 -1.06619501 1.85161853 -0.2591552
17 -0.5070882139 -0.41316853 1.07385597 0.3517950
18 0.4739183611 -0.28631590 -0.80195706 -0.5111817
19 -1.6363922875 -2.79662798 2.64997355 0.2825077
20 1.3029563579 0.11483212 0.29204756 -1.0608638
2 主成分分析并旋转
# PCA 但是不旋转
pca_n_rot <- psych::principal(
prepr4,
rotate = "none",
nfactors = 2,
scores = TRUE
)
# PCA 并做 varimax 旋转
pca_rot <- psych::principal(
prepr4,
rotate = "varimax",
nfactors = 2,
scores = TRUE
)
3 可视化
# 绘图参数
par(
mfrow = c(2, 1),
family = "DejaVu Sans",
cex = 1.1,
cex.axis = 0.7,
las = 1
)
# 可视化不旋转的 PCA
biplot(
pca_n_rot,
col = c("grey0", "green4"),
main = "a. Not rotate"
)
segments(
x0 = c(-3, -1),
x1 = c(3, 1),
y0 = c(-3, 1),
y1 = c(3, -1),
lty = 3
)
# 可视化旋转的 PCA
biplot(
pca_rot,
col = c("grey0", "green4"),
main = "b. Varimax arotated"
)
segments(
x0 = c(0, -3),
x1 = c(0, 3),
y0 = c(-3, 0),
y1 = c(3, 0),
lty = 3
)