Оператор if в функции, использующей purrr и dplyr (рабочий процесс столбца списка) в R

David спросил: 03 ноября 2018 в 09:23 в: r

Я пытаюсь оценить различия в средних показателях для двух больниц, A и B. В каждой больнице есть разные "группы", и я дал им группы 1 и 2 в смоделированном наборе данных. То есть я хочу проверить разницу в средних показателях между больницей A и B в группе 1 и группе 2, и, кроме того, у меня есть более одной переменной (например, value1 и value2). Поэтому я должен проверить значение 1 между больницами А и В в группах 1 и 2. Несмотря на то, что в конце вызова я указываю метод = 1, я получаю третий метод (остальная часть). Я использую пакет infer для начальной загрузки (часть tidyverse или tidymodels).

library(tidyverse)
library(lubridate)
library(readxl)
library(infer)
library(stringr)
library(rlang)set.seed(1)
A <-data.frame(value1=rnorm(n = 1000, mean = 0.8, sd = 0.2), value2= rnorm(n=10 ,mean=1, sd=0.3)) 
A$hosp <- "A"
A$group <- sample(1:2,nrow(A) , replace=T) B= data.frame(value1 = rnorm(n=1200, mean =1 , sd = 0.2), value2= rnorm(n=15, mean=1.1, sd=0.4))
B$hosp <- "B"
B$group <- sample(1:2,nrow(B) , replace=T) forskel <- bind_rows(A, B) %>% 
  group_by(group) %>% 
  nest()rm(A, B)

Сильфон - моя функция.

bootloop <- function(dataset, procestid, method, reps = 4, alpha = 0.05) { 
  procestid <- enquo(procestid)  diff_mean <- dataset %>% 
    mutate(diff_means  = map(data, function(.x){.x %>% 
        group_by(hosp) %>% 
        summarise(mean(!!procestid, na.rm=TRUE)) %>% 
        pull() %>% 
        diff() })) %>%
    select(-data)  bootstrap <- dataset %>% 
    mutate(distribution =map(data, function(.x){ .x %>% 
        specify(as.formula(paste0(quo_name(procestid), "~ hosp")) ) %>% 
        generate(reps = reps, type = "bootstrap") %>%
        calculate(stat = "diff in means", order = c( "A", "B"))} )) %>% 
    inner_join(diff_mean, by="group")    if (method==1) {
    bootstrap2 <- bootstrap %>% mutate(Bias_Corrected_KI=map2(distribution, diff_means, function(.x, .y){ .x %>% 
        summarise( l =quantile(.x$stat,pnorm(2*qnorm(sum(.x$stat >= .y)/reps) + qnorm(alpha/2))),
                   u= quantile(.x$stat,pnorm(2*qnorm(sum(.x$stat >= .y)/reps) + qnorm(1-alpha/2)))    )}))  }
  if (method==2) {
    bootstrap2 <- bootstrap %>% mutate(Percentile_KI = map(distribution, function(.x){.x %>% 
        summarize(l = quantile(stat, alpha/2),
                  u = quantile(stat, 1 - alpha/2))}))  }
  else {
    bootstrap2 <- bootstrap %>% mutate(SD_KI =map2(distribution, diff_means, function(.x,.y){.x %>% 
        get_confidence_interval(level = (1 - alpha), type="se", point_estimate = .y)})) 
  }
return(bootstrap2)}procestimes <- list("value1", "value2")a <- map(syms(procestimes), bootloop , dataset=forskel, method=1 ,  reps=1000)
a

Несмотря на то, что я указываю метод = 1 в вызове, я получаю третью форму доверительного интервала в операторе else.

[[1]]# A tibble: 2 x 5
  group data                 distribution         diff_means SD_KI           
  <int> <list>               <list>               <list>     <list>          
1     1 <tibble [1,086 x 3]> <tibble [1,000 x 2]> <dbl [1]>  <tibble [1 x 2]>
2     2 <tibble [1,114 x 3]> <tibble [1,000 x 2]> <dbl [1]>  <tibble [1 x 2]>[[2]]
# A tibble: 2 x 5
  group data                 distribution         diff_means SD_KI           
  <int> <list>               <list>               <list>     <list>          
1     1 <tibble [1,086 x 3]> <tibble [1,000 x 2]> <dbl [1]>  <tibble [1 x 2]>
2     2 <tibble [1,114 x 3]> <tibble [1,000 x 2]> <dbl [1]>  <tibble [1 x 2]>

0 ответов