Які хороші методи візуалізації даних для порівняння розподілів?


25

Я пишу кандидатську дисертацію і зрозумів, що надмірно покладаюся на графіки, щоб порівняти розподіли. Які ще альтернативи вам подобаються для досягнення цього завдання?

Я також хотів би запитати, чи знаєте ви будь-який інший ресурс, як галерея R, в якій я можу надихнути себе різними ідеями щодо візуалізації даних.


6
Я думаю, що вибір також залежить від особливостей, які ви хочете порівняти. Ви можете розглянути гістограми hist; згладжена щільність density,; QQ-сюжети qqplot; стеблосто-листяні ділянки (трохи старовинні) stem. Крім того, тест Колмогорова-Смірнова може бути хорошим доповненням ks.test.

1
Як щодо гістограми, оцінки щільності ядра чи графіку скрипки?
Олександр

Ділянки стебла та листя схожі на гістограми, але з додатковою особливістю, що вони дозволяють визначити точне значення кожного спостереження. Він містить більше інформації про дані, ніж ви отримуєте з гістограми box або q.
Майкл Р. Черник

2
@Procrastinator, який має гарну відповідь, якби ви хотіли це трохи розробити, ви могли б перетворити це у відповідь. Педро, вас також може зацікавити це , що охоплює початкове дослідження графічних даних. Ви не точно шукаєте, але, тим не менш, може вас зацікавити.
gung - Відновіть Моніку

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. Він називається "бджолиний рій" і являє собою суміш бокс-сюжету зі скрипковою сюжетом з таким же рівнем деталей, що і розкидний сюжет.

бджолиний пакет R

приклад сюжету бджолиного тепла


2
Я також включив beanplot.

7

Нотатка:

Ви хочете відповідати на запитання щодо своїх даних, а не створювати запитання щодо самого методу візуалізації. Часто нудно краще. Це також робить порівняння порівнянь простішим для розуміння.

Відповідь:

Необхідність простого форматування за межами базового пакету R, ймовірно, пояснює популярність пакету ggplot Hadley у Р.

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", який можна викликати панеллю

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

Я згоден з приводу альфа = .5 Я не міг запам'ятати синтаксис!
генеорама

7

Ось приємний підручник із блогу Натау Яу із ​​потоковими даними з використанням даних про злочини на рівні R та США. Це показує:

  • Сюжети Box-and-Whisker (які ви вже використовуєте)
  • Гістограми
  • Діаграма щільності ядра
  • Килимові сюжети
  • Скрипкові сюжети
  • Бін Сюжети (дивна комбінація коробчастої ділянки, густота ділянки, з килимком посередині).

Останнім часом я вважаю, що будують CDF набагато більше, ніж гістограми.


1
+1 для графіків щільності ядра. Вони набагато менш "зайняті", ніж гістограми для побудови кількох груп населення.
Doresoom

3

Існує концепція, спеціально для порівняння розподілів, яка повинна бути краще відома: відносний розподіл.

Y0,YЖ0,ЖЖ0

R=Ж0(Y)
RYY0Ж0(Y0) завжди має рівномірний розподіл (з безперервними випадковими змінними, якщо випадкові величини дискретні, це буде приблизним).

Розглянемо приклад. На веб-сайті http://www.math.hope.edu/swanson/data/cellphone.txt наведено дані про тривалість останнього телефонного дзвінка студентів та жінок. Висловимо розподіл довжини телефонних дзвінків для студентів-чоловіків, серед жінок - студентів.

Відносний розподіл тривалості телефонних дзвінків у чоловіків порівняно з жінками

хТ (що б воно не було, його значення не показано) таким, що на 20% жіночих дзвінків було коротше (або рівне) до цього відносна щільність для чоловіків у цьому інтервалі коливається приблизно від 1,3 до 1,4. Якщо ми зблизимо (подумки з графіку) середню відносну щільність у цьому інтервалі як 1,35, ми побачимо, що частка чоловіків у цьому інтервалі приблизно на 35% більша, ніж частка жінок. Це відповідає 27% чоловіків у цей інтервал.

Ми також можемо зробити той же графік з точковими інтервалами довіри навколо кривої відносної щільності:

графік відносного розподілу з точковим довірчим інтервалом

Широкі діапазони довіри в цьому випадку відображають невеликий розмір вибірки.

Існує книга про цей метод: 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 (узагальнена перехресна перевірка).

Q0Ж0rRуr

г(r)=f(Q0(r))f0(Q0(r))
або за вихідною шкалою вимірювання як г(r)=f(уr)f0(уr). Це показує, що відносну щільність можна інтерпретувати як відношення щільності. Але, у першій формі, з аргументом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 (нижче кривої)?
вовчі

Я думаю, що це виглядає красивіше.
TrynnaDoStat

Можливо - але це може скласти неправильне враження - про передачу маси чи площі, що може бути візуально недоречним.
вовчі

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