原文鏈接:http://tecdat.cn/?p=22492
原文出處:拓端數據部落公眾號
我們將使用葡萄酒數據集進行主成分分析。
數據
數據包含177個樣本和13個變量的數據框;vintages包含類標簽。這些數據是對生長在意大利同一地區但來自三個不同栽培品種的葡萄酒進行化學分析的結果:內比奧羅、巴貝拉和格里格諾葡萄。來自內比奧羅葡萄的葡萄酒被稱為巴羅洛。
這些數據包含在三種類型的葡萄酒中各自發現的幾種成分的數量。
-
# 看一下數據
-
head(no)
輸出
轉換和標准化數據
對數轉換和標准化,將所有變量設置在同一尺度上。
-
# 對數轉換
-
no_log <- log(no)
-
-
# 標准化
-
log_scale <- scale(no_log)
-
head(log_scale)
主成分分析(PCA)
使用奇異值分解算法進行主成分分析
-
prcomp(log_scale, center=FALSE)
-
summary(PCA)
基本圖形(默認設置)
帶有基礎圖形的主成分得分和載荷圖
-
-
plot(scores[,1:2], # x和y數據
-
pch=21, # 點形狀
-
cex=1.5, # 點的大小
-
-
legend("topright", # legend的位置
-
legend=levels(vint), # 圖例顯示
-
-
plot(loadings[,1:2], # x和y數據
-
pch=21, # 點的形狀
-
-
text(loadings[,1:2], # 設置標簽的位置
此外,我們還可以在分數圖中的組別上添加95%的置信度橢圓。
置信度橢圓圖函數
-
## 橢圓曲線圖
-
elev=0.95, # 橢圓概率水平
-
pcol=NULL, # 手工添加顏色,必須滿足長度的因素
-
cexsize=1, # 點大小
-
ppch=21, # 點類型,必須滿足因素的長度
-
legcexsize=2, # 圖例字體大小
-
legptsize=2, # 圖例點尺寸
-
-
## 設定因子水平
-
if(is.factor(factr) {
-
f <- factr
-
} else {
-
f <- factor(factr, levels=unique(as.character(factr)))
-
}
-
intfactr <- as.integer(f) # 設置與因子水平相匹配的整數向量
-
-
## 獲取橢圓的數據
-
edf <- data.frame(LV1 = x, LV2=y, factr = f) # 用數據和因子創建數據框
-
ellipses <- dlply(edf, .(factr), function(x) {
-
-
Ellipse(LV1, LV2, levels=elev, robust=TRUE, draw=FALSE) #從dataEllipse()函數中按因子水平獲取置信度橢圓點
-
})
-
## 獲取X和Y數據的范圍
-
xrange <- plotat(range(c(as.vector(sapply(ellipses, function(x) x[,1])), min(x), max(x))))
-
## 為圖塊設置顏色
-
if(is.null(pcol) != TRUE) { # 如果顏色是由用戶提供的
-
pgcol <- paste(pcol, "7e", sep="") # 增加不透明度
-
-
# 繪圖圖形
-
plot(x,y, type="n", xlab="", ylab="", main=""
-
abline(h=0, v=0, col="gray", lty=2) #在0添加線條
-
legpch <- c() # 收集圖例數據的矢量
-
legcol <- c() # 收集圖例col數據的向量
-
## 添加點、橢圓,並確定圖例的顏色
-
## 圖例
-
legend(x=legpos, legend=levels(f), pch=legpch,
-
## 使用prcomp()函數的PCA輸出的軸圖示
-
pcavar <- round((sdev^2)/sum((sdev^2))
基礎圖形
繪制主成分得分圖,使用基本默認值繪制載荷圖
-
plot(scores[,1], # X軸的數據
-
scores[,2], # Y軸的數據
-
vint, # 有類的因素
-
pcol=c(), # 用於繪圖的顏色(必須與因素的數量相匹配)
-
pbgcol=FALSE, #點的邊框是黑色的?
-
cexsize=1.5, # 點的大小
-
ppch=c(21:23), # 點的形狀(必須與因子的數量相匹配)
-
legpos="bottom right", # 圖例的位置
-
legcexsize=1.5, # 圖例文字大小
-
legptsize=1.5, # 圖例點的大小
-
axissize=1.5, # 設置軸的文字大小
-
linewidth=1.5 # 設置軸線尺寸
-
)
-
title(xlab=explain[["PC1"]], # PC1上解釋的方差百分比
-
ylab=explain[["PC2"]], # PC2解釋的方差百分比
-
main="Scores", # 標題
-
cex.lab=1.5, # 標簽文字的大小
-
cex.main=1.5 # 標題文字的大小
-
-
plot(loadings[,1:2], # x和y數據
-
pch=21, # 點的形狀
-
cex=1.5, # 點的大小
-
# type="n", # 不繪制點數
-
axes=FALSE, # 不打印坐標軸
-
xlab="", # 刪除x標簽
-
ylab="" # 刪除y標簽
-
)
-
pointLabel(loadings[,1:2], #設置標簽的位置
-
labels=rownames(PCAloadings), # 輸出標簽
-
cex=1.5 # 設置標簽的大小
-
) # pointLabel將嘗試將文本放在點的周圍
-
axis(1, # 顯示x軸
-
cex.axis=1.5, # 設置文本的大小
-
lwd=1.5 # 設置軸線的大小
-
)
-
axis(2, # 顯示y軸
-
las=2, # 參數設置文本的方向,2是垂直的
-
cex.axis=1.5, # 設置文本的大小
-
lwd=1.5 # 設置軸線的大小
-
)
-
title(xlab=explain[["PC1"]], # PC1所解釋的方差百分比
-
ylab=explain[["PC2"]], # PC2解釋的方差百分比
-
-
cex.lab=1.5, # 標簽文字的大小
-
cex.main=1.5 # 標題文字的大小
-
)
最受歡迎的見解
1.matlab偏最小二乘回歸(PLSR)和主成分回歸(PCR)
2.R語言高維數據的主成分pca、 t-SNE算法降維與可視化分析