如何在 R 或 python 中用精确平均值和标准差来模拟 1 到 5 之间的整数 [已关闭]

问题描述 投票:0回答:1

我想用整数值和精确的期望平均值和标准差来模拟数据。我知道如何生成具有精确平均值和标准差的浮点数。然后将其舍入为整数值,但舍入后 sd 和均值会发生变化!

`穆<- 3

西格玛<- 1.5

N<- 100

模拟人生<- round(rnorm(N, mu, sigma),0)`

python r statistics
1个回答
1
投票

您将无法将随机变量的值限制在 1 到 5 之间,而仍然得到平均值 5 和标准差 5。如果没有这个限制,就会出现无限数量的整数分布,从而导致平均值为 5,标准差为 5。一个例子:

x <- sample(c(0L, 10L), 1e8, 1)
mean(x)
#> [1] 5.000759
sd(x)
#> [1] 5

对于更通用的解决方案,我们可以使用,例如,beta 二项式分布。下面的函数

fGetDist
返回一个函数,该函数将从具有指定平均值和标准差的 beta 二项式分布中返回样本。

fGetDist <- function(mu, sigma) {
  sigma2 <- sigma^2
  
  f <- function(xyn) {
    xyn <- exp(xyn)
    a <- xyn[1]
    b <- xyn[2]
    n <- ceiling(xyn[3])
    ab <- a + b
    (n*a/ab - mu)^2 + (n*a*b*(ab + n)/ab^2/(ab + 1) - sigma2)^2
  }
  
  abn <- exp(optim(c(0, 0, log(2*ceiling(mu))), f)$par)
  function(n) rbinom(n, ceiling(abn[3]), rbeta(n, abn[1], abn[2]))
}

使用示例:

# mean = 5, sd = 5
x <- fGetDist(5, 5)(1e7)
unique(x)
#>  [1] 10  7  0  1  5  8 16  9  3  6  2 12 11 13  4 14 15
mean(x)
#> [1] 5.000809
sd(x)
#> [1] 5.000372

# mean = sqrt(2), sd = pi
x <- fGetDist(sqrt(2), pi)(1e7)
unique(x)
#>  [1] 0 9 2 7 3 1 4 6 5 8
mean(x)
#> [1] 1.413431
sd(x)
#> [1] 3.141078
© www.soinside.com 2019 - 2024. All rights reserved.