Monty Hall Problem


Setup

Set Global Options

knitr::opts_chunk$set(
    dpi = 200,
    warning = FALSE,
    message = FALSE
)


Load Relevant Libraries

library(tidyverse)
library(ggthemes)
library(rmarkdown)
library(scales)


Traditional 3 Door Problem

Simulations_Input <- 100000

Traditional <-
    data.frame(
        Winning_Door = 
            sample(
                c('1', '2', '3'), 
                Simulations_Input, 
                replace = TRUE
            )
    ) %>% 
    rowwise() %>% 
    mutate(
        
        Picked_Door_1 = 
            sample(
                c('1', '2', '3'), 
                1, 
                replace = TRUE
            ),
        
        Eliminated_Door =
            sample(
                setdiff(
                    c('1', '2', '3'),
                    c(Picked_Door_1, Winning_Door)
                ),
                1
            ),
        
        Picked_Door_2 =
            setdiff(
                c('1', '2', '3'),
                c(Picked_Door_1, Eliminated_Door)
            ),
        
        Correct_Pick_1 =
             Winning_Door == Picked_Door_1,

        Correct_Pick_2 =
             Winning_Door == Picked_Door_2

    )

cat(
    'First Pick Correct Odds:',
    '  ',
    (Traditional %>% .$Correct_Pick_1 %>% sum()) / (Traditional %>% nrow()),
    '\n',
    'Second Pick Correct Odds:',
    ' ',
    (Traditional %>% .$Correct_Pick_2 %>% sum()) / (Traditional %>% nrow()),
    sep = ''
)
## First Pick Correct Odds:  0.33202
## Second Pick Correct Odds: 0.66798


More Doors


4 Doors

Number_Of_Doors_Input <- 4

Simulations_Input <- 100000

More_Doors <-
    data.frame(
        Winning_Door = 
            sample(
                as.character(c(1:Number_Of_Doors_Input)), 
                Simulations_Input, 
                replace = TRUE
            )
    ) %>% 
    rowwise() %>%
    mutate(

        Picked_Door_1 =
            sample(
                as.character(c(1:Number_Of_Doors_Input)),
                1,
                replace = TRUE
            ),

        Eliminated_Door =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Winning_Door)
                ),
                1
            ),

        Picked_Door_2 =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Eliminated_Door)
                ),
                1
            ),

        Correct_Pick_1 =
             Winning_Door == Picked_Door_1,

        Correct_Pick_2 =
             Winning_Door == Picked_Door_2

    )

cat(
    'First Pick Correct Odds:',
    '  ',
    (More_Doors %>% .$Correct_Pick_1 %>% sum()) / (Traditional %>% nrow()),
    '\n',
    'Second Pick Correct Odds:',
    ' ',
    (More_Doors %>% .$Correct_Pick_2 %>% sum()) / (Traditional %>% nrow()),
    sep = ''
)
## First Pick Correct Odds:  0.25126
## Second Pick Correct Odds: 0.37506


5 Doors

Number_Of_Doors_Input <- 5

Simulations_Input <- 100000

More_Doors <-
    data.frame(
        Winning_Door = 
            sample(
                as.character(c(1:Number_Of_Doors_Input)), 
                Simulations_Input, 
                replace = TRUE
            )
    ) %>% 
    rowwise() %>%
    mutate(

        Picked_Door_1 =
            sample(
                as.character(c(1:Number_Of_Doors_Input)),
                1,
                replace = TRUE
            ),

        Eliminated_Door =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Winning_Door)
                ),
                1
            ),

        Picked_Door_2 =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Eliminated_Door)
                ),
                1
            ),

        Correct_Pick_1 =
             Winning_Door == Picked_Door_1,

        Correct_Pick_2 =
             Winning_Door == Picked_Door_2

    )

cat(
    'First Pick Correct Odds:',
    '  ',
    (More_Doors %>% .$Correct_Pick_1 %>% sum()) / (Traditional %>% nrow()),
    '\n',
    'Second Pick Correct Odds:',
    ' ',
    (More_Doors %>% .$Correct_Pick_2 %>% sum()) / (Traditional %>% nrow()),
    sep = ''
)
## First Pick Correct Odds:  0.2
## Second Pick Correct Odds: 0.26604


6 Doors

Number_Of_Doors_Input <- 6

Simulations_Input <- 100000

More_Doors <-
    data.frame(
        Winning_Door = 
            sample(
                as.character(c(1:Number_Of_Doors_Input)), 
                Simulations_Input, 
                replace = TRUE
            )
    ) %>% 
    rowwise() %>%
    mutate(

        Picked_Door_1 =
            sample(
                as.character(c(1:Number_Of_Doors_Input)),
                1,
                replace = TRUE
            ),

        Eliminated_Door =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Winning_Door)
                ),
                1
            ),

        Picked_Door_2 =
            sample(
                setdiff(
                    as.character(c(1:Number_Of_Doors_Input)),
                    c(Picked_Door_1, Eliminated_Door)
                ),
                1
            ),

        Correct_Pick_1 =
             Winning_Door == Picked_Door_1,

        Correct_Pick_2 =
             Winning_Door == Picked_Door_2

    )

cat(
    'First Pick Correct Odds:',
    '  ',
    (More_Doors %>% .$Correct_Pick_1 %>% sum()) / (Traditional %>% nrow()),
    '\n',
    'Second Pick Correct Odds:',
    ' ',
    (More_Doors %>% .$Correct_Pick_2 %>% sum()) / (Traditional %>% nrow()),
    sep = ''
)
## First Pick Correct Odds:  0.16758
## Second Pick Correct Odds: 0.20699


data.frame(
    Number_of_Doors = c('3', '4', '5', '6'),
    First_Pick_Odds = c('1/3', '1/4', '1/5', '1/6'),
    Second_Pick_Odds = c('2/3', '3/8', '4/15', '5/24')
) %>% 
paged_table()


Where n is the number of doors:

First pick odds: 1 / n

Second pick odds: (n - 1) / (n * (n-2))


Odds_Vs_Doors <-
    data.frame(
        Doors = 3:15
    ) %>% 
    mutate(
        First_Pick_Odds = 1 / Doors,
        Second_Pick_Odds = (Doors - 1) / (Doors * (Doors - 2)),
        Difference = Second_Pick_Odds - First_Pick_Odds
    ) 

Odds_Vs_Doors %>% 
paged_table()


Odds_Vs_Doors %>% 

ggplot(aes(x = Doors)) + 
geom_line(aes(y = First_Pick_Odds, color = 'First Pick')) + 
geom_line(aes(y = Second_Pick_Odds, color = 'Second Pick')) + 
scale_color_gdocs(' ') +
scale_x_continuous(breaks = pretty_breaks(n = 10)) +
theme_bw() + 
xlab(paste('\n', '# of Doors')) +
ylab(paste('Probability of Success', '\n'))