本文是R中mcmc包的一篇帮助文档,作者为Charles J.Geyer。经过knitr编译后的pdf文档可见此处,提供中文译稿的作者:

闫超,天津财经大学统计系2011级研究生,方向:非寿险准备金评估。

高磊,天津财经大学统计系2011级研究生,方向:非寿险准备金评估。

这个案例,我们不关心题目的具体意义,重点放在利用贝叶斯的观点来解决问题时,MCMC在后续的计算中所发挥的巨大作用。我们知道,贝叶斯的结果往往是一个后验分布。这个后验分布往往很复杂,我们难以用经典的方法求解其期望与方差等一系列的数据特征,这时MCMC来了,将这一系列问题通过模拟来解决。从这个意义上说,MCMC是一种计算手段。依频率学派看来,题目利用广义线性模型可以解决,在贝叶斯看来同样以解决,但是遇到了一个问题,就是我们得到的非标准后验分布很复杂。我们正是利用MCMC来解决了这个分布的处理问题。本文的重点也在于此。

在使用MCMC时作者遵循了这样的思路,首先依照贝叶斯解决问题的套路,构建了非标准后验分布函数。然后初步运行MCMC,确定合适的scale。继而,确定适当的模拟批次和每批长度(以克服模拟取样的相关性)。最后,估计参数并利用delta方法估计标准误。

1. 问题的提出

这是一个关于R软件中mcmc包的应用案例。问题出自明尼苏达大学统计系博士入学考试试题。这个问题所需要的数据存放在logit数据集中。在这个数据集中有五个变量,其中四个自变量x1、x2、x3、x4,一个响应变量y。

对于这个问题,频率学派的处理方法是利用广义线性模型进行参数估计,下面是相应的R代码以及结果:

library(mcmc)

data(logit)

out

summary(out)

Call:

glm(formula = y ~ x1 + x2 + x3 + x4, family = binomial(), data = logit,

x = T)

Deviance Residuals:

Min 1Q Median 3Q Max

-1.746 -0.691 0.154 0.704 2.194

Coefficients:

Estimate Std. Error z value Pr(>|z|)

(Intercept) 0.633 0.301 2.10 0.0354 *

x1 0.739 0.362 2.04 0.0410 *

x2 1.114 0.363 3.07 0.0021 **

x3 0.478 0.354 1.35 0.1766

x4 0.694 0.399 1.74 0.0817 .

---

Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 137.628 on 99 degrees of freedom

Residual deviance: 87.668 on 95 degrees of freedom

AIC: 97.67

Number of Fisher Scoring iterations: 6

但是,使用频率学派的分析方法解决这个问题并不是我们想要的,我们希望使用Bayesian分析方法。对于Bayesian分析而言,我们假定数据模型(即广义线性模型)与频率学派一致。同时假定,五个参数(回归系数)相互独立,并服从均值为0、标准差为2的先验正态分布。

定义下面的R函数来计算非标准的对数后验分布概率密度(先验密度与似然函数相乘)。我们为什么要定义成密度函数的对数形式?因为虽然我们是从分布中采样,但是MCMC算法的执行函数metrop()需要的一个参数正是这个分布的密度函数的对数形式。

x

y

lupost

eta

logp

logq

logl

return(logl - sum(beta^2)/8)

}

2. 开始MCMC处理

在完成上面数据以及函数的定义(它们都是mcmc算法的输入参数)之后,我们就可以利用mcmc包中的metrop()来产生随机数据,模拟模型的后验分布。也就是说,我们将要从后验分布中进行取样。

set.seed(42)

beta.init

out

names(out)

[1] "accept" "batch" "initial" "final"

[5] "initial.seed" "final.seed" "time" "lud"

[9] "nbatch" "blen" "nspac" "scale"

[13] "debug"

此处metrop()使用到了如下几种参数:

lupost一个函数对象,即后验分布概率密度函数的对数。

beta.init用来设定马氏链的初始状态。这里是上面广义线性模型的参数估计结果。

nbatch = 1000是采样的样本容量,也就是马氏链的转移次数。

x、y,是传入lupost函数中的一些参数。

metrop()函数的结果是一个list(列表)。模拟的数据存放在out$batch里。刚才的函数运行结果显示接受概率(accept)很低,所以我们调整一下proposal(建议分布)的重要参数scale(即随机游走MH算法的方差)来获得一个更合理的接受概率。什么是接受概率?我们用马氏链的方法对状态空间进行采样,那必然我们有一些值是访问不到的,接受概率就是对这种状况进行衡量的。接受概率大,说明访问越充分,接受概率小,访问就受到了一定的限制,访问不是很细致,但样本的自相关性会减弱。因此,接受概率不是越大越好,也不是越小越好。到底多大的接受概率我们认为才是合理的呢?理论显示,在五个需要估计参数的条件下,接受概率达到20%即可。我们开始尝试不同的scale值进行测试:

out

out$accept

## [1] 0.739

out

out$accept

## [1] 0.371

out

out$accept

## [1] 0.148

out

out$accept

## [1] 0.209

out

out$accept

## [1] 0.2345

可以看到,每个metrop()中第一个参数均为out,它的含义是metrop()的许多参数与生成out的那一次模拟的参数一致,除了这次又修改的部分外,比如scale。这里改变的是scale,这是Metropolis随机游走算法中的一个参数值越大,那么马尔可夫链状态转移就越明显(样本自相关性减弱),但同时接受概率就越低,所以这是一个需要兼顾两者的选择。从运行结果可以看到scale=0.4时满足了我们的要求。

3. 诊断,确定批次长度

我们找到了适合接受概率的scale值,下面我们按此参数增加模拟次数,然后观察结果。

out

out$accept

## [1] 0.2332

out$time

## user system elapsed

## 2.40   0.00   2.41

plot(ts(out$batch))

解释一下metrop()中的参数nbatch,其实与它对应的还有一个参数是blen;nbatch是要模拟的批数,blen是要模拟的每批的长度,blen默认为1。假如nbatch=100,blen=100,那么马氏链共转移100*100=10000次.

acf(out$batch)

在这个问题中,我们不研究收敛的问题。从自相关图可以看出,25阶以后的自相关系数可以忽略不计。所以每批次长度25就够了,为了更加保险,我们在下面的模拟中设置每批次长度为100。什么是批次?这是我们为了估计参数而对模拟的结果进行分组时的一个分组长度,之所以要分组,是因为这样才能克服相关性,使批次的均值之间近似独立。这样估计参数才更有效。

4. MCMC 的参数估计值与标准误

首先,运行以下程序:

out

z^2), x = x, y = y)

out$accept

## [1] 0.2345

out$time

## user system elapsed

## 2.46 0.00 2.54

outfun函数的作用是方便构建一些统计量。对于这个问题,我们关心的是后验均值和方差。均值的计算相对简单,只需要对涉及的变量进行平均。但是方差的计算有点棘手。我们需要利用等式

$$var(X)=E(X^2)-E(X)^2$$

将方差表示为可以通过简单的平均进行估计的两部分的方程。因此,我们只需要得到样本的一阶矩和二阶矩。此处,函数outfun可针对参数(状态向量)z返回c(z, z^2)。function() c(z, z^2)的含义是,每次马氏链转移取样时,得到的一个状态x,把这个状态带入函数中,得到状态本身值,以及它的平方值。这样我们可以求解样本一阶距及二阶矩。

nrow(out$batch)

[1] 100

out$batch[1, ]

[1] 0.6239 0.8217 1.1411 0.4686 0.7494 0.4520 0.7730 1.3696 0.3048 0.6358

out$batch[1, 1] = 0.6239是第一批样本的一阶样本矩,out$batch[1, 6] = 0.452是第一批样本的二阶样本矩,注意这里out$ batch[1, 1] $^2$与out$batch[1, 6]并不相等,因为这里的每批长度(blen)是100,只有当blen=1时,它们才相等。

outfun()函数中参数是必要的,因为函数同样需要传递其他参数(如这里的x和y)到metrop()。

4.1 简单均值的计算

对每批次的均值再求均值

apply(out$batch, 2, mean)

[1] 0.6712 0.7771 1.1814 0.5114 0.7729 0.5465 0.7336 1.5399 0.3878 0.7453

前五个数就是对后验参数均值的蒙特卡洛估计值,紧随其后的五个数是对后验参数二阶矩的估计值。通过下面的程序,得到参数的方差估计.

foo

mu

sigmasq

mu

[1] 0.6712 0.7771 1.1814 0.5114 0.7729

蒙特卡洛标准误(MCSE)通过批次均值进行计算。这是求均值对简单的方法。

(注:方差和标准误是两个不同的概念。方差是一个参数估计,而标准误是对参数估计好坏评价的度量。)

mu.muce

mu.muce

[1] 0.01367 0.01518 0.01785 0.01585 0.01622

额外因素sqrt(out$nbatch)的出现是因为批次均值的方差为$\sigma^{2}/b $,其中b是批次长度,即out$blen;而整体均值的方差为$\sigma^{2}/n$,其中n是迭代总数,即out$blen * out$nbatch。

4.2 均值的函数

下面我们使用delta method 得到后验方差的MC标准误。$ u_{i} $ 代表某个参数单批次的一阶矩的估计值,$\overline u $代表某个参数所有批次均值的均值,它们都是针对一阶矩而言。对于二阶矩而言样有$ v_{i} $和$ \overline v $ 。令$ u=E(\overline u)$, $ v=E(\overline v) $ 。采用delta方法将非线性函数线性化:

$$g(u,v)=v-u^{2}$$

$$\Delta g(u,v)=\Delta v-2u\Delta u $$

也就是说,$ g(\overline u, \overline v)-g(u,v) $ 与 $ (\overline v – v)- 2u(\overline u – u) $具有相同的渐进正态分布。而 $ (\overline v – v)- 2u(\overline u – u) $的方差是$ (v_{i} -v)-2u(u_{i} -u) $方差的1/nbatch倍。这样MCSE可以这样计算:

$$\frac{1}{n_{batch}} \displaystyle \sum_{i=1}^{n_{batch}}[(v_{i} – \overline v)-2\overline u

(u_{i} – \overline u)]^2 $$

我们将以上的计算过程用程序实现:

u

v

ubar

vbar

deltau

deltav

foo

sigmasq.mcse

sigmasq.mcse

[1] 0.004687 0.008586 0.007195 0.007666 0.007714

这五个值就是后验方差的蒙特卡洛标准误(MCSE)。

4.3 均值函数的函数

如果我们对后验标准差也感兴趣的话,也可以通过delta method计算它的标准误,程序如下

sigma

sigma.mcse

sigma.mcse

[1] 0.007565 0.011923 0.009470 0.010789 0.010029

5. 最后的运行

问题已经解决。现在唯一需要改进的就是提高结果的精确度。(试题要求“你的马尔科夫链采样器必须足够长以保证参数估计的标准误低于0.01”)。取模拟批次为500,每批长度为400,运行如下:

out

out$accept

[1] 0.2352

out$time

user system elapsed

50.40 0.01 51.01

(显然,由于模拟的次数增大,程序运行时间变长,当然不同运算速度的计算机可能显示结果并不一样。下面进行均值和方差的估计。)

foo

mu

sigmasq

mu

[1] 0.6636 0.7961 1.1712 0.5075 0.7241

然后计算均值估计的标准误

mu.muce

mu.muce

[1] 0.002972 0.003611 0.003828 0.003604 0.004242

紧接着计算方差估计的标准误

u

v

ubar

vbar

deltau

deltav

foo

sigmasq.mcse

sigmasq.mcse

[1] 0.001062 0.001718 0.001538 0.001574 0.002007

给出标准差的估计以及标准误

sigma

sigma.mcse

sigma.mcse

[1] 0.001752 0.002355 0.002116 0.002192 0.002509

以表格形式展示结果。

后验均值估计:

library(xtable)

data1

colnames(data1)

rownames(data1)

data1.table

print(data1.table, type = "html")

后验方差估计

data2

colnames(data2)

rownames(data2)

data2.table

print(data2.table, type = "html")

后验标准差估计

data3

colnames(data3)

rownames(data3)

data3.table

print(data3.table, type = "html")

计算机什么课学mcmc,MCMC案例学习相关推荐

  1. 计算机什么课学mcmc,科学网—MCMC的深入理解 - 蒋秋华的博文

    今天,重新将MCMC的word版本转换博文格式,但感觉还是写得很不好!重新整理一下!希望能够加深! 1. 采样的理解和Monte Carlo方法 原来学习电子技术时,对电压信号采样,有信号保持,采样间 ...

  2. 计算机什么课学mcmc,MCMC例子

    '''' 假设目标分布是: 一维的正太分布, i.e., N(0, 1) 建议的转移矩阵Q(i,j)也是正太分布, j 服从 N(i, 2^2) pi(i)Q(i,j)*alpha(i,j) = pi ...

  3. 计算机数值分析课学后感,计算方法课程总结 心得体会

    计算方法课程总结 心得体会 一.课程简介:本课程是信息与计算科学.数学与应用数学本科专业必修的一门专业基础课.我们需在掌握数学分析.高等代数和常微分方程的基础知识之上,学习本课程.在实际中,数学与科学 ...

  4. 学计算机应该怎样学,初学者该如何学习电脑知识

    看到不少刚入门的电脑刚入门者找不到适合自己的学习方法,到处碰壁,那么初学者该如何学习电脑知识呢?接下来大家跟着学习啦小编一起来了解一下学习电脑知识的解决方法吧. 初学者学习电脑知识方法 第一阶段:鼠标 ...

  5. 计算机能学设计吗,计算机平面设计难学吗

    计算机平面设计难学吗?对于学习平面设计,初学者往往不知从何下手,特别是零基础的伙伴们,选择自学,都会遇到很多小问题. 计算机平面设计难学吗?往往许多有兴趣的人都在一开始就退出了,没有进一步的去想知道这 ...

  6. 计算机新课标学习心得体会,【精品】新课标学习心得体会模板锦集10篇

    [精品]新课标学习心得体会模板锦集10篇 在平日里,心中难免会有一些新的想法,马上将其记录下来,这样可以记录我们的思想活动.很多人都十分头疼怎么写一篇精彩的心得体会,下面是小编收集整理的新课标学习心得 ...

  7. 计算机word做课程表实验报告,《用Word制作课程表》“学讲方式”案例分析

    2014年,徐州教育局"大力推进课堂教学改革,改变学与教的方式,使学习变得更主动.有趣.活泼.愉悦,使教学活动更有目的性.针对性.实效性,使老师的教和学生的学变得更有成效.更具教育和生活意义 ...

  8. 职校中的计算机学的是什么,职校计算机专业主要学什么课

    职校计算机专业主要学什么课2020-11-19 15:37:41文/樊越 很多同学都知道计算机是近几年的大热门课程,小编整理了一些计算机专业的课程,大家一起来看看吧. 计算机专业课程 学习计算机的基本 ...

  9. 视频教程-【跟一夫学设计】从0基础到精通学全套coreldraw x7轻松掌握CDR基础加案例学习视频教程-CorelDraw

    [跟一夫学设计]从0基础到精通学全套coreldraw x7轻松掌握CDR基础加案例学习视频教程 中国电商服务联盟品牌讲师.中国国际互联网节品牌顾问. 12年视觉设计经验,5年视觉讲师经验.电商品牌视 ...

最新文章

  1. gui - tkinter 开发
  2. vc mysql封装类_Oracle OCI API封装类VC数据库源码下载-华软网
  3. 年度大片:StackOverflow 2017开发者调查报告
  4. python收集数据程序_用Python挖掘Twitter数据:数据采集
  5. DataReader不奇怪,该出手时就出手!
  6. android dropbox切换账户,android – 如何获取我的APP_KEY和SECRET_KEY的Dropbox同步?
  7. 清华发布新版计算机学科推荐学术会议和期刊列表,与CCF有何不同?
  8. 【Java_Spring】控制反转IOC(Inversion of Control)
  9. 斐波那契数列Java
  10. Visual FoxPro已经过时了吗 ?我也经常问自己!
  11. Sql 列转行字符串
  12. 数据分析师还是算法工程师|用数据多角度解读如何选择
  13. PCIe+Switch高速存储方案设计
  14. 计算机组成原理SRop,【9A文】计算机组成原理历年真题.docx
  15. docker配置centos7(二),dnf,sshd配置及部分其它常用软件
  16. 第一次去曼谷旅游怎么玩?这份省钱攻略请收好
  17. pyQt5 学习笔记(6)设置鼠标(光标)样式
  18. 使用PlatformIO IDE开发Arduino如何安装和调用外部库文件【基于Visual Studio Code平台】
  19. 树莓派4B修复双触摸屏触摸问题
  20. Android编译命令m、mm、mmm区别及工程搭建示例

热门文章

  1. PHP初级学习(三)
  2. java 计算一个月有多少天和多少周
  3. List逆向遍历、反向遍历--Iterator详解
  4. rust哪个护甲高_《废土2》全部武器护甲资料及代码
  5. 二、CRUD操作以及配置解析
  6. linux7 etc下的grub2,Centos7安装 grub2 配置技巧:改变启动顺序
  7. 华为云医疗智能体,助力医疗健康加速智能化
  8. rtl8811au黑苹果10.15_黑苹果10.15Catalina硬件选择+完美配置指南【接入智能家居】...
  9. SQL Server 连接字符串和身份验证
  10. 春生冬至时——今日冬至