Mål og forberedelser
Simulering er viktig for statistikk og andre områder hvor man har behov for å introdusere tilfeldighet, f.eks. Monte Carlo simuleringer og bootstrapping. I denne arbeidsboken skal vi vise hvordan man kan generere tilfeldige tall i R.
Mål for arbeidsboken:
I denne arbeidsboken skal du lære:
- Å generere tilfeldige tall.
- Å trekke tilfeldige tall.
Generere tilfeldige tall
I R kan man genere tilfeldige tall med innbygde funksjoner, som gjør at man kan simulere fra kjente sannsynlighetsfordelinger.
Funksjoner knyttet til normalfordelingen:
rnorm()
: genererer variabler med en normalfordeling gitt spesifisert gjennomsnitt og standardavvik.dnorm()
: genererer sannsynlighetstettheten til en normalfordeling gitt spesifisert gjennomsnitt og standardavvik.pnorm()
: genererer kumulative sannsynlighetsfordelingen til en normal fordeling gitt spesifisert gjennomsnitt og standardavvik.qnorm()
: genererer den inverse kumulative sannsynlighetsfordelingen til en normal fordeling gitt spesifisert gjennomsnitt og standardavvik.
Funksjoner for andre fordelinger:
rpois()
: genererer tilfeldige Poisson variabler for en oppgitt rate.rbinom()
: genererer tilfeldige binære variabler.
For alle distribusjoner brukes de samme prefiksene:
d
: for sannsynlighetstettheten.r
: for generering av tilfeldige tall.p
: for den kumulative sannsynlighetsfordelingen.q
: for den inverse kumulative sannsynlighetsfordelingen.
Gjøre kode repliserbart: set.seed()
Dersom vi ønsker at koden vår og resultatene våre skal være mulig å replisere når vi genererer tilfeldige tall, kan vi bruke set.seed()
-funksjonen. Dette gjør det mulig å replisere en gitt sekvens av tilfeldige tall. I set.seed()
spesifiserer man et tall, og alle andre som spesifiserer det samme tallet og kjører den samme koden vil få de samme (psuedo-)tilfeldige genererte tallene.
# Setter "frøet"
set.seed(123)
# Genererer en tilfeldig normalfordelt variabel
rnorm(n = 10, mean = 5, sd = 1)
## [1] 4.439524 4.769823 6.558708 5.070508 5.129288 6.715065 5.460916 3.734939
## [9] 4.313147 4.554338
Generere tilfeldige variabler
I dette eksemplet vil vi simulere hva respondenter ville svart på en survey om politiske holdinger og stemmegivning.
Generere variabel for holdinger
Vi begynner med å lage en variabel for politisk ideologi som er normalfordelt med rnorm()
. For denne variabelen betyr 0 at man er på venstresiden og 10 at man er på høyresiden. Her må vi spesifisere følgende argumenter: antall observasjoner vi vi ha (n), gjennomsnittet til fordeligen (mean) og standardavviket (sd).
# Setter "frøet"
set.seed(12345)
# Genererer en tilfeldig normalfordelt variabel for politisk ideologi
ideologi <- rnorm(n = 100, mean = 4.5, sd = 2.2)
# Undersøker variabelen
summary(ideologi)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.7368 3.2018 5.5642 5.0394 6.4809 9.9496
I kodesnuttet over satt vi gjennomsnittet til 4.5 og standardavviket til 2.2. I sammendraget ser vi at den minste verdien til variabelen er under 0. Ettersom vi simulerer svar for en variabel som går mellom 0 (støtte til venstresiden) og 10 (støtte til høyresiden), ønsker vi at verdiene til den simulerte variabelen skal holde seg mellom disse verdiene. Dette kan vi gjøre ved å bruke funksjonen rtruncnorm()
i pakken truncnorm
.
# Installerer og henter pakken truncnorm
install.packages("truncnorm")
library(truncnorm)
# Generer en tilfeldig normalfordelt variabel for politisk ideologi innenfor spennet til variabelen
ideologi2 <- rtruncnorm(n = 100, a = 0, b = 10, mean = 4.5, sd = 2.2)
# Undersøker variabelen
summary(ideologi2)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.4402 3.2884 4.5321 4.5424 5.9124 9.9638
# Plotter fordelingen
hist(ideologi2, breaks = 20)
Generere variabel for stemmegivning
Lag en binær variabel for om en respondent har stemt ved forrige valg eller ikke. Her må vi spesifisere følgende argumenter: antall observasjoner (n), antall forsøk (size), og sannsynligheten for suksess/at man for 1 (prob). Her vil vi ha 100 observasjoner, 1 forsøk og 80% sannsynlighet for at man har stemt (0.8). Kall variabelen stemt
.
stemt <- rbinom(n = 100, size = 1, prob = 0.8)
stemt
med table().
table(stemt)
Tilfeldig sampling
Dersom vi ønsker å trekke et tilfeldig utvalg fra en vektor eller et datasett, kan vi bruke funksjonen sample()
. Funksjonen tar flere argumenter, bl.a.:
x
: objektet som utvalget skal trekkes fra.size
: størrelsen på utvalget.replace
: om enkeltverdier skal “legges tilbake” i objektet etter de har blitt trukket, og dermed kan bli trukket på nytt (bl.a. nyttig for bootstrapping).prob
: spesifiserer om enkelte elementer har høyere sannsynlighet for å bli trukket enn andre.
Vi ønsker å trekke et tilfeldig utvalg fra variabelen ideologi
. Vi ønsker å trekke 20 enheter.
# Bruker sample() til å trekke 20 tilfeldige enheter
sample(ideologi, size = 20) # Default til replace er FALSE og prob er NULL
## [1] 9.008219 5.748287 9.627126 6.297180 1.083098 6.312350 2.477492 5.644476
## [9] 8.471215 6.982724 6.561709 8.607618 6.286121 3.874849 9.219143 4.617899
## [17] 2.191424 5.157192 5.680352 3.311151
Bruk sample()
til å trekke 30 tilfeldige enheter fra objektet ideologi
.
sample(ideologi, size = 30)
Bruk sample()
til å trekke 10 tilfeldige enheter med tilbakelegging fra objektet ideologi
.
sample(ideologi, size = 10, replace = TRUE)