jagam
位于 mgcv
包(package)。 说明
auto-generate 模型规范代码和关联数据的设施,可在 JAGS(或 BUGS)中使用 GAM 进行模拟。这对于推断具有最好在 JAGS 中编码的复杂随机效应结构的模型非常有用。这是对标准 GAM 进行推断的一种非常低效的方法。这个想法是,jagam
为模型的平滑部分生成模板 JAGS 代码和关联数据。然后直接编辑该模板以包含其他随机分量。在使用所得模型进行仿真之后,提供了用于使用模型平滑组件进行绘图和预测的工具。
用法
jagam(formula,family=gaussian,data=list(),file,weights=NULL,na.action,
offset=NULL,knots=NULL,sp=NULL,drop.unused.levels=TRUE,
control=gam.control(),centred=TRUE,sp.prior = "gamma",diagonalize=FALSE)
sim2jam(sam,pregam,edf.type=2,burnin=0)
参数
formula |
GAM 公式(请参阅 |
family |
这是一个族对象,指定要使用的分布和链接函数。有关更多详细信息,请参阅 |
data |
包含模型响应变量和公式所需的协变量的 DataFrame 或列表。默认情况下,变量取自 |
file |
应写入 JAGS 模型规范代码的文件的名称。设置和查询当前工作目录请参见 |
weights |
数据的先验权重。 |
na.action |
一个函数,指示当数据包含“NA”时应该发生什么。默认值由 ‘options’ 的“na.action”设置设置,如果未设置,则为“na.fail”。 “factory-fresh” 默认为“na.omit”。 |
offset |
可用于提供模型偏移以用于拟合。请注意,与 |
control |
用于替换 |
knots |
这是一个可选列表,包含用户指定的用于基础构造的结值。对于大多数底座,用户只需提供要使用的结,该结必须与提供的 |
sp |
此处可以提供平滑参数向量。必须按照平滑项在模型公式中出现的顺序提供平滑参数(不要忘记零空间惩罚)。负元素表示应该估计参数,因此固定参数和估计参数的混合是可能的。如果平滑共享平滑参数,则 |
drop.unused.levels |
默认情况下,未使用的级别会在拟合之前从因子中删除。对于某些涉及因子变量的平滑,您可能需要将其关闭。仅当您知道自己在做什么时才这样做。 |
centred |
是否应该像 GAMS 中那样对平滑应用居中约束?仅当您确切知道自己在做什么时才将其设置为 |
sp.prior |
平滑参数先于 |
diagonalize |
是否应该重新参数化平滑以具有 i.i.d.高斯先验(如果可能)?对于高斯数据,这允许使用高效的共轭采样器,并且如果加载了 JAGS |
sam |
jags 样本对象,至少包含字段 |
pregam |
标准 |
edf.type |
由于 EDF 不是唯一定义的,并且可能会受到添加到 JAGS 模型文件中的随机结构的影响,因此提供了 3 个选项。查看具体信息。 |
burnin |
从模拟链中丢弃的烧录量。限制为链长的 0.9。 |
细节
使用平滑系数的多元正态先验,可以轻松地将平滑合并到 JAGS 模型中。平滑参数和平滑惩罚矩阵直接指定先验多元正态精度矩阵。通常,平滑惩罚并不对应于满秩精度矩阵,这意味着不适当的先验不适合吉布斯采样。为了纠正这个问题,Marra 和 Wood (2011) 中建议的零空间惩罚被添加到通常的惩罚中。
在加性建模环境中,通常将平滑居中,以避免与每个平滑项的截距(除了全局截距之外)相关的可识别性问题。在使用 JAGS 进行吉布斯采样的情况下,技术上可以省略这种居中,因为无论如何我们都会强制先验的适当性,而这种适当性意味着形式模型的可识别性。然而,在大多数情况下,这种形式上的可识别性是相当人为的,并不意味着具有统计意义的可识别性。相反,它只会大量夸大置信区间,因为多个截距项无法从数据中识别出来,而只能从先验中识别出来。默认情况下,jagam
对所有平滑施加标准 GAM 可识别性约束。 centred
参数确实允许您关闭此函数,但不建议这样做。如果您确实设置了centred=FALSE
,那么链收敛和混合检查应该特别严格。
模型设置的最后一个技术问题是系数和平滑参数的初始条件的设置。采取的方法是采用 mgcv
在其他地方使用的默认初始平滑参数值,并对这些平滑参数执行单个 PIRLS 拟合步骤,以获得平滑系数的起始值。在完全共轭更新的设置中,系数的初始值并不重要,并且在不提供它们的情况下也可以获得良好的结果。但在通常的设置中,至少某些更新需要切片采样,那么有时在没有初始值的情况下会获得非常差的结果,因为采样器根本无法找到后验模式的区域。
sim2jam
函数取部分gam
目的 (pregam
) 从jagam
以及标准的模拟输出rjags
形式并创建一个简化版本gam
对象,适合绘制和预测模型的平滑分量。sim2gam
计算每个平滑的有效自由度,但应该注意的是,在具有复杂随机效应结构的模型的背景下,有多种可能性可以执行此操作。最简单的方法(edf.type=0
) 是计算如果平滑是未加权高斯加性模型的一部分,则该平滑将具有的自由度。如果模型已被修改,使得响应分布和/或链接不是指定的那些,则可以选择使用此选项jagam
。第二个选项是(edf.type=1
) 使用 edf 计算得出gam
如果它产生了这些估计 - 在 JAGS 模型修改都是关于修改随机效应结构的情况下,这相当于简单地将所有随机效应设置为零以进行有效自由度计算。默认选项(edf.type=2
) 是将 EDF 基于样本协方差矩阵,Vp
,模型系数。如果模拟输出(sim
)包括一个mu
字段,那么这将用于生成权重矩阵W
在XWX = t(X)%*%W%*%X
,其中 EDF 计算自rowSums(Vp*XWX)*scale
.如果mu
未提供,则根据模型矩阵进行估计X
和模拟系数的平均值,但结果W
可能不严格兼容Vp
在这种情况下矩阵。在拟合模型的结构与生成的模板的回归模型有很大不同的情况下jagam
那么默认选项可能没有意义,实际上最好使用选项 0。
值
对于 jagam
包含三个项目的列表
pregam |
标准 |
jags.data |
要提供给 JAGS 的参数列表,其中包含模型规范中引用的信息。 |
jags.ini |
平滑系数和平滑参数的初始化数据。 |
对于 sim2jam
类的对象 "jam"
: mgcv
gamObject
的部分版本,适合绘图和预测。
警告
对于标准 GAM 来说,吉布采样是一种非常慢的推理方法。仅当需要复杂的随机效应结构高于直接 GAMM 方法所能达到的水平时,这才可能是值得的。
检查参数的先验参数是否适合您的目的。
例子
## the following illustrates a typical workflow. To run the
## 'Not run' code you need rjags (and JAGS) to be installed.
require(mgcv)
set.seed(2) ## simulate some data...
n <- 400
dat <- gamSim(1,n=n,dist="normal",scale=2)
## regular gam fit for comparison...
b0 <- gam(y~s(x0)+s(x1) + s(x2)+s(x3),data=dat,method="REML")
## Set directory and file name for file containing jags code.
## In real use you would *never* use tempdir() for this. It is
## only done here to keep CRAN happy, and avoid any chance of
## an accidental overwrite. Instead you would use
## setwd() to set an appropriate working directory in which
## to write the file, and just set the file name to what you
## want to call it (e.g. "test.jags" here).
jags.file <- paste(tempdir(),"/test.jags",sep="")
## Set up JAGS code and data. In this one might want to diagonalize
## to use conjugate samplers. Usually call 'setwd' first, to set
## directory in which model file ("test.jags") will be written.
jd <- jagam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat,file=jags.file,
sp.prior="gamma",diagonalize=TRUE)
## In normal use the model in "test.jags" would now be edited to add
## the non-standard stochastic elements that require use of JAGS....
## Not run:
require(rjags)
load.module("glm") ## improved samplers for GLMs often worth loading
jm <-jags.model(jags.file,data=jd$jags.data,inits=jd$jags.ini,n.chains=1)
list.samplers(jm)
sam <- jags.samples(jm,c("b","rho","scale"),n.iter=10000,thin=10)
jam <- sim2jam(sam,jd$pregam)
plot(jam,pages=1)
jam
pd <- data.frame(x0=c(.5,.6),x1=c(.4,.2),x2=c(.8,.4),x3=c(.1,.1))
fv <- predict(jam,newdata=pd)
## and some minimal checking...
require(coda)
effectiveSize(as.mcmc.list(sam$b))
## End(Not run)
## a gamma example...
set.seed(1); n <- 400
dat <- gamSim(1,n=n,dist="normal",scale=2)
scale <- .5; Ey <- exp(dat$f/2)
dat$y <- rgamma(n,shape=1/scale,scale=Ey*scale)
jd <- jagam(y~s(x0)+te(x1,x2)+s(x3),data=dat,family=Gamma(link=log),
file=jags.file,sp.prior="log.uniform")
## In normal use the model in "test.jags" would now be edited to add
## the non-standard stochastic elements that require use of JAGS....
## Not run:
require(rjags)
## following sets random seed, but note that under JAGS 3.4 many
## models are still not fully repeatable (JAGS 4 should fix this)
jd$jags.ini$.RNG.name <- "base::Mersenne-Twister" ## setting RNG
jd$jags.ini$.RNG.seed <- 6 ## how to set RNG seed
jm <-jags.model(jags.file,data=jd$jags.data,inits=jd$jags.ini,n.chains=1)
list.samplers(jm)
sam <- jags.samples(jm,c("b","rho","scale","mu"),n.iter=10000,thin=10)
jam <- sim2jam(sam,jd$pregam)
plot(jam,pages=1)
jam
pd <- data.frame(x0=c(.5,.6),x1=c(.4,.2),x2=c(.8,.4),x3=c(.1,.1))
fv <- predict(jam,newdata=pd)
## End(Not run)
作者
Simon N. Wood simon.wood@r-project.org
参考
Wood, S.N. (2016) Just Another Gibbs Additive Modeller: Interfacing JAGS and mgcv. Journal of Statistical Software 75(7):1-15 doi:10.18637/jss.v075.i07)
Marra, G. and S.N. Wood (2011) Practical variable selection for generalized additive models. Computational Statistics & Data Analysis 55(7): 2372-2387
Here is a key early reference to smoothing using BUGS (although the approach and smooths used are a bit different to jagam)
Crainiceanu, C. M. D Ruppert, & M.P. Wand (2005) Bayesian Analysis for Penalized Spline Regression Using WinBUGS Journal of Statistical Software 14.
也可以看看
相关用法
- R vcov.gam 从 GAM 拟合中提取参数(估计器)协方差矩阵
- R gam.check 拟合 gam 模型的一些诊断
- R null.space.dimension TPRS 未惩罚函数空间的基础
- R gam.reparam 寻找平方根惩罚的稳定正交重新参数化。
- R extract.lme.cov 从 lme 对象中提取数据协方差矩阵
- R scat 用于重尾数据的 GAM 缩放 t 系列
- R choldrop 删除并排名第一 Cholesky 因子更新
- R smooth.construct.cr.smooth.spec GAM 中的惩罚三次回归样条
- R bandchol 带对角矩阵的 Choleski 分解
- R gam.side GAM 的可识别性边条件
- R cox.ph 附加 Cox 比例风险模型
- R mgcv.parallel mgcv 中的并行计算。
- R gamm 广义加性混合模型
- R pdTens 实现张量积平滑的 pdMat 类的函数
- R Predict.matrix GAM 中平滑项的预测方法
- R Predict.matrix.soap.film 皂膜光滑度预测矩阵
- R smooth.construct.bs.smooth.spec GAM 中的惩罚 B 样条
- R gamlss.gH 计算回归系数的对数似然导数
- R plot.gam 默认 GAM 绘图
- R mvn 多元正态加性模型
- R gfam 分组家庭
- R smooth.construct GAM 中平滑项的构造函数
- R pcls 惩罚约束最小二乘拟合
- R gam.fit3 使用 GCV、UBRE/AIC 或 RE/ML 导数计算进行 P-IRLS GAM 估计
- R rTweedie 生成 Tweedie 随机偏差
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Just Another Gibbs Additive Modeller: JAGS support for mgcv.。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。