【问题标题】:Estimating dacay constant with Jags用 Jags 估计 dacay 常数
【发布时间】:2015-12-02 15:53:49
【问题描述】:

我尝试估计我的数据的衰减。让我解释。想象一下,你观察到事件 X,每个事件都有一个影响 y,它随时间衰减 exp(-t/Tau)。您观察时间 t 和事件 x 以及预测其影响 y 的内容。让我给你看看我的 JAGS 代码。

model{
for( j in 1:N ){
  for(i in 1:p){
    td[j,i] <- exp( - t[j,i] / Tau[i] )
  }

  mu[j] <- inprod( X[j,]*td[j,] ,beta[] )
  Y[j] ~ dnorm( mu[j], sigma )
}

   for(j in 1:p){
     bsigma[j] ~dgamma(0.001,0.001);
     beta[j] ~ dnorm(0,bsigma[j]);
     Tau[j] ~ dgamma(0.001,0.001);
   }
   sigma  ~ dgamma(0.001,0.001)
}

我在 R 中生成测试数据如下:

N = 1000;

sigma = 0.1;
beta  = c(0.75,0.33)
tau   = c(5.7,1.3)

X<-cbind(rnorm(N,1,1),rnorm(N,2,1))
t<-cbind(rnorm(N,1,1),rnorm(N,2,1))
t = abs(t);
Y<- rnorm(N,(X*exp(- t/tau ) )%*%as.matrix(beta),sigma)

使用我的模型,我可以成功找到 beta 的值,但我无法估计 Tau 的正确值。
这里是完整的代码:

N = 1000;

sigma = 0.1;
beta  = c(0.75,0.33)
tau   = c(5.7,1.3)

X<-cbind(rnorm(N,1,1),rnorm(N,2,1))
t<-cbind(rnorm(N,1,1),rnorm(N,2,1))
t = abs(t);
Y<- rnorm(N,(X*exp(- t/tau ) )%*%as.matrix(beta),sigma)

####JAGS
##################
library(mcmcplots)
library(runjags)
library(rjags)

hmodel_jags<- function(X,Y,t){
  modelstring = "
  model{
    for( j in 1:N ){
      for(i in 1:p){
        td[j,i] <- exp( - t[j,i] / Tau[i] )
      }

     mu[j] <- inprod( X[j,]*td[j,] ,beta[] )
      Y[j] ~ dnorm( mu[j], sigma )
    }

    for(j in 1:p){
      bsigma[j] ~dgamma(0.001,0.001);
      beta[j] ~ dnorm(0,bsigma[j]);
      Tau[j] ~ dgamma(0.001,0.001);
    }
    sigma  ~ dgamma(0.001,0.001)
  }"
  writeLines(modelstring,con="dec.txt")
  ########
  set.seed(123)


  jags_data <- list(Y = Y,
                t = t,
                X = X,
                p = ncol(X),
                N=nrow(X)
                )
  params <- c( "Tau",'sigma','beta') 
  adapt <- 1000
  burn <- 1000
  iterations <- 1000
  inits <- list( )

  sample <- run.jags(model="dec.txt", thin =2, monitor=params,data=jags_data, n.chains=2, inits=inits, adapt=adapt, burnin=burn,      sample=iterations, summarise=T, method="parallel") 

  sample
}
res_jags_het <- hmodel_jags(X,Y,t) 

【问题讨论】:

  • 我发现很难理解你的代码。如果您从模拟开始解释要处理的数据以及要估计的参数,这将很有帮助(如果您避免在 JAGS 代码中使用 sigma 作为精度,然后作为R 脚本中的标准偏差)。一个直接的困惑:在你的 R 脚本中 beta 如果已修复。但是在您的 JAGS 代码中,您假设它来自具有固定均值和建模精度的正态分布,而不是给 beta 一个无意义的先验。为什么?
  • 感谢您的评论并指出我对 sigma 的错误。观察到 t,y,x。我想估计 beta 和 tau。具有先验平均值 0 的正常 gamma 组合应该类似于岭回归,或者像 ARD 一样考虑它。基本上是贝叶斯回归。

标签: r jags


【解决方案1】:

错误在于您的数据模拟。你有

 Y<- rnorm(N,(X*exp(- t/tau ) )%*%as.matrix(beta),sigma)

关注t/tau。看看如果你这样做会发生什么

 t <- matrix(c(1,1,1,1,1,1,2,2,2,2,2,2), ncol=2)
 tau <- c(1,20)
 t/tau
 [,1] [,2]
 [1,] 1.00  2.0
 [2,] 0.05  0.1
 [3,] 1.00  2.0
 [4,] 0.05  0.1
 [5,] 1.00  2.0
 [6,] 0.05  0.1

有几种方法可以解决这个问题,最直观的方法是遍历 t 的行。

 tt <- matrix(data=NA, nrow=dim(t)[1], ncol=dim(t)[2])
 for(i in 1:dim(t)[1]){
   tt[i,] <- t[i,]/tau
 }
 tt
 [,1] [,2]
 [1,]    1  0.1
 [2,]    1  0.1
 [3,]    1  0.1
 [4,]    1  0.1
 [5,]    1  0.1
 [6,]    1  0.1

我还没来得及重新运行 JAGS 模型以确认这是唯一的问题——我得出门了!

【讨论】:

  • 是的,就是这样。太感谢了!愚蠢的我,我没有正确调试它,我假设它做了我认为它做的事情。你真的帮了我大忙。谢谢人!
猜你喜欢
  • 2014-06-19
  • 2017-04-24
  • 2016-07-03
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多