【发布时间】:2013-09-25 23:29:32
【问题描述】:
在 R 中使用 rnorm(或 runif 等)生成随机数时,它们很少具有精确的均值和 SD 作为它们的抽样分布。是否有任何简单的一两班轮可以为我做到这一点?作为初步解决方案,我创建了这个函数,但它似乎应该是 R 或某些包的原生函数。
# Draw sample from normal distribution with guaranteed fixed mean and sd
rnorm_fixed = function(n, mu=0, sigma=1) {
x = rnorm(n) # from standard normal distribution
x = sigma * x / sd(x) # scale to desired SD
x = x - mean(x) + mu # center around desired mean
return(x)
}
举例说明:
x = rnorm(n=20, mean=5, sd=10)
mean(x) # is e.g. 6.813...
sd(x) # is e.g. 10.222...
x = rnorm_fixed(n=20, mean=5, sd=10)
mean(x) # is 5
sd(x) # is 10
我想要这个的原因是我在将模拟数据应用到真实数据之前调整了我对模拟数据的分析。这很好,因为通过模拟数据,我知道确切的属性(平均值、标准差等),并且我避免了 p 值膨胀,因为我正在做推论统计。我在问是否存在任何简单的东西,例如
rnorm(n=20, mean=5, sd=10, fixed=TRUE)
【问题讨论】:
-
您可以使用函数
scale来执行此操作...但这不正是说明样本统计和总体统计之间的差异吗?随着您的n变大,sd(x)和mean(x)将接近您提供的值,但只有 20 个样本,您不能指望完美分布... -
出于好奇,您为什么需要它?我不希望样本与总体具有相同的均值和标准差。
-
我认为你做对了。我认为这很简单,人们只需在需要时就这样做。
MASS::mvrnorm确实有一个类似的功能(但对于多变量情况来说它有点棘手,这可能是它内置的原因)。同意@Justin,您可以将mu+sigma*scale(rnorm(n))用作单行... -
贾斯汀和罗兰:我在问题中添加了我的动机 :-) 这是因为我模拟数据并想知道它的属性!所以,是的,如果我想让它代表现实世界,这些约束会很奇怪。但我想要一个“完美的小世界”来玩耍,以便知道我是否做对了:-)
-
我通常只是创建一个样本并计算属性。
标签: r random mean standard-deviation