1

我有一个预测时间序列的模型。所以我只有 5 个参数——然后我用它来计算时间序列,作为生成 7200x3 矩阵的转换参数——然后将其与观察结果进行比较。

到目前为止一切顺利 - 仅进行 100 次迭代时按预期工作。但是现在我使用 SNOW 来并行化这个计算来创建 6x1000 迭代。花了一个小时 - 但看起来不错。唯一的问题是我无法再加载生成的 rdata 文件。它的大小为 11GB - 可能就是这样。

我需要增加模拟的数量——所以我需要找到一种方法来处理这种大小的数据。其他人如何处理这个问题?

代码

(试图做一个简单的例子 - 所以它是可读的)

R 脚本

library(rstan)
library(foreach)
library(doSNOW)

model.c <- stanc(file="3c_model.stan")
model.comp <- stan_model(stanc_ret=model.c) 
cl <- makeCluster(6, type="SOCK")
registerDoSNOW(cl)
num_chains <- 6
parallel_fit <- foreach(i = 1:num_chains,.packages='rstan') %dopar% {
  s <- sampling(model.comp, data=stan.list, chains=1, iter= 1000)
}
fits <- sflist2stanfit(parallel_fit)
stopCluster(cl)

模型的相关部分

functions { 
  vector evolve(vector pre, real inp, real p1){
     vector[3] out;
     out[1] <- pre[1] + pre[2]/p1;
     out[2] <- pre[2] + pre[3]/p1;
     out[3] <- pre[3]/p1 + inp;
  }
}

data {
  int<lower=1> N ;
  real<lower=0> y[N] ;
  real<lower=0> inp[N] ;
}

parameters { 
  vector<lower=0, upper=5000>[3] init_ss; 
  real<lower=0, upper=60> p1;
}

transformed parameters {      
  vector[3] state[N];
  state[1] <- init_ss;
  for (i in 2:N){
    state[i] <- evolve(state[i-1], inp[i-1] ,p1);
  }
}

model {   
  p1 ~ gamma(1, 10);
  init_ss ~ gamma(1,100);
  for (i in 100:N){
    if (y[i] >0 ) 
      y[i] ~ normal(state[i][1], 1) ;
  }
}

更新

我按照建模语言手册p41中的示例成功地重新组织了代码- 现在不再存储状态空间。不幸的是,我仍然需要这些轨迹(至少在这个开发阶段)。因此,我将保持开放状态,希望有人有一个聪明的解决方案。

4

0 回答 0