【问题标题】:Producing RNG vectors in R that have pre-defined sum of pdf or sum of cdf在 R 中生成具有预定义的 pdf 总和或 cdf 总和的 RNG 向量
【发布时间】:2013-03-03 20:13:27
【问题描述】:

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

例如,当生成向量 x1, x2 ... xn 时,我希望它们服从任一

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

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

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

我们也非常感谢您提供有关策略而非完整解决方案的提示和建议。

非常感谢您抽出宝贵时间。

【问题讨论】:

  • 有趣的问题。我的第一个想法是使用某种对立的变量方法。参见例如en.wikipedia.org/wiki/Antithetic_variates
  • 这似乎更像是一个统计/数学问题,而不是一个编程问题。你可能想把它带到 stat.stackexchange.com 或 math.sta...,然后如果你需要帮助实现在这里询问
  • 您是否注意到该类型的向量数量是有限制的?例如,如果您的 x1、x2、.. 都只是标量,那么在正态分布(x+mu 和 x-mu)的情况下,最多只有两个具有相同概率的值?
  • 非常感谢您的回复。具体来说,我认为这是一个编程而不是数学/统计问题。另外,我知道在正常分布的情况下存在两个具有相同概率的值,但是对于我的问题并没有太大变化,因为它是关于 sum(pnorm(x))。我相信 Vincent Zoonekynd 的更新答案涵盖了我的问题,但我要感谢你,因为你的 cmets 让我思考如何生成额外的代码来显示我的意思,它让我走上了正确答案的轨道。万事如意

标签: r random


【解决方案1】:

1. 在高斯分布的情况下, 在X1+...+Xn=s 的条件下从(X1,...,Xn) 采样 只是从一个 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. 还有另一种简单的特殊情况:均匀分布。

要均匀采样 n 个(正)数,总和为 1, 你可以取 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

【讨论】:

  • apply(x, 1, sum) 应该为所有行返回相同的值吗?
  • 是的:这是所需的总和,每行应该是(大约)1。
  • 没关系!我对某些会话变量做错了..! +1!我尝试了一段时间的粗鲁方式(我生成 x2 直到我断言条件,x3 ...)但它的效率极低..
  • 我误读了这个问题,它是关于sum(pnorm(x)),而不是sum(x):我已经相应地更新了我的答案。
  • 我添加了一个简短的解释,说明为什么p &lt;- rexp(n); p &lt;- p/sum(p) 应该产生受约束的统一数字,并附有参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多