从受限制的帕累托分布中抽取随机数

use*_*697 6 random r

我是R的新手,需要有关如何使用参数s和beta从Pareto分布的有限区域中抽取随机数的建议.(系统:Windows 7,R 2.15.2.)

(1)我在矢量数据$ t中有数据; 每个单一数据点我都会调用data&tx

对于这些数据,Pareto分布的参数s和beta是根据https://stats.stackexchange.com/questions/27426/how-do-i-fit-a-set-of-data-to-a-pareto估算的.-配送-在-R

pareto.MLE <- function(X)
{
n <- length(X)
m <- min(X)
a <- n/sum(log(X)-log(m))
return( c(m,a) ) 
}
Run Code Online (Sandbox Code Playgroud)

(2)现在我需要绘制尽可能多的随机数(RndNew)von这个Pareto分布(s,beta,见(1)),因为有观测值(=数据点:数据$ tx).对于绘制,绘制随机数的区域必须限制在RndNewx> = data $ tx的区域; 换句话说:RndNewx绝不能小于相应的数据$ tx.

问题:如何告诉R限制帕累托分布的区域,从中抽取随机数为RndNewx> = data $ tx?

万分感谢您的帮助!

Ric*_*ton 18

从截断分布中采样的标准方法有三个步骤.这是一个正态分布的例子,所以你可以得到这个想法.

n <- 1000
lower_bound <- -1
upper_bound <- 1
Run Code Online (Sandbox Code Playgroud)

将CDF应用于下边界和上边界以查找分布边缘的分位数.

(quantiles <- pnorm(c(lower_bound, upper_bound)))
# [1] 0.1586553 0.8413447
Run Code Online (Sandbox Code Playgroud)

从这些分位数之间的均匀分布中抽样.

uniform_random_numbers <- runif(n, quantiles[1], quantiles[2])
Run Code Online (Sandbox Code Playgroud)

应用反向CDF.

truncated_normal_random_numbers <- qnorm(uniform_random_numbers)
Run Code Online (Sandbox Code Playgroud)

截断的正常随机数


帕累托分布的CDF是

ppareto <- function(x, scale, shape)
{
  ifelse(x > scale, 1 - (scale / x) ^ shape, 0)
}
Run Code Online (Sandbox Code Playgroud)

反之亦然

qpareto <- function(y, scale, shape)
{
  ifelse(
    y >= 0 & y <= 1,
    scale * ((1 - y) ^ (-1 / shape)),
    NaN
  )
}
Run Code Online (Sandbox Code Playgroud)

我们可以重做上面的例子来使用这些Pareto函数.

n <- 1000
scale <- 1
shape <- 1
lower_bound <- 2
upper_bound <- 10

(quantiles <- ppareto(c(lower_bound, upper_bound), scale, shape))
uniform_random_numbers <- runif(n, quantiles[1], quantiles[2])    
truncated_pareto_random_numbers <- qpareto(uniform_random_numbers, scale, shape)
Run Code Online (Sandbox Code Playgroud)

截断的帕累托分布


为了更容易重用此代码,我们可以将其包装到一个函数中.下限和上限具有与分布范围匹配的默认值,因此如果您未传入值,则将获得非截断的Pareto分布.

rpareto <- function(n, scale, shape, lower_bound = scale, upper_bound = Inf)
{
  quantiles <- ppareto(c(lower_bound, upper_bound), scale, shape)
  uniform_random_numbers <- runif(n, quantiles[1], quantiles[2])    
  qpareto(uniform_random_numbers, scale, shape)
}
Run Code Online (Sandbox Code Playgroud)

  • 写得非常好.你能找到一份写微软用户手册的工作吗?:-) (2认同)
  • 唷!如果您对答案感到满意,请单击我的答案旁边的勾号将其标记为已解决. (2认同)