R запускает повторную выборку с несколькими наблюдениями за идентификатором и возвращает данные повторной выборки как результат - PullRequest
2 голосов
/ 08 ноября 2019

Я пытаюсь сделать загрузчик для моих данных. Мои данные (df) имеют следующую форму.

id    v1    v2
1    1    1
1    0    1
1    0    1
2    2    0
2    1    1
2    0    0

Насколько я понимаю, при инициализации начальной загрузки в R повторная выборка (с перестановкой) выполняется на уровне строк, верно?

так что настраивая что-н. как:

boot_function <- function(data, i)
{boot_data <- data[i,]}

Тем не менее, мой первый вопрос: как бы я настроил это в сценарии, где у меня есть несколько наблюдений для каждого идентификатора, которые должны храниться вместе в начальной загрузке? Так что в моем примере, когда я выполняю загрузку, я не могу просто выбирать среди строк, но мне нужно выбирать среди идентификаторов. Таким образом, вместо вышеприведенного

я использовал это:

boot_function2 <- function(data, i)
{boot_data <- data[data$id %in% i,]}

Это будет правильный путь?

И в связи с приведенным выше сценарием я хотел проверить, если мойподход верен, поэтому я подумал, что просто проверяю, как выглядят повторные выборки, но я не представляю, как можно вернуть отдельные образцы данных начальной загрузки. Любая идея? (и я знаю, что если мои исходные данные большие, и я делаю 2000 копий, возвращаемый объект может быть довольно большим, поэтому я, вероятно, просто захочу проверить это с R = 10 или около того).

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Я думаю, что начальная загрузка по идентификатору образца абсолютно подходит. Вот пример использования пакета boot. Я не уверен, правильно ли я понял, что вы запускаете, так что функция может быть не совсем правильной, но вы должны быть в состоянии понять более или менее, что она делает. Это не очень эффективно;Я вообще не оптимизировал его, учитывая, что не уверен насчет статистики.

library("boot")
ids <- rep(1:3, times = 1000)
values <- rnorm(300)

dat <- data.frame(ids, values)

boot_fun <- function(ids, i) {
  sapply(ids[i], function(j) mean(dat[dat$ids == j, "values"]))
}


boot_res <- boot(
  dat$ids,
  statistic = boot_fun,
  R = 100
)
hist(boot_res$t)

Создано в 2019-11-08 Представить пакет (v0.3.0)

1 голос
/ 08 ноября 2019

Вот подход. Сначала я сгенерирую некоторые поддельные данные:

ids <- rep(1:3, times = 10)
values <- rnorm(30)

dat <- data.frame(ids, values)

Теперь, когда у нас есть данные, мы можем сгенерировать функцию начальной загрузки кластера. Это будет выборка из каждого кластера и вернет новый фрейм данных. Затем вы можете применить свою статистику теста:

library(tidyverse)

cluster_boot_function <- function(x){

  clusted_boot <- dat %>% 
    group_by(ids) %>% 
    nest() %>%
    mutate(samps = map(data, ~sample(.$values, size = 5, replace = T))) %>% 
    select(ids, samps) %>% 
    unnest(cols = samps)


  results <- clusted_boot %>% 
    group_by(ids) %>% 
    summarise(mu = mean(values))

  results
}

Теперь вам просто нужно применять ее несколько раз (также обратите внимание, что «х» в функции ничего не делает, мне просто нужно там для следующегошаг).

Здесь я использую map_dfr для возврата моей сводной статистики для каждой итерации:

out <- map_df(1:100, cluster_boot_function, .id = "iteration")

И это даст вам статистику для каждой итерации начальной загрузки:

# A tibble: 300 x 3
   iteration   ids    mu
   <chr>     <int> <dbl>
 1 1             1 0.150
 2 1             2 0.150
 3 1             3 0.150
 4 2             1 0.150
 5 2             2 0.150
 6 2             3 0.150
 7 3             1 0.150
 8 3             2 0.150

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

...