从截断的高斯生成随机数

时间:2014-04-24 09:00:11

标签: r random gaussian truncated

与大多数物理问题一样,我的情况受到限制,因此我想根据截断的高斯分布生成(带R)随机数。

这个想法是这些数字的平均值不应该取决于边界。 我已经找到了包truncnorm,但它没有完成这项工作:

例如,这里的高斯平均值为0.1,宽度为0.1,但约束在0和1之间:

install.packages("truncnorm")
library(truncnorm)
vec=rtruncnorm(n=100000,a=0,b=1,mean=0.1,sd=0.1)
hist(vec,breaks=100)
mean(vec)
[1] 0.1289061

正如您所看到的,最终均值不是作为输入给出的,我可以通过使用标准rnorm函数并将结果分段来获得相同的结果。

我不想重新发明轮子,所以欢迎任何有关进一步包装的想法或建议!谢谢!

2 个答案:

答案 0 :(得分:5)

当你截断发行版时,这不是你所期望的吗?

#Example
x <- rnorm( 1e7 , mean = 0.1 , sd = 0.1 )
mean( x[ ! ( x < 0 | x > 1 ) ] )
#[1] 0.128814

#Visualising
hist( x , breaks = 100 , xlim = c(-1,1) )
#limits (red)
abline( v = 0 , col = "red" , lwd = 1 , lty = 2 )
abline( v = 1 , col = "red" , lwd = 1 , lty = 2 )
#truncated mean (green)
abline( v = mean( x[ !(x<0|x>1)] ) , col = "green" , lty = 2 , lwd = 1 )
#true mean (blue)
abline( v = 0.1 , col = "blue" , lty = 1 , lwd = 1 )

enter image description here

答案 1 :(得分:1)

因此我们可能必须区分截断前后的平均值,并且您显然打算控制截断样本可能会收敛的可观察平均值,尽管rnorm()(可能rtruncnorm(),我不知道)期待&#34;之前&#34; -means;虽然stats.stackexchange.com上的一些统计人员可能会为您提供更加防水的分析解决方案,但也许一些有趣的优化也可以帮助您找到合适的&#34;之前的参数(您可能需要根据是否需要调整此代码) &#34;之前&#34; -sd-参数也应该被修改):

myrtruncnorm <- function(n,a,b,mean=0,sd=1) 
    qnorm(runif(n,pnorm(a,mean=mean,sd=sd),pnorm(b,mean=mean,sd=sd)),mean=mean,sd=sd)
set.seed(1)
optim(list(mean=.1,sd=.1), function(x)
    abs(mean(myrtruncnorm(n=100000,a=0,b=1,mean=x[[1]],sd=x[[2]]))-.1))
# returns mean=0.07785390 and sd=0.07777597, let's test that: 
x1 <- myrtruncnorm(100000,0,1,0.07785390,0.07777597)
hist(x1); mean(x1) # Is "mean=0.1003832" sufficiently close?