正态后验分布的MCMC方法

代 码 是 对 原 文 例 子 的 一 个 验 证 , 用 的 R 语 言 , 使 用 的 M e t r o p o l i s − H a s t i n g s 方 法 , 写 的 有 点 潦 草 见 谅 见 谅 , 原 文 链 接 \textcolor{green}{代码是对原文例子的一个验证,用的R语言,使用的Metropolis-Hastings方法,写的有点潦草见谅见谅},\\原文链接 R使MetropolisHastings: 概率与统计——正态分布的共轭分布.

一. 正态分布后验分布的MCMC方法

1. 期望 μ \mu μ未知,方差 φ \varphi φ已知的情形

#利用MCMC对正态分布(期望未知,方差已知)的后验分布进行模拟
n   =100 		   #生成100个样本
var = 10		   #总体正态分布的已知方差
X = rnorm(n,23,var)#以23为期望的正态分布生成n个样本,即假定真实期望为23

theta_0=23		 #总体期望所服从的先验分布的均值
phi_0 = 2.25     #总体期望所服从的先验分布的方差
niter = 10^5     #链中状态转移步数
mu = rep(0,niter)#存储每一步后的总体期望值
mu[1]=X[1]		 #总体期望值初始状态赋值

for(i in 2 : niter){
  mu.p = mu[i-1]+rnorm(1,0,1)#利用一个标准正态分布来驱动总体期望值状态转移
  m = rep(mu.p,n)
  s_1 = exp(-(mu.p-theta_0)^2/(2*phi_0))*exp(-(t(X - m)%*%(X - m))[1]/(2*var))
  m = rep(mu[i-1],n)
  s_0 = exp(-(mu[i-1]-theta_0)^2/(2*phi_0))*exp(-(t(X - m)%*%(X - m))[1]/(2*var))
  r = s_1/s_0
  flip = rbinom(1,1,min(r,1))
  mu[i]=if(flip==1)mu.p else mu[i-1]
}
par(mfrow=c(1,2))
h_mu=mu[-(1:niter/2)]
hist(h_mu,breaks=100)
print(mean(h_mu))
x=seq(1,niter,1)
plot(x,h_mu,type="l",xlab="x",ylab="mu",main="MCMC",xlim=c(0,niter),ylim=c(min(h_mu),max(h_mu)),col="blue")

在这里插入图片描述

说明
图示里的MCMC结果虽然比较符合均值为23的正态分布,但并不是每次都能得到比较理想的直方图,有时会出现期望值偏得比较多的情况,这些都与生成的样本向量有关

2. 期望 μ \mu μ已知,方差 φ \varphi φ未知的情形

#利用MCMC对正态分布(期望已知,方差未知)的后验分布进行模拟phi=sigma^2
t_0 = 15		  #预估的先验分布上的自由度t_0
S_0 = 585         #预估的先验分布上的参数S_0

S = 724			  #样本数据与已知总体期望的差的平方和
n = 20			  #样本数据的个数

niter = 10^5	  #链中状态转移步数
phi = rep(0,niter)#存储每一步后的总体方差值
phi[1] = 45 	  #总体方差初始状态赋值


for(i in 2 : niter){
  phi.p = phi[i-1]+rnorm(1,0,3)#利用一个均值0,方差3正态分布来驱动总体期望值状态转移
  r = phi.p^(-n/2)*exp(-S/(2*phi.p)) * dchisq(S_0/phi.p,t_0)*(S_0/phi.p^2)/(phi[i-1]^(-n/2)*exp(-S/(2*phi[i-1])) * dchisq(S_0/phi[i-1],t_0)*(S_0/phi[i-1]^2))
  flip = rbinom(1,1,min(r,1))
  phi[i]=if(flip==1)phi.p else phi[i-1]
}

par(mfrow=c(1,2))
h_phi=phi[-(1:niter/2)]
hist(h_phi,breaks=100)
print(mean(h_phi))
x=seq(1,niter,1)
plot(x,phi,type="l",xlab="x",ylab="phi",main="MCMC",xlim=c(0,niter),ylim=c(min(phi),max(phi)),col="blue")

在这里插入图片描述
说明
方差的MCMC结果是比较稳定的,直方图近似于一个逆卡方分布,方差状态的均值整体稳定在39~40之间,与例题答案39.67比较接近

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个利用 MCMC 方法进行混合模型参数估计的过程。以下是具体步骤: 1. 首先,我们可以使用 MCMCpack 包中的 mvrnorm 函数生成一些混合分布数据,例如: ```R library(MCMCpack) set.seed(1234) n <- 1000 p <- 2 mu <- cbind(c(0, 0), c(3, 3), c(-3, 3)) sigma <- array(c(1, 0.5, 0.5, 2), dim = c(2, 2, 3)) w <- c(0.3, 0.4, 0.3) z <- sample(1:3, size = n, replace = TRUE, prob = w) X <- t(apply(mu[z, ], 1, function(x) mvrnorm(1, x, sigma[z,,]))) ``` 其中,n 表示样本大小,p 表示变量个数,mu 表示每个分量的均值,sigma 表示每个分量的协方差矩阵,w 表示每个分量的权重,z 表示每个观测所属的分量,X 表示生成的混合分布数据。 2. 接下来,我们可以建立混合模型的后分布函数,并使用 MCMCmetrop1R 函数产生相关参数的 MCMC 模拟结果,例如: ```R library(mvtnorm) # 后分布函数 logpost <- function(par, X, w) { mu1 <- par[1:2] mu2 <- par[3:4] sigma1 <- matrix(par[5:8], nrow = 2, byrow = TRUE) sigma2 <- matrix(par[9:12], nrow = 2, byrow = TRUE) pi <- par[13] p1 <- dmvt(X, mu1, sigma1, df = 5, log = TRUE) p2 <- dmvt(X, mu2, sigma2, df = 5, log = TRUE) logpost <- sum(log(exp(p1) * pi + exp(p2) * (1 - pi))) return(logpost) } # MCMC 模拟 library(MCMCpack) niter <- 5000 thin <- 5 burnin <- 1000 par0 <- c(0, 0, 3, 3, rep(1, 8), 0.5) par <- MCMCmetrop1R(logpost, par0, thin = thin, mcmc = niter, burnin = burnin, w = w, X = X) ``` 其中,logpost 函数表示混合模型的后分布函数,par 表示模型的参数向量,niter 表示 MCMC 模拟的迭代次数,thin 表示抽样间隔,burnin 表示燃烧期,par0 表示初始值向量,w 表示每个分量的权重,X 表示生成的混合分布数据。 3. 最后,我们可以计算相关参数的估计和区间估计,并检查是否覆盖了真实值,例如: ```R # 参数估计 library(coda) par.est <- colMeans(as.matrix(as.mcmc(par[-(1:burnin), ]))) # 区间估计 par.ci <- t(sapply(1:ncol(par[-(1:burnin), ]), function(i) { quantile(par[-(1:burnin), i], c(0.025, 0.975)) })) # 检查覆盖率 true.par <- cbind(mu[1, ], mu[2, ], sigma[1,,], sigma[2,,], w[1]) cover.rate <- apply((true.par >= par.ci[, 1] & true.par <= par.ci[, 2]), 2, mean) cover.rate ``` 其中,par.est 表示参数的估计向量,par.ci 表示参数的区间估计矩阵,true.par 表示真实参数向量,cover.rate 表示参数的区间估计覆盖率向量。 以上就是利用 MCMC 方法进行混合模型参数估计的完整过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值