R package "infer" - Итеративная загрузка / зацикливание имен столбцов - PullRequest
0 голосов
/ 18 февраля 2020

Я загружаюсь с помощью пакета infer. Интересующая статистика c представляет собой среднее значение, примерные данные приведены в виде таблицы с 3 столбцами и 5 строками. У моего настоящего тибля 86 строк и 40 столбцов. Для каждого столбца я хочу выполнить имитацию bootstrap, как показано ниже для столбца "x" в таблице "test_tibble".

library(infer)
library(tidyverse)

test_tibble <- tibble(x = 1:5, y = 6:10, z = 11:15)

# A tibble: 5 x 3
      x     y     z
  <int> <int> <int>
1     1     6    11
2     2     7    12
3     3     8    13
4     4     9    14
5     5    10    15

specify(test_tibble, response = x) %>% 
  generate(reps = 100, type = "bootstrap") %>% 
  calculate(stat = "mean") %>% 
  summarise(
    lower_CI = quantile(probs = 0.025, stat),
    upper_CI = quantile(probs = 0.975, stat)
  )
# A tibble: 1 x 2
  lower_CI upper_CI
     <dbl>    <dbl>
1     2.10        4

Сейчас я ищу способ сделать то же самое для другие столбцы в моей таблице. Я попытался for-l oop, как это:

for (i in 1:ncol(test_tibble)){

  var_name <- names(test_tibble)[i]

  specify(test_tibble, response = var_name) %>% 
  generate(reps = 100, type = "bootstrap") %>% 
  calculate(stat = "mean") %>% 
  summarise(
    lower_CI = quantile(probs = 0.025, stat),
    upper_CI = quantile(probs = 0.975, stat)
  )
}

К сожалению, это возвращает следующую ошибку

Error: The response variable `var_name` cannot be found in this dataframe.

Есть ли способ перебора столбцов x, y и z, не вводя их вручную в качестве аргументов для «ответа»? Это было бы довольно утомительно для 40 столбцов.

1 Ответ

1 голос
/ 18 февраля 2020

Это сложный вопрос с хитрым ответом.

Взгляните на аргумент response функции specify в документации :

Имя переменной в x, которая будет служить ответом. Это альтернатива использованию аргумента формулы.

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

library(infer)
library(tidyverse)

test_tibble <- tibble(x = 1:5, y = 6:10, z = 11:15, w = seq(1, 1, length.out = 5))

for (i in 1:ncol(test_tibble)){

  var_name <- names(test_tibble)[i]

  specify(test_tibble, formula = eval(parse(text = paste0(var_name, "~", "w"))))[, 1] %>% 
    generate(reps = 100, type = "bootstrap") %>% 
    calculate(stat = "mean") %>% 
    summarise(
      lower_CI = quantile(probs = 0.025, stat),
      upper_CI = quantile(probs = 0.975, stat)
    )
}

Надеюсь, это поможет

...