【问题标题】:Generating random numbers from a truncated Gaussian从截断的高斯生成随机数
【发布时间】:2014-06-09 11:15:21
【问题描述】:

与大多数物理问题一样,我的案例有边界,因此我想根据截断的高斯分布生成(使用 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 函数并对结果进行子集化,我可以得到相同的结果。

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

【问题讨论】:

  • 您创建了一组随机数字。是什么让您相信一个随机生成的向量将与您认为它应该具有完全相同的平均值?另外,您正在不对称地截断,预计均值偏斜。宽度称为标准差(参见维基百科这是什么意思)。

标签: r random gaussian truncated


【解决方案1】:

因此,我们可能必须区分截断前后的平均值,并且您显然打算控制截断样本可能收敛到的可观察平均值,尽管 rnorm()(可能还有 rtruncnorm(),我不这样做)知道)期待“之前”——意思是;虽然 stats.stackexchange.com 上的一些统计学家可能会为您提供更无懈可击的分析解决方案,但也许一些有趣的优化也可以帮助您找到合适的“之前”参数(您可能必须根据“之前”是否调整此代码 - sd-parameter也应该修改):

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?

【讨论】:

  • 对 optim 的使用很好。 +1
【解决方案2】:

这不是您截断分布时所期望的吗?

#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 )

【讨论】:

  • 是的,但我想最终得到一个随机数向量,其平均值与输入给出的相同。就像如果我想模拟一个平均值为 0.1 的总体,在模拟之后,无论是否截断,我仍然期望平均值为 0,1,否则我的模拟被搞砸了:-/
  • @XavierPrudent 扭曲你的预期平均值,直到你得到一个期望的平均值。我认为这是去这里的唯一途径。
  • 听起来好像没有魔法包可以自动倾斜,我会朝那个方向进一步研究,谢谢 Roman 和 Simon
  • 另外请记住,您的样本标准偏差与您的标称值不匹配。如果要确保匹配,还需要重新调整数据。根据边界和标称值,有截断分布的矩的表达式 - 将它们反转是解决问题的正式方法。
  • 似乎beta 分发版适合您。试试?rbeta
猜你喜欢
  • 2012-12-11
  • 2014-04-15
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多