R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

简介: R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

创建测试数据

作为第一步,我们创建一些测试数据,用于拟合我们的模型。让我们假设预测变量和响应变量之间存在线性关系,因此我们采用线性模型并添加一些噪声。

我将x值平衡在零附近以“去相关”斜率和截距。


trueA <- 5


trueB <- 0


trueSd <- 10


sampleSize <- 31






# 创建独立的x值


x <- (-(sampleSize-1)/2):((sampleSize-1)/2)


# 根据ax + b + N(0,sd)创建因变量
y <-  trueA * x + trueB + rnorm(n=sampleSize,mean=0,sd=trueSd)






plot(x,y, main="Test Data")

定义统计模型

下一步是指定统计模型。我们已经知道数据是用x和y之间的线性关系y = a * x + b和带有标准差sd的正常误差模型N(0,sd)创建的,所以让我们使用相同的模型进行拟合,看看如果我们可以检索我们的原始参数值。

从模型中导出似然函数

为了估计贝叶斯分析中的参数,我们需要导出我们想要拟合的模型的似然函数。可能性是我们期望观察到的数据以我们所看到的模型的参数为条件发生的概率(密度)。因此,假设我们的线性模型y = b + a * x + N(0,sd)将参数(a,b,sd)作为输入,我们必须返回在此模型下获得上述测试数据的概率(这听起来更复杂,正如你在代码中看到的那样,我们只是计算预测y = b + a * x和观察到的y之间的差异,然后我们必须查找概率密度(使用dnorm)发生这种偏差。


likelihood <- function(param){


    a = param[1]


    b = param[2]


    sd = param[3]






    pred = a*x + b


     sumll = sum(singlelikelihoods)


     (sumll)  


}






 slopevalues <- function(x){return(likelihood(c(x, trueB, trueSd)))}



斜率参数的对数似然曲线

作为说明,代码的最后几行绘制了斜率参数a的一系列参数值的似然性。

为什么我们使用对数

您可能已经注意到我返回似然函数中概率的对数,这也是我对所有数据点的概率求和的原因(乘积的对数等于对数之和)。我们为什么要做这个? 因为很多小概率乘以的可能性很快就会变得非常小(比如10 ^ -34)。在某些阶段,计算机程序正在进入数字舍入问题。

定义先验

作为第二步,与贝叶斯统计中一样,我们必须为每个参数指定先验分布。为了方便起见,我对所有三个参数使用了均匀分布和正态分布。

#先验分布


prior <- function(param){


    a = param[1]


    b = param[2]


    sd = param[3]


    aprior =  (a, min=0, max=10, log = T)


    bprior = dnorm(b, sd = 5, log = T)


 }

 后验

先验和可能性的乘积是MCMC将要处理的实际数量。这个函数被称为后验 。同样,在这里我们使用总和,因为我们使用对数。


posterior <- function(param){


   return ( (param) + prior(param))


}
 

 MCMC

现在,实际上是Metropolis-Hastings算法。该算法最常见的应用之一(如本例所示)是从贝叶斯统计中的后验密度中提取样本。然而,原则上,该算法可用于从任何可积函数中进行采样。因此,该算法的目的是在参数空间中跳转,但是以某种方式使得在某一点上的概率与我们采样的函数成比例(这通常称为目标函数)。在我们的例子中,这是上面定义的后验。

这是通过

  1. 从随机参数值开始
  2. 根据称为提议函数的某个概率密度,选择接近旧值的新参数值
  3. 以概率p(新)/ p(旧)跳到这个新点,其中p是目标函数,p> 1表示跳跃

当我们运行这个算法时,它访问的参数的分布会收敛到目标分布p。那么,让我们在R中得到


########Metropolis算法# ################






proposalfunction <- function(param){


    return(rnorm(3,mean = param, sd= c(0.1,0.5,0.3)))


}






run_metropolis_MCMC <- function(startvalue, iterations){


      for (i in 1:iterations){






         if (runif(1) < probab){


            chain[i+1,] = proposal


        }else{


            chain[i+1,] = chain[i,]


        }


    }


    return(chain)


}






 chain = run_metropolis_MCMC(startvalue, 10000)






burnIn = 5000


acceptance = 1-mean(duplicated(chain[-(1:burnIn),]))

使用后验的对数可能在开始时有点混乱,特别是当您查看计算接受概率的行时(probab = exp(后验(建议) - 后验(链[i,])) )。要理解我们为什么这样做,请注意p1 / p2 = exp [log(p1)-log(p2)]。

算法的第一步可能受初始值的偏差,因此通常被丢弃用于进一步分析 。要看的一个有趣的输出是接受率: 接受标准拒绝提案的频率是多少?接受率可以受提议函数的影响:通常,提案越接近,接受率越大。然而,非常高的接受率通常是无益的:这意味着算法“停留”在同一点 。可以证明,20%到30%的接受率对于典型应用来说是最佳的 。

 
###概要#######################






par(mfrow = c(2,3))


hist( [-(1:burnIn),1],nclass=30, , main="Posterior of a", xlab="True value = red line" )


abline(v = mean(chain[-(1:burnIn),1]))










#进行比较:


summary(lm(y~x))

生成的图应该类似于下图。您可以看到我们或多或少地检索了用于创建数据的原始参数,并且您还看到我们获得了一个围绕最高后验值的特定区域,这些区域也有一些数据支持,这是贝叶斯相当于置信度的间隔。

图:上排显示斜率(a)的后验估计,截距(b)和误差的标准偏差(sd)。下一行显示马尔可夫链参数值。

 

还有问题吗?请在下面留言!


相关文章
|
7月前
|
移动开发 算法 数据可视化
【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享(上)
【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享
|
6月前
|
算法 计算机视觉
图像处理之Lanczos采样放缩算法
图像处理之Lanczos采样放缩算法
64 0
|
6月前
|
算法 计算机视觉
图像处理之基于采样距离变换算法
图像处理之基于采样距离变换算法
38 0
|
7月前
|
存储 机器学习/深度学习 算法
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
|
7月前
|
算法 Python
R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列
R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列
|
7月前
|
算法 数据可视化 Windows
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样(2)
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样(2)
|
7月前
|
算法
【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享(下)
【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享
|
7月前
|
算法 数据可视化
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样(1)
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样(1)
|
8天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
5天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。