Каковы хорошие методы визуализации данных для сравнения распределений?

25

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

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

pedrosaurio
источник
6
Я думаю, что выбор также зависит от функций, которые вы хотите сравнить. Вы могли бы рассмотреть гистограммы, hist; сглаженные плотности, density; QQ-графики qqplot; стволовые и листовые участки (немного древние) stem. Кроме того, тест Колмогорова-Смирнова может быть хорошим дополнением ks.test.
1
Как насчет гистограммы, оценки плотности ядра или графика игры на скрипке?
Александр
Графики стволов и листьев похожи на гистограммы, но с добавленной функцией они позволяют вам определять точную ценность каждого наблюдения. Он содержит больше информации о данных, чем вы получаете из коробчатого графика или 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))

Надеюсь, это поможет.

user10525
источник
14

Изучив немного больше ваших предложений, я обнаружил, что этот вид сюжета дополняет ответ @Procastinator. Он называется «пчелиный рой» и представляет собой смесь прямоугольника с изображением скрипки с тем же уровнем детализации, что и точечная диаграмма.

Beeswarm R пакет

пример пчелиного заговора

pedrosaurio
источник
2
Я также включил beanplot.
7

Заметка:

Вы хотите отвечать на вопросы о своих данных, а не создавать вопросы о самом методе визуализации. Часто скучно лучше. Это облегчает понимание сравнений.

Ответ:

Необходимость простого форматирования помимо базового пакета R, вероятно, объясняет популярность пакета ggplot Хэдли в 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)
geneorama
источник
(+1) Хороший ответ. Я бы добавил alpha=0.5к первому графику (к geom_density()), чтобы перекрывающиеся части не были скрыты.
Смиллиг
Я согласен с альфа = .5 Я не мог вспомнить синтаксис!
Geneorama
7

Вот хороший урок из блога Flowing Data Натана Яу с использованием данных о преступности на уровне штатов и США. Это показывает:

  • Box-and-Whisker Plots (которые вы уже используете)
  • Гистограммы
  • Графики плотности ядра
  • Коврики
  • Сюжеты для скрипки
  • Bean Plots (странная комбинация коробчатого графика, графика плотности, с ковриком в середине).

В последнее время я обнаруживаю, что готовлю CDF гораздо больше, чем гистограммы.

Димитрий Васильевич Мастеров
источник
1
+1 для графиков плотности ядра. Они гораздо менее «заняты», чем гистограммы для построения нескольких популяций.
Doresoom
3

Специально для сравнения распределений существует концепция, которая должна быть лучше известна: относительное распределение.

Y0,YF0,FF0

рзнак равноF0(Y)
рYY0F0(Y0)

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

Относительное распределение длины телефонного звонка, мужчины по сравнению с женщинами

ИксT

Мы также можем сделать тот же график с точечными доверительными интервалами вокруг кривой относительной плотности:

график относительного распределения с точечным доверительным интервалом

Широкие доверительные полосы в этом случае отражают малый размер выборки.

Есть книга об этом методе: 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 (обобщенная перекрестная проверка).

Q0F0ррYр

г(р)знак равное(Q0(р))е0(Q0(р))
г(р)знак равное(Yр)е0(Yр)р(0,1)
kjetil b halvorsen
источник
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)

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

TrynnaDoStat
источник
Почему вы окрашиваете внутреннюю часть PDF (ниже кривой)?
волки
Я думаю, что это выглядит красивее.
TrynnaDoStat
Возможно - но это может передать неправильное впечатление - передачи массы или области, что может быть визуально неуместным.
волки
1
Он передает эмпирическую массу вероятности.
Лепидоптерист