เทคนิคการสร้างภาพข้อมูลที่ดีในการเปรียบเทียบการกระจายคืออะไร


25

ฉันกำลังเขียนวิทยานิพนธ์ระดับปริญญาเอกของฉันและฉันก็รู้ว่าฉันอาศัยอยู่มากเกินไปในกล่องแปลงเพื่อเปรียบเทียบการแจกแจง คุณมีทางเลือกอื่นใดในการทำภารกิจนี้ให้สำเร็จ

ฉันต้องการถามว่าคุณรู้จักแหล่งข้อมูลอื่น ๆ ในฐานะแกลเลอรี R หรือไม่ซึ่งฉันสามารถสร้างแรงบันดาลใจให้ตัวเองด้วยแนวคิดที่แตกต่างกันในการสร้างภาพข้อมูล


6
ฉันคิดว่าตัวเลือกยังขึ้นอยู่กับคุณสมบัติที่คุณต้องการเปรียบเทียบ คุณอาจพิจารณาฮิสโทแกรมhist; ความหนาแน่นเรียบ, density; QQ-แปลงqqplot; แปลงลำต้นและใบ stem(บิตโบราณ) นอกจากนี้การทดสอบ Kolmogorov-Smirnov ks.testอาจจะมีส่วนประกอบที่ดี

1
ฮิสโตแกรมประมาณค่าความหนาแน่นของเมล็ดหรือพล็อตไวโอลิน
Alexander

ต้นกำเนิดและพล็อตใบไม้เป็นเหมือนฮิสโทแกรม แต่ด้วยคุณสมบัติเพิ่มเติมที่ช่วยให้คุณสามารถกำหนดมูลค่าที่แน่นอนของการสังเกตแต่ละครั้ง มันมีข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลมากกว่าที่คุณได้รับจาก boxplot หรือฮิสโตแกรม q
Michael R. Chernick

2
@Procrastinator ที่มีคำตอบที่ดีถ้าคุณต้องการที่จะอธิบายรายละเอียดเล็กน้อยคุณสามารถเปลี่ยนมันเป็นคำตอบ เปโดรคุณอาจสนใจสิ่งนี้ซึ่งครอบคลุมการสำรวจข้อมูลกราฟิกเริ่มต้น มันไม่ใช่สิ่งที่คุณต้องการ แต่อาจเป็นที่สนใจของคุณ
gung - Reinstate Monica

1
ขอบคุณพวกฉันตระหนักถึงตัวเลือกเหล่านั้นและได้ใช้บางส่วนแล้ว ฉันไม่ได้สำรวจแปลงใบไม้อย่างแน่นอน ฉันจะมองลึกลงไปในลิงค์ที่คุณให้ไว้และในคำตอบของ
@Procastinator

คำตอบ:


24

ฉันจะอธิบายความคิดเห็นของฉันตามที่ @gung แนะนำ ฉันจะรวมพล็อตไวโอลินที่แนะนำโดย @Alexander เพื่อความสมบูรณ์ เครื่องมือเหล่านี้บางอย่างสามารถใช้สำหรับการเปรียบเทียบตัวอย่างมากกว่าสองตัวอย่าง

# Required packages

library(sn)
library(aplpack)
library(vioplot)
library(moments)
library(beanplot)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)

# Separated histograms
hist(x)
hist(y)

# Combined histograms
hist(x, xlim=c(-4,4),ylim=c(0,1), col="red",probability=T)
hist(y, add=T, col="blue",probability=T)

# Boxplots
boxplot(x,y)

# Separated smoothed densities
plot(density(x))
plot(density(y))

# Combined smoothed densities
plot(density(x),type="l",col="red",ylim=c(0,1),xlim=c(-4,4))
points(density(y),type="l",col="blue")

# Stem-and-leaf plots
stem(x)
stem(y)

# Back-to-back stem-and-leaf plots
stem.leaf.backback(x,y)

# Violin plot (suggested by Alexander)
vioplot(x,y)

# QQ-plot
qqplot(x,y,xlim=c(-4,4),ylim=c(-4,4))
qqline(x,y,col="red")

# Kolmogorov-Smirnov test
ks.test(x,y)

# six-numbers summary
summary(x)
summary(y)

# moment-based summary
c(mean(x),var(x),skewness(x),kurtosis(x))
c(mean(y),var(y),skewness(y),kurtosis(y))

# Empirical ROC curve
xx = c(-Inf, sort(unique(c(x,y))), Inf)
sens = sapply(xx, function(t){mean(x >= t)})
spec = sapply(xx, function(t){mean(y < t)})

plot(0, 0, xlim = c(0, 1), ylim = c(0, 1), type = 'l')
segments(0, 0, 1, 1, col = 1)
lines(1 - spec, sens, type = 'l', col = 2, lwd = 1)

# Beanplots
beanplot(x,y)

# Empirical CDF
plot(ecdf(x))
lines(ecdf(y))

ฉันหวังว่านี่จะช่วยได้.


14

หลังจากสำรวจข้อเสนอแนะของคุณอีกเล็กน้อยฉันพบพล็อตแบบนี้เพื่อเติมเต็มคำตอบของ @Procastinator มันถูกเรียกว่า'ฝูงผึ้ง'และเป็นส่วนผสมของพล็อตกล่องที่มีพล็อตไวโอลินที่มีระดับรายละเอียดเช่นเดียวกับพล็อตกระจาย

beeswarm R แพ็คเกจ

ตัวอย่างของพล็อตขี้ผึ้ง


2
beanplotผมได้รวมยัง

7

หมายเหตุ:

คุณต้องการตอบคำถามเกี่ยวกับข้อมูลของคุณและไม่สร้างคำถามเกี่ยวกับวิธีการสร้างภาพข้อมูล บ่อยครั้งที่การเบื่อดีกว่า มันทำให้การเปรียบเทียบการเปรียบเทียบง่ายกว่าที่จะเข้าใจเช่นกัน

คำตอบ:

ความต้องการในการฟอร์แมตแบบง่าย ๆ นอกเหนือจากแพ็คเกจพื้นฐานของ R อาจอธิบายถึงความนิยมของแพ็คเกจ ggplot ของ Hadley ใน R

library(sn)
library(ggplot2)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)


##============================================================================
## I put the data into a data frame for ease of use
##============================================================================

dat = data.frame(x,y=y[1:250]) ## y[1:250] is used to remove attributes of y
str(dat)
dat = stack(dat)
str(dat)

##============================================================================
## Density plots with ggplot2
##============================================================================
ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        opts(title = "Some Example Densities") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Densities \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Densities \n This time without \"scaled\" ") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

##----------------------------------------------------------------------------
## You can do histograms in ggplot2 as well...
## but I don't think that you can get all the good stats 
## in a table, as with hist
## e.g. stats = hist(x)
##----------------------------------------------------------------------------
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=.1) +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Histograms \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

## Note, I put in code to mimic the default "30 bins" setting
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=diff(range(dat$values))/30) +
        opts(title = "Some Example Histograms") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ในที่สุดฉันก็พบว่าการเพิ่มพื้นหลังง่าย ๆ ช่วย นี่คือเหตุผลที่ฉันเขียน "bgfun" ซึ่งสามารถเรียกโดย panel.first

bgfun = function (color="honeydew2", linecolor="grey45", addgridlines=TRUE) {
    tmp = par("usr")
    rect(tmp[1], tmp[3], tmp[2], tmp[4], col = color)
    if (addgridlines) {
        ylimits = par()$usr[c(3, 4)]
        abline(h = pretty(ylimits, 10), lty = 2, col = linecolor)
    }
}
plot(rnorm(100), panel.first=bgfun())

## Plot with original example data
op = par(mfcol=c(2,1))
hist(x, panel.first=bgfun(), col='antiquewhite1', main='Bases belonging to us')
hist(y, panel.first=bgfun(color='darkolivegreen2'), 
    col='antiquewhite2', main='Bases not belonging to us')
mtext( 'all your base are belong to us', 1, 4)
par(op)

(+1) คำตอบที่ดี ฉันจะเพิ่มลงalpha=0.5ในพล็อตแรก (ไปgeom_density()) ดังนั้นส่วนที่ทับซ้อนกันจะไม่ถูกซ่อน
smillig

ฉันเห็นด้วยกับ alpha = .5 ฉันจำไวยากรณ์ไม่ได้!
genorama

7

นี่คือบทช่วยสอนที่ดีจากบล็อกข้อมูลการไหลของนาธานเหยาโดยใช้ข้อมูลอาชญากรรมระดับ R และสหรัฐอเมริกา มันแสดงให้เห็น:

  • แปลง Box-and-Whisker (ซึ่งคุณใช้อยู่แล้ว)
  • histograms
  • แปลงความหนาแน่นของเคอร์เนล
  • แปลงพรม
  • แปลงไวโอลิน
  • Bean Plots (คอมโบแปลก ๆ ของพล็อตกล่อง, พล็อตความหนาแน่น, มีพรมอยู่ตรงกลาง)

เมื่อเร็ว ๆ นี้ฉันพบว่าตัวเองกำลังวางแผน CDFs มากกว่าฮิสโตแกรม


1
+1 สำหรับพล็อตความหนาแน่นเคอร์เนล พวกมัน 'ยุ่ง' น้อยกว่าฮิสโทแกรมสำหรับการวางแผนประชากรหลาย ๆ อย่าง
Doresoom

3

มีแนวคิดโดยเฉพาะสำหรับการเปรียบเทียบการแจกแจงซึ่งควรจะเป็นที่รู้จักกันดีคือการกระจายสัมพัทธ์

Y0,YF0,FF0

R=F0(Y)
RYY0F0(Y0)

ให้เราดูตัวอย่าง เว็บไซต์http://www.math.hope.edu/swanson/data/cellphone.txt ให้ข้อมูลเกี่ยวกับความยาวของการโทรครั้งสุดท้ายของนักเรียนชายและหญิง ให้เราแสดงการแจกแจงความยาวสายโทรศัพท์สำหรับนักเรียนชายโดยมีนักเรียนผู้หญิงเป็นตัวอ้างอิง

การกระจายความสัมพันธ์ของความยาวสายโทรศัพท์ผู้ชายเทียบกับผู้หญิง

xT

เราสามารถสร้างพล็อตเดียวกันโดยมีช่วงความเชื่อมั่นแบบเป็นจุดรอบเส้นโค้งความหนาแน่นสัมพัทธ์

เนื้อเรื่องของการแจกแจงแบบสัมพัทธ์กับช่วงความเชื่อมั่นแบบจุด

แถบความเชื่อมั่นที่กว้างในกรณีนี้สะท้อนให้เห็นถึงตัวอย่างขนาดเล็ก

มีหนังสือเกี่ยวกับวิธีนี้: Handcock

รหัส R สำหรับพล็อตอยู่ที่นี่:

phone <-  read.table(file="phone.txt", header=TRUE)
library(reldist)
men  <-  phone[, 1]
women <-  phone[, 3]
reldist(men, women)
title("length of mens last phonecall with women as reference")

สำหรับพล็อตสุดท้ายเปลี่ยนเป็น:

reldist(men, women, ci=TRUE)
title("length of mens last phonecall with women as reference\nwith pointwise confidence interval (95%)")

โปรดทราบว่าพล็อตถูกสร้างขึ้นด้วยการใช้การประมาณความหนาแน่นของเคอร์เนลโดยมีระดับความนุ่มนวลที่เลือกผ่าน gcv (การตรวจสอบความถูกต้องไขว้ทั่วไป)

Q0F0rRyr

g(r)=f(Q0(r))f0(Q0(r))
g(r)=f(yr)f0(yr)r(0,1)

1

ฉันชอบที่จะประเมินความหนาแน่นและวางแผนมัน

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

library(ggplot2)
ggplot(data = iris) + geom_density(aes(x = Sepal.Length, color = Species, fill = Species), alpha = .2)

ป้อนคำอธิบายรูปภาพที่นี่


ทำไมคุณถึงระบายสีด้านในของ pdf (ใต้เส้นโค้ง)
wolfies

ฉันคิดว่ามันดูดีกว่า
TrynnaDoStat

บางที - แต่มันสามารถสื่อถึงความประทับใจที่ไม่ถูกต้อง - ในการสื่อมวลหรือพื้นที่ซึ่งอาจไม่เหมาะสมทางสายตา
wolfies

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