> pet<-read.table("petunia.csv",sep=",",header=T) > res<-prcomp(pet[,3:25],scale.=T) # pl, spを除く全データを使う。 > summary(res) # 固有値、寄与率、累積寄与率の表示 Importance of components: PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 PC14 Standard deviation 3.3646 1.49100 1.35508 1.23312 1.07091 0.98562 0.94125 0.75862 0.69786 0.62428 0.58708 0.53921 0.51377 0.49051 Proportion of Variance 0.4922 0.09666 0.07984 0.06611 0.04986 0.04224 0.03852 0.02502 0.02117 0.01694 0.01499 0.01264 0.01148 0.01046 Cumulative Proportion 0.4922 0.58886 0.66869 0.73481 0.78467 0.82691 0.86542 0.89045 0.91162 0.92857 0.94355 0.95619 0.96767 0.97813 PC15 PC16 PC17 PC18 PC19 PC20 PC21 PC22 PC23 Standard deviation 0.44034 0.35269 0.2876 0.22273 0.1797 0.11493 0.06514 0.04459 0.02665 Proportion of Variance 0.00843 0.00541 0.0036 0.00216 0.0014 0.00057 0.00018 0.00009 0.00003 Cumulative Proportion 0.98656 0.99197 0.9956 0.99772 0.9991 0.99970 0.99988 0.99997 1.00000 > res$rotation[,1:4] # 因子負荷量を第4主成分まで表示 PC1 PC2 PC3 PC4 X1 -0.232902265 -0.007737726 -0.11926598 0.084209120 X3 -0.125560614 -0.038512370 -0.43077888 -0.075944713 X4 -0.073251021 -0.228037568 -0.50934208 -0.027266084 X5 -0.283243440 0.115905707 0.01346202 -0.013690070 X6 -0.280968230 0.129511194 0.07787914 -0.016946203 X7 -0.262326416 0.135132295 0.13562767 -0.026904644 X8 -0.279998306 0.128339399 0.03669440 -0.012244306 X9 -0.275328334 0.082197053 0.02629658 -0.044473096 X10 -0.234093251 -0.138156813 -0.15981333 0.217121593 X11 -0.165980897 0.248784151 0.20097755 -0.272031591 X12 -0.138290237 -0.024120199 -0.23978806 0.293020160 X14 -0.175804168 -0.101687140 0.16463744 -0.145212460 X16 -0.197096009 -0.185338117 -0.14846991 0.071400841 X17 -0.206668986 -0.150850302 -0.07571860 0.177249191 X19 -0.251178368 0.213004676 0.14398787 -0.047846778 X21 -0.272395960 0.004539319 -0.05266473 0.023877109 X24 -0.268917541 0.006342497 0.02638788 -0.004010512 X25 -0.259344731 -0.041710520 -0.07050005 0.060615579 X29 0.004998925 -0.041842991 -0.24654798 -0.629364943 X30 -0.053711753 -0.585100094 0.22898313 -0.034536584 X31 -0.061202688 -0.536945309 0.28471550 -0.005553255 X33 -0.193511651 -0.142001416 0.31716958 -0.050094976 X34 -0.086758434 -0.161283144 -0.10831709 -0.558643570
二次元散布図を描く
> my_pch<-c(16,17) > plot(res$x[,1:2],pch=my_pch[pet$sp]) > abline(h=0,v=0) # x=0, y=0に線を引く
三次元散布図を描き、ファイルに保存する
> library(rgl) > my_colors<-c("red", "blue") > rgl.spheres(res$x[,1:3],radius=0.1,col=my_colors[pet$sp]) # 第1、2、4主成分を使う場合などは、座標はres$x[,c(1,2,4)]と指定する。 > rgl.lines(c(-6,6),0,0,col="cyan") > rgl.lines(0,c(-6,6),0,col="yellow") > rgl.lines(0,0,c(-6,6),col="white") > rgl.texts(c(6,0,0), c(0,6,0) c(0,0,6),text=c("PC1", "PC2", "PC3"),col="white") > rgl.snapshot("3d_scatter.png")
最後の軸を描く部分は関数にしておくと汎用性がある。次のファイルをダウンロードし、「ファイル」メニューの「ソースを読み込む...」
からそのファイルを選択するか、source関数を使って読み込む。
draw_axis.R
使う時は
> source("draw_axis.R") # またはメニューの「ソースを読み込む」から
> draw.axis(2) # -2から2の3本の軸を描き、デフォルトの軸ラベルx, y, zを書く。
> draw.axis(6,c("PC1","PC2","PC3"))
などとする。
# draw_axis.R
draw.axis <- function( x,labels=c("x","y","z"),colors=c("cyan","yellow","white","white") ) {
rgl.texts(c(x,0,0),c(0,x,0),c(0,0,x),text=labels,col=colors[4])
rgl.lines(c(-x,x),0,0,col=colors[1])
rgl.lines(0,c(-x,x),0,col=colors[2])
rgl.lines(0,0,c(-x,x),col=colors[3])
}