我想用整数值和精确的期望平均值和标准差来模拟数据。我知道如何生成具有精确平均值和标准差的浮点数。然后将其舍入为整数值,但舍入后 sd 和均值会发生变化!
`穆<- 3
西格玛<- 1.5
N<- 100
模拟人生<- round(rnorm(N, mu, sigma),0)`
您将无法将随机变量的值限制在 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