6

どこが間違っていますか?prcomp と自分で PCA を実行しようとしていますが、異なる結果が得られます。

自分でやる:

>database <- read.csv("E:/R/database.csv", sep=";", dec=",") #it's a 105 rows x 8 columns, each column is a variable
>matrix.cor<-cor(database)
>standardize<-function(x) {(x-mean(x))/sd(x)}
>values.standard<-apply(database, MARGIN=2, FUN=standardize)
>my.eigen<-eigen(matrix.cor)
>loadings<-my.eigen$vectors
>scores<-values.standard %*% loadings
>head (scores, n=10) # I m just posting here the first row scores for the first 6 pc

[,1]       [,2]       [,3]        [,4]       [,5]        [,6]        

2.3342586  2.3426398 -0.9169527  0.80711713  1.1409138 -0.25832090    

>sd <-sqrt (my.eigen$values)
>sd

[1] 1.5586078 1.1577093 1.1168477 0.9562853 0.8793033 0.8094500 0.6574788
0.4560247

PRCOMPでそれを行う:

>database.pca<-prcomp(database, retx=TRUE, center= TRUE, scale=TRUE)
>sd1<-database.pca$sdev 
>loadings1<-database.pca$rotation
>rownames(loadings1)<-colnames(database)
>scores1<-database.pca$x
>head (scores1, n=10)
PC1        PC2        PC3         PC4        PC5         PC6       
-2.3342586  2.3426398  0.9169527  0.80711713  1.1409138  0.25832090

範囲 (scores-scores1) はゼロではありません! 私を助けてください!!!グロリア

4

1 に答える 1

5

主成分スコアは、符号が異なるだけで、ほぼ同じように見えます。ここで学んだように、主成分の符号は基本的に任意です。

代わりに次のようなものを使用して手動で計算したスコアをテストするとrange(abs(scores) - abs(scores1))、0 にかなり近い値が得られるはずです (浮動小数点精度の影響が考えられるため、正確には 0 ではない可能性があります)。

于 2013-01-30T00:58:02.683 に答える