从 R 中的幂律分布中绘制随机数
Drawing random numbers from a power law distribution in R
我正在使用 R 包“poweRlaw”来估计并随后从离散幂律分布中得出结论,但是从拟合得出的分布似乎与数据不匹配。为了说明这一点,请考虑此软件包指南中的示例:https://cran.r-project.org/web/packages/poweRlaw/vignettes/b_powerlaw_examples.pdf。这里我们先从包中下载一个示例数据集,然后拟合一个离散幂律。
library("poweRlaw")
data("moby", package = "poweRlaw")
m_pl = displ$new(moby)
est = estimate_xmin(m_pl)
m_pl$setXmin(est)
拟合看起来不错,因为我们不能放弃这个数据是从幂分布中提取的假设(p 值 > 0.05):
bs = bootstrap_p(m_pl, threads = 8)
bs$p
但是,当我们使用内置函数 dist_rand() 从该分布中提取时,生成的分布将移至原始分布的右侧:
set.seed(1)
randNum = dist_rand(m_pl, n = length(moby))
plot(density(moby), xlim = c(0, 1000), ylim = c(0, 1), xlab = "", ylab = "", main = "")
par(new=TRUE)
plot(density(randNum), xlim = c(0, 1000), ylim = c(0, 1), col = "red", xlab = "x", ylab = "Density", main = "")
我可能误解了从幂分布中提取的意思,但发生这种情况是因为我们只拟合了实验分布的尾部(所以我们在参数 Xmin 之后绘制)吗?如果发生这样的事情,有什么办法可以补偿这个事实,使拟合分布类似于实验分布?
这里发生了一些事情。
正如你在问题中暗示的那样,如果你想比较分布,你需要t运行cate moby,所以moby = moby[moby >= m_pl$getXmin()]
使用 density()
有点麻烦。这是一个内核密度平滑器,它在离散点上绘制正态分布。由于幂律的尾巴很长,因此值得怀疑
比较两个幂律分布的尾部是棘手的(模拟一些数据并查看)。
无论如何,如果你运行
set.seed(1)
x = dist_rand(m_pl, n = length(moby))
# Cut off the tail for visualisation
moby = moby[moby >= m_pl$getXmin() & moby < 100]
plot(density(moby), log = "xy")
x = x[ x < 100]
lines(density(x), col = 2)
给出的东西非常相似。
我正在使用 R 包“poweRlaw”来估计并随后从离散幂律分布中得出结论,但是从拟合得出的分布似乎与数据不匹配。为了说明这一点,请考虑此软件包指南中的示例:https://cran.r-project.org/web/packages/poweRlaw/vignettes/b_powerlaw_examples.pdf。这里我们先从包中下载一个示例数据集,然后拟合一个离散幂律。
library("poweRlaw")
data("moby", package = "poweRlaw")
m_pl = displ$new(moby)
est = estimate_xmin(m_pl)
m_pl$setXmin(est)
拟合看起来不错,因为我们不能放弃这个数据是从幂分布中提取的假设(p 值 > 0.05):
bs = bootstrap_p(m_pl, threads = 8)
bs$p
但是,当我们使用内置函数 dist_rand() 从该分布中提取时,生成的分布将移至原始分布的右侧:
set.seed(1)
randNum = dist_rand(m_pl, n = length(moby))
plot(density(moby), xlim = c(0, 1000), ylim = c(0, 1), xlab = "", ylab = "", main = "")
par(new=TRUE)
plot(density(randNum), xlim = c(0, 1000), ylim = c(0, 1), col = "red", xlab = "x", ylab = "Density", main = "")
我可能误解了从幂分布中提取的意思,但发生这种情况是因为我们只拟合了实验分布的尾部(所以我们在参数 Xmin 之后绘制)吗?如果发生这样的事情,有什么办法可以补偿这个事实,使拟合分布类似于实验分布?
这里发生了一些事情。
正如你在问题中暗示的那样,如果你想比较分布,你需要t运行cate moby,所以
moby = moby[moby >= m_pl$getXmin()]
使用
density()
有点麻烦。这是一个内核密度平滑器,它在离散点上绘制正态分布。由于幂律的尾巴很长,因此值得怀疑比较两个幂律分布的尾部是棘手的(模拟一些数据并查看)。
无论如何,如果你运行
set.seed(1)
x = dist_rand(m_pl, n = length(moby))
# Cut off the tail for visualisation
moby = moby[moby >= m_pl$getXmin() & moby < 100]
plot(density(moby), log = "xy")
x = x[ x < 100]
lines(density(x), col = 2)
给出的东西非常相似。