2012-06-02 73 views
-1

我正試圖找到一種方法,使得R更加便攜的3D PCA可視化; 我已使用prcomp()在2D矩陣上運行PCA。從R中提取3D座標PCA

  1. 如何導出數據點的3D座標以及與每個點相關的標籤和顏色(RGB)?
  2. princomp()prcomp()有什麼實際區別?
  3. 關於如何使用HTML5和畫布最佳查看3D PCA圖的任何想法?

謝謝!

+2

你最好問這些問題作爲單獨的問題(特別是問題3)。 –

+0

你必須提供更多信息。你的數據是什麼,你的2d矩陣是一個cov矩陣,RGB的含義是什麼?在你的領域,這種分析可能是顯而易見的,但PCA適用於大量的學科領域。 –

回答

6

下面是一個例子,從工作:

pc <- prcomp(~ . - Species, data = iris, scale = TRUE) 
  1. 分數從部件x萃取軸;因此你可以只寫出來(你不說你想怎麼導出)爲CSV使用:

    write.csv(pc$x[, 1:3], "my_pc_scores.csv") 
    

    如果你想分配信息,以這些分數(顏色和標籤,這是不相關的東西與PCA,但你自己分配),然後將它們添加到分數矩陣,然後出口。在上面的例子中,有三個物種各有50個觀測值。如果我們要導出的成績旁邊的信息,然後像這樣將工作

    scrs <- data.frame(pc$x[, 1:3], Species = iris$Species, 
            Colour = rep(c("red","green","black"), each = 50)) 
    write.csv(scrs, "my_pc_scores2.csv") 
    

    scrs看起來是這樣的:

    > head(scrs) 
         PC1  PC2   PC3 Species Colour 
    1 -2.257141 -0.4784238 0.12727962 setosa red 
    2 -2.074013 0.6718827 0.23382552 setosa red 
    3 -2.356335 0.3407664 -0.04405390 setosa red 
    4 -2.291707 0.5953999 -0.09098530 setosa red 
    5 -2.381863 -0.6446757 -0.01568565 setosa red 
    6 -2.068701 -1.4842053 -0.02687825 setosa red 
    

    更新錯過有關RGB點。見?rgb爲R中指定此方法,但是如果你想要的是RGB字符串,然後更改上述使用類似

        Colour = rep(c("#FF0000","#00FF00","#000000"), each = 50) 
    

    相反,在那裏你指定你想要的RGB字符串。

  2. princomp()prcomp()之間的本質區別是用於計算PCA的算法。 princomp()使用協方差或相關矩陣的Eigen分解,而prcomp()使用原始數據矩陣的奇異值分解(SVD)。princomp()僅處理數據中至少包含同樣多樣本(行)和變量(列)的數據集。 prcomp()可以處理那些類型的數據數據集,其中列數多於行數。另外,也許更重要的是取決於你的想法,SVD優於特徵分解,因爲它具有更好的數值精度。

  3. 我已經用標記了Q,希望那些專家能夠提供幫助。如果您沒有得到任何答覆,請從Q中刪除第3點,並專門針對使用畫布顯示PC的主題開始一個新的操作,並參考該細節。

1

您可以通過做str(object_name)瞭解任何R對象。在這種情況下:

m <- matrix(rnorm(50), nrow = 10) 
res <- prcomp(m) 
str(m) 

如果你看一下幫助頁面prcomp?prcomp,你可以發現,得分在res$x和負荷都在res$rotation。這些已被PC標記。沒有顏色,除非你決定在劇情過程中分配一些顏色。請參閱相應的幫助頁面,以比較princompprcomp,以便比較兩種功能。基本上,它們之間的區別與幕後使用的方法有關。我無法幫助你處理最後一個問題。

0

您聲明您在2D矩陣上執行PCA。如果這是您的數據矩陣,則無法獲得3D PCA。 Ofcourse它可能是你的二維矩陣是數據的協方差矩陣,在這種情況下,你需要使用princomp和explictely通過協方差矩陣m像這樣(不prcomp!):

princomp(covmat = m) 

傳遞的協方差矩陣如:

princomp(m) 

不會產生正確的結果。

+0

您是否正在對數據描述進行相當概括的觀察?考慮'mat < - matrix(rnorm(100),ncol = 10)';這是一個二維數據集,意思是「長度(dim(mat))」是2.然而,由這些數據表示的空間是10-d。 –