关于 R 中的 PCA?

5

我在R中使用了caret包来对数据进行预处理,例如:

> trans <- preProcess(data, method  = "pca").
> transformedData <- predict(trans, data)

我遇到了问题,我的原始数据中预测变量的名称丢失了,只有一列主成分(PCs)。我该如何找到这些主成分与我的原始预测变量之间的关系?您知道,这些预测变量上可能有一些载荷(loadings)或系数(coefficients)。

请问有人可以给我一些提示吗?最好使用caret方法。谢谢!


你在问什么?PC是什么?你看过双标图并了解每个PC解释的变化有多少吗? - cianius
3个回答

3
我不太熟悉caret,但是你可以使用princompprcomp吗?
例如:
# some random data
x   <-data.frame(a=1:25+rnorm(25),
                 b=3:27+rnorm(25,mean=1), 
                 c=25:1 + rnorm(25,mean=2,sd=2))
pca <- prcomp(x, retx = TRUE, center = TRUE, scale. = TRUE)
transformedData <- pca$x
loadings        <- pca$rotation
eigenvalues     <- pca$sdev

同时请参阅"在R中执行主成分分析的5个函数"相关资源。


3
我不确定我是否100%理解了你的问题,但我猜测你有一个数据集中缺失一些名称,并且希望快速识别变量之间的关系(可能是线性关系),识别“主成分”?
这是一个非常棒的交叉验证帖子,向您展示PCA和SVD的一些知识。
这里有一个非常简单的例子,向您展示如何使用prcomp函数:
>library(ggplot2)
>data(mpg)
>data <- mpg[,c("displ", "year", "cyl", "cty", "hwy")]
# get the numeric columns only for this easy demo
>prcomp(data, scale=TRUE)

Standard deviations:
  [1] 1.8758132 1.0069712 0.5971261 0.2658375 0.2002613

Rotation:
  PC1         PC2        PC3         PC4         PC5
displ  0.49818034 -0.07540283  0.4897111  0.70386376 -0.10435326
year   0.06047629 -0.98055060 -0.1846807 -0.01604536  0.02233245
cyl    0.49820578 -0.04868461  0.5028416 -0.68062021  0.18255766
cty   -0.50575849 -0.09911736  0.4348234  0.15195854  0.72264881
hwy   -0.49412379 -0.14366800  0.5330619 -0.13410105 -0.65807527

以下是您如何解释结果:

(1)标准差,即奇异值分解时应用的中间对角矩阵。解释了每个“主成分”/层/透明度在矩阵的整体方差中解释了多少方差。

例如,

70 % = 1.8758132^2 / (1.8758132^2 + 1.0069712^2 + 0.5971261^2 + 0.2658375^2 + 0.2002613^2)

这意味着第一列本身已经解释了整个矩阵的70%变异性。

(2) 现在让我们看一下旋转矩阵/V中的第一列:

          PC1       
displ  0.49818034 
year   0.06047629
cyl    0.49820578
cty   -0.50575849
hwy   -0.49412379

我们可以看到:displcyl 呈正相关,与 ctyhwy 呈负相关。在这个主导层中,year 并不是很明显。
更大的排量或气缸数可能会让您的汽车有更高的平均每加仑英里数(MPG),这是有道理的。
以下是变量之间的图表,供您参考。
pairs(data)

enter image description here


2
你想要查看生成列表的 rotation 变量:
> trans <- preProcess(data, method  = "pca").
> transformedData <- predict(trans, data)
> trans$rotation

如果您想查看特定的计算机,比如前两台:

> trans$rotation[,c(1,2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接