帮我写一个r语言的M-H抽样法
时间: 2023-06-02 18:05:27 浏览: 108
R语言——简单的抽样方法梳理
好的,下面是使用R语言实现M-H抽样的代码:
```
# 设置目标分布
target_pdf <- function(x){
return(dnorm(x, mean=5, sd=2))
}
# 设置建议分布(正态分布)
proposal_pdf <- function(x, x0, sd){
return(dnorm(x, mean=x0, sd=sd))
}
#定义抽样函数mcmc.mh
mcmc.mh <- function(target_pdf, proposal_pdf, nsim, burnin, x0, sd){
# 初始化参数
x <- numeric(nsim+burnin)
x[1] <- x0
# 运行抽样
for(i in 2:(nsim+burnin)){
# 从建议分布中抽样新样本
x_prop <- rnorm(1, mean=x[i-1], sd=sd)
# 计算接受率
a <- min(1, target_pdf(x_prop)/target_pdf(x[i-1])*proposal_pdf(x[i-1], x_prop, sd)/proposal_pdf(x_prop, x[i-1], sd))
# 以接受率为概率决定是否接受新样本
if(runif(1) <= a){
x[i] <- x_prop
}else{
x[i] <- x[i-1]
}
}
# 返回抽样结果
return(x[(burnin+1):(nsim+burnin)])
}
# 运行M-H抽样
set.seed(123)
samples <- mcmc.mh(target_pdf, proposal_pdf, nsim=10000, burnin=1000, x0=1, sd=2)
# 绘制采样结果的直方图(用于检查结果是否正确)
hist(samples, col="lightblue", main="Metropolis-Hastings Sampler")
```
以上代码实现了在目标分布为正态分布(均值为5,标准差为2)时,使用M-H抽样方法从该分布中抽取随机样本。其中主要步骤包括设定目标分布和建议分布、按照M-H抽样算法进行随机采样等。最终采样结果可以用直方图等方式进行检验。
阅读全文