用Jags估算dacay常数

时间:2015-12-02 15:53:49

标签: r jags

我尝试估算数据的衰减。让我解释。想象一下,你观察事件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) 

1 个答案:

答案 0 :(得分: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模型,但确认这是唯一的问题 - 我得出门了!