使用R进行主成分分析。自动和手动结果不匹配

使用R进行主成分分析。自动和手动结果不匹配,r,statistics,pca,R,Statistics,Pca,采用以下Box1的R代码,采用两种不同的主成分分析方法对以下数据()进行分析。https://drive.google.com/file/d/1xykl6ln-bUnXIs-jIA3n5S3XgHjQbkWB/view?usp=sharing 第一种方法使用旋转矩阵(参见Box1代码中“旋转数据”下的“ANSU mat”),并且, 第二种方法使用“pcomp”函数(请参见Box1代码的“#旋转数据”下的“rpca”) 然而,使用旋转矩阵的方法和使用“pcomp”函数的方法之间的答案存在细微差异。

采用以下Box1的R代码,采用两种不同的主成分分析方法对以下数据()进行分析。
https://drive.google.com/file/d/1xykl6ln-bUnXIs-jIA3n5S3XgHjQbkWB/view?usp=sharing

第一种方法使用旋转矩阵(参见Box1代码中“旋转数据”下的“ANSU mat”),并且, 第二种方法使用“pcomp”函数(请参见Box1代码的“#旋转数据”下的“rpca”)

然而,使用旋转矩阵的方法和使用“pcomp”函数的方法之间的答案存在细微差异。 匹配

我的问题

我应该怎样做才能使基于旋转矩阵的方法的结果与“pcomp”函数的结果相匹配

就我对各种数据(包括其他数据)所做的尝试而言,实际的差异似乎仅限于缩放变换和镜像变换

  • 基于旋转矩阵的方法的结果显示在左面板中
  • 基于pcomp函数的方法的结果显示在右面板中
镜像反转可以在“ch082.dat”数据中看到(见图1); 似乎在某些j中,“相关矩阵的第j个特征向量”的符号和“prcomp函数的输出值的第j列”的符号可以反转。如果特征值有一定程度的重叠,则差异可能比镜像反转更复杂。
图1

尽管对数据进行了集中化和标准化处理,但Box2的数据(参见图2)仍存在比例变化。
图2

框1

#dataload
##Use the 'setwd' function to specify the directory containing 'ch082.dat'.
##For example, if you put this file directly under the C drive of your Windows PC, you can run the following command.

setwd("C:/") #Depending on where you put the file, you may need to change the path.
getwd()
w1<-read.table("ch082.dat",header = TRUE,row.names = 1,fileEncoding = "UTF-8")
w1

#Function for standardizing data
#Thanks to https://qiita.com/ohisama2/items/5922fac0c8a6c21fcbf8
standalize <- function(data)
{ for(i in length(data[1,]))
{
  x <- as.matrix(data[,i])
  y <- (x-mean(x)/sd(x))
  data[,i] <- y
}
  return(data)}


#Method using rotation matrix
z_=standalize(w1)
B_mat=cor(z_) #Compute correlation matrix
eigen_m <- eigen(B_mat)
sample_mat <- as.matrix(z_)
ans_mat=sample_mat

for(j in 1:length(sample_mat[1,])){
ans_mat[,j]=sample_mat%*%eigen_m$vectors[,j]
}

#Method using "rpca" function
rpca <- prcomp(w1,center=TRUE, scale=TRUE)

#eigen vectors
eigen_m$vectors
rpca

#rotated data
ans_mat
rpca$x

#Graph Plots
par(mfrow=c(1,2))
plot(
  ans_mat[,1], 
  ans_mat[,2], 
  main="Rotation using eigenvectors"
)
plot(rpca$x[,1], rpca$x[,2], 
     main="Principal component score")
par(mfrow=c(1,1))

#summary
summary(rpca)$importance
#数据加载
##使用“setwd”函数指定包含“ch082.dat”的目录。
##例如,如果将此文件直接放在Windows PC的C驱动器下,则可以运行以下命令。
setwd(“C:/”)#根据文件的放置位置,可能需要更改路径。
getwd()

w1两组结果一致。首先,我们可以稍微简化您的代码。您不需要函数或for循环:

z_ <- scale(w1)
B_mat <- cor(z_)
eigen_m <- eigen(B_mat)
ans_mat <- z_ %*% eigen_m$vectors
您的原始代码错误地标记了
ans\u mat
列。它们实际上是主成分得分。你可以用它来解决这个问题

colnames(ans_mat) <- colnames(z_pca$x)

谢谢您的回答。我根据您的说明修改了代码,但是,对于仍然是特征向量[1]=-z_pca$旋转[1],对于Box2的数据,最终结果似乎是一致的。图2所示的情节,两种方法的比例是一致的。我应该注意到。pc加载(因此分数)不是关于反射的唯一定义。换句话说,将一个组件中的所有负载或分数乘以-1将翻转它们,但不会改变它们之间的关系。将ans_mat[,1]或rpca$x[,1]乘以-1,但不能两者都乘以,绘图将匹配。目前,它们是彼此的镜像。>“pc加载(因此分数)并不是关于反射的唯一定义。”⇒非常感谢你。现在一切都清楚了。所以,如果我们用一个非零标量乘以特征向量,它仍然是一个对应于相同特征值的特征向量。如果本征空间是二维或多维的,那么它仍然是对应于相同本征值的本征向量,即使我们做了一个保持本征空间的变换,只要保持正交性。。因此,主成分分析在这个意义上具有任意性,对吗? 谢谢。是的,尽管乘以除1以外的任何值,-1将改变特征向量/分数与特征值的关系。
z_pca <- prcomp(z_)
z_pca$sdev^2    # Equals eigen_m$values
z_pca$rotation  # Equals eigen_m$vectors
z_pca$x         # Equals ans_mat
colnames(ans_mat) <- colnames(z_pca$x)
z_pca$x[, 1] <- z_pca$x[, 1] * -1
dev.new(width=10, height=6)
par(mfrow=c(1,2))
plot(ans_mat[,1], ans_mat[,2], main="Rotation using eigenvectors")
plot(z_pca$x[,1], z_pca$x[,2], main="Principal component score")