2016-10-24 6 views
1

これは簡単な問題だと思われますが、問題を解決できません。PCAの出力から主成分を動的に選択する

IはrownamesたPCが

さらなる操作のために最初の列を形成するよう今DFの列にrownames変換

newiris<-iris[,1:4] 
iris.norm<-data.frame(scale(newiris)) 
head(iris.norm) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width 
1 -0.8976739 1.01560199 -1.335752 -1.311052 
2 -1.1392005 -0.13153881 -1.335752 -1.311052 
3 -1.3807271 0.32731751 -1.392399 -1.311052 
4 -1.5014904 0.09788935 -1.279104 -1.311052 
5 -1.0184372 1.24503015 -1.335752 -1.311052 
6 -0.5353840 1.93331463 -1.165809 -1.048667 

# performed PCA now 
pccomp <- prcomp(iris.norm) 
summary(pccomp) 
a <- summary(pccomp) 
df<- as.data.frame(a$importance) 
df <- t(df) 
df 
##  Standard deviation Proportion of Variance Cumulative Proportion 
## PC1   1.7083611    0.72962    0.72962 
## PC2   0.9560494    0.22851    0.95813 
## PC3   0.3830886    0.03669    0.99482 
## PC4   0.1439265    0.00518    1.00000 

以下として..then正規化されたセットの虹彩データの数値列をとっている

library(tibble) 
    library(dplyr) 
    df<-rownames_to_column(as.data.frame(df), var="PrinComp") %>% head 
    df 
    ## PrinComp Standard deviation Proportion of Variance Cumulative Proportion 
    ## 1  PC1   1.7083611    0.72962    0.72962 
    ## 2  PC2   0.9560494    0.22851    0.95813 
    ## 3  PC3   0.3830886    0.03669    0.99482 
    ## 4  PC4   0.1439265    0.00518    1.00000 

# Now will be selecting only those PCs where the cumulative proportion is say less than 96% 
# subsetting 
pcs<-as.vector(as.character(df[which(df$`Cumulative Proportion`<0.96),][,1])) # cumulative prop less than 96% 
pcs 
## [1] "PC1" "PC2" 

今私たちは、上記の条件から得た第2主成分(兼プロパ< 0.96)から静的ベクトルスコアのPC用データフレームを作成してい

x1 <- pccomp$x[,1] 
x2 <- pccomp$x[,2] 
pcdf <- cbind(x1,x2) 
head(pcdf) 
##    x1   x2 
## [1,] -2.257141 -0.4784238 
## [2,] -2.074013 0.6718827 
## [3,] -2.356335 0.3407664 
## [4,] -2.291707 0.5953999 
## [5,] -2.381863 -0.6446757 
## [6,] -2.068701 -1.4842053 

私の問題は、上記のPCデータフレームを動的に作成するにはどうすればいいですか?

答えて

1

df's cumulative proportionフィールドでwhileループを実行し、変換された値が必要なしきい値より小さくなるまで追加することができます。

threshold = 0.96 
pcdf = list() 
i = 1 
while(df$`Cumulative Proportion`[i]<threshold){ 
    pcdf[[i]] = pccomp$x[,i] 
    i = i +1 
} 
pcdf = as.data.frame(pcdf) 

names(pcdf) = paste("x",c(1:ncol(pcdf)),sep="") 

出力

> head(pcdf) 
     x1   x2 
1 -2.257141 -0.4784238 
2 -2.074013 0.6718827 
3 -2.356335 0.3407664 
4 -2.291707 0.5953999 
5 -2.381863 -0.6446757 
6 -2.068701 -1.4842053 

同じコードを実行しているthreshold = 0.999はあなたがiを言いたい主成分の数を知っていると仮定すると、

> head(pcdf) 
     x1   x2   x3 
1 -2.257141 -0.4784238 0.12727962 
2 -2.074013 0.6718827 0.23382552 
3 -2.356335 0.3407664 -0.04405390 
4 -2.291707 0.5953999 -0.09098530 
5 -2.381863 -0.6446757 -0.01568565 
6 -2.068701 -1.4842053 -0.02687825 

UPDATE

を与えますあなたは使用することができます

while loop sectionの代わりに使用することができます。 i = 2の場合は

> head(a) 
      [,1]  [,2] 
[1,] -2.257141 -0.4784238 
[2,] -2.074013 0.6718827 
[3,] -2.356335 0.3407664 
[4,] -2.291707 0.5953999 
[5,] -2.381863 -0.6446757 
[6,] -2.068701 -1.4842053 

ここでaは結果です。

+0

... fantastico ... tats watさんが探していた... – Nishant

+0

wud luv to knw to apply the family functionsを使用して解決をさらに短縮できますか? – Nishant

+0

「i」と言ってほしい主成分の数が分かっていると仮定すると、サプリー関数を簡単に適用してこれを行うことができます。私は私の答えの更新としてそれを置くでしょう。 – 9Heads

1

あなたは常に少なくとも一つのPCが欲しいと仮定すると、ここでは1行バージョンの上方に設けられGR8溶液に追加

p <- 0.96 
pccomp$x[,1:nrow(df[which(df$`Cumulative Proportion`<p),])] # first two PCs 
p <- 0.75 
pccomp$x[,1:nrow(df[which(df$`Cumulative Proportion`<p),])] # first PC 
+1

、@ 9Heads ...ただ素晴らしい....... – Nishant

+0

@sandipan ...単純に素晴らしい...... – Nishant

0

です:完了

pcs<-as.vector(as.character(df1[which(df1$`Cumulative Proportion`<0.96),][,1])) # cumulative prop less than 96% 
pcs 
## [1] "PC1" "PC2" 
i=length(pcs) # we get the no of PCs fulfilling the cum prop condition 
a <- sapply(X = c(1:i),FUN = function(X){pcdf[[X]] = pccomp$x[,X]}) 
head(a) 

> head(a) 
     [,1]  [,2] 
[1,] -2.257141 -0.4784238 
[2,] -2.074013 0.6718827 
[3,] -2.356335 0.3407664 
[4,] -2.291707 0.5953999 
[5,] -2.381863 -0.6446757 
[6,] -2.068701 -1.4842053 

が!

関連する問題