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)
我会很满意确定性解决方案,以更有效的方式将结果返回到接近平均值的方法.
根据答案,以下似乎可行,相对于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)
如果你想要一个确定性的解决方案,这应该工作
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.
您是否尝试创建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)