我有一个预测时间序列的模型。所以我只有 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中的示例成功地重新组织了代码- 现在不再存储状态空间。不幸的是,我仍然需要这些轨迹(至少在这个开发阶段)。因此,我将保持开放状态,希望有人有一个聪明的解决方案。