2

で PCA を作成してvegan{}おり、(のデフォルトのように一意の行 ID ではなく) 要因によってポイントにラベルを付けたいと考えていますbiplot.rda()。私の 2D PCA では、ここで Gavin Simpson が提案した方法を使用しました。カスタム ラベルの付いた PCA を作成するためのこの方法の 3D バージョンがあるかどうか、賢明な R コミュニティに尋ねたいと思います。2D PCA で機能する方法は次のとおりです。

#Relabel a la Gavin Simpson:
site.scr<-scores(dat.pca,display="sites",scaling=2,choices=c(1,2,3))
spp.scr<-scores(dat.pca,display="species",scaling=2,choices=c(1,2,3))

## generate x,y lims
xlims <- range(site.scr[,1], spp.scr[,1])
ylims <- range(site.scr[,2], spp.scr[,2])

## plot what you want, but leave out sites
biplot(dat.pca, display = "species", xlim = xlims, ylim = ylims)
points(site.scr[39:65,2:3],col="green",pch=1)   #These sites are in green
points(site.scr[1:38,2:3],col="brown",pch=3)        #These sites are in brown

私は自分のコンピューターの 1 つを使用してこれをordirgl()行いましたが、rgl でうまく動作しない R バージョン/OS の組み合わせがいくつかあるため (これは多くの人にとって問題のようです)、作成できるようにしたいと考えています。と の両方rgl()のプロットordiplot3d()

ordiplot3d(dat.pca, display = "species", scaling = 3)

これは、biplot.rda のベクトルではなく、3D 空間にポイントをプロットします (最初の問題 - rgl を使用するときにもこの問題が発生します - これらのポイントは、通常のbiplot.rda()PCA でプロットされるベクトルの端であると思います)。これは私にとってそれほど重要ではありませんが、これらのベクトルを ordirgl で描画してラベルを付ける方法を誰かが知っている場合は、知りたいです. より大きな問題は、作成した ordiplot3d にポイントを追加するのに苦労していることです。理想的には、これは次のようになりますpoints()。これはいくつかの異なる質問スレッドで見たことがありますが、rgl を必要としないエレガントなソリューションがあればいいのにと思います。

4

2 に答える 2

4

3Dバイプロットも作成できるpca3d( http://cran.r-project.org/web/packages/pca3d/index.html )という小さなパッケージを作成しました。サンプルと変数を個別にスケーリングするため、変数の負荷は直接比較できます。ただし、ベータ版ですのでご注意ください。

ここに画像の説明を入力してください

于 2013-03-22T11:55:22.067 に答える
3

最初に警告します。現時点では、3D バイプロット (パッケージ scatterplot3d ) を描画するために使用される基になるコードでは、すべて軸を同じようにスケーリングすることはできません。したがって、3 番目の次元は他の 2 つの次元と同じ単位でスケーリングできないため、バイプロットは正しくありません。Jari はscatterplot3dパッケージの管理者にこれを制御できるようにするパッチを提供しましたが、私たちはそれが受け入れられるのを待っています。

あなたが見逃しているのは、ordiplot3d()(の使用のためにscatterplot3d())既存の3D散布図にポイントなどを追加できる関数を含むオブジェクトを返すことです。

ここに例があります

## continue example from ?biplot.rda
require(vegan)
## produces 'mod' 
example(biplot.rda)
## why do we need this?
par(ask = FALSE)

## grab the scores on axes you require; mod == your fitted rda/pca 
site.scr <- scores(mod, display = "sites", scaling = 3, choices = 1:3) 
spp.scr <- scores(mod, display = "species", scaling = 3, choices = 1:3)

## do the 3d plot but suppress plotting of the species,
## though plot is scaled to accommodate them
ordi <- ordiplot3d(mod, display = "species", scaling = 3, type = "n")

オブジェクトを見てみましょう。ordiこれは複雑なオブジェクトであり、現在のプロットにポイントを追加できる関数を返します。

> str(ordi, max = 1)
List of 7
 $ xyz.convert   :function (x, y = NULL, z = NULL)  
 $ points3d      :function (x, y = NULL, z = NULL, type = "p", ...)  
 $ plane3d       :function (Intercept, x.coef = NULL, y.coef = NULL, lty = "dashed", lty.box = NULL, 
    ...)  
 $ box3d         :function (...)  
 $ origin        : num [1, 1:2] 1.67 1.33
 $ envfit.convert:function (object)  
 $ points        : num [1:30, 1:2] -0.146 2.776 1.291 3.102 2.816 ...
  ..- attr(*, "dimnames")=List of 2
 - attr(*, "class")= chr [1:2] "ordiplot3d" "ordiplot"

例として、最初の 10 種を色と aa 円でプロットし、次の 10 種を別の色とプロット文字などで、points3d()返されたを使用してプロットします。

cols <- bgs <- c("red","green","blue")
pchs <- 21:23
ordi$points3d(spp.scr[1:10,1], spp.scr[1:10,2], spp.scr[1:10,3],
              col = cols[1], bg = bgs[1], pch = pchs[1])
ordi$points3d(spp.scr[11:20,1], spp.scr[11:20,2], spp.scr[11:20,3],
              col = cols[2], bg = bgs[2], pch = pchs[1])
ordi$points3d(spp.scr[21:30,1], spp.scr[21:30,2], spp.scr[21:30,3],
              col = cols[3], bg = bgs[3], pch = pchs[3])

これは以下を生成します:

3D 散布図にポイントを追加する例

ただし、これは実際のバイプロットではないことに注意してください。3 番目の軸 (z) のスケーリングは、等しいスケーリングを行う機能が に追加されるまで間違っていscatterplot3d()ます。

于 2012-05-23T12:54:08.980 に答える