在R中生成大小为n的完全正态分布的样本

Dom*_*ski 1 r normal-distribution generate

我想生成一个mean = 0,sd = 1和size n = 100的样本,其分布尽可能正常.单独使用rnorm会带来很多变化.

我发现的唯一方法是平均多个rnorms.

rowMeans(replicate(10000, sort(rnorm(100, 0, 1))))

这会返回一个相当令人满意的结果,但我不确定这是最有效的方法.


编辑:

我不希望均值和sd严格等于0和1,而是将"看起来"分布为正态分布(当绘制密度曲线时).

似乎qnorm方法比"平均"方法更糟糕:

# qnorm method
x <- qnorm(seq(.00001, .99999, length.out = 100), mean=0, sd=1)
plot(density(x))

# average method
x <- rowMeans(replicate(10000, sort(rnorm(100, mean=0, sd=1))))
plot(density(x))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

我会很满意确定性解决方案,以更有效的方式将结果返回到接近平均值的方法.


编辑2:可能的解决方案

根据答案,以下似乎可行,相对于n调整界限:

x <- qnorm(seq(1/n, 1-1/n, length.out = n), mean=0, sd=1)

下面比较了不同n值的qnorm和average方法:

par(mfrow=c(6,2))
for(n in c(10, 20, 100, 500, 1000, 9876)){
  x <- qnorm(seq(1/n, 1-1/n, length.out = n), mean=0, sd=1)
  plot(density(x), col="blue", lwd=2)

  x <- rowMeans(replicate(10000, sort(rnorm(n, mean=0, sd=1))))
  plot(density(x), col="red", lwd=2)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Mel*_*Key 5

如果你想要一个确定性的解决方案,这应该工作

qnorm(seq(0.01, 0.99, length.out = 100))
Run Code Online (Sandbox Code Playgroud)

注意,qnorm(0)给出$ - \infty $并且qnorm(1)是$\infty $,所以你需要找到一些合理的界限.

因为n=100,边界0.01和0.99似乎效果最好.如果您希望确定性解决方案的边界更远,则需要增加n.


Spa*_*man 5

您是否尝试创建100个具有近似正态分布的数字,其平均值为零且sd恰好为1?做这个:

大致开始:

> X = rnorm(100)
Run Code Online (Sandbox Code Playgroud)

改变它们:

> X = X-mean(X)
Run Code Online (Sandbox Code Playgroud)

缩放它们:

> X = X/sd(X)
Run Code Online (Sandbox Code Playgroud)

核实:

> mean(X)
[1] -7.223497e-18
Run Code Online (Sandbox Code Playgroud)

足够近了

> sd(X)
[1] 1
Run Code Online (Sandbox Code Playgroud)

砰的一声.

这与scale函数的作用相同:

> X = rnorm(100)
> mean(X)
[1] -0.007667039
> sd(X)
[1] 0.9336842
> sx = scale(X)
> mean(sx)
[1] 1.437056e-17
> sd(sx)
[1] 1
Run Code Online (Sandbox Code Playgroud)