2

我有一个以天为单位的年龄列表,我希望在密度图上以年为单位显示它们。

我做了这两种方法 - 将 x 轴上的标签更改为年,并将数据除以 365。这些方法给了我不同的密度估计:

df <- data.frame(id = 1:80000, age = rnorm(80000, 46, 5) * 365)

第一个图是使用以下方法生成的:

breaks <- seq(from = min(df$age), to = max(df$age), by = 10*365)
ggplot(data = df, aes(x = age)) + 
    geom_density(aes(y = ..density..)) + 
    scale_x_continuous(breaks= breaks, labels = floor(breaks/365))

在此处输入图像描述 y 轴上显示的密度范围为 0 到 0.0002

但是,当我这样做时(将年龄除以 365 得到年份 - 而不仅仅是像上面那样更改 x 标签):

ggplot(data = df, aes(x = age/365)) + 
    geom_density(aes(y = ..density..))

该图看起来相同,但密度范围从 0 到 0.08 我很难理解发生了什么 - 为什么两个图之间的密度不同?

在此处输入图像描述

4

2 回答 2

4

两个图中的密度不同,因为在一种情况下,水平单位的数量是 365 倍,因此考虑到概率密度函数(这些曲线下的区域),垂直单位需要是另一个图的 1/365必须总和为一。

这更容易根据箱而不是密度曲线来考虑。如果你用一个 bin 代替 365 个 bin,那么在一个 bin 中着陆的概率远高于在单个 bin 中着陆的平均概率。

对于您提供的具体示例数据,我们可以通过查看两个函数的峰值来了解垂直单位之间的转换:

> max(density(df$age)$y) # max of density in days, more horizontal units
[1] 0.0002178977
> df$ageinyears <- df$age/365 # create an age-in-years variable
> max(density(df$ageinyears)$y) # max density in years, fewer horizontals
[1] 0.07953267
> max(density(df$age)$y)*365 
[1] 0.07953267

这是绘图中的一个问题(可能是您问题的主要主旨)的实际原因是估计 ggplot 密度的函数是从父 aes() 继承 x 参数。所以它对您正在使用的自定义 x 轴一无所知。您可以明确告诉 geom_density 不要使用继承的 x 值,而不仅仅是更改第一个图中的 x 轴:

ggplot(data = df, aes(x = age)) + 
    geom_density(aes(x = age/365, y = ..density..))
于 2012-11-20T13:53:51.910 回答
2

最好的建议是忽略 y 轴上的刻度标签,它们对解释密度图毫无帮助,而且正如您所见,它们更容易混淆而不是帮助。

我的偏好是密度图、直方图和任何类似图的默认行为不标记 y 轴刻度线,因为它们通常没有任何意义,只会分散对图表重要部分的注意力,并经常导致混乱。即使将它们缩放到有意义的值,它们也对绘图的主要目的没有帮助,并且仍然会引起混乱(我更改了直方图中的 bin 数量,现在我的 y-tick 标签非常不同,恐慌!恐慌!)。不幸的是,在绘制它们时有很大的惯性,以至于我一个人不太可能改变这种情况。

于 2012-11-20T19:16:00.987 回答