Я хотел бы смоделировать сценарии доходов для: price
и est_p
(оценочная вероятность) из следующих df:
df <- data.frame(price = c(200, 100, 600, 20, 100),
est_p = c(0.9, 0.2, 0.8, 0.5, 0.6),
actual_sale = c(FALSE, TRUE, TRUE, TRUE, TRUE))
Выручка - сумма price
, где actual_sale
равно TRUE
:
print(actual1 <- sum(df$price[df$actual_sale])) # Actual Revenue
[1] 820
Я создал функцию для имитации испытаний Бернулли со значениями est_p
и price
:
bernoulli <- function(df) {
sapply(seq(nrow(df)), function(x) {
prc <- df$price[x]
p <- df$est_p[x]
sample(c(prc, 0), size = 1000, replace = T, prob = c(p, 1 - p))
})
}
И применил его к образцу df
:
set.seed(100)
distr1 <- rowSums(bernoulli(df))
quantile(distr1)
0% 25% 50% 75% 100%
0 700 820 920 1020
Выглядит нормально, фактическое значение = медиана! Но когда я применяю ту же функцию к увеличенному (реплицированному в 1000 раз) образцу - df1000
, фактический доход выходит за пределы смоделированных значений:
df1000 <- do.call("rbind", replicate(1000, df, simplify = FALSE))
print(actual2 <- sum(df1000$price[df1000$actual_sale]))
[1] 820000
distr2 <- rowSums(bernoulli(df1000))
quantile(distr2)
0% 25% 50% 75% 100%
726780 744300 750050 754920 775800
Почему фактическая выручка выходит за рамки смоделированных значений? Где я сделал ошибку и как правильно решить эту проблему?
set.seed(100)
и запуститеdistr1 <- rowSums(sim(df))
, а затемquantile(distr1)
, измените начальное значение на 200 и снова запустите вышеуказанное, посмотрите результат, он даст вам другой результат. Идея затравки состоит в том, чтобы сделать воспроизводимую случайную выборку. - person deepseefan   schedule 26.08.2019rbind
в вашемdo.call
наcbind
и посмотрите, дает ли он вам то, что вы хотите. - person deepseefan   schedule 26.08.2019binomial distributions
(распределении вероятностей)? Почему реальная выручка по второму делу820000
? - person deepseefan   schedule 26.08.2019Bernulli
в названии илиBernoulli
? - person deepseefan   schedule 26.08.2019temp <- bernoulli(df1000)
. Вам нужно взятьrowSums
иquantile
из каждых 5 столбцов, поскольку они составляют одну группу. Сделайтеlapply(seq(1, ncol(temp), 5), function(x) quantile(rowSums(temp[, x:(x + 4)])))
, и они следуют тому же распределениюquantile
. - person Ronak Shah   schedule 27.08.2019