【问题标题】:How to create a distribution function in R?如何在 R 中创建分布函数?
【发布时间】:2017-04-20 16:39:35
【问题描述】:

给定以下函数:

f(x) = (1/2*pi)(1/(1+x^2/4))

我如何识别它的分布并在 R 中编写这个分布函数?

【问题讨论】:

    标签: r function statistics distribution


    【解决方案1】:

    这就是你现在的函数(希望你知道如何编写 R 函数;如果不知道,请查看writing your own function):

    f <- function (x) (pi / 2) * (1 / (1 + 0.25 * x ^ 2))
    

    f 定义在(-Inf, Inf) 上,因此在此范围内的积分给出了不定积分。幸运的是,它以x ^ (-2) 的速度逼近Inf,所以积分定义明确,可以计算:

    C <- integrate(f, -Inf, Inf)
    # 9.869604 with absolute error < 1e-09
    
    C <- C$value  ## extract integral value
    # [1] 9.869604
    

    然后你想规范化f,因为我们知道概率密度应该集成为 1:

    f <- function (x) (pi / 2) * (1 / (1 + 0.25 * x ^ 2)) / C
    

    您可以通过以下方式绘制其密度:

    curve(f, from = -10, to = 10)
    

    【讨论】:

    • 谢谢您,再次精彩回复!现在我有了可能的分布函数,我想知道如何使用这个新的分布函数创建一个 n = 1000 的随机样本?
    • @ZheyuanLi 好的,我明白了。
    • 是的,但我现在明白了,我已经解决了,所以谢谢!
    【解决方案2】:

    现在我有了可能的分布函数,我想知道如何使用这个新的分布函数创建一个随机样本,比如 n = 1000

    一个离题的问题,但可以在不创建新线程的情况下回答。有用,因为它变得微妙。

    比较

    set.seed(0); range(simf(1000, 1e-2))
    #[1] -56.37246  63.21080
    set.seed(0); range(simf(1000, 1e-3))
    #[1] -275.3465  595.3771
    set.seed(0); range(simf(1000, 1e-4))
    #[1] -450.0979 3758.2528
    set.seed(0); range(simf(1000, 1e-5))
    #[1] -480.5991 8017.3802
    

    所以我认为e = 1e-2 是合理的。我们可以抽取样本,制作(缩放的)直方图和叠加密度曲线:

    set.seed(0); x <- simf(1000)
    hist(x, prob = TRUE, breaks = 50, ylim = c(0, 0.16))
    curve(f, add = TRUE, col = 2, lwd = 2, n = 201)
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多