如何从R中的pareto密度函数生成随机数据?

时间:2019-04-30 04:29:43

标签: r distribution

我正在尝试根据R中的给定pareto密度生成数据。

帕累托密度:F(x)= | X | ^(-3)* 1 | x |> 1

我知道我需要使用执行器库中的rpareto函数,但是我不确定如何将给定的pareto密度转换为参数。

2 个答案:

答案 0 :(得分:0)

帕累托分布足够简单,可以使用转换方法(又名Inverse Transform Sampling)。帕累托分布的CDF是

$$ F(x)= \ int_ {x_ {min}} ^ xf(x')\,dx'= 1- \ left(\ frac {x_ {min}} {x} \ right ^ k $ $

可以解析为

$$ F ^ {-1}(y)= x_ {min} \ cdot(1-y)^ {-1 / k} $$

因此,如果您用$ F ^ {-1} $变换均匀分布在$(0,1)$上的随机数,则会获得帕累托分布的随机数。

编辑::抱歉,显然,此处不支持Latex-Code。为了方便起见,这里是R代码:

k <- 5      # parameter k of the Pareto distribution
x.min <- 2  # cutoff point of Pareto distribution
N <- 500    # number of random points
x.random <- x.min*(1-runif(N))^(-1/k)

这是它起作用的实际演示:

h <- hist(x.random, freq=FALSE, plot=TRUE)
x <- seq(x.min, h$breaks[length(h$breaks)], by=0.01)
lines(x, k*x.min^k/x^(k+1), col="red")

plot for k=5 and x.min=2

答案 1 :(得分:0)

使用反采样方法,Pareto Distribution中的公式

此处为更新版本,其中包含平均值和sd计算值

rpar <- function(n, xm, a) {
    v <- runif(n)
    xm / v^(1.0/a)
}

rpar_mean <- function(xm, a) {
    result <- 1/0 # Inf
    if (a > 1.0)
        result <- a*xm/(a - 1.0)
    result
}

rpar_var <- function(xm, a) {
    result <- 1/0 # Inf
    if (a > 2.0)
        result <- xm*xm*a/((a - 1.0)^2*(a - 2.0))
    result
}

set.seed(54122345)

xm = 1.0
a  = 3.0

q <- rpar(10000, xm, a)
print(mean(q))
print(rpar_mean(xm, a))

print(sd(q))
print(sqrt(rpar_var(xm, a)))