#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 записей, где каждое наблюдение генерируется случайным образом.
Учитывая, что:
case_id
является случайной строкой для каждого наблюденияscenario
может быть либоAnomalies
Patterns
alert_number
является случайной строкой, одинаковой для каждогоcase_id
random_ref_id
является случайной строкой, одинаковой для каждогоcase_id
amount
может быть различным числом от 0 до 100000code_type
может быть 100 или 200, одинаково для каждогоcase_id
is_cred_debt
может быть либо D, либо C, одинаковым для каждогоcase_id
source
может быть либо xdd, либо CFT, одинаково для каждогоcase_id
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")