Как подобрать и объединить подмодели в один объект stanfit? - PullRequest
0 голосов
/ 17 января 2019

Буду признателен за любую помощь в этом:

  1. для каждого P соответствует модели для каждого столбца weights.
  2. выполните шаг 1 для всех наблюдений в наборе данных, чтобы получить p * w подмоделей, где p - это число P, а w - это число столбцы weights.
  3. объединить результаты путем объединения задних образцов подмодели.

Аналогичная реализация brms доступна здесь , также обсуждается здесь . Но это допускает только включение неопределенности, возникающей в результате многократного вменения P. Я хочу учесть неопределенность, которая исходит также из оценки weights.

@paul.buerkner говорит там , что мы могли бы также extract those data sets and then pass them to the actual model fitting function as a list of data frames. Используя этот подход, решением, вероятно, будет передача моих отдельных p * w фреймов данных, каждый из которых имеет p=1 и w=1. Тем не менее, неясно, как на практике список этих фреймов данных может быть передан в функцию подбора модели.

В моем случае, кратно вмененные значения предикторов представлены в длинном формате, причем каждый этап вменения представлен значением переменной P, а набор weights, оцененный для каждого P, равен в широком формате и представлены переменными от w_1 до w_10.

Здесь также обсуждается stan подход здесь . Для этого требуется вызвать "stan by parallel , и он возвращает список объектов stanfit", а затем использовать sflist2stanfit для создания одного объекта stanfit из списка. Здесь проблема в том, что мне нужно разделить мой фрейм данных на p * w = 50 или более чем на 100 наборов данных (если я увеличу количество импутаций P до более 10, как обычно рекомендуется), каждый с p=1 и w=1.

Следуя рекомендации @ BobCarpenter, ниже я представлю свою попытку распараллелить вероятность. Кажется, что этот подход мог бы позволить мне объяснить один из источников неопределенности отдельно, но не оба вместе, как предполагалось. Здесь я не уверен, как указать блок transformed parameters и likelihood для учета неопределенности также из P.

Любая помощь в улучшении и / или исправлении моей нынешней попытки достичь моей цели будет принята с благодарностью. Любой вклад в реализацию любого из других подходов, обсужденных выше, также будет высоко оценен. Я прошу прощения, если вы найдете какие-либо основные ошибки в моем коде. Несмотря на то, что я уверен в том, что я хочу сделать и почему, стандартная реализация моих идей все еще остается сложной - все еще учусь.

# модель

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]);
 }
}

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...