使用 ggplot2 在 R 中绘制高斯混合图

Plot Gaussian Mixture in R using ggplot2

我正在用高斯混合近似分布,想知道是否有一种简单的方法可以自动将整个(一维)数据集的估计内核密度绘制为漂亮的组件密度之和像这样使用 ggplot2:

给定以下示例数据,我在 ggplot2 中的方法是手动将子集密度绘制成缩放的总密度,如下所示:

#example data
a<-rnorm(1000,0,1) #component 1
b<-rnorm(1000,5,2) #component 2
d<-c(a,b) #overall data 
df<-data.frame(d,id=rep(c(1,2),each=1000)) #add group id

##ggplot2
require(ggplot2)

ggplot(df) +
  geom_density(aes(x=d,y=..scaled..)) +
  geom_density(data=subset(df,id==1), aes(x=d), lty=2) +
  geom_density(data=subset(df,id==2), aes(x=d), lty=4)

请注意,这不适用于天平。当您缩放所有 3 个密度或根本没有密度时,它也不起作用。所以我无法复制上面的情节。

此外,我无法在不手动设置子集的情况下自动生成此图。我尝试在 geom_density.

中使用 position = "stacked" 作为参数

我通常每个数据集有大约 5-6 个组件,因此可以手动进行子集化。但是,我希望在 ggplot 的图例中显示每个组件密度的不同颜色或线型,因此手动执行所有子集会增加很多工作量。

有什么想法吗? 谢谢!

这是一个可能的解决方案,通过在一层中使用 position = "identity" 指定 aes 调用中的每个密度,在第二层中使用不带图例的堆叠密度。

ggplot(df) +
  stat_density(aes(x = d,  linetype = as.factor(id)), position = "stack", geom = "line", show.legend = F, color = "red") +
  stat_density(aes(x = d,  linetype = as.factor(id)), position = "identity", geom = "line")

请注意,当使用两个以上的组时:

  a <- rnorm(1000, 0, 1) 
  b <- rnorm(1000, 5, 2) 
  c <- rnorm(1000, 3, 2)
  d <- rnorm(1000, -2, 1)
  d <- c(a, b, c, d)
  df <- data.frame(d, id = as.factor(rep(c(1, 2, 3, 4), each = 1000))) 

出现每个堆栈的曲线(这是两组示例的问题,但第一层中的 linetype 伪装了它 - 使用 group 代替检查):

 gplot(df) +
    stat_density(aes(x = d, group = id), position = "stack", geom = "line", show.legend = F, color = "red") +
    stat_density(aes(x = d, linetype = id), position = "identity", geom = "line")

一个相对简单的解决方法是添加 alpha 映射并针对不需要的曲线手动将其设置为 0:

  ggplot(df) +
    stat_density(aes(x=d, alpha = id), position = "stack", geom = "line", show.legend = F, color = "red") +
    stat_density(aes(x=d,  linetype = id), position = "identity", geom = "line")+
    scale_alpha_manual(values = c(1,0,0,0))