Skip to Tutorial Content

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)
Undersøk fordelingen til 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)

Simulering i R

Master i statsvitenskap — R-forberedelse

Eli Baltzersen

2023-06-23