รับผลลัพธ์ที่แตกต่างเมื่อทำการพล็อตจุดไข่ปลา 95% ด้วย ggplot หรือแพ็คเกจวงรี


11

ฉันต้องการให้เห็นภาพผลลัพธ์ของการจัดกลุ่ม (สร้างด้วยprotoclust{protoclust}) โดยสร้างแผนการสแกลเลอร์สำหรับแต่ละคู่ของตัวแปรที่ใช้สำหรับการจำแนกข้อมูลของฉันการระบายสีตามคลาส คลาส elipses- ทับซ้อนกันภายใต้ตัวแปรแต่ละคู่)

ฉันใช้รูปวาดของวงรีในสองวิธีที่แตกต่างกันและรูปวงรีที่ได้นั้นแตกต่างกัน! (รูปวงรีที่ใหญ่กว่าสำหรับการใช้งานครั้งแรก!) นิรนัยที่มีขนาดแตกต่างกันเท่านั้น ฉันเดาว่าฉันต้องทำอะไรผิดโดยใช้หนึ่งในนั้น (หวังว่าจะไม่ใช้ทั้งคู่!) หรือด้วยข้อโต้แย้ง

มีใครบอกฉันได้ไหมว่าฉันทำอะไรผิด

นี่คือรหัสสำหรับการใช้งานทั้งสอง ทั้งสองขึ้นอยู่กับคำตอบของวิธีการที่วงรีข้อมูลสามารถวางทับบน scatterplot 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

คุณไม่ได้ทำอะไรผิดทั้งสองฟังก์ชั่นกำลังตั้งสมมติฐานที่แตกต่างกันเกี่ยวกับการกระจายของข้อมูล การใช้งานครั้งแรกของคุณคือการสมมติว่ามีหลายตัวแปรปกติและการแจกแจง 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()และการใช้เสื้อโต้แย้งในการตั้งค่าปรับเท่ากับ 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

แต่การติดต่อยังคงไม่แน่นอน ความแตกต่างจะต้องเกิดขึ้นระหว่างการใช้การสลายตัวแบบ cholesky ของเมทริกซ์ความแปรปรวนร่วมกับการสร้างสเกลจากความสัมพันธ์และส่วนเบี่ยงเบนมาตรฐาน ฉันยังไม่เพียงพอที่นักคณิตศาสตร์จะได้เห็นความแตกต่างอย่างชัดเจน

อันไหนที่ถูก? ขึ้นอยู่กับคุณที่จะตัดสินใจ! การstat_ellipse()ดำเนินการจะมีความไวน้อยกว่ากับจุดที่อยู่ห่างไกลในขณะที่สิ่งแรกจะอนุรักษ์นิยมมากกว่า


1
ขอบคุณมากที่สละเวลาแก้ไขคำถามนี้! ตอนนี้มันชัดเจนแล้วสำหรับฉัน jose
josetanago

1
ฉันชอบจุดไข่ปลาในแปลงดังนั้นมันสนุกที่ได้เห็นฟังก์ชั่นการทำงานเหล่านี้
atiretoo - คืนสถานะโมนิก้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.