在R中生成具有预定义的pdf总和或cdf之和的RNG向量

Nic*_*las 6 random r

我是一个新的R用户,我正在尝试生成具有基于特定分布(例如,使用rnorm命令)随机生成的数字的向量,其中向量具有预定义的概率密度和或累积分布的总和.

例如,当生成向量x1,x2 ... xn时,我希望它们遵守

sum(pnorm(x1)) = sum(pnorm(x2)) = … sum(pnorm(xn))

要么

sum(pnorm(xi)) = ”fixed value”

或者用dnorm做同样的事情.换句话说,当在R中使用rnorm或任何其他RNG时,是否有可能设置这样的参数?

对于策略的提示和建议而不是完整的解决方案也将非常感激.

非常感谢你的时间.

Vin*_*ynd 6

1. 在高斯分布的情况下,从取样(X1,...,Xn)该条件下X1+...+Xn=s 是刚刚从采样 条件高斯分布.

向量(X1,X2,...,Xn,X1 + ... + Xn)具有高斯分布,零均值和方差矩阵

1 0 0 ... 0 1
0 1 0 ... 0 1
0 0 1 ... 0 1
...
0 0 0 ... 1 1
1 1 1 ... 1 n.
Run Code Online (Sandbox Code Playgroud)

因此,我们可以从中进行如下采样.

s <- 1  # Desired sum
n <- 10
mu1 <- rep(0,n)
mu2 <- 0
V11 <- diag(n)
V12 <- as.matrix(rep(1,n))
V21 <- t(V12)
V22 <- as.matrix(n)
mu <- mu1 + V12 %*% solve(V22, s - mu2)
V  <- V11 - V12 %*% solve(V22,V21)
library(mvtnorm)
# Random vectors (in each row)
x <- rmvnorm( 100, mu, V )
# Check the sum and the distribution
apply(x, 1, sum)
hist(x[,1])
qqnorm(x[,1])
Run Code Online (Sandbox Code Playgroud)

对于任意分布,这种方法需要您计算条件分布,这可能并不容易.

2, 还有一种简单的特殊情况:均匀分布.

为了统一采样总和为1的n(正)数,你可以在[0,1]中统一取n-1个数,然后对它们进行排序:它们定义n个区间,其长度总和最多为1,并且碰巧均匀分布.

由于这些点形成泊松过程,您还可以使用指数分布生成它们.

x <- rexp(n)
x <- x / sum(x)  # Sums to 1, and each coordinate is uniform in [0,1]
Run Code Online (Sandbox Code Playgroud)

在下面的文章中解释了这个想法(有很多图片): VaR,CVaR,Omega和具有一般收益分布的效用的投资组合优化,(WT Shaw,2011),第6至8页.

3. (编辑)我最初误读了这个问题,而sum(pnorm(x))不是sum(x).事实证明这更容易.

如果X具有高斯分布,则pnorm(X)具有均匀分布:然后问题是从具有规定总和的均匀分布中采样.

n <- 10
s <- 1  # Desired sum
p <- rexp(n)
p <- p / sum(p) * s  # Uniform, sums to s
x <- qnorm(p)        # Gaussian, the p-values sum to s
Run Code Online (Sandbox Code Playgroud)

  • 我误读了这个问题,这是关于`sum(pnorm(x))`而不是`sum(x)`:我已经相应地更新了我的答案. (3认同)