Как сделать так, чтобы на графике плотности правильно отображалась область вблизи границ? - PullRequest
2 голосов
/ 25 марта 2019

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

Как правильно построить плотности вокруг пределов с помощью ggplot?


В качестве примера, давайте построим распределение хи-квадрат с 2 степенями свободы.Используя встроенные плотности вероятностей:

library(ggplot2)

u = seq(0, 2, by=0.01)
v = dchisq(u, df=2)

df = data.frame(x=u, p=v)

p = ggplot(df) +
    geom_line(aes(x=x, y=p), size=1) +
    theme_classic() +
    coord_cartesian(xlim=c(0, 2), ylim=c(0, 0.5))

show(p)

Мы получаем ожидаемый график:

enter image description here

Теперь давайте попробуем смоделировать его и построить графикэмпирическое распределение:

library(ggplot2)

u = rchisq(10000, df=2)

df = data.frame(x=u)

p = ggplot(df) +
    geom_density(aes(x=x)) +
    theme_classic() +
    coord_cartesian(xlim=c(0, 2))

show(p)

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

enter image description here

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

library(ggplot2, dplyr, tidyr)

u = rchisq(10000, df=2)

df = data.frame(x=u)

p = ggplot(df) +
    geom_point(aes(x=x, y=0.5), position=position_jitter(height=0.2), shape='.', alpha=1) +
    theme_classic() +
    coord_cartesian(xlim=c(0, 2), ylim=c(0, 1))

show(p)

И это выглядит правильно, вопреки графику плотности:

enter image description here

Кажется, проблема связана сядра, а geom_density позволяет использовать разные ядра.Но они на самом деле не исправляют проблему предела.Например, приведенный выше код с triangular выглядит примерно так же:

enter image description here

Вот идея того, что я ожидаю увидеть (конечно, я хочу плотность, а не гистограмму):

library(ggplot2)

u = rchisq(10000, df=2)

df = data.frame(x=u)

p = ggplot(df) +
    geom_histogram(aes(x=x), center=0.1, binwidth=0.2, fill='white', color='black') +
    theme_classic() +
    coord_cartesian(xlim=c(0, 2))

show(p)

enter image description here

1 Ответ

1 голос
/ 25 марта 2019

Обычные методы плотности ядра имеют проблемы, когда есть ограничение, такое как в этом случае для плотности с поддержкой только выше нуля. Обычной рекомендацией для обработки этого было использование пакета logspline:

install.packages("logspline")
library(logspline)
png(); fit <- logspline(rchisq(10000, 3))       
plot(fit) ; dev.off()

enter image description here

Если это необходимо сделать в среде ggplot2, есть функция dlogspline:

densdf <- data.frame( y=dlogspline(seq(0,12,length=1000), fit), 
                      x=seq(0,12,length=1000))

ggplot(densdf, aes(y=y,x=x))+geom_line()

Возможно, вы настаивали на одном с двумя степенями свободы?

enter image description here

...