R 从截断高斯分布生成随机数

R 从截断高斯分布生成随机数,r,random,gaussian,truncated,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) m

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


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

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

#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 )
#示例
x 1)])
#[1] 0.128814
#想象
hist(x,breaks=100,xlim=c(-1,1))
#限制(红色)
abline(v=0,col=“红色”,lwd=1,lty=2)
abline(v=1,col=“红色”,lwd=1,lty=2)
#截断平均值(绿色)
abline(v=平均值(x[!(x1)]),col=“绿色”,lty=2,lwd=1)
#真实平均值(蓝色)
abline(v=0.1,col=“蓝色”,lty=1,lwd=1)

截断分发时,这不是您所期望的吗

#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 )
#示例
x 1)])
#[1] 0.128814
#想象
hist(x,breaks=100,xlim=c(-1,1))
#限制(红色)
abline(v=0,col=“红色”,lwd=1,lty=2)
abline(v=1,col=“红色”,lwd=1,lty=2)
#截断平均值(绿色)
abline(v=平均值(x[!(x1)]),col=“绿色”,lty=2,lwd=1)
#真实平均值(蓝色)
abline(v=0.1,col=“蓝色”,lty=1,lwd=1)

因此,我们可能必须区分截断前后的平均值,显然,您打算控制截断样本可能会收敛到的可观察平均值,尽管
rnorm()
(可能
rtruncnorm()
,我不知道)预期“before”是指;虽然stats.stackexchange.com上的一些统计学家可能会为您提供更严密的分析解决方案,但一些有趣的优化也可能会帮助您找到合适的“before”参数(您可能需要根据是否也应修改“before”-sd参数来调整此代码):


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


myrtruncnorm是的,但是我想得到一个随机数向量,其平均值与输入值相同。比如,如果我想模拟平均值为0.1的总体,在模拟之后,不管是否截断,我仍然期望平均值为0,1,否则我的模拟就失败了:-/@xavierpudent扭曲你的期望平均值,直到你得到期望的平均值。我认为这是唯一的方法。听起来好像没有神奇的软件包会自动倾斜,这意味着,我会朝这个方向看得更远,感谢Roman和SimonAlso记住,你的样品的标准偏差将与你的标称值不匹配。如果要确保匹配,还需要重新缩放数据。对于截断分布的矩,有一些关于边界和标称值的表达式-将它们反转将是解决问题的一种正式方法。似乎
beta
分布适合您。请尝试使用rbeta
是,但我希望最终得到一个随机数向量,其平均值与输入值相同。比如,如果我想模拟平均值为0.1的总体,在模拟之后,不管是否截断,我仍然期望平均值为0,1,否则我的模拟就失败了:-/@xavierpudent扭曲你的期望平均值,直到你得到期望的平均值。我认为这是唯一的方法。听起来好像没有神奇的软件包会自动倾斜,这意味着,我会朝这个方向看得更远,感谢Roman和SimonAlso记住,你的样品的标准偏差将与你的标称值不匹配。如果要确保匹配,还需要重新缩放数据。对于截断分布的矩,有一些关于边界和标称值的表达式-将它们反转将是解决问题的一种正式方法。似乎
beta
分布适合您。尝试创建一组随机数。是什么让你相信一个随机生成的向量会有和你认为的完全相同的平均值?另外,您正在非对称地截断,预计会出现平均值偏移。宽度被称为标准偏差(参见维基百科,这是什么意思)。你可以创建一组随机数。是什么让你相信一个随机生成的向量会有和你认为的完全相同的平均值?另外,您正在非对称地截断,预计会出现平均值偏移。宽度被称为标准偏差(参见Wikipedia,这是什么意思)。optim的使用很好+1 optim的良好使用+1.