如何在Stan中使用每个链的不同数据集?

时间:2015-01-21 21:27:24

标签: r stan

我有一个包含许多观察结果的数据集,我使用Amelia包来创建推算数据集。我想知道是否可以与每个链的不同数据集并行运行相同的模型,并将结果合并到一个Stan对象中。

# Load packages
library(Amelia)
library(rstan)

# Load built-in data
data(freetrade)

# Create 2 imputed data sets (polity is an ordinal variable)
df.imp <- amelia(freetrade, m = 2, ords = "polity")

# Check the first data set
head(df.imp$imputations[[1]])

# Run the model in Stan
code <- '
    data {
int<lower=0> N;          
vector[N] tariff;     
vector[N] polity;      
}
    parameters {
real b0;                  
real b1;           
real<lower=0> sigma;       
}
    model {
b0 ~ normal(0,100);  
b1 ~ normal(0,100); 
tariff ~ normal(b0 + b1 * polity, sigma);    
}
'

# Create a list from the first and second data sets
df1 <- list(N = nrow(df.imp$imputations[[1]]),
            tariff = df.imp$imputations[[1]]$tariff,
            polity = df.imp$imputations[[1]]$polity)

df2 <- list(N = nrow(df.imp$imputations[[2]]),
            tariff = df.imp$imputations[[2]]$tariff,
            polity = df.imp$imputations[[2]]$polity)

# Run the model
m1 <- stan(model_code = code, data = df1, chains = 1, iter = 1000) 

我的问题是如何在两个数据集上同时运行最后一行代码,运行2个链并将输出与相同的stan()函数组合。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

您可以单独运行模型,然后使用sflist2stanfit()组合它们。

E.g。

seed <- 12345
s1 <- stan_model(model_code = code) # compile the model

m1 <- sampling(object = s1, data = df1, chains = 1,
               seed = seed, chain_id = 1, iter = 1000) 
m2 <- sampling(object = s1, data = df2, chains = 1,
               seed = seed, chain_id = 2, iter = 1000)

f12 <- sflist2stanfit(list(m1, m2))

答案 1 :(得分:2)

你必须在R中使用其中一个包进行并行计算。 根据这篇文章,它应该工作: Will RStan run on a supercomputer?

这是一个可行的示例(我将此代码与JAGS一起使用,稍后将使用Stan进行测试):

library( doParallel )
cl <- makeCluster( 2 ) # for 2 processes
registerDoParallel( cl )

library(rstan)

# make a function to combine the results
stan.combine <- function(...) { return( sflist2stanfit( list(...) )  ) }

mydatalist <- list(df1 , df2)    
myseeds <- c(123, 456)

# now start the chains
nchains <- 2
m_both <- foreach(i=1:nchains , 
              .packages = c( 'rstan' ), 
              .combine = "stan.combine") %dopar% {
             result <- stan(model_code = code, 
                   data = mydatalist[[i]], # use the right dataset
                   seed=myseeds[i],        # use different seeds
                   chains = 1, iter = 1000) 
             return(result) }

让我知道它是否适用于斯坦。正如我所说,我还没有测试过它。