2017-07-07 8 views
0

私はユーザがShiny GUIを使ってベータディストリビューション(p、q)のパラメータを調整できるようにしています。反応確率密度関数の面積を1に固定する方法を教えてください。

しかし、thetaは0から1の範囲内でなければならないため、私のコードでは、パラメータの選択に関係なく、カーブの下の領域が常に1に等しいことを基本的に保証するステップがありません。

私はこれについてどのように役立つか大いに感謝する方法について考えることができません。これを行うには

# Required packages 
require(shiny) 
require(ggplot2) 
require(gridExtra) 

# Beta plot function 
betaFun <- function(p = 1.1, q = 1.1){ 

    prior <- function(theta){ 
    (theta^(p - 1)) * ((1 - theta)^(q - 1)) 
    } 

    priorFill <- function(theta){ 
    ifelse(prior(theta) > 0 & prior(theta) < 1, prior(theta), NA) 
    } 

    ggplot(data = data.frame(x = as.double(0)), mapping = aes(x = x)) + 
    stat_function(fun = prior, col = 'blue') + 
    stat_function(fun = priorFill, geom = "area", fill = "blue", alpha = 0.2) + 
    geom_segment(x = 0, y = 0, xend = 1, yend = 0, color = 'blue') + 
    xlim(0, 1) + 
    ylim(0, 1) 

} 

# UI 
ui <- fluidPage(
    titlePanel("Beta Distribution"), 

    sidebarLayout(
    sidebarPanel(
     sliderInput("pInput", "Parameter p", min = 1.1, max = 5, value = 1, step = 0.1), 
     sliderInput("qInput", "Parameter q", min = 1.1, max = 5, value = 1, step = 0.1) 
), 

    mainPanel(
     plotOutput("betaPlot") 
    ) 
) 
) 

# Server 
server <- function(input, output) { 
    output$betaPlot <- renderPlot({ 
    betaFun(p = input$pInput, 
      q = input$qInput) 
    }) 
} 

# Execution 
shinyApp(ui = ui, server = server) 
+0

はここに定数を取得します。私が探していたhttps://en.wikipedia.org/wiki/Beta_distribution –

答えて

1

一つの方法は、あなたがアップフロント1の面積に正規化することができるように(代わりのstat_functionを使用してその場で)ggplotを実行する前に、すべての値を計算することであろう。次にstat_functionの代わりにgeom_lineを使用してプロットすることができます。たとえば:

# Required packages 
require(shiny) 
require(ggplot2) 
require(gridExtra) 

# Beta plot function 
betaFun <- function(p = 1.1, q = 1.1){ 

    theta = seq(0,1,length=1000) 
    dat = data.frame(theta, prior=(theta^(p - 1)) * ((1 - theta)^(q - 1))) 
    dat$prior = dat$prior/(sum(dat$prior)*mean(diff(theta))) # Normalize to area = 1 

    ggplot(dat, aes(theta, prior)) + 
    geom_line(color="blue") + 
    geom_area(alpha=0.2, fill="blue") + 
    geom_segment(x = 0, y = 0, xend = 1, yend = 0, color = 'blue') + 
    xlim(0, 1) + 
    ylim(0, 5) + 
    theme_classic(base_size=15) 

} 

# UI 
ui <- fluidPage(
    titlePanel("Beta Distribution"), 

    sidebarLayout(
    sidebarPanel(
     sliderInput("pInput", "Parameter p", min = 1.1, max = 5, value = 1, step = 0.1), 
     sliderInput("qInput", "Parameter q", min = 1.1, max = 5, value = 1, step = 0.1) 
    ), 

    mainPanel(
     plotOutput("betaPlot") 
    ) 
) 
) 

# Server 
server <- function(input, output) { 
    output$betaPlot <- renderPlot({ 
    betaFun(p = input$pInput, 
      q = input$qInput) 
    }) 
} 

# Execution 
shinyApp(ui = ui, server = server) 

enter image description here

enter image description here

+0

本当に素敵な答えとまさに。ありがとうございました。 –

+0

ベータ関数はRに組み込まれています.... –

+0

@ Hong Ooi確かに、ベータ関数はMWEのために選択されました。 –

関連する問題