R语言 如何使用ggplot2绘制“困难”的概率分布

amrnrhlw  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(147)

背景

某些概率分布,如商分布(又名ratio distributions),其中一个特定的情况是Cauchy distribution,似乎很难可视化,因为它们的尾部很重。下面是ggplot2中的MRE:

require(ggplot2)
a <- rnorm(1e4, 2, 0.5)
b <- rnorm(1e4, 0.2, 0.1)
c <- a/b
ggplot() + geom_density(aes(c)) + coord_cartesian(xlim = c(-300, 500))

提问

我试着根据this S/O post的答案调整内核带宽,但似乎不起作用。我如何获得上述概率分布的平滑版本?当我尝试处理依赖关系时,例如ggridges::geom_density_ridges,显然会出现同样的问题。

w3nuxt5m

w3nuxt5m1#

问题是ggplot 2默认情况下会在x轴上创建512个点来计算内核密度。由于您的范围是数据范围的一小部分,因此只会显示其中一些被计算的点。我们可以通过添加一个点层来演示这一点:

library(ggplot2)
a <- rnorm(1e4, 2, 0.5)
b <- rnorm(1e4, 0.2, 0.1)
c <- a/b

ggplot() +
  geom_point(aes(c), stat = "density") +
  geom_density(aes(c)) +
  coord_cartesian(xlim = c(-300, 500))

值得注意的是,密度层并不知道坐标的限制。解决这个问题的一个方法是增加n参数的点数。

# Increase number of points over which to evaluate density
ggplot() + 
  geom_density(aes(c), n = 10000) + 
  coord_cartesian(xlim = c(-300, 500))

然而,这可能会效率低下,因为你没有使用所有这些点。相反,你可以设置比例的限制,密度层 * 会 * 知道。这将使你看到的范围更密集地填充点,从而提供更平滑的KDE。
这里有一个重要的细节,我们使用oob = scales::oob_keep作为越界处理器。这确保KDE计算考虑所有的点,而不仅仅是你的范围内的点。

# Limit range to populate with points over which to evaluate density
ggplot() + 
  geom_density(aes(c)) + 
  scale_x_continuous(limits = c(-300, 500), 
                     oob = scales::oob_keep) # Do not censor data

创建于2023-04-24带有reprex v2.0.2

相关问题