0

我想从以下df模拟收入场景:price和(估计概率):est_p

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))

收入是 - s 的总和,price其中:actual_saleTRUE

print(actual1 <- sum(df$price[df$actual_sale])) # Actual Revenue

[1] 820

我创建了一个函数来模拟伯努利试验est_pprice值:

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 

看起来不错,实际值 = 中值!但是当我将相同的函数应用于增加的(复制 x 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

为什么实际收入超出模拟值范围?我在哪里犯了错误,这个问题的正确解决方案是什么?

4

1 回答 1

0

我需要一个空间来澄清我的评论,rbindcbind你的do.call. 在这里,为什么我这么说。

set.seed(100)
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))

print(actual1 <- sum(df$price[df$actual_sale])) # Actual Revenue

[1] 820

# here is where you need to change the rbind to cbind to stay within the range 
# otherwise you're essentially changing the distribution of the data and you 
# can't compare the results 
df1000 <- do.call("cbind", replicate(1000, df, simplify = FALSE))
print(actual2 <- sum(df1000$price[df1000$actual_sale])) 
[1] 820

这里是simulated分布,rbind分布和cbind分布让你有一个直观的感受。如您所见,simulatedcbind是相同的。rbind产生了不同的分布。或quantile()取自fivenum()分布。这就是为什么你得到一个不同的数字。

二项式输出

希望这有助于追踪为什么或从哪里quantile()获得数字的原因。

于 2019-08-26T03:51:51.810 回答