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

标签 r random

我是一个新的 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的条件下
只是从一个采样
conditional Gaussian distribution .

向量 (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.

因此,我们可以从中取样如下。
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])

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

2.
还有另一个简单的特例:均匀分布。

要均匀采样总和为 1 的 n 个(正)数,
你可以取n-1个数字,
均匀地在 [0,1] 中,
并对它们进行排序:它们定义了 n 个区间,
其长度总和为 1,并且恰好是均匀分布的。

由于这些点形成泊松过程,
您还可以使用指数分布生成它们。
x <- rexp(n)
x <- x / sum(x)  # Sums to 1, and each coordinate is uniform in [0,1]

这个想法在下面的文章中有解释(有很多图片):
Portfolio Optimization for VaR, CVaR, Omega and Utility with General Return Distributions ,
(W.T. 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

关于r - 在 R 中生成具有预定义 pdf 总和或 cdf 总和的 RNG 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190317/

相关文章:

r - 提取嵌套在列表内的 data.frame

java - 其他替代方案使 rand.nextDouble() beetwen -1 和 1

c++ - 在多个函数中使用相同的随机数生成器

r - 在 R 中的 ggplot2 中操作数据点的值

r - 取消列出嵌套列表的倒数第二个列表

r - 无法安装 `proj4` 包,因为在标准搜索位置找不到 libproj 和/或 proj_api.h

R 使用 dplyr 选择向量元素语法

c++ - 从 C++ 中的随机访问文件读取访问冲突

php - 如何通过php过滤任意给定数量的html标签

r - 将 lambda 向量传递给 Rcpp 的 rpois