SESSION 1
INTRODUCTION
CODING PRINCIPLES
Use sanity checks!!!! → dingen waarvan je weet wat de uitkomst is runnen, zodat je kunt checken of code werkt
SIMPLE SAMPLE
Sample() : generates observations of a discrete random variable with a specific distribution
• X = welke waarden het kan genereren
• Size = aantal waarden
• Met of zonder teruglegging
• Prob = kans dat een bepaald element getrokken wordt → komt overeen met de elementen van de
sample
o Eerste element heeft bv ½ (50%) kans om getrokken te worden
Vb: sample(x= c(8,3,1,9), size = 2 , replace = FALSE) → je krijgt iedere keer 2 cijfers (steekproeftrekkingen,
verschilt keer tot keer)
Replace = FALSE → betekent zonder teruglegging → max steekproefgrootte = 4
Indien replace = TRUE → zonder teruglegging → dan is size = 6 (groter dan aantal elementen vector) wel
mogelijk
• Indien 4 samples en maar 3 probabiliteiten → error
• Je kan argumenten ook gwn weglaten
• Sample(x=k, size=s, replace = TRUE, prob=p) → selecteert s van de waarden van k met kansen
gespecifieerd door p
• Vector k: discrete waarden die men kan trekken
• P: probabilities of each valueset in k being selected
• Prob niet gespecifieerd → alle elementen binnen de vector gelijke kans om getrokken te worden
• sample(x = 1:6, size = 5, replace = TRUE) is identical to sample(x = 1:6, size = 5, replace = TRUE, prob =
rep(1/6,6))
• replace niet gespecifieerd: trekking zonder teruglegging (replace = FALSE)
• size niet gespecifieerd → n = aantal elementen in k
ALEA IACTA EST
KERN: Kans op een specifieke uitkomst can be computed by simulating a large portion of events + prop
berekenen dat uitkomst voorkomt
Virtueel dobbelsteen gooien (simulation)
• 1x : sample(x = c(1,2,3,4,5,6), size = 1)
o Default: replace=FALSE (met teruglegging) , kansen gelijk voor iedere kant dobbelsteen
• 10 x: iedere uitkomst wordt opgeslagen in var “eyes”
5
o nsim <- 100000 #the number of virtual rolls
o eyes <- NULL #let R know that eyes exists
o for (i in 1:nsim){
o eyes[i] <- sample(x = 1:6, size = 1) #roll once, and store the result in eyes
o }
o Om kans op 2 gooien te berekenen → prop 2 nodig
▪ Aantal x 2 gegooid/ totaal aantal worpen
▪ Head(eyes==2) → vragen of 2 gegooid wordt
• Logische data → indien TRUE =1 → som = totaal aantal x 2 gegooid
• DUS: sum(eyes==2)/nsim (zie eerder → nsim is de laatste worp)
o OF: sum(eyes==2)/lenght(eyes)
, o OF: mean(eyes==2)
▪ FALSE = 0
▪ TRUE = 1
▪ Proportie van 1 (TRUE) = #1’s/totaal aantal elementen = mean
(want som van alles = som van alle 1’s)
Waarom is de simulatie-gebaseerde proportie niet exact gelijk aan de theoretische uitkomst?
• Simulatie is een schatting → want bijna altijd random data
• Indien simulatie meerdere keren runnen → gelijkaardige resultaten maar nooit exact hetzelfde
• Zie meer bij seeds
“Two students each chose one of the numbers 0, 1 or 2. What is the probability that the mean of both numbers
is smaller than 1.5?”
3 cijfers waaruit gekozen kan
worden = sample
Size → 2 studenten 1 nummer
Monte carlo simulation = simulates the sampling process from a defined population repeatedly by using a
computer instead of actually drawing multiple samples to estimate properties of the events of interest
TAKE YOUR SEAT
Random numbers generated with computer = pseudorandom (adhv wiskundige formules dat lijkt op random
trekken)
Indien kiezen met welk nummer starten → kun je simulatie nog eens exact recreëren
→set.seed() → eerste nummer in sample(), rnorm(), rbinom(), runif()
MORE ALEAS, MORE IACTAS
Simulatie adhv implicit loop (dus geen for loop) → bv adhv replicate()
Resultaten zijn iedere keer verschillend want geen seed → andere random data
simpelere versie
1 stap
accolades dienen voor duidelijkheid → wat er
tussen staat is wat gerepliceerd moet worden → indien maar 1 lijn kun je accolades weglaten
Code niet van links naar rechts lezen!!! → “work from within”
Voorbeeld:
mean(replicate(nsim, {sample(x = 1:6, size = 1)})==2)
1. first, we sample(x= 1:6, size = 1), i.e., pick 1 random number between 1 and 6
2. then we replicate(nsim, {sample(x = 1:6, size = 1)}), i.e, we do whatever it was we did in
{sample(1:6, 1)} nsim times again
, 3. then we do replicate(nsim, {sample(x = 1:6, size = 1)})==2, i.e. we check for each element of the
vector we produced using replicate(nsim, {sample(x = 1:6, size = 1)}) whether or not it is equal to 2
4. finally, we do mean(replicate(nsim, {sample(x = 1:6, size = 1)})==2), i.e., we compute the
proportion of 2s in our vector
Intermediary output checken → kan helpen (= tip)
• Nsim kleinere waarde → bv 10
Kan nog makkelijker
zonder loop
kan ook zonder variabelen een naam te geven
Conclusie: er zijn veel verschillende manieren om te coderen, work from within, inspecting intermediary output
is key om code te begrijpen, checken
SAVE SPACES
Ipv na de loop te gewenste data eruit te halen kun je ook binnen de for loop definiëren waarnaar we op
zoek zijn:
Of met replicate()
Of simpeler
1) sample nemen
1 sample nemen
2) Kijken of sample = 2
2 Dit nsim x doen
3) We doen sample == 2 nsim times
3 Per keer kijken of getrokken nummer een 2
repliceren
is
4) Mean nemen van alle 2’s (true’s)
4 Mean: proportie 2’s berekenen