【发布时间】:2017-04-20 16:39:35
【问题描述】:
给定以下函数:
f(x) = (1/2*pi)(1/(1+x^2/4))
我如何识别它的分布并在 R 中编写这个分布函数?
【问题讨论】:
标签: r function statistics distribution
给定以下函数:
f(x) = (1/2*pi)(1/(1+x^2/4))
我如何识别它的分布并在 R 中编写这个分布函数?
【问题讨论】:
标签: r function statistics distribution
这就是你现在的函数(希望你知道如何编写 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?
一个离题的问题,但可以在不创建新线程的情况下回答。有用,因为它变得微妙。
比较
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)
【讨论】: