Когда я строю плотности с помощью 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)
Мы получаем ожидаемый график:
Теперь давайте попробуем смоделировать его и построить графикэмпирическое распределение:
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)
Мы получаем неправильный график:
Мы можем попытаться визуализировать фактическое распределение:
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)
И это выглядит правильно, вопреки графику плотности:
Кажется, проблема связана сядра, а geom_density
позволяет использовать разные ядра.Но они на самом деле не исправляют проблему предела.Например, приведенный выше код с triangular
выглядит примерно так же:
Вот идея того, что я ожидаю увидеть (конечно, я хочу плотность, а не гистограмму):
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)