rnorm正在生成非随机外观的实现

时间:2019-02-16 05:06:22

标签: r

我正在调试模拟,发现运行rnorm()时,我的随机法线值对我来说根本不是随机的。 ccc是参数给定的平均sd向量。如何获得真正随机的法线实现?由于我的原始模拟时间很长,因此我不想进行Gibbs采样...您是否知道为什么我会得到普通随机变量的非随机形式的实现?

> ccc  
# [1] 144.66667  52.52671  

> rnorm(20, ccc)  
# [1] 144.72325  52.31605 144.44628  53.07380 144.64438  53.87741 144.91300  54.06928 144.76440  
# [10]  52.09181 144.61817  52.17339 145.01374  53.38597 145.51335  52.37353 143.02516  52.49332  
# [19] 144.27616  54.22477

> rnorm(20, ccc)  
# [1] 143.88539  52.42435 145.24666  50.94785 146.10255  51.59644 144.04244  51.78682 144.70936  
# [10]  53.51048 143.63903  51.25484 143.83508  52.94973 145.53776  51.93892 144.14925  52.35716  
# [19] 144.08803  53.34002 

1 个答案:

答案 0 :(得分:5)

在函数中设置参数是一个基本概念。以rnorm()为例:

其结构为rnorm(n, mean = 0, sd = 1)。显然,meansd是两个不同的参数,因此您需要给它们分别输入值。这是一个令人困惑的情况,您可能会陷入困境:

arg <- c(5, 10)
rnorm(1000, arg)

这实际上是 rnorm(n = 1000, mean = c(5, 10), sd = 1) 。由于arg的位置代表参数mean,并且您无需另外设置sd,因此标准偏差设置为1。因此,rnorm()将默认值1设为sd。但是,mean = c(5, 10)是什么意思?让我们检查一下:

x <- rnorm(1000, arg)
hist(x, breaks = 50, prob = T)
# lines(density(x), col = 2, lwd = 2)

enter image description here

您会发现随机样本为两个峰值正态分布,均值出现在 5和10 (实际上,整体不再是正态)。至于您的问题,应该是:

arg <- c(5, 10)
rnorm(1000, arg[1], arg[2])

,这表示 rnorm(n = 1000, mean = 5, sd = 10) 。再次检查,将得到mean = 5sd = 10的正态分布。

x <- rnorm(1000, arg[1], arg[2])
hist(x, breaks = 50, prob = T)
# curve(dnorm(x, arg[1], arg[2]), col = 2, lwd = 2, add = T)

enter image description here