Problem 3 of Monte Carlo solutions to Fifty Challenging Problems...
(This is another part of the Fifty Problems series, a set of example applications of Monte Carlo methods. In each post, I present source code which answers a probabilistic question using simulated models of the underlying system.)
In a jury, each individual member has probability p of making the right decision. Which is more likely to find the correct decision: a 3-person jury in which the third member decides by flipping a coin (50/50), or a 1-person jury? (NB: these juries are majority rule, not unanimous)
#!/usr/bin/env ruby
# First off, we need to model the juries:
# 1. One-man jury: just p every time
# 2. Three-man jury: p,p,0.5 (majority rules)
#
# The goal is: which jury is more likely to be correct?
# Apparent sexism note: if "woman" was shorter than "man",
# these would all be n_woman_judgement. I'm lazy.
def one_man_judgement(p)
sample = rand()
if (sample < p)
return true
else
return false
end
end
def three_man_judgement(p)
j1 = one_man_judgement(p)
j2 = one_man_judgement(p)
j3 = one_man_judgement(0.5)
if (j1 && j2 || j1 && j3 || j2 && j3)
return true
else
return false
end
end
# So, now we can get the judgement of a jury by calling one of the above.
# if it's true, they got the correct judgement; if false, they got it wrong.
# Since we're leaving p unspecified, we should sample it at multiple
# values. I usually go for 20 right up front, since it's often over
# the precision needs of a problem. If you see anything fishy (esp
# non-monotonic behavior), you probably want to run again with tighter
# buckets, to get a better idea of the shape of the curve.
SAMPLE_WIDTH=0.05
TRIALS=10000
one_man_wins = 0
three_man_wins = 0
p = 0.0
while (p <= 1.0)
# now, we create the confusion matrix:
one_man_outcomes = { :correct => 0, :incorrect => 0 }
three_man_outcomes = { :correct => 0, :incorrect => 0 }
TRIALS.times do
o = one_man_judgement(p)
t = three_man_judgement(p)
one_man_outcomes[ o ? :correct : :incorrect ] += 1
three_man_outcomes[ t ? :correct : :incorrect ] += 1
end
p_one = one_man_outcomes[:correct] / TRIALS.to_f
p_three = three_man_outcomes[:correct] / TRIALS.to_f
puts "==== #{p} // #{TRIALS} ===="
puts "sample\ttrue\tfalse\tP"
puts "one\t#{one_man_outcomes[:correct]}\t#{one_man_outcomes[:incorrect]}\t#{p_one}"
puts "three\t#{three_man_outcomes[:correct]}\t#{three_man_outcomes[:incorrect]}\t#{p_three}"
one_man_wins += one_man_outcomes[:correct]
three_man_wins += three_man_outcomes[:correct]
p += SAMPLE_WIDTH
end
puts
puts "FINAL: At #{one_man_wins} samples one-man is better; at #{three_man_wins} three-man is better"
I've been coding my way through Fifty Challenging Problems in Statistics with Solutions. This post is a part of the Fifty Challenging Problems series.
This was brought to you by Josh Myer. He has other fun things at his homepage.