ガワーの類似性が変更された図心の信頼区間


9

いくつかの多変量サンプル(堆積物コアからのコミュニティデータ)間のGowerの類似性に基づいて、重心の95%信頼区間を取得したいと考えています。私はこれまでvegan{}、R内のパッケージを使用して、コア間の変更されたGowerの類似性を取得しました(Anderson 2006に基づくvegdist()。誰かが、修正されたガワー類似度に基づいて、たとえばサンプリングサイトの重心の95%信頼区間を計算する方法を知っていますか?

さらに、可能であれば、重心を示すPCOでこれらの95%CIをプロットしたいので、それらが重なっているかどうかは明らかです。

変更されたガワーの類似性を取得するために、私は以下を使用しました:

dat.mgower <- vegdist(decostand(dat, "log"), "altGower")

しかし、私が知る限り、から重心は得られませんvegdist()。重心を取得し、次に95%のCIを取得してからプロットする必要があります。

アンダーソン、MJ、KEエリンセン、B​​Hマッカードル。2006.ベータ多様性の尺度としての多変量分散。Ecology Letters 9:683–693。


k次元のクラスターを表示している場合、重心はk次元ではありませんか?その場合、区間ではなく信頼領域を探す必要があります。クラスターセンターのような変数の信頼領域は、推定値の不確実性を構成するすべてのコンポーネントに依存します。それはかなり複雑になる可能性があり、信頼領域を生成することは単純な問題ではないと思います。それらを近似するシミュレーションはできませんか?
Michael R. Chernick

ありがとう、マイケル。はい、私は信頼領域を意味しました。これはk次元空間にあり、kはコミュニティで見つかった分類群の数です。計算する代わりにシミュレーションをするつもりですが、どうすればいいのかわかりません。おおよそのCIで十分です。
マーガレット

1
私が回答を書いている間に、議論があったようです。私たちが非類似度を計算するときにその情報を捨てたので、あなたが何を説明し、何を説明しているのかは、種の観点からわかりません。次に、いくつかの序数空間での重心を計算できます。この場合は、修正されたガワー非類似度のPCOです。これがあなたが望んでいたものと異なる場合は、私に知らせてください。k
Gavin Simpson

1
別のアプローチは、ブートストラップすることです。n個のk次元の点について、データセットからの置換でn回サンプリングすることにより、ブートストラップサンプルを生成します。クラスター化アルゴリズムを通じてブートストラップデータセットを実行します。これを何度も繰り返します。これにより、選択したクラスターと重心の分布が得られます。次に、各重心(ブートストラップサンプルから別のサンプルに一致させることができる場合)ごとに、各クラスターの重心の分布を取得し、それらからそれらのブートストラップ信頼領域を構築します。
Michael R.Chernick

1
@MichaelChernickグループ化が私の例のように演繹的に定義されている場合、それはそれほど問題ではないかもしれません。それは、マーガレットが引用した論文に記載されている種類のデータの典型です。
Gavin Simpson

回答:


5

求める重心はすぐにはわかりませんが、頭に浮かぶのは、グループごとの点の質量の中心にある多変量空間の点です。これについては、95%の信頼楕円が必要です。どちらの側面もveganordiellipse()関数を使用して計算できます。これは、Nature Management変数に基づいてグループの重心と信頼楕円を導出できるユークリッド空間に非類似性を埋め込む手段としてPCOを使用したものの変更例です。?ordiellipseManagement

require(vegan)
data(dune)
dij <- vegdist(decostand(dune, "log"), method = "altGower")
ord <- capscale(dij ~ 1) ## This does PCO

data(dune.env) ## load the environmental data

ここで、最初の2つのPCO軸を表示し、軸スコアの平均の標準誤差に基づいて95%の信頼楕円を追加します。標準誤差が必要なのでkind="se"conf引数を設定して使用し、必要な信頼区間を与えます。

plot(ord, display = "sites", type = "n")
stats <- with(dune.env,
              ordiellipse(ord, Management, kind="se", conf=0.95, 
                          lwd=2, draw = "polygon", col="skyblue",
                          border = "blue"))
points(ord)
ordipointlabel(ord, add = TRUE)

からの出力をキャプチャしていることに注意してくださいordiellipse()。これにより、重心と楕円の詳細を含むリストが、グループごとに1つのコンポーネントで返されます。centerこれらのそれぞれからコンポーネントを抽出して、図心を取得できます

> t(sapply(stats, `[[`, "center"))
         MDS1       MDS2
BF -1.2222687  0.1569338
HF -0.6222935 -0.1839497
NM  0.8848758  1.2061265
SF  0.2448365 -1.1313020

図心は2次元の解のためだけのものであることに注意してください。より一般的なオプションは、重心を自分で計算することです。重心は、変数の個々の平均、またはこの場合はPCO軸です。非類似度を扱うときは、それらを順序空間に埋め込んで、平均を計算できる軸(変数)を用意する必要があります。ここで、軸スコアは列にあり、サイトは行にあります。グループの重心は、グループの列平均のベクトルです。データを分割する方法はいくつかありますが、ここaggregate()では、最初の2つのPCO軸のスコアをグループに分割し、Managementそれらの平均に基づいて計算します

scrs <- scores(ord, display = "sites")
cent <- aggregate(scrs ~ Management, data = dune.env, FUN = mean)
names(cent)[-1] <- colnames(scrs)

これは与える:

> cent
  Management       MDS1       MDS2
1         BF -1.2222687  0.1569338
2         HF -0.6222935 -0.1839497
3         NM  0.8848758  1.2061265
4         SF  0.2448365 -1.1313020

これは、stats上記で抽出されたに格納された値と同じです。このaggregate()アプローチは、任意の数の軸に一般化されます。例:

> scrs2 <- scores(ord, choices = 1:4, display = "sites")
> cent2 <- aggregate(scrs2 ~ Management, data = dune.env, FUN = mean)
> names(cent2)[-1] <- colnames(scrs2)
> cent2
  Management       MDS1       MDS2       MDS3       MDS4
1         BF -1.2222687  0.1569338 -0.5300011 -0.1063031
2         HF -0.6222935 -0.1839497  0.3252891  1.1354676
3         NM  0.8848758  1.2061265 -0.1986570 -0.4012043
4         SF  0.2448365 -1.1313020  0.1925833 -0.4918671

明らかに、最初の2つのPCO軸の重心は、追加の軸を要求しても変化しません。そのため、一度にすべての軸の重心を計算し、必要な次元を使用できます。

上記のプロットに重心を追加することができます

points(cent[, -1], pch = 22, col = "darkred", bg = "darkred", cex = 1.1)

結果のプロットは次のようになります

ordiellipseの使用

最後に、veganには、Martiの論文/ソフトウェアと非常によく似た方法で、多変量​​データの平均と分散の違いを調べるように設計されたadonis()およびbetadisper()関数が含まれています。betadisper()引用した論文の内容と密接に関連しており、重心を返すこともできます。


1
?ordiellipse特に信頼区間の計算で、ここで行われていることの詳細についてはヘルプを読んでください。理論がデータと一致するかどうかは、「理論」に頼るのではなく、シミュレーションやリサンプリングなどで調べたいと思うかもしれません。
Gavin Simpson

1
コメントと回答の最後の段落に加えて、adonis()1変量のケースでANOVAを使用する場合があるので、グループの類似の平均(重心)をテストするために使用できます。順列検定を使用して、データが重心の差がないという帰無仮説と一致するかどうかを判断します。重心の違いは、異なるグループ分散(分散)によって引き起こされる可能性があることにも注意してください。betadisper()これが当てはまるかどうかをテストするのに役立ちます。ここでも、サンプルポイントとそれらの重心との平均距離の順列ベースのテストを使用します。
Gavin Simpson

@ Gavin--ありがとう。私は(と同じタスクを実行PRIMERでPERMANOVAとPERMDISPを使用して重心間の差を測定するためのテストを行っているadonis()betadisp()私は信じている、)、私はデータを表示するための良い方法を探していました。繰り返し測定の設計のためにサイトxシーズンの相互作用があるので、どのサイトが季節効果を示したかを簡単に示すことができるようにしたいと考えました。これらの楕円は私が探しているものだと思います。この例は非常に役に立ちました。
マーガレット

また、はい-各グループの多変量重心は、CIを計算しようとした重心のタイプです。
マーガレット

もう1つ-要素に応じて異なる色で楕円を塗りつぶしたい場合ordiellipse()、forループを埋め込まずにそれを行う方法はありますか?私のデータには季節と場所の両方があり、それらを色分けして、1つのプロットで異なる場所を、別のプロットで季節を示したいと思いました。何らかの理由で、col = c(1,2,1,2)などを使用しても機能せず、col = as.numeric(cent ["Site_TP"])も機能しません。これを行うエレガントな方法はありますか?
マーガレット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.