如何将子模型拟合并组合成单个stanfit对象?

时间:2019-01-17 10:21:11

标签: r parallel-processing imputation stan rstan

我将很乐意为您提供帮助:

  
      
  1. 为每个P拟合模型,为weights的每一列。
  2.   
  3. 对数据集中的所有观测值执行步骤1,以获得p * w子模型,其中pP的数量,而w是   weights列。
  4.   通过合并后验样本来合并结果   子模型。   

here也提供了类似的brms实现,也讨论了here。但这仅允许合并来自多个插补P的不确定性。我还要考虑weights的估计带来的不确定性。

@ paul.buerkner说there,我们也可以extract those data sets and then pass them to the actual model fitting function as a list of data frames。使用这种方法,解决方案可能是传递我各自的p * w数据帧,每个数据帧都带有p=1w=1。不过,目前尚不清楚如何在实践中将这些数据框的列表传递给模型拟合函数。

在我的情况下,预测变量的乘积插值采用长格式,每个插补阶段由变量P的值表示,weights的集合由每个变量估计P的格式很宽,由变量w_1w_10表示。

还有here讨论的stan方法。这需要调用“ stan by parallel,并返回一个stanfit对象的列表”,然后使用sflist2stanfit从该列表中创建一个stanfit对象。 Here的问题是,我需要将数据框分成p * w = 50或100多个数据集(如果我将估算P的数量增加到通常建议的10个以上),每个都有p=1w=1

下面,按照@BobCarpenter的建议,我提出了使可能性平行化的尝试。看来这种方法可以让我单独解释不确定性的来源之一,但不能同时考虑两者。这里我不确定如何指定transformed parameters块和likelihood来解决P的不确定性。

任何有助于改善和/或纠正我目前实现目标的尝试的帮助将不胜感激。实施以上讨论的任何其他方法中的任何输入的任何输入也将是非常感谢的。如果您在我的代码中发现任何基本错误,我们深表歉意。尽管我确定自己想做什么以及为什么要做,但是我的想法的扎实实施仍然充满挑战-仍在学习。

#model

data{
int N;                                     
int P;                 
int ncases[N];         
int A[N];                
int B[N];              
int nn[N];              
int id[N];               
real w_1[N];       
real w_2[N];       
real w_3[N];      
real w_4[N];       
real w_5[N];       
real w_6[N];       
real w_7[N];       
real w_8[N];       
real w_9[N];       
real w_10[N];       
}

parameters {
real beta_0; 
real beta_1; 
real beta_2; 
real beta_3; 
}

transformed parameters {
vector[N] pp_hat;  
vector[N] odds;    
for (i in 1:N) { 
odds[i] = exp(beta_0) * (1 + beta_1*A[i] + beta_2*B[i] + beta_3*A[i]*B[i]);
pp_hat[i] = odds[i]/(1 + odds[i]);
}
}

model {
beta_0 ~ normal(0, 5);
beta_1 ~ normal(0, 5);
beta_2 ~ normal(0, 5);
beta_3 ~ normal(0, 5);
for (i in 1:N){
  target += w_1[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_2[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_3[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_4[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_5[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_6[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_7[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_8[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_9[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
  target += w_10[i] * binomial_lpmf(ncases[i] | nn[i], pp_hat[i]);
 }
}

谢谢。

0 个答案:

没有答案