> 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])
}