Я хочу визуализировать результаты кластеризации (созданные с помощью protoclust{protoclust}
), создавая диаграммы разброса для каждой пары переменных, используемых для классификации моих данных, раскраски по классам и перекрытия эллипсов для 95% доверительного интервала для каждого из классов (чтобы проверить, какие elipses-классы перекрываются под каждой парой переменных).
Я реализовал рисование эллипсов двумя разными способами, и в результате получились разные эллипсы! (Большие эллипсы для первой реализации!) Априори они отличаются только по размеру (какое-то разное масштабирование?), так как центры и угол осей кажутся одинаковыми в обоих случаях. Я думаю, что я должен делать что-то не так, используя один из них (надеюсь, не с обоими!) Или с аргументами.
Может кто-нибудь сказать мне, что я делаю не так?
Здесь код для двух реализаций; оба основаны на ответах на вопрос Как можно наложить эллипс данных на диаграмму рассеяния 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
, это также происходит, когда вы запускаете код?Ответы:
Вы не делаете ничего плохого, две функции делают разные базовые предположения о распределении данных. Ваша первая реализация предполагает многомерное нормальное, а вторая - многомерное t-распределение (см.? Cov.trob в пакете MASS). Эффект легче увидеть, если вы вытащите одну группу:
Так что, хотя он находится близко к одному центру и ориентации, они не одинаковы. Вы можете приблизиться к эллипсу того же размера, используя,
cov.trob()
чтобы получить корреляцию и масштаб для передачиellipse()
, и используя аргумент t, чтобы установить масштабирование, равное f-распределению, как этоstat_ellipse()
делает.но соответствие все еще не точно. Разница должна возникать между использованием разложения по Холески ковариационной матрицы и созданием масштабирования из корреляции и стандартных отклонений. Мне не хватает математика, чтобы понять, в чем именно разница.
Который правильный? Это решать вам!
stat_ellipse()
Реализация будет менее чувствительна к окрестным пунктов, в то время как первый будет более консервативным.источник