全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
18516 15
2013-05-11
悬赏 20 个论坛币 未解决
如题,现在需要生成介于一定区间的正态随机数,但是不知道如何下手。

比如,生成介于10到20之间的正态随机数,要求均值为15,标准差为5
之所以有这样的需求,是因为如果单单生成均值为15,标准差为5的正态随机数,随机值当中会出现负值的情况,但是这跟现实不符,比如年龄是不可能出现负值的,尽管从统计上来讲是可能的
所以就需要截尾处理,使正态分布介于一定的区间以内

在VBA里可以用NORMINV函数生成正态随机数,但是不知道如何限定区间

曾经试过一些方法,比如先通过循环逐一生成均值为15,标准差为5的正态随机数,函数用NORMINV(RAND(),15,5)
然后循环内判断是否介于10-20之间,如果不在这个区间内,重新生成正态随机数
以此类推,但是结果是可以保证正态和区间,不能保证均值为10,标准差为5

也试过线性变化的方法来将正态随机数转换为一定区间内的分布,但也不能保证均值和标准差

目前找到一点R语言写的算法(可能是红色部分,也可能是全部),从来没用过R,高手能否解释一下这个代码的大致思路,我对VBA比较熟悉,感谢
#R program for dichotomous probit model
#read the data
x=as.matrix(read.table("c:\\bookdead.dat")[,3:9])
y=as.matrix(read.table("c:\\bookdead.dat")[,10])
#create variables, set values, and write out starting values
b=matrix(0,7); vb=solve(t(x)%*%x); ch<-chol(vb)
write(c(i,t(b)), file="c:\\dprob_gibbs.out", append=T, ncol=8)
#begin MCMC simulation
for(i in 2:5000){
#simulate latent data from truncated normal distributions
u=as.matrix(runif(length(y),min=0,max=1))
xb=as.matrix(x%*%b)
ystar=qnorm(y*u + u*(-1)^y*pnorm(0,mean=xb,sd=x[,1]) +y*pnorm(0,mean=xb,sd=1), mean=xb, sd=x[,1])

#simulate beta vector from appropriate mvn distribution
b<-vb%*%(t(x)%*%ystar) + t((rnorm(7,mean=0,sd=1))%*%ch)
write(c(i,t(b))), file="c:\\dprob_gibbs.out", append=T, ncolumns=8)
if(i%%10==0){print(c(i,t(b))),digits=2)}




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-5-11 08:54:11
?rnorm
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-11 09:32:27
这个方差肯定要比原来的小
可以有公式计算出方差,但是一般都比比原来的小
想要得到和原来一样方差那是不可能的, 除非区间相对于原来的方差大得多
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-11 11:57:23
不求原委的话,可以用bayesm包中的rtrun函数。
比较基本的想法是利用accept-reject algorithm, candidate function 可以取为一般的正态分布N(mu, sigma^2).
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-11 12:41:48
hugebear 发表于 2013-5-11 11:57
不求原委的话,可以用bayesm包中的rtrun函数。
比较基本的想法是利用accept-reject algorithm, candidate  ...
刚才在一本英文教材中找到了R语言的截尾正态分布随机数的生成代码,不过我不是很懂啥意思,请问您能否解释一下这个算法的大致原理,详见帖子内容,我已经重新编辑,并贴上R代码了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-5-11 13:03:11
ntsean 发表于 2013-5-11 09:32
这个方差肯定要比原来的小
可以有公式计算出方差,但是一般都比比原来的小
想要得到和原来一样方差那是不 ...
谢谢,我贴了一个R代码,不过不是很了解,如果您熟悉的话,能否解释一下,感谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群