ggplotまたはellipseパッケージで95%CI楕円をプロットすると異なる結果が得られる


11

protoclust{protoclust}データの分類に使用される変数のペアごとにスキャッタープロットを作成し、クラスごとに色を付け、各クラスの95%信頼区間の楕円を重ねることで(で作成された)クラスタリングの結果を視覚化したいelipses-classesは、変数の各ペアの下で重複しています。

楕円の描画を2つの異なる方法で実装しましたが、結果の楕円が異なります!(最初の実装では楕円が大きくなります!)軸の中心と角度はどちらも似ているように見えるので、アプリオリはサイズが異なるだけです(多少のスケーリング?)。私はそれらの1つ(両方ではないことを願っています!)、または引数を使用して何か間違ったことをしているに違いないと思います。

誰かが私が間違っていることを教えてもらえますか?

ここに2つの実装のコードがあります。どちらも、データ楕円どのようにしてggplot2散布図に重ね合わせることができるかという答えに基づいています

### 1st implementation 
### using ellipse{ellipse}
library(ellipse)
library(ggplot2) 
library(RColorBrewer)
colorpal <- brewer.pal(10, "Paired")

x <- data$x
y <- data$y
group <- data$group
df <- data.frame(x=x, y=y, group=factor(group))

df_ell <- data.frame() 
for(g in levels(df$group)){df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y),scale=c(sd(x),sd(y)),centre=c(mean(x),mean(y))))),group=g))} 

p1 <- ggplot(data=df, aes(x=x, y=y,colour=group)) + geom_point() + 
  geom_path(data=df_ell, aes(x=x, y=y,colour=group))+scale_colour_manual(values=colorpal)

### 2nd implementation 
###using function ellipse_stat() 
###code by Josef Fruehwald available in: https://github.com/JoFrhwld/FAAV/blob/master/r/stat-ellipse.R

p2 <-qplot(data=df, x=x,y=y,colour=group)+stat_ellipse(level=0.95)+scale_colour_manual(values=colorpal)

これが2つのプロットをまとめたものです(左側のグラフはp1実装(ellipse())です):

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

データはこちらから入手できます:https : //www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt


これは問題にならないかもしれませんが、コードを実行すると警告Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failureが表示されますが、コードを実行すると警告 が発生しますか?
atiretoo-2012年

@atiretooはい、コードを実行したときにも発生します。理由はわかりません。多分誰かが知っていますか?ホセ
josetanago

回答:


9

あなたは何も間違っていない、2つの関数はデータの分布について異なる基本的な仮定を行っています。最初の実装は多変量正規分布を想定し、2番目の実装は多変量t分布を想定しています(パッケージMASSの?cov.trobを参照)。1つのグループを引き出すと、効果がわかりやすくなります。

#pull out group 1
pick = group ==1
p3 <- qplot(data=df[pick,], x=x, y=y)
tl = with(df[pick,], 
     ellipse(cor(x, y),scale=c(sd(x),sd(y)),
             centre=c(mean(x),mean(y))))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y))
p3 <- p3 + stat_ellipse(level=0.95)
p3 # looks off center
p3 <- p3 + geom_point(aes(x=mean(x),y=mean(y),size=2,color="red"))
p3

そのため、同じ中心と方向に近いものの、同じではありません。を使用cov.trob()してに渡すための相関とスケールを取得ellipse()し、t引数を使用してスケーリングをf分布と同じように設定すると、同じサイズの楕円に近づくことができますstat_ellipse()

tcv = cov.trob(data[pick,2:3],cor=TRUE)
tl = with(df[pick,], 
          ellipse(tcv$cor[2,1],scale=sqrt(diag(tcv$cov)),
                  t=qf(0.95,2,length(x)-1),
                  centre=tcv$center))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y,color="red"))
p3

しかし、対応はまだ正確ではありません。違いは、共分散行列のコレスキー分解を使用することと、相関と標準偏差からスケーリングを作成することの間に生じている必要があります。数学者だけでは違いがどこにあるのかを正確に理解できません。

どちらが正しいですか?それはあなた次第です!最初のstat_ellipse()実装はより保守的ですが、実装は周辺のポイントにあまり敏感ではありません。


1
この質問の解決にご協力いただき、誠にありがとうございます。今私にはそれは明らかです。ホセ
josetanago

1
プロットでは楕円が好きなので、これらの関数の動作を見るのは楽しいものでした。
atiretoo-モニカを復活させる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.