我是一个新的R用户,我正在尝试生成具有基于特定分布(例如,使用rnorm命令)随机生成的数字的向量,其中向量具有预定义的概率密度和或累积分布的总和.
例如,当生成向量x1,x2 ... xn时,我希望它们遵守
sum(pnorm(x1)) = sum(pnorm(x2)) = … sum(pnorm(xn))
要么
sum(pnorm(xi)) = ”fixed value”
或者用dnorm做同样的事情.换句话说,当在R中使用rnorm或任何其他RNG时,是否有可能设置这样的参数?
对于策略的提示和建议而不是完整的解决方案也将非常感激.
非常感谢你的时间.
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)