R - ggplot和Shiny中的随机数生成

时间:2017-04-23 04:27:44

标签: r random shiny

我正在使用FinCal包及其赔率建立净现值(NPV)图。对于NPV,现金流量使用销售的三角分布,成本的正态分布等进行模拟。所以,这是我正在做的事情的片段:

npvCdf <- function(n) {
  N <- sort(n)
  P <- ecdf(N)
  return(P)
}

makePlot <- function(C, m) {
  N <- m$NPV / C$MILLION
  P <- npvCdf(N)
  #
  # NPV distribution curve
  n <- sort(N)
  p <- P(n) * 100
  df <- data.frame(npv = n, odds = p)
  #
  # Points of interest
  o <- C$NPV_BREAK_EVEN_WORST_ODDS
  q <- round((quantile(n, o)), C$DIGITS)
  e <- C$NPV_BREAK_EVEN_VALUE
  b <- P(e) * 100   # THIS IS THE ERROR I CANT FIGURE OUT
  w <- o * 100
  s <- getBreakEven(C, m)
  #
  # Labels
  npvOdds <- paste("Odds of break-even : ", b, "%")
  salesThresh <- paste("Sales threshold : ", s)
  worstCase <-
    paste("Worst case (@ 5% odds) : ", q, "million")
  #
  # Make plot
  #
  g <- ggplot(df, aes(x = npv, y = odds)) +
    geom_line(colour = "blue") +
    labs(title = "NPV and Odds") +
    labs(x = "NPV (million)") +
    labs(y = "Percent (%)") +
    geom_vline(xintercept = e,
               colour = "red",
               linetype = "longdash") +
    geom_hline(yintercept = b,
               colour = "green",
               linetype = "longdash") +
    geom_vline(xintercept = q,
               colour = "green",
               linetype = "dotdash") +
    geom_hline(yintercept = w,
               colour = "red",
               linetype = "dotdash")

C是所有常数的数据框,用于计算现金流量,NPV计算等。例如,C$MILLION=1000000用于划分NPV以便更简单地表示。 m是每个模拟的销售,现金流量和净现值的数据框架。模拟用于现金流量(三角分布),可变成本(正态分布)等。

而且,这是使用上述代码段的Shiny代码。

library(shiny)
source("../npd-c.R")
# Define server logic 
shinyServer(function(input, output) {
  output$npdPlot <- renderPlot({

    C <- data.frame(2017,5000,1000000,3,100,500000,0.0,0.05,0.1,
                    input$salesRange[1],
                    input$salesRange[2],
                    input$salesMode,
                    input$demDeclMean,
                    input$demDeclSd,
                    input$varCostMean,
                    input$varCostSd,
                    input$fixedCostRange[1],
                    input$fixedCostRange[2]
                    )
    names(C) <-
      c(
        "SEED",
        "ITERATIONS",
        "MILLION",
        "DIGITS",
        "PRICE",
        "OUTLAY",
        "NPV_BREAK_EVEN_VALUE",
        "NPV_BREAK_EVEN_WORST_ODDS",
        "HURDLE_RATE",
        "SALES_TRIANG_MIN",
        "SALES_TRIANG_MAX",
        "SALES_TRIANG_MODE",
        "DEM_DECL_FACTOR_MEAN",
        "DEM_DECL_FACTOR_SD",
        "VAR_COST_RATE_MEAN",
        "VAR_COST_RATE_SD",
        "FIX_COST_RATE_MIN",
        "FIX_COST_RATE_MAX"
      )

    n <- npd(C,-1)
    g <- makePlot(C,n)
    g
  })
})

问题如下。

在R中运行相同的代码时,我根据NPV曲线,水平线和垂直线获得正确的图。然而,当作为Shiny应用程序运行时,水平和垂直线都会发生巨大的位移。尽管如此,将NPV和现金流代码分配到单独的.R文件中,并且为Shiny和非闪亮版本设置相同的种子值。例如,P(0)=40.07没有Shiny,P(0)=4.7有Shiny应用程序。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

首先,让我说这是非常有用的代码。这是使用NPV进行蒙特卡罗模拟的一个很好的代表,我喜欢这些情节。这是一篇我非常肯定会回顾的帖子。

我认为我看到问题出在哪里,基本上更多的是误解和一个小的编程错误。

所述的问题是这些图表虽然应该是显示相同的结果。蓝色ecdf-NPV曲线看起来乍一看是相同的:

闪亮版:

enter image description here

独立版本:

enter image description here

然而,如果你仔细观察,你会发现它们实际上并不相同,第一种情况下的预期NPV值(50%)约为150万,而第二种情况下仅为0.2左右。 / p>

曲线看起来一样,但它们不是。另一点是,其中一个计算中存在错误,进一步混淆了事情。 &#34;盈亏平衡的几率&#34;计算错误,实际上是&#34;赔钱的几率&#34;。

正确的计算应该是:

b <- (1-P(e)) * 100 

在第一种情况下,正确的破损几率约为60%,在第二种情况下约为95%,这与预期的NPV相符。