Homework 2

Aleksei Parm

2022-09-18

Ülesanne 2.1

Defineeri funktsioon, mis etteantud kahekomponedilisest seemnest (x0, x1) ja positiivsest täisarvust n lähtuvalt genereeriks n pseudojuhuslikku arvu vastavalt valemile ui−1 = xi / 230 , i = 2, … , n + 1,
kus arvud xi leitakse vastavalt valemile xi = (5 * (xi−1)2 + 171 * xi−2 + 3) mod 230

generaator <- function(x0, x1, n) {
  u <- rep(NA, n)
  
  xim1 <- x1
  xim2 <- x0
  
  for (i in 2:(n+1)) {
    xi <- (5 * xim1^2 + 171 * xim2 + 3) %% 2^30
    u[i-1] <- xi / 2^30
    
    xim2 <- xim1
    xim1 <- xi
  }
  
  return(u)
}


Kontrolli n=10000 ja seemne (1974, 42) korral, kas sündmuse 0.2 ≤ U ≤ 0.3 toimumine on kooskõlas ühtlase jaotuse eeldusega.

n <- 10000
u <- generaator(1974, 42, n)


Fikseerime sündmuse A = {0.2 ≤ U ≤ 0.3}. Sündmuse A toimumiste arv n sõltumatu katse jooksul (N_A).

N_A = sum((u >= 0.2) * (u <= 0.3))
N_A
## [1] 1005


N_A on binoomjaotusega parameetritega n ja p, kus p on sündmuse A toimumise tõenäosus ühel katsel. Antud juhul on p lõigu [0.2; 0.3] pikkus ehk 0.1. Kvantiili definitsioonist tulenevalt peaks juhuslik suurus oma 2,5% ja 97,5% kvantiilide vahele jääma 95% tõenäosusega.

ülempiir <- qbinom(0.975, n, 0.1)
alampiir <- qbinom(0.025, n, 0.1)
c(alampiir,ülempiir)
## [1]  942 1059
(N_A >= alampiir) && (N_A <= ülempiir)
## [1] TRUE


Päris juhuslike katsete korral peaks leitud arv jääma tõenäosusega 0.05 ka piiridest välja.

Korda katset 200 korda (n = 1000, võtteks esimeseks seemneks (1974, 42) ja järgmistel kordadel viimasest generaatori väljastatud arvudele un ja un-1 vastav xn ja xn-1) ning leia, mitu korda jäi leitud tulemus piiridest välja.

kordi <- 200
n <- 1000

x0 <- 1974
x1 <- 42

#uued alampiir ja ülempiir (n = 1000)
ülempiir <- qbinom(0.975, n, 0.1)
alampiir <- qbinom(0.025, n, 0.1)

väljas <- 0

for(i in 1:200) {
  u <- generaator(x0, x1, n)
  N_A <- sum((u >= 0.2) * (u <= 0.3))
  
  if(N_A > ülempiir | N_A < alampiir) {
    väljas <- väljas + 1
  }
  
  x0 <- round(2^30 * u[n - 1])
  x1 <- round(2^30 * u[n])
}

väljas
## [1] 9


Kordade arv 200 katse seast, millel N_A jääb kvantiilide vahemikust välja, on ka omakorda binoomjaotusega parameetritega n = 200 (see on katsete arv) ja p = 0.05 (kvantiili definitsioonist tulenevalt peaks juhuslik suurus oma 2.5% ja 97.5% kvantiilide vahelt välja jääma 5% tõenäosusega).

Selle binoomjaotuse keskväärtus on np = 200 · 0, 05 = 10. Seega oodatavalt võiks 200-st katsest N_A jääda kvantiilide vahemikust välja 10 korda.

vahe <- abs(väljas - 10)
vahe
## [1] 1

Praegu jäi suurus N_A kvantiilide vahemikust välja 9 korral. See erineb oodatavast välja jäämiste arvust 1 võrra.


Kui suur on tõenäosus, et see kordade arv erineks oodatavast väljajäämiste arvust vähemalt niipalju, kui praguse katse tulemus näitas?

P(N_A erineb oodatavast tulemusest 10 vähemalt sama palju kui meie konkreetne tulemus 9)
= P(|N_A − 10| ⩾ vahe)
= P(10 − vahe ⩾ N_A ⩾ 10 + vahe)
= P({N_A ⩽ 10 − vahe} ∪ {N_A > 10 + vahe − 1})
= P({N_A ⩽ 10 − vahe}) + 1 − P({N_A ⩽ 9 + vahe})
= FN_A (10 − vahe) + 1 − FN_A (9 + vahe)
= FN_A (9) + 1 − FN_A (10)

Kuna N_A ∼ B(200; 0.05), siis saame FN_A arvutamisel kasutada R funktsiooni pbinom (binoomjaotuse jaotusfunktsioon).

if(vahe != 0){
  pbinom(10 - vahe, kordi, 0.05) + (1 - pbinom(9 + vahe, kordi, 0.05))
} else {1}
## [1] 0.8716426

Tõenäosus, et see kordade arv erineks oodatavast väljajäämiste arvust vähemalt niipalju, kui praguse katse tulemus näitas, on ~0.87.


Ülesanne 2.2

Kirjuta Wichmann-Hilli generaator R funktsioonina, mis võtaks argumentideks arvu, mitu juhuslikku suurust on vaja teha, ja seemne (3 arvu).

WH_generaator <- function(n, xi, yi, zi) {
  tulemus <- rep(NA, n)
  for (i in 1:(n)) {
    xi <- (171 * xi) %% 30269 
    yi <- (172 * yi) %% 30307
    zi <- (170 * zi) %% 30323
    tulemus[i] <- (xi/30269 + yi/30307 + zi/30323) %% 1
  }
  return(tulemus)
}


Genereeri selle generaatoriga 1000 pseudojuhuslikku arvu, lähtudes seemnest (x0, y0, z0) = (166, 9, 32) ning kirjeldada joonisel nende arvude sattumist vahemikesse [0, 0.3), [0.3, 0.8), [0.8, 1).

Samal joonisel kujutada teoreetilised 0.05 ja 0.95 kvantiilid (mis on iga vahemiku jaoks erinevad). Kommenteeri tulemust - kas see katse tekitab mingeid kahtluseid generaatori korrektsuse osas või mitte.

n <- 1000
u <- WH_generaator(n, 166, 9, 32)


Teoreetilised kvantiilid [0, 0.3) vahemiku jaoks.

x1 <- c(0, 0.3)
alampiir1 <- qbinom(0.05, n, 0.3)
ülempiir1 <- qbinom(0.95, n, 0.3)
y1a <- c(alampiir1, alampiir1)
y1ü <- c(ülempiir1, ülempiir1)

c(alampiir1, ülempiir1)
## [1] 276 324


Teoreetilised kvantiilid [0.3, 0.8) vahemiku jaoks.

x2 <- c(0.3, 0.8)
alampiir2 <- qbinom(0.05, n, 0.8 - 0.3)
ülempiir2 <- qbinom(0.95, n, 0.8 - 0.3)
y2a <- c(alampiir2, alampiir2)
y2ü <- c(ülempiir2, ülempiir2)

c(alampiir2, ülempiir2)
## [1] 474 526


Teoreetilised kvantiilid [0.8, 1) vahemiku jaoks.

x3 <- c(0.8, 1)
alampiir3 <- qbinom(0.05, n, 1 - 0.8)
ülempiir3 <- qbinom(0.95, n, 1 - 0.8)
y3a <- c(alampiir3, alampiir3)
y3ü <- c(ülempiir3, ülempiir3)

c(alampiir3, ülempiir3)
## [1] 179 221


Histogramm ja teoreetilised 0.05 ja 0.95 kvantiilid samal joonisel.

hist(u, breaks = c(0, 0.3, 0.8, 1), ylim = c(0, 600), freq = TRUE)

lines(x1, y1a, col = "red", lty = 3)
lines(x1, y1ü, col = "red", lty = 3)

lines(x2, y2a, col = "red", lty = 3)
lines(x2, y2ü, col = "red", lty = 3)

lines(x3, y3a, col = "red", lty = 3)
lines(x3, y3ü, col = "red", lty = 3)

See katse tekitab kahtluseid generaatori korrektsuse osas, kuna graafikul näeme et esimeses vahemikus on vähem arve, kui näitab 0.05 kvantiil.

Aga me ei saa öelda, kas see geraator on hea või mitte, sest juhuslik suurus peab oma 0.05 ja 0.95 kvantiilide vahelt välja jääma 10% tõenäosusega. Järelikult on vaja rohkem katseid.