【问题标题】:Drawing uniform Distributions with ggplot in R在 R 中使用 ggplot 绘制均匀分布
【发布时间】:2021-04-26 12:21:39
【问题描述】:

我想在 R 中绘制不同的均匀分布,最好使用 ggplot。当尝试绘制 U(0.35,0.55) 的 pdf 时,看起来边缘周围的值(即参数值,在本例中为 0.35 和 0.55)的概率与应有的不同。输出可见:

这在作为均匀分布输入的不同参数之间是一致的,并且似乎不是规模问题。

重现类似结果的代码示例:

#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3

base <- ggplot() + xlim(-1, 2)


base + 
        geom_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1)) +
        geom_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2)) +
        geom_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3))

使用 stat_function 代替 geom_function 不会改变任何东西。

但是,以下工作:

curve(dunif(x, min = alpha_1, max = beta_1), 
            from = 0, to = 1, 
            n = 100000, 
            col = "blue", 
            lwd = 2, 
            add = F, 
            yaxt = "n",
            ylab = 'probability')
curve(dunif(x, min = alpha_2, max = beta_2), 
     from = 0, to = 1, 
     n = 100000, 
     col = "red", 
     lwd = 2, 
     add = T, 
     yaxt = "n",
     ylab = 'probability')
curve(dunif(x, min = alpha_3, max = beta_3), 
     from = 0, to = 1, 
     n = 100000, 
     col = "black", 
     lwd = 2, 
     add = T, 
     yaxt = "n",
     ylab = 'probability')

我怎样才能让它在 ggplot 中工作?在我看来,问题可能是这样的:

评估沿 x 轴的 n 个值以获得图形的坐标。围绕参数 (a,b) 这些是,例如在 a+0.0001 和 a-0.0001。这些坐标之间的直线不会完全垂直。我不确定这是否是正确的诊断,但无论如何我都会感谢任何帮助。谢谢!

【问题讨论】:

  • 似乎是分辨率问题。 ?stat_function 默认使用 101 个点。尝试在该层设置n = 1001
  • 是的,n = 10001 做到了。我应该自己想出来的,多么尴尬。非常感谢!

标签: r ggplot2 uniform-distribution


【解决方案1】:

这很容易通过增加评估点的数量来解决,正如Gregor Thomas 在评论中有用地指出的那样。以下调整后的代码按预期工作:

library(ggplot2)
#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3

base <- ggplot() + xlim(-1, 2)


base + 
        stat_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1), n = 10001) +
        stat_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2), n = 10001) +
        stat_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3), n = 10001)

关键变化是将n=10001 添加到每个stat_function 调用中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多