Создайте смоделированный фрейм данных, начиная с образца

#r #tidyverse #statistics-bootstrap

#r #аккуратная вселенная #статистика-bootstrap

Вопрос:

Я загрузил образец из 10 строк, содержащий около 10 столбцов.

 library(tidyverse)

# A tibble: 7 x 9
  case_id             scenario  alert_number random_ref_id  amount code_type is_cred_debt source type 
  <chr>               <chr>            <dbl> <chr>           <dbl>     <dbl> <chr>        <chr>  <chr>
1 2020500ZSJU45679007 Anomalies      8796964 xxxxdg6yht78lj  2137.       100 D            xdd    CASH 
2 2020500ZSJU45679007 Anomalies      8796964 xxxxdg6yht78lj  2137.       100 D            xdd    CASH 
3 2020500ZSJU45679007 Anomalies      8796964 xxxxdg6yht78lj  2137.       100 D            xdd    CASH 
4 2020500ZSJU45679007 Anomalies      8796964 xxxxdg6yht78lj  2137.       100 D            xdd    CASH 
5 2020500ZSJU45679111 Patterns       8678867 xxxykhkh67hhg   6000        200 C            CFT    WIRE 
6 2020500ZSJU45679111 Patterns       8678867 xxxykhkh67hhg   7000        200 C            CFT    WIRE 
7 2020500ZSJU45679111 Patterns       8678867 xxxykhkh67hhg  24000        200 C            CFT    WIRE 
 
 df <-
  as.data.frame(
    structure(
      list(
        case_id = c(
          "2020500ZSJU45679007",
          "2020500ZSJU45679007",
          "2020500ZSJU45679007",
          "2020500ZSJU45679007",
          "2020500ZSJU45679111",
          "2020500ZSJU45679111",
          "2020500ZSJU45679111"
        ),
        scenario = c(
          "Anomalies",
          "Anomalies",
          "Anomalies",
          "Anomalies",
          "Patterns",
          "Patterns",
          "Patterns"
        ),
        alert_number = c(8796964, 8796964, 8796964, 8796964, 8678867, 8678867, 8678867),
        random_ref_id = c(
          "xxxxdg6yht78lj",
          "xxxxdg6yht78lj",
          "xxxxdg6yht78lj",
          "xxxxdg6yht78lj",
          "xxxykhkh67hhg",
          "xxxykhkh67hhg",
          "xxxykhkh67hhg"
        ),
        amount = c(2136.76, 2136.76, 2136.76, 2136.76, 6000, 7000, 24000),
        code_type = c(100, 100, 100, 100, 200, 200, 200),
        is_cred_debt = c("D", "D", "D", "D", "C", "C", "C"),
        source = c("xdd", "xdd", "xdd", "xdd", "CFT", "CFT", "CFT"),
        type = c("CASH", "CASH", "CASH", "CASH", "WIRE", "WIRE", "WIRE")
      ),
      class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"),
      row.names = c(NA, -7L),
      spec = structure(list(cols = list(
 

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

Учитывая, что:

  1. case_id является случайной строкой для каждого наблюдения
  2. scenario может быть либо Anomalies Patterns
  3. alert_number является случайной строкой, одинаковой для каждого case_id
  4. random_ref_id является случайной строкой, одинаковой для каждого case_id
  5. amount может быть различным числом от 0 до 100000
  6. code_type может быть 100 или 200, одинаково для каждого case_id
  7. is_cred_debt может быть либо D, либо C, одинаковым для каждого case_id
  8. source может быть либо xdd, либо CFT, одинаково для каждого case_id
  9. type может быть либо НАЛИЧНЫМИ, либо безналичными, одинаковыми для каждого case_id

Хотя я знаю, как выполнить процедуру наоборот, создайте случайную выборку из начального df, скажем, от 100 наблюдений, скажем, до 10, мне не ясно, как сгенерировать случайное моделирование, начиная с этой выборки из 10 наблюдений.

Любой намек был бы очень признателен.

Комментарии:

1. Я отредактировал ваш dput текст, чтобы он был не таким широким, но он не кажется полным — он заканчивается на cols = list( .

2. Пара уточняющих вопросов: 1) существует ли только один уникальный case_id (согласно вашему примеру данных)? 2) хотели бы вы провести выборку таким образом, чтобы пропорции классов оставались примерно одинаковыми для каждой переменной?

3. @latlio Я добавил 2 разных case_id , таким образом, я хотел бы иметь большую выборку с разными идентификаторами case_id 2) да, я бы хотел, чтобы пропорции классов оставались одинаковыми для переменных! большое спасибо за вашу помощь!

4. Я не уверен case_id , что появится ваше редактирование. Кроме того, каждый ref_id из них отличается, что имеет смысл; однако ваш case_id не отличается, например, в вашем примере одно и то же case_id имеет разные значения для code_type is_cred_debt , и т.д. Вы имели в виду «то же самое для каждого ref_id » ?

5. @latlio вот так!

Ответ №1:

Моделирование наборов данных определенно не является тривиальной задачей, и, вероятно, есть много вещей, которые вы хотите рассмотреть, о которых я не смогу думать в данный момент.

Однако вот несколько начальных кодов, которые могут дать вам некоторое представление.

 set.seed(2021)

# convert to type factor so I can use levels()
tidy_df <- df %>%
  mutate(across(-c(amount), as.factor))

#functionalize, and sample with replacement using original props
generate_sample <- function(df, var, n) {
  out <- sample(levels(df[[var]]),
                size = n,
                replace = T, 
                prob = 100 * prop.table(table(df[[var]])))
}

#simulate case_id, scenario, and amount
sim_df <- tibble(
  case_id = generate_sample(tidy_df, "case_id", 20),
  scenarios = generate_sample(tidy_df, "scenario", 20),
  amount = sample(0:100000, 20, replace = T)
) %>%
#because you specified that these variables should be the same with case_id, a join would work
  left_join(tidy_df %>% select(-c(scenario, amount)), by = "case_id")