R 如何处理超过10GB的stan结果
我有一个预测时间序列的模型。所以我只有5个参数,我用它来计算时间序列,作为转换后的参数,生成一个7200x3的矩阵,然后与观测值进行比较 到目前为止还不错-在进行100次迭代时,效果如预期。 但现在我用SNOW来并行计算,创建6x1000次迭代。花了一个小时,但看起来不错。唯一的问题是我无法再加载生成的rdata文件。它的大小是11GB——可能就是这样 我需要增加模拟的数量,所以我需要找到一种处理这种大小数据的方法。其他人如何处理这个问题 代码 (尝试制作一个简单的示例,以便可读) R脚本R 如何处理超过10GB的stan结果,r,snow,stan,R,Snow,Stan,我有一个预测时间序列的模型。所以我只有5个参数,我用它来计算时间序列,作为转换后的参数,生成一个7200x3的矩阵,然后与观测值进行比较 到目前为止还不错-在进行100次迭代时,效果如预期。 但现在我用SNOW来并行计算,创建6x1000次迭代。花了一个小时,但看起来不错。唯一的问题是我无法再加载生成的rdata文件。它的大小是11GB——可能就是这样 我需要增加模拟的数量,所以我需要找到一种处理这种大小数据的方法。其他人如何处理这个问题 代码 (尝试制作一个简单的示例,以便可读) R脚本 库(
库(rstan)
图书馆(foreach)
图书馆(doSNOW)
model.c将数据保存为块或另存为ASCII文件并读取块或使用数据库或使用bigmemory包。发布代码。很可能你不需要保存所有的模拟细节。@Roland这也是我的第一个想法。从我所看到的情况来看,我需要在调用采样时执行此操作,我不确定如何执行此操作。此外,如果我现在仍然能够使用rstans功能,如traceplot
,这将是最有帮助的。如果它是11GB,最简单的方法就是只购买一点额外的RAM 4 4GB模块,成本大约为100$/€。一天的工作成本可能会更高…我会首先指定sample_file
参数为sampling
,以便将结果保存到磁盘以备安全保管(即发生崩溃时)。另外,thin
参数可能最终是必需的。如果您有足够的RAM一次分析一条链的结果,您可以使用read\u stan\u csv
功能来进行分析。对于需要所有链的分析,您可能需要按照@Roland的建议编写一些自定义内容。
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) ;
}
}