楼主: 天狮
15869 11

[有偿编程] 如何用R生成服从任意有限离散分布的随机数 [推广有奖]

  • 1关注
  • 10粉丝

教授

33%

还不是VIP/贵宾

-

威望
1
论坛币
6270 个
通用积分
352.6322
学术水平
20 点
热心指数
35 点
信用等级
13 点
经验
18416 点
帖子
1406
精华
0
在线时间
509 小时
注册时间
2008-10-10
最后登录
2024-4-29

5论坛币
我在网上找到了如何用matlab生成服从任意有限离散分布的随机数的方法,代码如下:
function out=drnd(p,n)
%out=drnd(p,n)
%copyright:rocwoods
%p is the probability distribution matrix;
%n is the number of the samples you want to generate;
%=================
a=cumsum(p(2,: ));
b=rand(n,1);
out=zeros(1,n);
for k=1:n
c=find(a<b(k));
if (isempty(c))
out(k)=p(1,1);
else
out(k)=p(1,c(end)+1);
end
end

举例说明:
比方说一个随机变量可以取1 2 3 4 5这5个值。每个值的概率分别为0.1 0.3 0.25 0.25 0.1
则P=[1 2 3 4 5;0.1 0.3 0.25 0.25 0.1]
生成1000个样本,如下:
out=drnd(P,1000)
%结果省略

当然在R中可以直接调用sample函数得到结果,但我尝试着编写Rcode编写相同的程序(因为个人觉得R和matlab有很多相似之处),
比如说X的分布律满足x=(x1,x2,.....,xk),相应概率为p=(p1,p2,....,pk),要生成n个满足所给分布律的随机数z,则先要生成n个(0,1)随机数,记为r,
当0<r[i]<=p1时,z[i]=x1; 当p1<r[i]<=p1+p2时,z[i]=x2;........  当pk<r[i]<=1时,z[i]=xk; 我编写了R程序,但是结果老是出错。
本人刚接触软件不久,希望高手赐教,悬赏不多,还请包涵。

最佳答案

关键词:如何用 随机数 distribution Probability Copyright 离散 随机数
沙发
qoiqpwqr 发表于 2011-5-22 19:12:29 |只看作者 |坛友微信交流群
drnd <- function(x, p, n) {
    z <- NULL
    ps <- cumsum(p)
    r <- runif(n)
    for (i in 1:n) z <- c(z, x[which(r[i] <= ps)[1]])
    return(z)
}
> x <- c(1, 2, 3, 4, 5)
> p <- c(0.1, 0.2, 0.2, 0.35, 0.15)
> out <- drnd(x, p, 10000)
> table(out)/10000
out
     1      2      3      4      5
0.0978 0.2056 0.1974 0.3480 0.1512

缺点:慢,因为那个for循环
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
AspenRd + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
天狮 发表于 2011-5-24 15:00:44 |只看作者 |坛友微信交流群
等了两天了,你写的还不错,那分就给你吧,是不是我点最佳答案就可以了?
还有两个小问题,z <- c(z, x[which(r[i] <= ps)[1]])是什么意思,不是有两边吗,r[i]还要大于某某呀;
另外你最后搞个table(out)/10000是什么意思

使用道具

板凳
天狮 发表于 2011-5-24 15:02:20 |只看作者 |坛友微信交流群
哦,忘了说谢谢了

使用道具

报纸
qoiqpwqr 发表于 2011-5-24 22:04:58 |只看作者 |坛友微信交流群
table(out)/10000是用来检查一下结果合理不
z <- c(z, x[which(r[i] <= ps)[1]])是找到离散的cdf里面第一个大于r[i]的数,然后z[i]就赋值为x里面这个位置的数。就是按照你帖子里的算法来的。

使用道具

地板
天狮 发表于 2011-5-24 23:05:10 |只看作者 |坛友微信交流群
MUCHAS GRACIAS !

使用道具

7
qoiqpwqr 发表于 2011-5-25 04:52:54 |只看作者 |坛友微信交流群
De Nada  !

使用道具

8
一诺9257 发表于 2011-5-25 08:20:58 |只看作者 |坛友微信交流群
统计模拟,你可以参见武汉大学出版社《统计模拟及其R应用》,这本书挺好的

使用道具

9
danica33 发表于 2014-3-19 16:08:11 |只看作者 |坛友微信交流群
f<-function(n,x,prob){
  num<-length(prob)
  u<-runif(n)
  cup<-cumsum(prob)
  z<-x[as.integer(cut(u,breaks=c(0,cup)))]
  z}

使用道具

10
jzdfenger 发表于 2015-10-18 00:02:18 |只看作者 |坛友微信交流群
一诺9257 发表于 2011-5-25 08:20
统计模拟,你可以参见武汉大学出版社《统计模拟及其R应用》,这本书挺好的
你说的是<<统计模拟与R实现>>吗?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-3 11:22