【问题标题】:R ggplot2::geom_density with a constant variableR ggplot2::geom_density 带有一个常量变量
【发布时间】:2016-04-27 10:17:11
【问题描述】:

我最近遇到了一个我无法解决的 ggplot2::geom_density 问题。我正在尝试可视化某个变量的密度并将其与常数进行比较。为了绘制密度,我使用了 ggplot2::geom_density。然而,我绘制密度的变量恰好是一个常数(这次):

df <- data.frame(matrix(1,ncol = 1, nrow = 100))
colnames(df) <- "dummy"

dfV <- data.frame(matrix(5,ncol = 1, nrow = 1))
colnames(dfV) <- "latent"

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
                 fill = '#FF6666', alpha = 0.2, position = "identity") +
  geom_vline(data = dfV, aes(xintercept = latent, color = 'ls'), size = 2)

这没关系,这是我所期望的。但是,当我将此分布移到最右边时,我会得到这样的图:

df <- data.frame(matrix(71,ncol = 1, nrow = 100))
colnames(df) <- "dummy"

dfV <- data.frame(matrix(75,ncol = 1, nrow = 1))
colnames(dfV) <- "latent"

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
               fill = '#FF6666', alpha = 0.2, position = "identity") +
  geom_vline(data = dfV, aes(xintercept = latent, color = 'ls'), size = 2) 

这可能意味着内核估计仍然以 0 作为分布的中心(对吗?)。

有什么办法可以规避吗?我想看到一个像上面那样的图,只有核密度的中心在 71 中,而 vline 在 75 中。

谢谢

【问题讨论】:

  • 它与通过ggplot2::stat_density 传递给stat::density 的调整和bw 参数有关。我不确定如何修改它以获得您想要的解决方案......当然,做一个常数的密度估计是愚蠢的
  • 嗯?这有帮助吗?

标签: r ggplot2 kernel-density


【解决方案1】:

好吧,我不确定代码的作用,但我怀疑geom_density 原语不是为值都相同的情况设计的,它对分布做出了一些与您不期望的假设.下面是一些代码和一个图:

# Generate 10 data sets with 100 constant values from 0 to 90
# and then merge them into a single dataframe

dfs <- list()
for (i in 1:10){
  v <- 10*(i-1)
  dfs[[i]] <- data.frame(dummy=rep(v,100),facet=v)
}
df <- do.call(rbind,dfs)

# facet plot them
ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
                       fill = '#FF6666', alpha = 0.5, position = "identity") +
  facet_wrap( ~ facet,ncol=5 )

产量:

所以它没有按照你的想法做,但它也可能没有按照你的意愿做。您当然可以通过添加一些像这样的噪音(几乎)使其成为“翻译不变”:

set.seed(1234)

noise <- +rnorm(100,0,1e-3)
dfs <- list()
for (i in 1:10){
  v <- 10*(i-1)
  dfs[[i]] <- data.frame(dummy=rep(v,100)+noise,facet=v)
}
df <- do.call(rbind,dfs)

ggplot() + 
  geom_density(data = df, aes(x = dummy, colour = 's'), 
               fill = '#FF6666', alpha = 0.5, position = "identity") +
  facet_wrap( ~ facet,ncol=5 )

产量:

请注意,geom_density 函数显然有一个随机分量,我看不到如何在每个实例之前设置种子,因此每次估计的密度都有点不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2017-11-29
    • 2011-04-25
    相关资源
    最近更新 更多