2012-04-20 13 views
4

私はFactorMineRを使用してPCA解析のプロットを生成するRスクリプトを実行しています。PCA FactoMineRプロットデータ

生成されたPCAプロットの座標を出力したいが、正しい座標を見つけることができない。 results1$ind$coordresults1$var$coordが見つかりましたが、どちらもデフォルトプロットのようには見えません。

私は http://www.statistik.tuwien.ac.at/public/filz/students/seminar/ws1011/hoffmann_ausarbeitung.pdfhttp://factominer.free.fr/classical-methods/principal-components-analysis.html を見つけましたが、どちらも私は$ind$coord[,1]$ind$coord[,2]PCAオブジェクトの最初の2つのPCA coordsのあることがわかったPCA

library(FactoMineR) 
data1 <- read.table(file=args[1], sep='\t', header=T, row.names=1) 
result1 <- PCA(data1,ncp = 4, graph=TRUE) # graphs generated automatically 
plot(result1) 
+0

私はそれだけでdidntはラベルが正しく –

+0

引数は、[1]再生可能なリファレンスではありません$のINDする$ COORDでデータを見つけたと思います。パッケージに含まれるデータセットを参照するようにQを編集する場合は、より多くの注意が必要です。 –

+0

@DWinありがとうthats a good point –

答えて

6

によって作成された変数の内容を記載していません。ここでは、PCA出力をどうすることもできますいくつか他のものが含まれて働いた例...

# Plotting the output of FactoMineR's PCA using ggplot2 
# 
# load libraries 
library(FactoMineR) 
library(ggplot2) 
library(scales) 
library(grid) 
library(plyr) 
library(gridExtra) 
# 
# start with a clean slate 
rm(list=ls(all=TRUE)) 
# 
# load example data 
data(decathlon) 
# 
# compute PCA 
res.pca <- PCA(decathlon, quanti.sup = 11:12, quali.sup=13, graph = FALSE) 
# 
# extract some parts for plotting 
PC1 <- res.pca$ind$coord[,1] 
PC2 <- res.pca$ind$coord[,2] 
labs <- rownames(res.pca$ind$coord) 
PCs <- data.frame(cbind(PC1,PC2)) 
rownames(PCs) <- labs 
# 
# Just showing the individual samples... 
ggplot(PCs, aes(PC1,PC2, label=rownames(PCs))) + 
    geom_text() 

enter image description here

# Now get supplementary categorical variables 
cPC1 <- res.pca$quali.sup$coor[,1] 
cPC2 <- res.pca$quali.sup$coor[,2] 
clabs <- rownames(res.pca$quali.sup$coor) 
cPCs <- data.frame(cbind(cPC1,cPC2)) 
rownames(cPCs) <- clabs 
colnames(cPCs) <- colnames(PCs) 
# 
# Put samples and categorical variables (ie. grouping 
# of samples) all together 
p <- ggplot() + theme(aspect.ratio=1) + theme_bw(base_size = 20) 
# no data so there's nothing to plot... 
# add on data 
p <- p + geom_text(data=PCs, aes(x=PC1,y=PC2,label=rownames(PCs)), size=4) 
p <- p + geom_text(data=cPCs, aes(x=cPC1,y=cPC2,label=rownames(cPCs)),size=10) 
p # show plot with both layers 

enter image description here

# Now extract the variables 
# 
vPC1 <- res.pca$var$coord[,1] 
vPC2 <- res.pca$var$coord[,2] 
vlabs <- rownames(res.pca$var$coord) 
vPCs <- data.frame(cbind(vPC1,vPC2)) 
rownames(vPCs) <- vlabs 
colnames(vPCs) <- colnames(PCs) 
# 
# and plot them 
# 
pv <- ggplot() + theme(aspect.ratio=1) + theme_bw(base_size = 20) 
# no data so there's nothing to plot 
# put a faint circle there, as is customary 
angle <- seq(-pi, pi, length = 50) 
df <- data.frame(x = sin(angle), y = cos(angle)) 
pv <- pv + geom_path(aes(x, y), data = df, colour="grey70") 
# 
# add on arrows and variable labels 
pv <- pv + geom_text(data=vPCs, aes(x=vPC1,y=vPC2,label=rownames(vPCs)), size=4) + xlab("PC1") + ylab("PC2") 
pv <- pv + geom_segment(data=vPCs, aes(x = 0, y = 0, xend = vPC1*0.9, yend = vPC2*0.9), arrow = arrow(length = unit(1/2, 'picas')), color = "grey30") 
pv # show plot 

enter image description here

# Now put them side by side in a single image 
# 
grid.arrange(p,pv,nrow=1) 
# 
# Now they can be saved or exported... 
です

enter image description here

+0

本当に助けてくれてありがとうベン! :) –

+0

心配はいりません。私は 'FactorMineR'メールリストに載っている人たちも本当に役に立つと分かっています。 – Ben

1

ベンの答えに何かを追加します。 Benの反応の最初のチャートでは、ラベルが多少重なっていることに気づくでしょう。 maptoolsパッケージ内のpointLabel()関数は、重複のないラベルの場所を探します。完璧ではありませんが、newデータフレーム内の位置を調整して(下記参照)、必要に応じて微調整を行うことができます。 (また、maptoolsをロードするときには、gpclibPermit()に関する注釈があります。制限付きのライセンスが心配な場合は、無視することができます)。下のスクリプトの最初の部分はBenのスクリプトです。

# load libraries 
library(FactoMineR) 
library(ggplot2) 
library(scales) 
library(grid) 
library(plyr) 
library(gridExtra) 
# 
# start with a clean slate 
# rm(list=ls(all=TRUE)) 
# 
# load example data 
data(decathlon) 
# 
# compute PCA 
res.pca <- PCA(decathlon, quanti.sup = 11:12, quali.sup=13, graph = FALSE) 
# 
# extract some parts for plotting 
PC1 <- res.pca$ind$coord[,1] 
PC2 <- res.pca$ind$coord[,2] 
labs <- rownames(res.pca$ind$coord) 
PCs <- data.frame(cbind(PC1,PC2)) 
rownames(PCs) <- labs 
# 

# Now, the code to produce Ben's first chart but with less overlap of the labels. 

library(maptools) 

PCs$label=rownames(PCs) 

# Base plot first for pointLabels() to get locations 
plot(PCs$PC1, PCs$PC2, pch = 20, col = "red") 
new = pointLabel(PCs$PC1, PCs$PC2, PCs$label, cex = .7) 
new = as.data.frame(new) 
new$label = PCs$label 

# Then plot using ggplot2 
(p = ggplot(data = PCs) + 
    geom_hline(yintercept = 0, linetype = 3, colour = "grey20") + 
    geom_vline(xintercept = 0, linetype = 3, colour = "grey20") + 
    geom_point(aes(PC1, PC2), shape = 20, col = "red") + 
    theme_bw()) 

(p = p + geom_text(data = new, aes(x, y, label = label), size = 3)) 

結果は:

enter image description here

+0

私のチャートのテキストはちょっと混乱しています。 'geom_text'のサイズを減らすことは少し助けになるかもしれません。 'pointLabel'関数を見せてくれてありがとう、私は今までそれを見ていませんでした! – Ben

1

代替心理パッケージからコアラ又はbiplot.psychからバイプロット関数を使用することです。これは、コンポーネントとデータを同じ図形に置きます。サイケパッケージから十種競技データセット、使用プリンシパルとバイプロットについては

library(FactoMineR) #needed to get the example data 
library(psych) #needed for principal 
data(decathlon) #the data set 
pc2 <- principal(decathlon[1:10],2) #just the first 10 columns 
biplot(pc2,labels = rownames(decathlon),cex=.5, main="Biplot of Decathlon results") 
#this is a call to biplot.psych which in turn calls biplot. 
#adjust the cex parameter to change the type size of the labels. 

これは次のようになります。

a biplot http://personality-project.org/r/images/olympic.biplot.pdf

ビルは