【问题标题】:How to use autoplot in R to plot rotated components?如何在 R 中使用自动绘图来绘制旋转组件?
【发布时间】:2018-04-30 17:53:58
【问题描述】:

我正在使用 R 中的 autoplot 函数(来自 ggfortify 包)来绘制 PCA 的前两个组件,如下所示,以 iris 数据集为例:

data<-iris
data_dims<-(data[, 1:4])
data$Species<-as.factor(data$Species)
plot1<-autoplot(prcomp(data_dims, center = TRUE, scale = TRUE), data = data, colour = 'Species', frame = TRUE)

但是,我想知道是否有人可以帮助我绘制旋转解决方案?我知道得到这样的旋转解决方案:

pcompanalysis<-prcomp(data, center = TRUE, scale = TRUE)

pcompanalysis_rot <- varimax(pcompanalysis$rotation)

但是,我不确定如何在 autoplot() 函数中使用这个旋转的解决方案?

编辑:示例现在使用 iris 数据集进行复制。

【问题讨论】:

  • 请参阅here,了解如何使这个问题成为人们可以更轻松地帮助解决的问题,包括如何发布您的数据样本
  • 感谢您指出这一点,这些示例现在使用 iris 数据集并且可以重现。

标签: r ggplot2 pca


【解决方案1】:

这是一个可能的解决方案:

library(ggfortify)
library(pracma)

# Generate a dataset
set.seed(1234) 
n <- 20
p <- 25
ncomp <- 2
data_dims <- matrix(rnorm(n*p),nrow=n)
data <- data.frame(data_dims, Species=cut(runif(n), breaks=4))

# Perform PCA and calculate varimax rotated scores
pca.obj <- prcomp(data_dims, center=T, scale=T)
rawLoadings <- pca.obj$rotation[,1:ncomp] %*% diag(pca.obj$sdev, ncomp, ncomp)
varimax.obj <- varimax(rawLoadings)
rotatedLoadings <- varimax.obj$loadings

# Create a prcomp object with varimax rotated scores
pca_obj <- list(sdev=pca.obj$sdev, rotation=t(varimax.obj$rotmat), 
              center=NULL, scale=NULL, x=scale(pca.obj$x[,1:ncomp]))
name.pcs <- paste0("PC",1:ncomp)
dimnames(pca_obj$rotation) <- list(name.pcs,name.pcs)
dimnames(pca_obj$x) <- list(rownames(data_dims),name.pcs)
class(pca_obj) <- "prcomp"

plot1 <- autoplot(pca_obj, data=data, colour='Species', 
                  frame=TRUE, variance_percentage=F)
plot1

更多详情请见here

【讨论】:

  • 我一直在尝试将其扩展到我的实际数据(具有 25 个评级维度),但出现以下错误。 as.matrix(apply(pca_dims, 2, scale)) %*% varimax.rot 中的错误:不符合要求的参数想知道您能否指出正确的方向?
  • 非常感谢您克服困难!您的代码适用于您生成的示例数据;但是,它仍然对我的数据给出相同的错误。但是,我意识到在我的数据上运行代码时,这两个矩阵的列数不同(data_dims 的预期值为 25;varimax.rot 只有 20)。关于如何解决这个问题的任何想法,或者它为什么会出现?
  • 我尝试只取前 20 列来进行乘法运算——这是一种潜在的解决方法吗?请参阅此处:pastebin.com/HVsM1s5v 但是,我现在收到以下错误: scale.default(data, center = FALSE, scale = 1/scale) 中的错误:“scale”的长度必须等于“x”的列数
  • 啊,明白了!再次感谢大家的帮助!
  • 谢谢马可!仔细检查一下,我注意到情节在旋转前后看起来是一样的,这是意料之中的吗?如果没有,我已将尝试将您的代码应用于我的数据集,也许我在某个地方出错了? pastebin.com/hLrZeJL5
猜你喜欢
  • 2014-03-30
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多