создать цикл while с purrr для имитации данных - PullRequest
2 голосов
/ 12 марта 2019

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

Моя проблема в том, что я хотел бы повторять случайную выборку до тех пор, пока не будет достигнут критерий, что, как я реализовал в настоящее время, означает, что мне придется добавлять строки в мой массив данных.

Вот код, который у меня сейчас есть:

library(tidyverse)
set.seed(1)
simulation_df =  crossing(sim_mean = 1, 
                          sim_sd = 2, 
                          final_sample_size =20, 
                          sim =1:10, 
                          collected_data = c(6,14)) %>%
  mutate(phase = if_else(collected_data == 6, 
                         "pilot", 
                         "full sample"),
    data =pmap(list(collected_data, # input to rnorm
                    sim_mean, 
                    sim_sd), 
               rnorm)) %>% # function to apply
  group_by(sim) %>% 
  # check if pilot was successful (ie 4 or more data points > 0)
 mutate( pilot_result = if_else(phase =="pilot",
                                map_dbl(data, ~ sum(. > 0)),
                                0 ),
         success_pilot = pilot_result >= 4) %>%
  ungroup()

(simulation_df %>% select(sim,phase, data, success_pilot) %>% head())
#> # A tibble: 6 x 4
#>     sim phase       data       success_pilot
#>   <int> <chr>       <list>     <lgl>        
#> 1     1 pilot       <dbl [6]>  FALSE        
#> 2     1 full sample <dbl [14]> FALSE        
#> 3     2 pilot       <dbl [6]>  TRUE         
#> 4     2 full sample <dbl [14]> FALSE        
#> 5     3 pilot       <dbl [6]>  TRUE         
#> 6     3 full sample <dbl [14]> FALSE

Создано в 2019-03-12 пакетом представ. (v0.2.1)

Если success_pilot == FALSE, я бы хотел повторить выборку из 6 точек данных до success_pilot == TRUE. Я мог бы реализовать это окольным путем, выбрав максимальное количество раз, которое я выбрал бы для 6 точек данных, а затем отфильтровал все точки данных после первого success_pilot == TRUE.

В главе Итерации в R для Data Science , хотя циклы упоминаются, но не рассматриваются - мне было интересно, есть ли для этого аккуратное решение?

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