【发布时间】: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 一样考虑它。基本上是贝叶斯回归。