统计模拟与R
统计模拟初步
基本概念
- 又称蒙特卡洛方法,所为模拟就是把某一显示的或抽象的系统的部分状态或特征,用另一个系统(称为模型)来代替或模仿。
- 在传统的方法难以解决的问题中,有很大一部分可以用概率统计模型进行描述。
基本思想
将各种随机事件的概率特征(概率分布,数学期望)与随机事件的模拟联系起来用试验的方法确定事件的相应概率与数学期望。突出特点是概率模型的解是由试验得到的。
例子——布丰投针试验
利用随机模拟试验估计pi的值。具体过程点击该链接
代码如下:
buffon<-function(n,a,l){k<-0for(i in 1:n){x<-runif(1)*atheta<-runif(1)*piif(l*sin(theta)>=x) {k=k+1}}p=k/npie=2*l/(a*p)result<-c(p,pie);result
}
buffon(10000,1,0.8)
伪随机数的产生方法
随机数是指(0,1)上均匀分布随机变量的值,最早是手工或通过机械方式产生,现可由计算机相机产生伪随机数
- 乘同余法
从初值或者称为种子 x 0 x_0 x0出发,利用公式 x n x_n xn= mod m,其中a和m是给定的正整数,每个 x n x_n xn均为0,1,2,…,m-1中的一个, x n x_n xn/m称为一个伪随机数 - 混合同余法
利用如下递推公式
x n x_n xn=(a x n − 1 x_{n-1} xn−1+c) mod m
随机数计算积分
一重积分
比如计算积分 θ \theta θ= ∫ a b g ( x ) d x \int_a^bg(x){\rm d}x ∫abg(x)dx
f1=function(n,a,b,g){
X=runif(n)
sum((b-a)*g(a+(b-a)*X))/length(X)
}
或者用R的内置函数来计算积分:
integrate(g,a,b)
计算 ∫ 1 2 x 2 d x \int_1^2x^2{\rm d}x ∫12x2dx的积分
g<-function(x){x^2
}
int<-integrate(g,1,2)
二重积分
计算 ∬ D e ( z − y ) 2 d x \iint _D{e^{{(z-y)}^2}}{\rm d}x ∬De(z−y)2dx D=[0,1] × \times ×[0,1]
#内置函数法
library(cubature)
double<-function(x){exp((x[1]+x[2])^2)}
adaptIntegrate(double,c(0,0),c(1,1))$interal
π \pi π估计方法
模拟案例
- 追逐问题
- 赶火车问题
随机变量的模拟方法
离散型随机变量生成方法
二项分布,几何分布,poison分布,超几何分布等
逆变换法
例子:产生分布律如下的随机变量100个
X | 1 | 2 | 3 | 4 |
---|---|---|---|---|
P | 0.2 | 0.15 | 0.3 | 0.35 |
方法1 |
X=rep(0,100)for(i in 1:100)
{u=runif(1);if(u<0.2){X[i]=1}
else
if(u<0.35){X[i]=2}
else if(u<0.65)
{X[i]=3}
else X[i]=4
}
方法2
X=sample(c(1,2,3,4),100,
c(0.2,0.15,0.3,0.35),replace=TRUE)
均匀分布
n<-100
U=runif(n,0,1)
X=floor(n*U)+1
向上取整数: ceiling(x)
几何分布
ge.f=function(n,p){U=runif(n)
X=floor(log(U)/log(1-p))+1
X
}
poison分布
rp=function(n,lambda){Y=rep(0,n)for(j in 1:n){i=0;p=exp(-lambda);F=pu=runif(1)while(F<=u){p=lambda*p/(i+1);F=F+pi=i+1}Y[j]=i
}
Y
}
二项分布
rb=function(m,n,p){Y=rep(0,m)
for(j in 1:m){
c=p/(1-p);i=0;pr=(1-p)^n;F=pru=runif(1)while(u>=F){pr=(c*(n-i)/(i+1))*pr;F=F+pri=i+1}Y[j]=i}Y}
连续性随机变量
Poisson随机过程生成方法
模拟案例:Markov链
模拟数据的统计方法
更多推荐
统计模拟与R
发布评论