【问题标题】:Error evaluating the log probability at the initial value (Stan error)在初始值处评估对数概率的错误(斯坦错误)
【发布时间】:2021-05-15 09:34:22
【问题描述】:

我正在尝试在 Stan 中运行具有异方差性的向量自回归模型 (VAR (1))。我可以使用 JAGS 成功运行模型,但我不知道为什么 Stan 在运行相同模型时会出现一些错误。这是数据和模型:

library(rstan)
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())

#Simulating data: 
T <- 100
alpha <- 1
gamma_1 <- 1
gamma_2 <- 0.4
sigma <- y <- rep(NA, length = T)
set.seed(123)
sigma[1] <- runif(1)
y[1] <- 0
for (t in 2:T) {
  sigma[t] <- sqrt(gamma_1 + gamma_2 * (y[t - 1] - alpha)^2)
  y[t] <- rnorm(1, mean = alpha, sd = sigma[t])
}

df <- data.frame(y1 = y, y2 = y, x = rnorm(100,0,1))



model_code <- "
data{
  int<lower=1> T;    //Time
  int<lower=2> K;    //location
  matrix[T,K] y;     //Target variable
  vector[T] x;       //Covariate
}
parameters {
  vector[K] alpha;       //Modelling mean: intercept
  real<lower=0> sigma;   //Modelling y: variance
  matrix[K,K] theta;     //AR(1) coefficient matrix
  row_vector[K] mu_t1 ;  //Initial values of the AR process 
  vector[K] beta;        //Covariate's effect coefficient 
}
transformed parameters {
  matrix[T,K] epsilon;   //Residuals (innovation)
  matrix[T,K] mu;        //Mean of the process
  mu[1,] = mu_t1 ;       //Initial values of the time-series
  
  epsilon[1,] = y[1,] - mu[1,];
  
for(k in 1:K){
  for (t in 2:T){
    mu[t,k] =  alpha[k] + theta[k,] * epsilon[t - 1,]' + beta[k] * x[t];
    epsilon[t,k] =  y[t,k] - mu[t,k] ;
    }
  }
 
}
model{
  //priors
for(k in 1:K){  
  alpha[k] ~ normal(0,3);
  beta[k] ~ normal(0,10);
  theta[k,] ~ normal(0,1);
}
mu_t1 ~ normal(7,1) ;
sigma ~ normal(0, 5);

//Model likelihood
for(k in 1:K){
  for (t in 1:T)
    y[t,k] ~ normal(mu[t,k], sigma);
          }
}
"

model_data <- list(
  T = nrow(df), 
  K = 2,
  x = df$x,
  y = df[,1:2]
)


stan_run <- stan(
  data = model_data,
  model_code = model_code
)

当我运行这段代码时,Stan 在开始采样前停下来说:

链 2:拒绝初始值:链 2:评估日志时出错 初始值的概率。链 2:异常:normal_lpdf: 位置参数是 nan,但必须是有限的! (在 'model290f30a800bc_9a829e355b070cb7ca3039bdb9dcc780' 在第 43 行)

我不确定为什么它不能评估初始值的对数概率。我认为我的输入没有任何问题。有谁知道我的代码出了什么问题?

【问题讨论】:

  • 这似乎不是问题,但model_data 中的y = df[,1:2] 很奇怪,因为df[,1:2] 是一个数据框。我会做y = as.matrix(df[,1:2])
  • @StéphaneLaurent 刚刚尝试了y = as.matrix(df[,1:2]),但这并没有改变任何东西。
  • 您是否尝试提供自己的初始值?另外,我会尝试用dot_product(theta[k,], epsilon[t-1,]) 替换theta[k,] * epsilon[t - 1,]'。但同样,这可能不是问题。
  • @StéphaneLaurent 是的,我做到了。我尝试了dot_product 功能,但没有帮助。仍然不确定出了什么问题。

标签: r mcmc stan


【解决方案1】:

我在转换后的参数块中使用了print() 语句来查看哪个值是 Nan(如错误中所述)。所以这就是我所做的:

"
transformed parameters {
  matrix[T,K] epsilon;   //Residuals (innovation)
  matrix[T,K] mu;        //Mean of the process
  mu[1,] = mu_t1 ;       //Initial values of the time-series
  
  epsilon[1,] = y[1,] - mu[1,];
  
for(k in 1:K){
  for (t in 2:T){
    mu[t,k] =  alpha[k] + theta[k,] * epsilon[t - 1,]' + beta[k] * x[t];
    epsilon[t,k] =  y[t,k] - mu[t,k] ;
    }
  }

print('mu =', mu);
print('epsilon =', epsilon);
print('theta =', theta);
print('beta =', beta);
 
}
"

而参数 mu 是罪魁祸首。我发现我的错误是在转换后的参数块中错误地定义了循环。 k 循环应该在 t 循环之后,替换它们可以修复错误并且模型运行没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多