具有离散x轴的geom_density()分组图不平滑

时间:2018-06-06 17:07:10

标签: r ggplot2 kernel-density density-plot

我正在处理一个数据集,该数据集由两组不同的观察值组成,其中值为整数。我想绘制这些密度以了解不同组如何分布在值上。

发生了什么事情是一组具有'平滑'密度而另一组具有'波浪'密度。我知道这与带宽有关,而且我的数据基本上与离散观察有关,但如果有人可以解释原因,我会很高兴。

以下是一个例子:

data2 <- rbind(
    data.frame(group=rep('poisson1', 1000), value = rpois(1000, 5)),
    data.frame(group=rep('poisson2', 1000), value = rpois(1000, 45)))

library(ggplot2)
ggplot(data2, aes(x=value, fill=group)) +
  geom_density()

enter image description here

奇怪的是,我可以再次创建该数据帧以获取新样本,并且情节有时是平滑的: enter image description here

1 个答案:

答案 0 :(得分:1)

观察到的平滑度(或缺乏平滑度)是由rpois()函数“引起的”。 lambda函数中的rpois()参数必须是所需随机分布的非负均值。因此,当您传递接近零(lambda)的rpois(1000, 5)时,它将生成较少的唯一值(因为它以零为界)。

考虑这个例子:

nValue <- 1e3
nLambda <- c(1:9, seq(10, 100, 10))

foo <- lapply(nLambda, function(lambda) {
    data.frame(value = rpois(nValue, lambda), lambda)
})
data <- do.call(rbind, foo)
ggplot(data, aes(value, group = lambda, color = lambda)) +
    geom_density()

enter image description here

我们可以看到接近零的lambda会有峰值,而远离零会产生更平滑的线条。

您还可以通过调查每个lambda组中的差异来测试这一点:

ggplot(aggregate(data$value, list(data$lambda), var), aes(Group.1, x)) +
    geom_line() +
    geom_point() +
    labs(x = "Lambda",
         y = "Variance")

enter image description here