ggplot с функцией for-loop

Я использую порядковую логит-модель с пакетом brms. Я хочу написать плотность апостериорного распределения параметров.

<model>

    dfpop$pop = factor(df$pop, levels = c("extinct","<10", "<100", "<1000", ">=1000"), ordered = TRUE) 
dfpop$RDB2000pop = factor(dfpop_chenv$RDB2000pop, levels = c("<10", "<100", "<1000", ">=1000"), ordered = TRUE) 
bmodel<- brms::brm(pop ~  R2000pop + Temperature2003 + Population2003 + Volcanic.area + Agricultural.land2003 + RiverLake2003 + Seashore2003 + Protected.area + 
                         (1+RDB2000pop+Temperature2003+Population2003+ Volcanic.area + Agricultural.land2003 + RiverLake2003 + Seashore2003 + Protected.area |species_id),
             data      = dfpop,
             family    = "cumulative",
             prior   = c(set_prior("normal(0,10)", class = "b")), 
             warmup    = 200,
             iter      = 1000,
             chains    = 4,
             save_all_pars = TRUE) 

Я смог построить модель, но я могу создать только один график за раз. Следующий код попытался запустить функцию цикла, задав имена переменных. Однако я не смог нарисовать плотность в полученном результате.

<plot>

model1tranformed <- ggs(bmodel)

exvars <- rownames(summary(bmodel)$fixed)

plots <- list()
for(i in 1:length(exvars)){
p<-ggplot(filter(model1tranformed,
              Parameter  %in% c("exvars[i]"), 
              Iteration > 0),
       aes(x = value))+
  geom_density(fill  = "darkgreen", 
               alpha = .5)+
  geom_vline(xintercept = 0, 
             col  = "darkred",
             size = 1)+
  scale_x_continuous(name   = "Value",
                     limits = c(-10,10)) + 
  geom_vline(xintercept = summary(bmodel)$fixed[i,3:4],
             col = "blue",
             linetype = 2) +
  theme_light() +
  theme(text = element_text(size = 20))
  labs(title = paste("pd_",exvars[i]))
  plots[[i]] = p
}
library(gridExtra)
pp <- do.call("grid.arrange", c(plots, ncol=4))
ggsave(pp)

введите здесь описание изображения


person marie    schedule 04.08.2021    source источник
comment
Трудно сказать без дополнительных данных и понимания ваших структур данных, но я рискну предположить, что ваша строка Parameter %in% c("exvars[i]") - это гарантирует, что результат вызова filter в цикле всегда будет одним и тем же. Возможно, это должно быть Parameter %in% exvars[i]?   -  person MrGumble    schedule 04.08.2021
comment
Вы жертва ленивой оценки. Когда ваш do.call выполняется, i равен length(exvars), и, следовательно, ваши графики идентичны. Измените свой цикл for на (например) lapply, который вызывает оценку, и все будет хорошо. На SO есть ответы на многие и многие похожие вопросы, которые иллюстрируют возможные решения.   -  person Limey    schedule 04.08.2021
comment
Большое тебе спасибо. Эта проблема была решена. Проблема заключалась в формировании данных, а не в функции цикла. Прости за это. Я хотел бы впредь активнее использовать функцию lapply.   -  person marie    schedule 05.08.2021