首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将jagam代码插入runjags (JAGS)模型

将jagam代码插入runjags (JAGS)模型
EN

Stack Overflow用户
提问于 2018-08-14 05:14:37
回答 1查看 161关注 0票数 1

我一直在尝试将平滑融入到我创建的runjags模型中,该模型用于模拟海鸟洞穴的数量和分布。通过从模型输出中提取计数数据以及x和y坐标,并使用此页面http://www.petrkeil.com/?p=2385上的JAGAM教程,我成功地生成了一些平滑代码

我认为我可以通过将平滑合并到jags模型中来提高模型性能,但我不知道如何做到这一点。你能给我一些关于如何实现这一点的建议吗?

我在下面附加了runjags代码和JAGAM输出的一部分。

runjags代码:

代码语言:javascript
复制
for(i in 1:K) { 
S1[i]~dpois(lambda1[i])
SS1[i]~dpois(lambda1[i])
lambda1[i]<-exp(a0+
a1*Tussac[i]+
a2*normalise_DEM_aspect[i]+
a3*normalise_DEM_slope[i]+
a4*Tussac[i]*normalise_DEM_aspect[i]+
a5*Tussac[i]*normalise_DEM_slope[i]+
a6*normalise_sentinel1[i]+
a7*normalise_setinel3[i]+
a8*normalise_sentinel4[i]+
a9*normalise_sentinel5[i]+
a10*normalise_sentinel8[i]+
a11*normalise_sentinel10[i]+
a12*S2[i])
}

JAGAM输出:

代码语言:javascript
复制
readLines("jagam.bug")
"model {"                                                        
"  eta <- X %*% b ## linear predictor"                           
"  for (i in 1:n) { mu[i] <-  exp(eta[i]) } ## expected response"
"  for (i in 1:n) { y[i] ~ dpois(mu[i]) } ## response "          
"  ## Parametric effect priors CHECK tau=1/35^2 is appropriate!" 
"  for (i in 1:1) { b[i] ~ dnorm(0,0.00083) }"                   
"  ## prior for s(x,y)... "                                      
"  K1 <- S1[1:29,1:29] * lambda[1]  + S1[1:29,30:58] * lambda[2]"
"  b[2:30] ~ dmnorm(zero[2:30],K1) "                             
"  ## smoothing parameter priors CHECK..."                       
"  for (i in 1:2) {"                                             
"    lambda[i] ~ dgamma(.05,.005)"                               
"    rho[i] <- log(lambda[i])"                                   
"  }"                                                            
"}" 

示例数据:

代码语言:javascript
复制
S1 Logit_tussac soil_moisture DEM_slope DEM_aspect DEM_elevation sentinel1 sentinel2 sentinel3 sentinel4 sentinel5 sentinel6 sentinel7 sentinel8 sentinel9 sentinel10
NA          NA            NA 14.917334   256.1612      12.24432    0.0513    0.0588    0.0541    0.1145    0.1676    0.1988    0.1977    0.1658    0.1566     0.0770
0    -9.210240             1 23.803741   225.1231      16.88028    0.1058    0.1370    0.2139    0.2387    0.2654    0.2933    0.3235    0.2928    0.3093     0.1601
NA          NA            NA 20.789165   306.0945      18.52480    0.0287    0.0279    0.0271    0.0276    0.0290    0.0321    0.0346    0.0452    0.0475     0.0219
NA   -9.210240             1  6.689442   287.9641      36.08975    0.0462    0.0679    0.1274    0.1535    0.1797    0.2201    0.2982    0.2545    0.4170     0.2252
0    -9.210240             1 25.476444   203.0659      23.59964    0.0758    0.1041    0.1326    0.1571    0.2143    0.2486    0.2939    0.2536    0.3336     0.1937
1    -1.385919             3  1.672511   270.0000      39.55215    0.0466    0.0716    0.1227    0.1482    0.2215    0.2715    0.3334    0.2903    0.3577     0.1957
EN

回答 1

Stack Overflow用户

发布于 2018-09-06 22:29:35

这是一个非常好的问题,也是一个好主意,可以使用jagam (非常有用)的输出将GAM术语添加到您的模型中。对于您的情况,我建议使用jagam只生成GAM术语,而不生成其他项(甚至不是截取),然后将jagam模型输出的相关部分复制/粘贴到您现有的模型代码中,并从jagam获取X数据变量并将其用作您的数据。这是通过示例进行演示的最简单方法:

首先,使用单个线性项X1和单个非线性项X2 (在本例中为多项式,但这无关紧要)模拟一些数据:

代码语言:javascript
复制
library('runjags')
library('mgcv')

set.seed(2018-09-06)

N <- 100
dataset <- data.frame(X1 = runif(N,-1,1), X2 = runif(N,-1,1))
dataset$ll <- with(dataset, 1 + 0.15*X1 + 0.25*X2 - 0.2*X2^2 + 0.15*X2^3 + rnorm(N,0,0.1))
dataset$Y <- rpois(N, exp(dataset$ll))

# Non-linear relationship with log lambda:
with(dataset, plot(X2, ll))

然后运行jagam,但确保通过在右侧指定0+来排除截取项:

代码语言:javascript
复制
# Get the JAGAM stuff excluding intercept:
jd <- jagam(Y ~ 0 + s(X2), data=dataset, file='jagam.txt',
    sp.prior="gamma",diagonalize=TRUE,family='poisson')

或者,您可以将截取项留在此处,并将其从模型中删除。这将为我们提供一个如下所示的jagam.txt文件:

代码语言:javascript
复制
model {
  eta <- X %*% b ## linear predictor
  for (i in 1:n) { mu[i] <-  exp(eta[i]) } ## expected response
  for (i in 1:n) { y[i] ~ dpois(mu[i]) } ## response 
  ## prior for s(X2)... 
  for (i in 1:8) { b[i] ~ dnorm(0, lambda[1]) }
  for (i in 9:9) { b[i] ~ dnorm(0, lambda[2]) }
  ## smoothing parameter priors CHECK...
  for (i in 1:2) {
    lambda[i] ~ dgamma(.05,.005)
    rho[i] <- log(lambda[i])
  }
}

您可以删除第一行和最后一行,以及以for (i in 1:n)开头的两行,因为我们将自己复制这些行。现在复制文件的所有剩余内容,并转到您的(非GAM)模型,其中只有线性预测器(和/或随机效果或其他任何东西)-例如:

代码语言:javascript
复制
model <- 'model{

    for(i in 1:N){      
        log(mean[i]) <- intercept + coef*X1[i]
        Y[i] ~ dpois(mean[i])
    }

    # Our priors:
    intercept ~ dnorm(0, 10^-6)
    coef ~ dnorm(0, 10^-6)

    #data# N, X1, Y
    #monitor# intercept, coef
}'

然后将您复制的GAM位粘贴到末尾,这样您就会得到:

代码语言:javascript
复制
model <- 'model{

    for(i in 1:N){      
        log(mean[i]) <- intercept + coef*X1[i] + eta[i]
        Y[i] ~ dpois(mean[i])
    }

    # Our priors:
    intercept ~ dnorm(0, 10^-6)
    coef ~ dnorm(0, 10^-6)

    #data# N, X1, Y, X
    #monitor# intercept, coef, b, rho

    ## JAGAM
    eta <- X %*% b ## linear predictor
    ## prior for s(X2)... 
    for (i in 1:8) { b[i] ~ dnorm(0, lambda[1]) }
    for (i in 9:9) { b[i] ~ dnorm(0, lambda[2]) }
    ## smoothing parameter priors CHECK...
    for (i in 1:2) {
    lambda[i] ~ dgamma(.05,.005)
    rho[i] <- log(lambda[i])
    }
    ## END JAGAM    
}'

请注意,在GLM行中添加了+ etai以考虑GAM术语,并将b和rho添加到监视器中。这应该是你需要为模型做的所有事情(除了检查平滑参数等的先验信息之外)。

然后我们需要提取新的X数据变量,以便与JAGS一起使用:

代码语言:javascript
复制
X <- jd$jags.data$X

如果需要,您还可以提取b和lambda的初始值。最后,我们可以使用runjags运行模型:

代码语言:javascript
复制
results <- run.jags(model, n.chains=2, data=dataset)
results

当然,通过将jagam代码放入更简单的模型中,这个愚蠢的示例什么也得不到- jagam本可以为我们创建整个模型(包括截取和线性预测)。但是,当将相对较小的GAM组件添加到较大的预先存在的模型中时,这种方法可能会有价值,该模型已经编写为使用runjags中的一些功能……

如果我们想要使用sim2jam返回并在拟合的runjags对象上使用mgcv中的相关诊断/帮助函数,当前需要直接调用rjags来获取更多样本:

代码语言:javascript
复制
library('rjags')
sam <- jags.samples(as.jags(results), c('b','rho'), n.iter=10000)
jam <- sim2jam(sam,jd$pregam)
plot(jam)

这里缺少两件事:

1)无需在rjags中进行更多采样即可使用sim2jam的能力。这需要向rjags包中的mcarray类添加一些内容,我目前正在开发这个包。

2)让template.jags()自动为您完成所有这些工作的能力--这是我将来要实现的事情。

希望这能帮上忙--我很想听听你的进展情况。

哑光

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51830657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档