Имитация множества наборов данных в Tidyr - PullRequest
0 голосов
/ 30 августа 2018

Я хочу получить чистую структуру данных, подобную приведенной ниже:

N    | r     | data     | stat
---------------------------------
10   | 0.2   | <tibble> | 0.5
20   | 0.3   | <tibble> | 0.86
...

data генерируется из параметров в первых столбцах, а stat вычисляется на data. Если у меня есть первые два столбца, как мне добавить таблицы данных?

В качестве минимального примера, вот функция для создания двух коррелированных столбцов:

correlated_data = function(N, r) {
  MASS::mvrnorm(N, mu=c(0, 4), Sigma=matrix(c(1, r, r, 1), ncol=2))
}

Запустив это для всех комбинаций N и r, я начинаю с выполнения

# Make parameter combinations
expand.grid(N=c(10,20,30), r=c(0, 0.1, 0.3)) %>%
  group_by(N, r) %>%
  expand(set=1:100) %>%  # create 100 of each combination

  # HERE! How to add a N x 2 tibble to each row?
  rowwise() %>%
  mutate(data=correlate_data( N, r))

  # Compute summary stats on each (for illustration only; not tested)
  mutate(   
     stats = map(data, ~cor.test(.x[, 1], .x[, 2])),  # Correlation on each
     tidy_stats = map(stats, tidy))  # using broom package

У меня есть больше параметров (N, r, распределение), и я буду вычислять больше сводок. Если альтернативные рабочие процессы лучше, я тоже приветствую это.

1 Ответ

0 голосов
/ 29 мая 2019

Это делается для двух переменных:

map2(N, r, correlated_data)

Для дополнительных переменных используйте

pmap(list(N, r), correlated_data)

Таким образом, полная процедура в первоначальном вопросе становится такой:

expand.grid(N=c(10, 20, 30), r=c(0, 0.1, 0.3)) %>%
  group_by(N, r) %>%
  expand(set=1:200) %>%  # create 100 of each combination

  # HERE! How to add a N x 2 tibble to each row?
  mutate(
    data = map2(N, r, correlated_data),
    stats = map(data, ~cor.test(.[, 1], .[,2])),
    tidy_stats = map(stats, tidy)
  ) %>%  # using broom package

  unnest(tidy_stats)
...