этого эмулирую ряд изменений метрики и смотрю на процент прокрасившихся тестов.
Соотвествено это итерирование по двум параметрам. Очень хочется это сделать в рамках purrr логики. Но как сделать вложенные итерации - не сообразил.
Внутренний map плохо реагирует на указатели из внешнего.
Поняттно, что можно через циклы и прочее (так примерно и сделал) но интересно чисто пуровское решение так работает?
incr<-seq(1,1.1,0.01)
seeds<-round(runif(1000,1,10000))
expand_grid(incr,seeds)->it
size=10e3
library(purrr)
library(broom)
library(tidyverse)
tibble(
id=1:size,
res=rnorm(size,mean=10,sd=1)
)->dd
map2_df(it$seeds,it$incr,~{set.seed(.x)
dd %>% mutate(sam=sample(id),gr=ifelse(sam<=nrow(.)*0.5,'a','b')) %>%
group_by(gr) %>% nest() %>% pivot_wider(names_from = gr,values_from = data) %>%
mutate(t_test = map2(a, b, ~{t.test(.x$res, .y$res *.y) %>% tidy()}),
a=map(a,nrow),
b=map(b,nrow)
) %>%
unnest(everything()) %>% mutate(seed=.x,incr=.y)
}
)->rs.1
Как обычно, начну с типичной фразы "здесь все не так". Наперстки и сокрытие реальных действий. Надо делать все прозрачно и ясно, не упираться в tidyverse. И такие имитационные задачи надо оптимизировать на всех шагах. Гипотетически она должна хорошо параллелиться... Да и сэмплы можно сначала пакетом нагенерить... Подкрепляю неидеальным кодом. Это только мысли по мотивам. Мне неочевиден подсчет значения a если replace = TRUE не включен. library(tidyverse) library(data.table) library(broom) library(dqrng) library(tictoc) size <- 100 it_df <- expand_grid(incr = seq(1, 1.1, 0.01), seeds = round(runif(10, 1, 10000))) dt <- data.table(id = 1:size, res = rnorm(size, mean = 10, sd = 1)) ff2 <- function(i_seed){ set.seed(i_seed) dt %>% .[, grp := dqsample(id) <= nrow(.) * .5] tidy(t.test(dt[grp==TRUE], dt[grp==FALSE])) %>% mutate(a = dt[grp==TRUE, .N]) } # можно furrr подключать, эксперименты параллелятся tic() res_df <- it_df %>% rowwise() %>% mutate(data = ff2(seeds)) %>% unnest(data) toc()
Подход понятен, спасибо, вопрос - где лифты обсчитываются? incr надо применять к какой то группе?
интересно, но ничего не понятно
Ну я не понимаю как представленный код тестирует лифты относительно искомой метрики. Результат кода не очень интерпретируем
я показал подход, а не решал конкретную бизнес-задачу, которая не очень очевидна из исходного кода.
Мой вопрос был не в генерации данных. А как итерировать внутри пура по двум направлениям. анлог синтаксиса for (i in ...){ for (j in ...){ }} В ответ я получил небеинтересный кусок кода который позволяет генерировать данные на дататейбле, делая это побыстрее. При этом про итерирование внутри пура у меня знаний не прибавилось.
eхpand_grid дает ответ на первый вопрос
а вы можете раскрыть свой ответ? потому что я вот не понимаю, как expand_grid отвечает на вопрос про итерацию в пурр по двум переменным
for (i in ...){ for (j in ...){ }} дает комбинаторику i x j expand_grid делает ровно это же. а потом итерируем по строкам. я никак не пойму, что именно смущает?
Хорошо, попробую еще раз. for (i in ...){ for (j in ...){ }} дает комбинаторику i x j expand_grid делает ровно это же. а потом итерируем по строкам. В рамках tidyverse для итерации по строкам (держим два параметра в голове) можно использовать: rowwise() map2() pmap() вариант c map2() может оказаться наилучшим, поскольку его потом будет легко распараллелить с помощью furrr. Для прототипирования решения и для маленьких задачек можно воспользоваться rowwise(). Так годится?
на мой взгляд, вот в этом случае достаточно было бы вот этого комментария, который вы дали выше.
Обсуждают сегодня