MCMC方法的目的是获得服从高维分布的样本,理论涉及平稳分布马尔科夫链转移概率等,还是比较麻烦且不好懂的,但好在网上已有不少讲解得比较详细的。

对于统计计算而言,获得高维分布样本后可以用于计算高维空间的积分。对于统计模型而言,获得高维分布样本后可以用于估计参数。网上大部分讲解理论后给出的是一个估计

参数的例子,对于如何具体用到模型中如简单的回归却还是模糊。

这里分别使用MCMC中的Gibbs抽样、Metropolis-Hasting算法对简单回归模型

中的参数
进行参数估计。给出MCMC用于模型(贝叶斯估计)的一个例子,其它复杂模型使用MCMC估计参数时可类似该过程使用。最后给出R语言中MCMCpack包使用mcmc进行参数估计。

1.用Gibbs抽样

资料来源 Gibbs sampling for Bayesian linear regression in Python,下面的代码会改为R的。

假设模型为,

似然函数,

假设三个未知参数的先验分布,

Gibbs抽样需要获得这三个参数的后验分布,

上面三个分布也就是Gibbs抽样中满条件分布,依次循环抽样至平稳,即为3个参数的分布。

下面推导这些满条件分布,

表示所有样本的联合分布。

一个问题是上式左右是正比连接的,而非等号,貌似没法求。实际上求一个分布时,我们并不需要得到完整密度函数,只需要一些项即可,如某种正态分布

,只需知道
的值即可获得该分布的期望方差(和正态分布形式对比即可知),即得到该分布。左右再加个对数,就只需要知道右边
的系数即可。

更详细可看贝叶斯估计共轭先验分布和分布的核的概念。

对右边的式子取对数(此时

就是似然函数),取出我们关心的含
的项,得到,

由上式得到

的系数为
的系数为
,由这个两个系数得到
后验分布的均值方差,得到后验分布,
先验分布是正态分布,关于其后验分布是否仍是正态,看分布的核的概念,实际就是看看概率函数乘后是否仍是正态分布形式。

同理有,

对右边取对数,拿出仅和

相关的项,

获得

的系数为
的系数为
,得到后验分布的期望方差,从而有后验分布为,

取对数,取出仅含

的项,

注意

服从gamma分布,gamma分布取对数为
,所以这里取
的系数为
的系数为
,根据这两个系数得到gamma分布后验分布为,
#模拟数据
x = -15:15
y <- 3 + 5 * x + rnorm(n=length(x),mean=0,sd=7)plot(x,y)

#参数设定
N = 31mu0 = 0
tau0 = 1mu1 = 0
tau1 = 1alpha = 2
beta = 1#后验分布抽样函数
#beta_0
sample_beta_0 = function(beta1,tau){mean = (tau0*mu0 + tau*sum(y - beta1*x))/(tau0+tau*N)sd = sqrt(1/(tau0+tau*N))rnorm(1,mean = mean, sd = sd)}#beta_1
sample_beta_1 = function(beta0,tau){mean = (tau1*mu1+tau*sum((y-beta0)*x))/(tau1+tau*sum(x^2))sd = sqrt(1/(tau1+tau*sum(x^2)))rnorm(1,mean = mean, sd = sd)}#tau
sample_tau = function(beta0,beta1){alpha = alpha+N/2beta = beta + sum(((y-beta0-beta1*x)^2)/2)rgamma(1,shape=alpha,rate = beta)}#迭代过程
beta0_r = c(0)  #三个参数初始值设为0,0,2
beta1_r = c(0)
tau_r = c(2)n = 1e4for(i in 1:n){beta0_r = c(beta0_r,sample_beta_0(beta1_r[i], tau_r[i]))beta1_r = c(beta1_r,sample_beta_1(beta0_r[i+1],tau_r[i]))tau_r = c(tau_r,sample_tau(beta0_r[i+1],beta1_r[i+1]))}tau_r = sqrt(1/tau_r)  #sigma^2=1/tau,获得sigma

画图看看,

h = 5000:npar(mfrow=c(2,3))plot(beta0_r[h])
abline(h=3,col="red")plot(beta1_r[h])
abline(h=5,col="red")plot(tau_r[h])
abline(h=7,col="red")hist(beta0_r[h])
hist(beta1_r[h])
hist(tau_r[h])

和最小二乘的结果比较看看,

> #看看最小二乘的结果
> model = lm(y~x)
> mean(model$residuals^2)
[1] 51.31251
> modelCall:
lm(formula = y ~ x)Coefficients:
(Intercept)            x  6.990        4.945  >
> #看看Gibbs的结果
> beta0 = mean(beta0_r[h])
> beta1 = mean(beta1_r[h])
> beta0
[1] 2.126934
> beta1
[1] 4.802838
>
> mean((y-beta0-beta1*x)^2)  #单从均方误效果比最小二乘差
[1] 76.57444> mean(tau_r[h])   #tau的估计也还行
[1] 8.579605

真实

为3,最小二乘得到7,Gibbs得到2.1,都比较远,当然这又样本随机的原因。
都比较接近真实。

2.Metropolis-Hasting 算法

摘自A simple Metropolis-Hastings MCMC in R,这里做下解释。

真实模型为

#模拟数据
trueA <- 5
trueB <- 0
trueSd <- 10
sampleSize <- 31# create independent x-values
x <- (-(sampleSize-1)/2):((sampleSize-1)/2)
# create dependent values according to ax + b + N(0,sd)
y <-  trueA * x + trueB + rnorm(n=sampleSize,mean=0,sd=trueSd)plot(x,y, main="Test Data")

训练数据

,假设模型为
,且已知
。需要训练得到的参数

贝叶斯估计中假设真实参数不是固定的常数,而是服从某种分布。这里假设各个参数的先验分布为,

。加上样本信息的后验分布为,

正比符号去掉了无关的

#样本的似然函数
likelihood <- function(param){a = param[1]b = param[2]sd = param[3]pred = a*x + bsinglelikelihoods = dnorm(y, mean = pred, sd = sd, log = T)sumll = sum(singlelikelihoods)return(sumll)
}# 参数的先验分布似然
prior <- function(param){a = param[1]b = param[2]sd = param[3]aprior = dunif(a, min=0, max=10, log = T)bprior = dnorm(b, sd = 5, log = T)sdprior = dunif(sd, min=0, max=30, log = T)return(aprior+bprior+sdprior)
}#联合后验分布似然
posterior <- function(param){return (likelihood(param) + prior(param))
}

######## Metropolis 算法 ################
proposalfunction <- function(param){            #建议密度函数return(rnorm(3,mean = param, sd= c(0.1,0.5,0.3)))
}run_metropolis_MCMC <- function(startvalue, iterations){chain = array(dim = c(iterations+1,3))  #按列分开了参数chain[1,] = startvaluefor (i in 1:iterations){proposal = proposalfunction(chain[i,])probab = exp(posterior(proposal) - posterior(chain[i,])) #前面取了对数,这里取指数if (runif(1) < probab){       #使用 mcmc 接受-拒绝样本,获得(beta_0,beta_1,sigma)的多维联合样本chain[i+1,] = proposal}else{chain[i+1,] = chain[i,]}}return(chain)
}startvalue = c(4,0,10)
chain = run_metropolis_MCMC(startvalue, 10000)burnIn = 5000
acceptance = 1-mean(duplicated(chain[-(1:burnIn),]))

par(mfrow = c(2,3))hist(chain[-(1:burnIn),1],nclass=30, , main="Posterior of a", xlab="True value = red line" )
abline(v = mean(chain[-(1:burnIn),1]))
abline(v = trueA, col="red" )hist(chain[-(1:burnIn),2],nclass=30, main="Posterior of b", xlab="True value = red line")
abline(v = mean(chain[-(1:burnIn),2]))
abline(v = trueB, col="red" )hist(chain[-(1:burnIn),3],nclass=30, main="Posterior of sd", xlab="True value = red line")
abline(v = mean(chain[-(1:burnIn),3]) )
abline(v = trueSd, col="red" )plot(chain[-(1:burnIn),1], type = "l", xlab="True value = red line" , main = "Chain values of a", )
abline(h = trueA, col="red" )plot(chain[-(1:burnIn),2], type = "l", xlab="True value = red line" , main = "Chain values of b", )
abline(h = trueB, col="red" )plot(chain[-(1:burnIn),3], type = "l", xlab="True value = red line" , main = "Chain values of sd", )
abline(h = trueSd, col="red" )

3.MCMCmetrop1R()函数

使用贝叶斯估计的一个主要问题是,

中分母难求,办法是当作以
为概率求期望,实际就是积分,那么只要用mcmc方法对
抽样,针对
求均值即可。

在R的MCMCpack包里面,只要写出似然函数+先验即可。

仍然以一般回归为例,对数似然为

的无关项去掉了假设了
,当然
也可以做个先验分布,这里为方便假设已知。

先验分布,假设各个参数相互独立,先验分布均用正态分布,

,对数为
,每个
都是正态分布。当然也可以用个3维正态分布做先验。
library(MCMCpack)x1 = runif(100)
x2 = runif(100)x_data = cbind(1,x1,x2)
y_data = 3 + x1 + 5*x2 + rnorm(100)log_fun = function(beta,x,y){dim(beta) = c(3,1)loglike = sum(-(y- x %*% beta)^2)    #对数似然prior = sum(log(sapply(beta,dnorm))) #给个先验分布的对数,程序会自动执行mcmcloglike + prior
}m = MCMCmetrop1R(log_fun, theta.init=c(0,0,0),x=x_data, y=y_data,mcmc=4000, burnin=500)
#参数x,y和log_fun中的x,y对应#模型诊断
raftery.diag(m)plot(m)summary(m)Iterations = 501:4500
Thinning interval = 1
Number of chains = 1
Sample size per chain = 4000 1. Empirical mean and standard deviation for each variable,plus standard error of the mean:Mean     SD Naive SE Time-series SE
[1,] 2.881 0.1965 0.003106        0.01008
[2,] 1.182 0.2418 0.003824        0.01318
[3,] 5.024 0.2425 0.003834        0.013702. Quantiles for each variable:2.5%   25%   50%   75% 97.5%
var1 2.4936 2.750 2.871 3.021 3.266
var2 0.7219 1.019 1.176 1.344 1.657
var3 4.5547 4.855 5.023 5.190 5.500

和真实还是很接近的。且参数接近正态分布,这是因为正态样本关于均值的共轭先验分布为正态分布,故后验分布为正态分布,即上图。

参数估计_MCMC-模型参数估计相关推荐

  1. cox风险回归模型参数估计_信用风险管理:分类模型和超参数调整

    cox风险回归模型参数估计 The final part aims to walk you through the process of applying different classificati ...

  2. AR模型参数估计、Y-W方程、L-D算法原理部分

    实验:AR模型参数估计 一.实验目的 二.实验内容 三.实验原理及方法 3.1 AR模型 3.1.1 AR模型参数估计 3.1.2 AR模型参数和自相关函数的关系 3.2 Y-W方程的解法--L-D算 ...

  3. dsge模型参数估计 matlab,DSGE求解和模型参数估计的一些认识

    DSGE求解和模型参数估计的一些认识 其实DSGE最难的地方不在于模型的optimality condition的推导,也不在于寻找Saddle-path.最难的还是在于参数估计,最大似然或者是贝叶斯 ...

  4. ar模型matlab fpe,基于Matlab的AR模型参数估计.pdf

    基于Matlab的AR模型参数估计.pdf 维普资讯 2OO5年第39卷No4 39 基于Matlab的AR模型参数估计* 陈国强 赵俊伟 黄俊杰 刘万里 河南理工大学 摘 要:基于Matlab用时间 ...

  5. matlab 模型参数估计值,基于MATLAB的AR模型参数估计

    第 4 卷 第 11 期 中 国 水 运 Vol.4 No.11 2006 年 11 月 China Water Transport Novembdr 2006 收稿日期:2006-9-16 作者简介 ...

  6. [DataAnalysis]多元线性回归深入浅出-案例+模型假设+参数估计方法+模型评判方法+变量选择+多重共线性问题

    一.案例介绍 1.目的:利用上市公司当年的公开财务指标预测来年盈利情况最重要的投资人决策依据. 2.数据来源:随机抽取深市和沪市2002和2003年的500个上市公司样本预测来年的净资产收益率. 3. ...

  7. python 最小二乘回归 高斯核_最经典的回归模型参数估计算法—最小二乘

    首先,我们要明白最小二乘估计是个什么东西?说的直白一点,当我们确定了一组数的模型之后,然后想通过最小二乘的办法来确定模型的参数.举个两变量(一个自变量.一个因变量)线性回归的例子来说明一下,如下面所示 ...

  8. 【物理应用】基于matlab白鲸算法太阳能光伏模型参数估计【含Matlab源码 2018期】

    ⛄一.太阳能光伏模型简介 1 太阳能电池和光伏模板1 太阳能电池模板是一种能够吸收太阳光并将其转换为电流的半导体装置,也就是太阳能电池板.它是由多个p-n结串联组成的,其转换效率一般为17%左右.电池 ...

  9. 统计学中的参数估计思想与参数估计方法python实现(以2010-2014上证指数收益率的均值区间估计为例)

    参数估计是统计学中"推断统计" 的一部分,推断统计是统计学中最重要的部分之一,它源于统计学中一个最基本的目的,也是这个概率论与数理统计这一学科的数理统计部分存在的唯一目的:用样本推 ...

最新文章

  1. 页面加载后如何使JavaScript执行?
  2. GDCM:gdcm::ServiceClassUser的测试程序
  3. Django第二天笔记
  4. 怎么导出链接_如何导出CocosCreator项目供cocos2dx加载
  5. php软件开发--公众平台
  6. UE3采用多进程编译Shader
  7. Error: getaddrinfo ENOTFOUND localhost
  8. (day 52 - 约舍夫环问题 ) 剑指 Offer 62. 圆圈中最后剩下的数字
  9. 合并两个有序数组js
  10. np学习——OSPF的典型配置案例
  11. Java内存模型——《深入理解Java虚拟机》笔记
  12. C盘清理 / 磁盘清理
  13. xmake v2.5.9 发布,改进 C++20 模块,并支持 Nim, Keil MDK 和 Unity Build
  14. ffmpeg v4l2集成分析
  15. 计算某一天是星期几(C语言,可运行)
  16. 那些 996 公司的员工怎么样了?
  17. Android View学习笔记(三):Scroller的原理剖析及使用(上)
  18. b站m4s文件怎么转mp4
  19. java web热区链接_HTML图片热区map area的用法
  20. html5星际,纯原版复刻 牛人打造星际争霸HTML5版

热门文章

  1. MySQL性能优化的21个最佳实践
  2. Unity3D热更新全书-脚本(二) 两级分化
  3. 10个免费的javascript富文本编辑器(jQuery and non-jQuery)
  4. 提高电子商务转化率的关键因素
  5. “网工”可以跳越“网管”吗?
  6. SD-WAN技术解决方案有什么作用?—Vecloud
  7. Windows Azure Web Site (9) Web Site公网IP地址
  8. CentOS tcpdump的使用实例
  9. vtigercrm安装
  10. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)