如何在Stan中使用每个链的不同数据集? [英] How to use a distinct data set per chain in Stan?

查看:93
本文介绍了如何在Stan中使用每个链的不同数据集?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个缺少许多观察结果的数据集,并且我使用Amelia软件包创建了估算数据集.我想知道是否可以并行运行同一模型,并且每条链具有不同的数据集,并将结果组合到单个Stan对象中.

I have a data set with many missing observations and I used the Amelia package to create imputed data sets. I'd like to know if it's possible to run the same model in parallel with a different data set per chain and combine the results into a single Stan object.

# 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()函数组合在一起.有什么建议吗?

My question is how to run the last line of code on both data sets at the same time, running 2 chains and combining the output with the same stan() function. Any suggestions?

推荐答案

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

You can run the models separately, and then combine them using sflist2stanfit().

例如

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))

这篇关于如何在Stan中使用每个链的不同数据集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆