【问题标题】:Generate Random Numbers with Std Dev x and Fixed Product使用 Std Dev x 和固定乘积生成随机数
【发布时间】:2012-12-21 16:37:50
【问题描述】:

我想生成一系列收益 x,使得收益的标准差为 0.03 和 1+x = 1 的乘积。总而言之,收益有两个条件:

1) sd(x) == 0.03

2) prod(1+x) == 1

这可能吗?如果可以,我如何在 R 中实现它?

谢谢。

【问题讨论】:

  • 你试过什么?另外,你能给我们一个例子来满足你的限制吗?
  • 回报应该遵循特定分布(正态?对数正态?)还是可以遵循任何分布?以及应该有多少(即length(x)是什么)?

标签: r random


【解决方案1】:

稍微复杂一点的方法是使用对数正态分布的知识:来自?dlnorm,Var= exp(2*mu + sigma^2)*(exp(sigma^2) - 1)。我们希望几何平均值等于 1,因此对数刻度上的平均值应该为 0。我们有 Var = exp(sigma^2)*(exp(sigma^2)-1),显然无法解析解决这个问题,但我们可以使用 uniroot

找到正确的对数方差:

vfun <- function(s2,v=0.03^2) { exp(s2)*(exp(s2)-1)-v }
s2 <- uniroot(vfun,interval=c(1e-6,100))$root

生成值:

set.seed(1001)
x <- rnorm(1000,mean=0,sd=sqrt(s2))
x <- exp(x-mean(x))-1   ## makes sum(x) exactly zero
prod(1+x)  ## exactly 1
sd(x)

这会产生标准偏差不完全等于 0.03 但接近的值。如果我们愿意,我们也可以解决这个问题...

【讨论】:

    【解决方案2】:

    一个非常简单的方法是简单地模拟退货,直到您有一套满足您的要求。不过,您需要根据自己的要求指定容差(请参阅here 为什么)。

    nn <- 10
    epsilon <- 1e-3
    while ( TRUE ) {
        xx <- rnorm(nn,0,0.03)
        if ( abs(sd(xx)-0.03)<epsilon & abs(prod(1+xx)-1)<epsilon ) break
    }
    xx
    

    产量

    [1]  0.007862226 -0.011437600 -0.038740969  0.028614022  0.006986953
    [6] -0.004131429  0.030846398 -0.037977057  0.046448318 -0.025294236
    

    【讨论】:

    • 很好的答案,但请注意,如果您不希望它们大致呈正态分布,您可以尝试不同的分布。此外,如果您需要低于 1e-4 左右的容差,这将运行非常非常长的时间。
    • 建议 - 如果您在生成 xx 之后添加行 xx = .03 * xx / sd(xx),这将更快地收敛并适用于更小的误差容限。这将sd(xx) 修复为精确的.03(在浮点错误范围内),这样您只需要担心产品。使用它,我能够在几秒钟内在 1e-6 内获得它。
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 2011-03-11
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多