跳到内容

rmcelreath/重新思考

存储库文件导航

重新思考

该R包与贝叶斯数据分析课程和书籍一起提供:McElreath 2020。《统计反思》,第二版,CRC出版社。如果你在第一版中使用它,请参阅本文件底部的注释。

它包含用于对后验分布进行快速二次近似以及哈密尔顿蒙特卡罗(通过RStan或cmdstanr-mc-stan.org)的工具。许多软件包都这样做。这个包的特征性区别在于,它强制用户将模型指定为显式分布假设的列表。这比典型的基于公式的工具更加繁琐,但它也更加灵活、强大,而且——最重要的是——对教学和学习非常有用。当学生必须写出模型的每个细节时,他们实际上是在学习模型。

例如,可以使用以下公式列表指定简单的高斯模型:

f<-列表(y~dnorm(mu,sigma),μ~dnorm(0,10),σ~dexp(1))

列表中的第一个公式是结果的概率(可能性);第二个优先于;第三个优先于西格玛.

安装

有三个步骤。(1)安装C++工具链,(2)安装指挥棒,(3)安装重新思考。详情如下。

首先,安装C++工具链。https://mc-stan.org/docs/cmdstan-guide/cmdstan-installation.html#cpp-工具链并遵循您平台的说明。

其次,安装指挥棒包裹。访问https://mc-stan.org/cmdstanr/。首次安装cmdstanr时,还需要使用cmdstanr::install_cmdstan()所有这些麻烦都是值得的。你只需要做一次。如果你不想使用MCMC,你不必完成这一步。

第三,您可以安装重新思考从R内使用:

install.packages(c(“coda”,“mvtnorm”,“devtools”,“loo”,“dagitty”,“shape”)devtools::install_github(“rmcelreath/rethinking”)

请注意重新思考这个包不在CRAN上,只在github上。这个重新思考软件包永远不会出现在CRAN上。所以,如果您在重新思考R版本不可用时出错,那是因为您试图从CRAN安装。请使用上面的github代码。

重新思考苗条-没有MCMC

如果您只想完成课程的前半部分,而不想费心安装MCMC和Stan,那么您可以安装重新思考软件包的“苗条”版本。这样做:

install.packages(c(“coda”,“mvtnorm”,“devtools”,“loo”,“dagitty”)开发工具::install_github(“rmcelreath/重新思考@slim")

这个夸普函数和相关的helper函数应该仍然可以工作,在需要用Stan安装完整版本之前,您可以完成第8章。

二次近似夸普

几乎任何普通的广义线性模型都可以用夸普。要使用二次近似:

图书馆(反思)f<-列表(y~dnorm(mu,sigma),μ~dnorm(0,10),σ~dexp(1))适合<-quap(f、,数据=列表(y=c(-1,1)),开始=列表(mu=0,sigma=1))

对象适合保存结果。对于边缘后验分布的总结,请使用总结(适合)精确(适合):

平均sd 5.5%94.5%亩0.00 0.59-0.95 0.95西格玛0.84 0.33 0.31 1.36

它还支持向量化参数,这对类别来说很方便。参见示例?呱呱.

在教科书的第一版中,这个函数被称为地图。它仍然可以与该别名一起使用。它被重命名了,因为名称地图具有误导性。该函数产生后验分布的二次近似值,而不仅仅是最大后验(MAP)估计值。

哈密尔顿蒙特卡罗乌兰姆(和地图2stan)

可以使用以下两种工具之一将相同的公式列表编译为Stan(mc-Stan.org)模型:乌兰姆地图2stan对于简单的模型,它们是相同的。乌兰姆是一个更新的工具,允许更大的灵活性,包括显式变量类型和自定义分布。地图2stan是第一版软件包和教科书中的原始工具。今后,将向添加新功能乌兰姆.

乌兰姆以Stanisław Ulam命名,他是Monte Carlo方法的父母之一,也是Stan项目的同名者。它的发音类似于[OO-lahm],而不像[YOU-lamm]。

这两种工具采用的输入类型与夸普:

fit_stan<-ulam(f,数据=列表(y=c(-1,1)))

链条自动运行,前提是rstan公司已安装。链诊断显示在精度(fit_stan)输出:

平均sd 5.5%94.5%n_eff Rhat西格玛1.45 0.72 0.67 2.84 145 1亩0.12 1.04-1.46 1.59 163 1

对于乌兰姆模型,情节显示的信息与精密度轨迹图显示链。

提取样品返回列表中的示例。提取.优先并返回列表中的样本。

这个斯坦菲特对象本身位于@斯坦菲特狭槽。你可以用Stan模型直接做任何事情。

Stan代码可以使用支柱(fit_stan):

数据{实y[2];}参数{实际<下限=0>σ;实亩;}模型{σ~指数(1);mu~正态(0,10);y~正态(mu,sigma);}

请注意乌兰姆不关心R分布名称。您可以使用Stan-style名称:

fit_stan<-乌兰姆(拥护者(y~正常(mu,sigma),mu~正常(0,10),σ~指数(1)),数据=列表(y=c(-1,1))

后验预测

全部夸普,乌兰姆、和地图2stan可以对对象进行后处理以生成后验预测分布。

链接用于计算来自后验分布的样本上的任何线性模型的值。

模拟用于模拟后验预测分布,从参数的后验分布模拟样本的结果。模拟也可用于模拟先前的预测。

请参见?链接?模拟了解详细信息。

后检查自动计算后验预测检查。它只是使用链接模拟.

多级模型公式

While期间夸普大多数情况下仅限于固定效应模型,乌兰姆可以指定多级模型,甚至非常复杂的模型。例如,一个简单的可变截距模型看起来像:

#准备数据数据(UCBadmit)UCBadmit$male<-as.integer(UCBadmit$applicationr.gender==“male”)UCBadmit$部门<-rep(1:6,每个=2)UCBadmit$applicant.gender<-空#可变截获模型m_glmm1<-ulam(拥护者(承认~二项式(应用,p),logit(p)<-a[部门]+b*男性,a[dept]~正常(abar,sigma),abar~正常(0,4),σ~半正态(0,1),b~正常(0,1)),数据=UCBadmit)

类似的变坡度模型为:

m_glmm2<-ulam(拥护者(承认~二项式(应用,p),logit(p)<-a[部门]+b[部门]*男性,c(a,b)[dept]~多重正规(c(abar,bbar),Rho,sigma),abar~正常(0,4),bbar~正常(0,1),σ~半正态(0,1),Rho~lkjcorr(2)),数据=UCBadmit)

表达变化斜率模型的另一种方法是使用一个具有变化效果的向量。这可以通过在公式中使用显式向量声明来实现:

m_glmm3<-ulam(拥护者(承认~二项式(应用,p),logit(p)<-v[dept,1]+v[dett,2]*男性,向量[2]:v[dept]~multi_normal(c(abar,bbar),Rho,sigma),abar~正常(0,4),bbar~正常(0,1),σ~半正态(0,1),Rho~lkjcorr(2)),数据=UCBadmit)

那个向量[2]:v[dept]表示“为每个唯一的dept声明一个长度为2的向量”。为了访问这些向量的元素,线性模型使用括号内的多个索引:[部门,1].

该策略可以进一步,方法也可以声明为向量:

m_glmm4<-ulam(拥护者(承认~二项式(应用,p),logit(p)<-v[dept,1]+v[dett,2]*男性,向量[2]:v[dept]~multi_normal(v_mu,Rho,sigma),向量[2]:v_mu~法线(0,1),σ[1]~半正规(0,1),σ[2]~半正规(0,2),Rho~lkjcorr(2)),数据=UCBadmit)

完全非中心参数化也可以直接编码:

m_glmm5<-乌兰姆(拥护者(承认~二项式(应用,p),logit(p)<-v_mu[1]+v[dept,1]+(v_mu[2]+v[dept,2])*男性,矩阵[dept,2]:v<-t(diag_pre_multiply(sigma,L_Rho)*z),矩阵[2,dept]:z~正规(0,1),向量[2]:v_mu[[1]~法线(0,4),向量[2]:v_mu[2]~法线(0,1),向量[2]:sigma~half_normal(0,1),cholesky_factor_corr[2]:L_Rho~lkj_cor_cholesky(2)),数据=UCBadmit)

在上面,变化效应矩阵v(v)由z分数矩阵构成z(z)和中包含的协方差结构西格玛和Cholesky因素L_Rho(左旋).注意双括号符号v_mu[[1]允许向量的每个索引具有不同的优先级。

WAIC和LOOCV的对数似然计算

乌兰姆可以选择返回逐点的log-likelihood值。这些是计算WAIC和PSIS-LOO所需的。这个日志_链接参数启用此选项:

m_glmm1<-ulam(拥护者(承认~二项式(应用,p),logit(p)<-a[部门]+b*男性,a[dept]~正常(abar,sigma),abar~正常(0,4),σ~半正态(0,1),b~正常(0,1)),数据=UCBadmit,log_lik=TRUE)WAIC(m_glmm1)

附加代码已添加到Stan模型的生成数量块中(请参见支柱(m_glmm1)):

生成的数量{向量[12]log_lik;向量[12]p;对于(1:12中的i){p[i]=a[部门[i]]+b*男性[i];p[i]=库存记录(p[i]);}对于(1:12中的i)log_lik[i]=二项式lpmf(允许[i]|应用[i],p[i]);}

条件语句、自定义分布和混合模型

乌兰姆还支持if-then语句和自定义分发分配。这些对于混合模型的编码很有用,例如零膨胀泊松模型和离散缺失值模型。

这是一个零膨胀泊松模型的例子。

#零膨胀泊松#gen数据优先-文本示例prob_drink<-0.2#20%天rate_work<-1平均每天1份手稿N<-365饮料<-rbinom(N,1,prob_drink)y<-作为整数((1-饮料)*rpois(N,rate_work))x<-rorm(N)#伪协变量#现在的ulam代码m_zip<-ulam(拥护者(y|y==0~自定义(log_mix(p,0,poisson_lpmf(0|lambda))),y|y>0~自定义(log1m(p)+poisson_lpmf(y|lambda)),logit(p)<-ap,对数(λ)<-al+bl*x,ap~dnorm(0,1),al~dnorm(0,10),bl~正常(0,1)) ,数据=列表(y=y,x=x)

上述公式中前两行对应的Stan代码为:

用于(1:365中的i)如果(y[i]>0)目标+=log1m(p)+泊松lpmf(y[i]|lambda[i]);用于(1:365中的i)如果(y[i]==0)目标+=log_mix(p,0,poisson_lpmf(0|lambda[i]));

什么习俗是定义自定义目标更新。|运算符使该行具有条件。请注意对数1m,日志_混合、和泊松_lpmf是Stan函数。

相同的习俗分布方法允许在离散缺失值上边缘化。让我们介绍一下加州大学巴德米特分校早期的数据。

UCBadmit$男2<-UCBadmit$男UCBadmit$male2[1:2]<-(-1)#缺失代码UCBadmit$male2<-as.integer(UCBadmit$male2)

现在模型需要检测何时马来酸2缺少(-1),然后计算未知状态的混合物。

m_mix<-ulam(拥护者(admin|male2==-1~自定义(log_mix(phi_尺寸,二项式lpmf(允许|应用程序,pm1),二项式lpmf(允许|应用程序,p_m0)),承认|male2>-1~二项式(应用程序,p),logit(p)<-a[部门]+b*男性2,logit(p_m1)<-a[部门]+b*1,logit(p_m0)<-a[部门]+b*0,雄性2 |雄性2>-1~伯努利(phi _ male),phi_male~β(2,2),a[dept]~正常(0,4),b~正常(0,1)),数据=UCBadmit)

注意添加了phi_规格平均未知状态。

连续缺失数据插补

原则上,缺失实值数据的插补很容易:只需用一个参数替换每个缺失的值。实际上,这涉及到一堆烦人的簿记。乌兰姆具有名为的宏合并丢失(_M)来简化这一点。

UCBadmit$x<-rnorm(12)UCB限额$x[1:2]<-不适用m_miss<-乌兰姆(拥护者(承认~二项式(应用,p),logit(p)<-a+b*男性+bx*x_合并,x_合并~正常(0,1),x_merge<-合并丢失(x,x_impute),a~正态(0,4),b~正常(0,1),bx~正态(0,1)),数据=UCBadmit)

什么合并丢失(_M)就是找到不适用中的值x个(以第一个参数的符号为准),构建一个参数向量x输入(_I)(无论第二个参数是什么名称)的正确长度,并将一个向量拼凑在一起x_合并在正确的位置包含这两者。然后,您可以在该向量之前指定一个优先级,并像往常一样在线性模型中使用它。

合并是在Stan模型运行时使用自定义功能块完成的。查看Stan代码支柱(m_miss)所有可爱的细节。

缺少合并是宏的一个示例,这是一种乌兰姆使用函数名触发特殊编译。在这种情况下,合并丢失(_M)两者都在Stan模型中插入一个函数,并构建必要的索引,以在运行时查找缺少的值。系统完成后,宏将获得完整的文档。

高斯过程

简单的高斯过程,如本书第13章中的大洋洲岛屿示例,如下所示:

数据(Kline2)d<-Kline2数据(岛屿DistMatrix)d$社会<-1:10日期<-list(y=d$total_tools,社会=d$社会,log_pop=日志(d$population),Dmat=岛屿分布矩阵)m_GP1<-ulam(列表主义者(y~泊松(mu),log(mu)<-a+aj[society]+b*log_pop,a~正常(0,10),b~正常(0,1),向量[10]:aj~multi_normal(0,SIGMA),矩阵[10,10]:SIGMA<-cov_GPL2(Dmat,etasq,rhosq,0.01),etasq ~指数(1),rhosq~指数(1)),数据=dat)

这只是一个普通的可变截距模型,但所有10个截距都是从单个高斯分布中得出的。协方差矩阵SIGMA公司在通常的L2-形式中定义。再一次,覆盖GPL2是一个宏,它在Stan代码中插入一个函数,以便在模型运行时计算协方差矩阵。

更奇特的高斯过程需要不同的参数化。这些也可以建造。下面是一个使用151种灵长类物种和系统发育距离矩阵的示例。首先,准备数据:

数据(灵长类301)数据(灵长类301_distance_matrix)d<-灵长类301d$name<-as.character(d$name)dstan<-d[完成案例(d$sociallearning,d$research_efort,d$body,d$brain),]#dstan中spp的剪枝距离矩阵spp_obs<-dstan$namey<-灵长类301_距离矩阵y2<-y[spp_obs,spp_obs]#缩放距离y3<-y2/最大值(y2)

现在,该模型是一个非中心L2-高斯过程:

m_GP2<-ulam(拥护者(社交学习~poisson(lambda),log(λ)<-a+g[spp_id]+b_ef*log_research_efort+b_body*log_body+b_eq*log_brain,a~正态(0,1),向量[N_spp]:g<<-L_SIGMA*eta,向量[N_sp]:η~法线(0,1),矩阵[N_spp,N_spp]:L_SIGMA<<-cholesky_decompose(SIGMA),矩阵[N_spp,N_spp]:SIGMA<-cov_GPL2(Dmat,etasq,rhosq,0.01),b体~正常(0,1),b_eq ~正常(0,1),bef~正态(1,1),etasq ~指数(1),rhosq~指数(1)),data=列表(N_spp=当前(数据扫描),social_learning=dstan$社会学习,spp_id=1:nrow(数据扫描),log_research_efort=日志(dstan$research_ efort),log_body=日志(dstan$body),log_brain=日志(dstan$brain),Dmat=y3) , 控制=列表(max_treedepth=15,adapt_delta=0.95),sample=FALSE)

这个模型采样不快,所以我设置了sample=假。您仍然可以使用检查Stan代码支柱(m_GP2).

注意协方差SIGMA公司是以与之前相同的方式构建的,但随后我们立即将其分解为Cholesky因子并构建不同的截取通过矩阵乘法。这个<<-操作员告知乌兰姆不是循环,而是直接赋值。所以g<<-L_SIGMA*eta做正确的线性代数。

带链内多线程

使用指挥棒而不是rstan公司是目前在链内使用多线程的唯一方法重新思考。它还可以更快地编译模型,并且在需要重新编译模型时更加智能,因此使用指挥棒建议使用,即使您不需要多线程。

如果你愿意乌兰姆使用指挥棒包,然后您也可以使用

开发工具::install_github(“stan-dev/cmdstanr”)

如果以前没有安装cmdstan,还需要使用安装cmdstan().

然后你需要添加cmdstan=真乌兰姆代码。这个螺纹参数控制每个链的线程数。例子:

N<-1 e4x<-形式(N)m<-1+用途(N,2)y<-rbinom(N,大小=m,prob=inv_logit(-3+x))dat<-list(y=y,x=x,m=m)#两个螺纹m1<-乌兰姆(拥护者(y~二项式逻辑(m,logit_p),logit_p<-a+b*x,a~正常(0,1.5),b~正常(0,0.5)),数据=dat,cmdstan=TRUE,线程=2,刷新=1000)

由于代码的复杂性,有些模型无法以这种方式自动执行多线程。在这种情况下,您可以直接用Stan编写代码。请参见本指南。直接在Stan中编写多线程模型也可以更高效,因为您可以详细选择要传递哪些变量以及将模型的哪些部分传递给多线程。

正在进行的工作

乌拉姆仍在开发中,但大部分功能已完成。它仍然主要是一个教学工具,公开模型的统计细节,同时隐藏Stan中需要的一些编程细节。

地图2stan语法和功能

年纪较大的地图2stan函数对它将看到的公式做出了更有力的假设。这允许提供一些额外的自动化,因此它有一些特殊的语法。乌兰姆相反,它通过宏库支持这些功能。

非中心参数化

下面是一个非中心参数化,它在线性模型之前以不同的效果移动比例参数,这通常对采样更有效:

f4u列表(y~dnorm(mu,sigma),mu<-a+zaj[组]*sigma组[1]+(b+zbj[组]*sigma_组[2])*x,c(zaj,zbj)[group]~dmvnorm(0,Rho_group),a~dnorm(0,10),b~dnorm(0,1),σ~dcauchy(0,1),sigma_group~dcauchy(0,1),Rho_group~dlkjcorr(2))

这本书的第13章提供了关于这个问题的更多细节。

我们可以更进一步,去掉相关矩阵,Rho_组也是从之前开始的。地图2stan通过dmv正常NC密度,它使用相关矩阵的内部Cholesky分解来构建不同的效果。以下是以前的变斜率模型,现在使用非中心符号:

f4nc列表(y~dnorm(mu,sigma),mu<-a+aj[组]+(b+bj[组])*x,c(aj,bj)[组]~dmvnormNC(sigma_group,Rho_group),a~dnorm(0,10),b~d形式(0,1),σ~dcauchy(0,1),σ群~dcauchy(0,1),Rho_group~dlkjcorr(2))

从内部来看,是一个Cholesky因素L_Rho_group(L_Rho_组)用于执行采样。除了Rho_组,它是由它构造的。

半自动贝叶斯插补

可以对简单的贝叶斯插补进行编码。例如,让我们模拟一个缺少预测值的简单回归:

N<-100N_错过<-10x<-形式(N)y<-形式(N,2*x,1)x[样本(1:N,大小=N_miss)]<-NA

这将删除10个x个值。然后地图2stan公式列表只定义了x个:

f5列表(y~dnorm(mu,sigma),μ<-a+b*x,x~dnorm(mux,sigmax),a~dnorm(0,100),b~dnorm(0,10),mux~dnorm(0,100),σ_x~dcauchy(0,2),σ~dcauchy(0,2))m5<-map2stan(f5,数据=列表(y=y,x=x))

什么地图2stan注意缺失的值,查看分配给变量的缺失值分布,构建混合使用观察值和估计值的Stan代码x个回归中的值。请参阅支柱(m5)有关实现的详细信息。

二进制离散缺失值的半自动边缘化

缺少值的二进制(0/1)变量存在特殊障碍,因为Stan无法对离散参数进行采样。因此,与其输入二进制缺失值,地图2stan可以平均(边缘化)他们。与上述情况一样,当地图2stan如果检测到预测变量中的缺失值,它将尝试找到包含这些值的变量的分布。如果这个变量是二元(0/1),那么它将构建一个混合模型,其中每个项都是以采用0/1值的特定组合的变量为条件的对数似然条件。

根据上一节中的示例,我们可以模拟二进制预测器中的缺失:

N<-100N_错过<-10x<-rbinom(N,大小=1,概率=0.5)y<-形式(N,2*x,1)x[样本(1:N,大小=N_miss)]<-NA

模型定义与前一个类似,但在为定义分布的超参数指定约束时也需要谨慎x个:

f6列表(y~dnorm(mu,sigma),μ<-a+b*x,x~bernoulli(φ),a~d形式(0-100),b~dnorm(0,10),φ~β(1,1),σ~dcauchy(0,2))m6<-map2stan(f6,数据=列表(y=y,x=x),约束=列表(phi=“下限=0,上限=1”)

理论上,该算法适用于任何数量的缺少值的二进制预测器。例如,使用两个预测因子,每个预测因子都有缺失:

N<-100N_错过<-10x1<-rbinom(N,大小=1,概率=0.5)x2<-rbinom(N,大小=1,概率=0.1)y<-r形式(N,2*x1-x2,1)x1[样本(1:N,大小=N_miss)]<-NAx2[样本(1:N,大小=N_miss)]<-NAf7列表(y~dnorm(mu,sigma),μ<-a+b1*x1+b2*x2,x1~伯努利(phi1),x2~伯努利(phi2),a~dnorm(0,100),c(b1,b2)~dnorm(0,10),phi1~β(1,1),phi2~β(1,1),σ~dcauchy(0,2))m7<-map2stan(f7,数据=列表(y=y,x1=x1,x2=x2),约束=列表(phi1=“下限=0,上限=1”,phi2=“下限=0,上限=1”)

虽然二进制预报器的未观测值通常不受关注,但它们可以从后验分布中计算出来。添加参数do_discrete_imputation=真指示地图2stan自动执行这些计算。例子:

m6<-map2stan(f6,数据=列表(y=y,x=x),约束=列表(phi=“下限=0,上限=1”),do_discrete_imputation=真)精度(m6,深度=2)

输出包含每种情况的样本,其估算概率为x个取值为1。

该算法通过构造一个混合项列表来工作,这些混合项是计算每个观测到的概率所必需的值。在最简单的情况下,只有一个预测值缺失,隐含混合似然包含两个项:

Pr(y[i])=Pr(x[i]=1)Pr(y[i]|x[i]=1)+Pr(x[i]=0)Pr

在我们示例模型的参数中6米这是:

Pr(y[i])=φ*N(y[i]|a+b,σ)+(1-phi)*N(y[i]|a,σ

现在,循环处理案例很简单并分别计算上述值。类似地,它的后验概率x[i]==1表示为:

Pr(x[i]==1|y[i])=φ*N(y[i]|a+b,σ)/Pr(y[i])

当只有一个预测器存在缺失时,这很简单。如果有两个或多个呢?在这种情况下,必须考虑所有可能的缺失组合。例如,假设有两个预测因子,x1个2个都在案件中失踪现在隐含的混合可能性为:

Pr(y[i])=Pr(x1=1)Pr(x2=1)*Pr(y[i]| x1=1,x2=1

未观察值有四种组合,因此混合可能性中有四项。什么时候?2个相反,我们可以将观察值替换为上述值,然后混合物很容易简化为之前的两项似然:

Pr(y[i]|x2[i]==1)=Pr(x1=1)Pr=0,x2=1)=[Pr(x1=1)Pr(x2=1)+Pr(x1=1)Pr+[Pr(x1=0)Pr(x2=1)+Pr(x1=0.)Pr=Pr(x1=1)Pr(y[i]|x1=1,x2=1)+Pr(x1=0)Pr

这意味着如果我们循环处理案例并将任何观察值插入一般混合似然中,我们可以计算每种情况下具体缺失组合的相关混合.这就是地图2stan做。一般的混合项可以通过算法生成。下面的代码生成以下项的矩阵n个缺失的二进制变量。

合并<-2^nd<-矩阵(NA,nrow=n组合,ncol=n)for(col_var in 1:n)d[,col_var]<-rep(0:1,each=2^(col_var-1),length.out=合并)

第行,共行d日包含术语,列包含变量,每个列中的值是每个变量的对应值。该算法为矩阵中的每一行建立一个线性模型,将混合似然合成为这些行的和,并对观测值进行适当的替换。为了精确起见,所有计算都是在对数刻度上进行的。

高斯过程

基本高斯过程可以用GPL2级分发标签。这意味着具有由普通L2范数距离函数定义的协方差矩阵的多元高斯函数:

k(i,j)=eta^2*exp(-rho^2*D(i,j)^2)+ifelse(i==j,sigma^2,0)

哪里D类是成对距离的矩阵。例如,在空间自相关模型中使用此约定:

图书馆(反思)数据(Kline2)d<-Kline2数据(岛屿DistMatrix)d$社会<-1:10mGP<-map2stan(拥护者(total_tools~dpois(mu),log(mu)<-a+aj[社会],a~dnorm(0,10),aj[社会]~GPL2(Dmat,etasq,rhosq,0.01),etasq~dcauchy(0,1),rhosq~dcauchy(0,1)),data=列表(total_tools=d$总工具,社会=d$社会,Dmat=岛屿DistMatrix),constraints=列表(etasq=“lower=0”,rhosq=“下限=0”),预热=1000,iter=5000,链条=4)

注意使用约束列表将自定义参数约束传递给Stan。本书对这个例子进行了更详细的探讨。

信息标准

两者都有地图地图2stan提供DIC和WAIC。嗯,大多数情况下是这样的。事实上,这两个工具都足够灵活,您可以指定DIC和WAIC都无法正确计算的模型。但对于普通GLM和GLMM来说,它是有效的。参见R帮助?WAIC公司.方便功能比较总结了信息标准比较,包括WAIC的标准错误。

乌兰姆支持WAIC计算log_lik=真参数,它返回厕所包裹。

合奏计算链接模拟一组模型的输出,根据WAIC计算出的Akaike权重对每个模型进行加权。

《统计反思》第1版的代码问题

对的一个小变化链接在本书第七章第一版中打破了两个例子。

R代码7.10

mu.Africa.mean<-适用(mu.Africa,2,平均值)应用时出错(mu.Africa,2,mean):dim(X)必须为正数

这是因为link()现在返回所有线性模型。所以mu。非洲是一个包含mu和gamma的列表。要修复,请使用:

mu.Africa.mean<-apply(亩非洲$亩,2,平均值)

在同一节中的其他apply()调用中使用类似的修复。

R代码7.17

与R代码7.10类似的问题。使用mu.ruggedlo$mu代替mu.rugge dlo。