咱们将应用葡萄酒数据集进行主成分剖析。
数据
数据蕴含 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 # 题目文字的大小
)