使用Std Dev x和固定产品生成随机数

时间:2012-12-21 16:37:51

标签: r random

我想生成一系列回报x,使得回报的标准差为0.03,乘积为1 + x = 1.总结一下,回报有两个条件:

1)sd(x) == 0.03

2)prod(1+x) == 1

这可能吗?如果可以,我该如何在R?

中实现它?

谢谢。

2 个答案:

答案 0 :(得分:5)

稍微复杂一点的方法是使用对数正态分布的知识:来自?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但接近的值。如果我们想要,我们也可以解决这个问题......

答案 1 :(得分:3)

一种非常简单的方法是简单地模拟返回,直到您拥有满足要求的集合。但是,您需要指定对要求的容差(请参阅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