我正在尝试根据R中的给定pareto密度生成数据。
帕累托密度:F(x)= | X | ^(-3)* 1 | x |> 1
我知道我需要使用执行器库中的rpareto函数,但是我不确定如何将给定的pareto密度转换为参数。
答案 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")
答案 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)))