Отримання різних результатів під час побудови 95% еліпсів CI за допомогою ggplot або пакета ellipse


11

Я хочу візуалізувати результати кластеризації (створені за допомогою protoclust{protoclust}), створюючи графіки скатера для кожної пари змінних, що використовуються для класифікації моїх даних, фарбування за класами та перекриття еліпсів для 95% довірчого інтервалу для кожного з класів (щоб перевірити, який Класи еліпсів перекриваються під кожною парою змінних).

Я реалізував малюнок еліпсів двома різними способами, і отримані еліпси відрізняються! (Більші еліпси для першої реалізації!) Апріорі вони відрізняються лише розмірами (деякі різні масштабування?), оскільки центри та кут осей здаються однаковими в обох. Я думаю, що я повинен робити щось не так, використовуючи один з них (сподіваюся, не з обома!) Або з аргументами.

Хтось може сказати мені, що я роблю неправильно?

Тут код для двох реалізацій; обидва базуються на відповідях на те, як еліпс даних може бути накладений на розсіювач 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)

Ось два сюжети разом (лівий графік - p1реалізація ( ellipse()):

введіть тут опис зображення

Дані доступні тут: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt


Це може не мати значення, але коли я запускаю ваш код, я отримую попередження Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failure, це також відбувається, коли ви запускаєте код?
atiretoo - відновити моніку

@atiretoo Так, це також трапляється, коли я запускаю код. Я не знаю чому. Може хтось ще знає? jose
josetanago

Відповіді:


9

Ви не робите нічого поганого, обидві функції роблять різні основні припущення щодо розподілу даних. Ваша перша реалізація передбачає багатоваріантне нормальне, а 2-е багатоваріантне t-розподіл (див.? Cov.trob в пакеті MASS). Ефект легше помітити, якщо витягнути одну групу:

#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
Дуже дякую, що витратили свій час на вирішення цього питання! Мені зрозуміло вже зараз. jose
josetanago

1
Мені подобаються еліпси в сюжетах, тому мені було цікаво бачити ці функції в дії.
atiretoo - відновити моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.