R 如何使密度图正确显示边界附近的区域?

R 如何使密度图正确显示边界附近的区域?,r,ggplot2,kernel-density,R,Ggplot2,Kernel Density,当我用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(ae

当我用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)
我们得到了一个错误的图:

我们可以尝试将实际分布可视化:

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
确实允许使用不同的内核。但他们并没有真正纠正极限问题。例如,上面带有
三角形的代码看起来大致相同:

以下是我希望看到的内容(当然,我想要的是密度,而不是直方图):


当存在约束时,通常的内核密度方法会遇到问题,例如在本例中,对于仅支持高于零的密度。处理此问题的通常建议是使用logspline包:

install.packages("logspline")
library(logspline)
png(); fit <- logspline(rchisq(10000, 3))       
plot(fit) ; dev.off()
install.packages(“logspline”)
库(对数样条曲线)

png();fit我对您使用的
geom_Violent
感到有点困惑-它通常用于使用箱线图的地方,例如显示多个离散类别的分布。当我运行代码时,我也会得到一些与你发布的图像不同的东西。@Marius我只是错误地粘贴了错误的代码,伙计。不需要统计课。这看起来比我问题中的密度图更不准确。我画了一个三自由度的分布。你用2画了一个。