1 + 1
## [1] 2
2*3
## [1] 6
15/4
## [1] 3.75
17 %% 4 # modulo
## [1] 1
x <- c(1, 4, 5, 5) # priradenie do vektora
x
## [1] 1 4 5 5
rep(3, times = 5) # staci rep(3, 5)
## [1] 3 3 3 3 3
rep(c(1, 15, 20), times = 5)
## [1] 1 15 20 1 15 20 1 15 20 1 15 20 1 15 20
rep(c(1, 15, 20), each = 5)
## [1] 1 1 1 1 1 15 15 15 15 15 20 20 20 20 20
seq(from = 0, to = 100, by = 10)
## [1] 0 10 20 30 40 50 60 70 80 90 100
seq(from = 1, to = 100, length.out = 15)
## [1] 1.000000 8.071429 15.142857 22.214286 29.285714 36.357143
## [7] 43.428571 50.500000 57.571429 64.642857 71.714286 78.785714
## [13] 85.857143 92.928571 100.000000
10:20
## [1] 10 11 12 13 14 15 16 17 18 19 20
Práca s vektormi - lepšie priamo ako v cykloch
x1 <- seq(from = 5, to = 15, by = 2)
x1
## [1] 5 7 9 11 13 15
x2 <- x1 + 1
x2
## [1] 6 8 10 12 14 16
x1 + x2
## [1] 11 15 19 23 27 31
x1/x2 # delenie bude po zlozkach
## [1] 0.8333333 0.8750000 0.9000000 0.9166667 0.9285714 0.9375000
length(x1)
## [1] 6
max(x1)
## [1] 15
min(x1)
## [1] 5
unique(c(1, 2, 2, 5, 6, 2))
## [1] 1 2 5 6
3 > 4
## [1] FALSE
y1 <- c(1, 3, 5, 2)
y2 <- c(2, 2, 5, 2)
y1 == y2 # porovnanie bude po zlozkach
## [1] FALSE FALSE TRUE TRUE
y1 != y2
## [1] TRUE TRUE FALSE FALSE
y1 < y2
## [1] TRUE FALSE FALSE FALSE
all(y1 < y2)
## [1] FALSE
any(y1 < y2)
## [1] TRUE
(1 < 3) & (1 < 0) # AND
## [1] FALSE
(1 < 3) | (1 < 0) # OR
## [1] TRUE
grep(pattern = "o", x = c("pondelok", "utorok", "streda"))
## [1] 1 2
grepl(pattern = "o", x = c("pondelok", "utorok", "streda"))
## [1] TRUE TRUE FALSE
strsplit("MAREC", "")
## [[1]]
## [1] "M" "A" "R" "E" "C"
strsplit("MAREC", "")[[1]]
## [1] "M" "A" "R" "E" "C"
as.character(12345)
## [1] "12345"
paste("A", "B", "C")
## [1] "A B C"
paste0("A", "B", "C")
## [1] "ABC"
vypocet <- function(x, y, n){
pom1 <- (x + y)^n
pom2 <- x*y
return(pom1/pom2)
}
vypocet(1, 3, 1)
## [1] 1.333333
set.seed(123) # kvoli reprodukovatelnosti
sample(1:10, size = 8, replace = FALSE)
## [1] 3 10 2 8 6 9 1 7
sample(1:10, size = 8, replace = TRUE)
## [1] 6 9 10 5 3 9 9 9
sample(1:3, size = 20, replace = TRUE, prob = c(0.6, 0.3, 0.1))
## [1] 2 2 1 1 1 1 3 3 2 2 1 1 2 1 1 1 1 1 1 1
pocetRoznych <- function(n){
vyber <- # doplnte - chceme vygenerovat n hodnot spomedzi 1, 2, ..., n, s opakovanim a rovnakymi pravdepodobnostami
return() # doplne - pocet roznych cisel vo vybere
}
set.seed(123) # kvoli reprodukovatelnosti
simulacia <- replicate(10^5, pocetRoznych(10))
table(simulacia) # pocetnosti pre jednotlive moznosti
prop.table(table(simulacia)) # relativne pocetnosti = odhady pravdepodobnosti
mean(simulacia) # priemer = odhad strednej hodnoty
Pre kontrolu:
## simulacia
## 2 3 4 5 6 7 8 9 10
## 0.00001 0.00067 0.01671 0.12991 0.34460 0.35559 0.13584 0.01624 0.00043
## [1] 6.51233
Hodíme päťkrát pravidelnou kockou a zaznamenáme súčet čísel, ktoré padli. Aké možnosti súčtu a ako často nastali?
# definujte funkciu
sucet <- function(){
...
}
# spravte simulacie
set.seed(123)
simulacie <- replicate( ... )
# zobrazte vysledky
To isté, ale hádžeme päťdesiatkrát.
Pri veľkom počte výsledkov sa namiesto stĺpcového grafu oplatí spraviť histogram:
Hodíme desaťkrát pravidelnou kockou a zaznamenáme či padla aspoň raz šestka. Ako často nastala situácia, že šestka padla a ako často nie?
Návod:
set.seed(123)
kocky <- sample(1:6, size = 10, replace = TRUE)
kocky
## [1] 3 6 3 2 2 6 3 5 4 6
kocky == 6
## [1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
Hodíme desaťkrát nepravidelnou kockou, pri ktorej má jednotka pravdepodobnosť padnutia 0,5 a ostatné hodnoty po 0,1. Zaznamenáme či padla aspoň raz šestka. Ako často nastala situácia, že šestka padla a ako často nie? Inak povedané: Aký je náš odhad pravdepodobnosti, že padla aspoň jedna šestka?
Návod: parameter prob
funkcie sample
kocky <- sample(1:6, size = 10, replace = TRUE, prob = ) # doplnte
Hodíme päťkrát pravidelnou mincou. Aká je pravdepodobnosť, že hlava padla práve trikrát?
Do výťahu nastúpilo na prízemí osemposchodovej budovy 10 ľudí. Každý vystupuje s rovnakou pravdepodobnosťou na každom z poschodí, nezávisle od ostatných. Aká je stredná hodnota počtu poschodí, na ktorých výťah zastane, lebo na tomto poschodí niekto vystupuje?
V lotérii sa ťahá 5 čísel z 35. Aká je pravdepodobnosť, že budú medzi nimi dve susedné čísla?
Na každej zo šiestich kartičiek je napísané jedno písmeno a sú usporiadané tak, že vytvárajú slovo KARATE. Zamiešame ich a náhodne vyberáme, pričom ich ukladáme vedľa seba. Aká je pravdepodobodobnosť, že vznikne slovo RAKETA?
Príklad z cvičenia - študent, ktorý píše písomku z dejepisu o amerických prezidentoch
Príklad z cvičenia o narodeninách - firma, kde sa nepracuje v dňoch, keď má niekto narodeniny.
Príklad z cvičenia o narodeninách - lístok zadarmo.
Syntax:
# hadzeme siestimi kockami, ak padne aspon jedna sestka, vyhrame 1 euro, inak nic
set.seed(12)
x <- sample(1:6, size = 6, replace = TRUE)
x
## [1] 2 2 3 6 5 5
vyhra <- 0
if(any(x == 6)) vyhra <- 1
vyhra
## [1] 1
x
## [1] 2 2 3 6 5 5
vyhra <- 0
if(any(x == 6)){
vyhra <- 1
print("HURA!!!")
}
## [1] "HURA!!!"
vyhra
## [1] 1
x <- sample(1:6, size = 6, replace = TRUE)
x
## [1] 4 2 3 2 5 2
vyhra <- 0
if(any(x == 6)){
vyhra <- 1
print("HURA!!!")
} else{
vyhra <- 0
print("SMOLA :(")
}
## [1] "SMOLA :("
ifelse
:
x <- c(4, 2, 3, 2, 5, 2)
vysledok <- ifelse(any(x == 6), "HURA", "SMOLA")
vysledok
## [1] "SMOLA"
parita <- ifelse(x %% 2 == 0, "parne", "neparne")
parita
## [1] "parne" "parne" "neparne" "parne" "neparne" "parne"
Ak sa dá, treba pracovať s vektormi, niekedy však treba niečo prejsť v cykle
Syntax:
x
## [1] 4 2 3 2 5 2
y <- numeric(length(x)) # vektor s rovnakym rozmerom ako x, numericke zlozky
for(i in 1:length(x)) y[i] <- x[i] + 2
z <- numeric(length(x)) # vektor s rovnakym rozmerom ako x, numericke zlozky
for(i in 1:length(x)) {
pom <- x[i] %% 2 # pomocna premenna
z[i] <- pom
}
z
## [1] 0 0 1 0 1 0
Cvičenie: Vytvorte tieto vektory y
a
z
bez cyklu.
Užitočné použitie for-cyklu: Príklad zo slajdov o podmienených pravdepodobnostiach zo súťaže Putnam exam o hádzaní na basketbalový kôš.
koniec <- 0
while(!koniec) # v jednom riadku netreba zatvorky
while(!koniec){
# telo cyklu
}
Vygenerujme si nejaké hodnoty:
x <- 1:10
y <- 11:21
xy <- cbind(x, y) # spoji x, y ako stlpce (c = column)
## Warning in cbind(x, y): number of rows of result is not a multiple of vector
## length (arg 1)
xy
## x y
## [1,] 1 11
## [2,] 2 12
## [3,] 3 13
## [4,] 4 14
## [5,] 5 15
## [6,] 6 16
## [7,] 7 17
## [8,] 8 18
## [9,] 9 19
## [10,] 10 20
## [11,] 1 21
class(xy)
## [1] "matrix" "array"
# PRIKLAD 1
apply(xy, # pracujeme s maticou xy
MARGIN = 1, # po riadkoch
FUN = function(vstup) vstup[2] %% vstup[1]) # na kazdy riadok sa pouzije tato funkcia
## [1] 0 0 1 2 0 4 3 2 1 0 0
# PRIKLAD 2
apply(xy, 1, max)
## [1] 11 12 13 14 15 16 17 18 19 20 21
# PRIKLAD 3
f <- function(vstup) vstup[1] > vstup[2]
vysledok <- apply(xy, 1, f)
vysledok
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# PRIKLAD 4
set.seed(123)
apply(xy,
2, # po stlpcoch
function(a) sample(a, size = 2, replace = FALSE)) # vyberieme nahodne dve zlozky s opakovanim
## x y
## [1,] 3 20
## [2,] 1 12
Uvažujme príklad analogický cvičeniu o hádaní odpovedí na teste o prezidentoch, v ktorom je však len 6 otázok. Nájdeme presné pravdepodobnostné rozdelenie počtu bodov, ktoré študent získa.
# install.packages(gtools) # ak treba nainstalovat balik
library(gtools)
n <- 6
permutacie <- permutations(n, n) # help k funkcii pomocou ?permutations
head(permutacie)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 1 2 3 4 6 5
## [3,] 1 2 3 5 4 6
## [4,] 1 2 3 5 6 4
## [5,] 1 2 3 6 4 5
## [6,] 1 2 3 6 5 4
Pomocou
apply
spočítajte počet bodov, ktoré študent získa pre každú možnú odpoveď. Vypočítajte pravdepodobnosti jednotlivých počtov bodov, ktoré získa pri náhodnom výbere odpovede.
Základná myšlienka: Tú istú funkciu voláme pre rôzne vstupy (preto
apply
), pričom (ak sa to dá) sa výstup zjednoduší na vektor
alebo pole (simplify, preto s
).
Hádžeme mincami, vo vseobecnosti nepravidelnými
minca <- function(p) sample(c("H", "Z"), size = 1, p = c(p, 1-p))
minca(0.5) # hodime pravidelnou mincou
## [1] "H"
minca(0.1) # hodime nepravidelnou mincou, pp. hlavy je 0.1
## [1] "Z"
set.seed(123)
sapply(c(0.5, 0.1, 0.9), # prva minca je pravidelna, druha ma pp. hlavy 0.1, tretia 0.9
minca) # volame funkciu pocetH
## [1] "Z" "Z" "H"
Uvažujme príklad z cvičenia o podmienenej pravdepodobnosti zo súťaže Putnam, v ktorej sa hádže mincami. Napíšte funkciu, ktorá pre zadaný počet mincí simuluje hádzanie a vráti TRUE/FALSE podľa toho, či je počet hláv párny alebo nepárny. Simuláciou odhadnite pravdepodobnosť výsledku TRUE pre 10 mincí.
Zoznam otázok na skúšku obsahuje 30 otázok. Napísané sú po dvojiciach na kartičkách, pričom sa neopakujú a dvojice sú vytvorené náhodne. Študent ovláda 25 otázok. Na to, aby skúšku spravil, musí buď zodpovedať obidve otázky z vytiahnutej kartičky alebo na jednu z otázok (ktorú si vyberie) a na jednu otázok z druhej vytiahnutej kartičky, pričom túto otázku vyberie skúšajúci (s rovnakou pravdepodobnosťou vyberie jednu z otázok, ktoré sú na kartičke). Aká je pravdepodobnosť, že študent skúšku spraví?
V púšti ide za sebou 6 tiav. Po tom, čo majú prestávku, sa usporiadajú náhodným spôsobom tak, že každé usporiadanie má rovnakú pravdepodobnosť. Aká je pravdepodobnosť, že žiadna ťava nemá pred sebou tú istú ťavu ako predtým?
Číslo žrebu v lotérii je na ňom napísané ako päťciferné číslo od 00001 do 99999. Náhodne si jeden kúpime. Aká je pravdepodobnosť, že číslice, z ktorých sa skladá jeho číslo, sú všetky rôzne?
Hádžeme pravidelnou kockou, kým nepadne šestka. Aká je pravdepodobnosť, že budeme musieť hádzať viac ako trikrát?
Ľubovoľný príklad z kombinatoriky alebo diskrétnej pravdepodobnosti podľa vlastného výberu. :)