Rachunek_prawdopodobienstwa/Przewodnik_studenta_lab/01LRAP_przewodnik.ipynb

19 KiB
Raw Permalink Blame History

Modelowanie przestrzeni probabilistycznych w języku R

Język R zawiera różne pakiety, które są przydatne, gdy chcemy modelować doświadczenia losowe. Dzisiaj omówimy kilka z nich - skupimy się w szczególności na funkcjach, które pozwalają generować obiekty kombinatoryczne, tworzyć proste przestrzenie probabilistyczne i symulować doświadczenia losowe.

Generowanie obiektów kombinatorycznych

Funkcje permutations oraz combinations z pakietu gtools pozwalają w prosty sposób generować wariacje i kombinacje.

  • Sposób działania:

    permutations(n, r, v=1:n, set=TRUE, repeats.allowed=FALSE)

    combinations(n, r, v=1:n, set=TRUE, repeats.allowed=FALSE)

    • n - liczba różnych elementów do wyboru;
    • r - liczba elementów, które chcemy wybrać;
    • v - wektor przechowujący elementy do wyboru. Jeśli długość tego wektora będzie mniejsza niż n, to zostanie zwrócony błąd. Jeśli natomiast długość wektora będzie większa niż n, to końcowe elementy wektora v zostaną zignorowane;
    • Jeśli wektor v zawiera duplikaty i chcemy je usunąć, to powinniśmy ustawić opcję set=TRUE. Jeśli nie chcemy usuwać duplikatów, to powinnniśmy ustawić opcję set=FALSE;
    • repeats.allowed - parametr, który ustala czy dokonujemy wyborów z powtórzeniami;
  • Funkcja permutations generuje wariacje, a funkcja combinations kombinacje. Od wartości parametru repeats.allowed zależy, czy dopuszczamy powtórzenia.

  • _Uwaga:* Poniższe przykłady wymagają zainstalowania i załadowania pakietu gtools. Niestety, ani ten pakiet, ani pozostałe pakiety, które będą omawiane w tym przewodniku, nie są domyślnie dostępne w wersji online Jupytera, dlatego poniższe przykłady mogą wymagać przekopiowania instrukcji do RStudio.

Przykład 1

W urnie znajdują się cztery kule ponumerowane liczbami ze zbioru $\{1,2,3,4\}$. Losujemy trzykrotnie jedną kulę. Wypisz wszystkie możliwe wyniki tego doświadczenia, jeśli losowanie odbywa się:

  • ze zwracaniem,
  • bez zwracania.
install.packages("gtools")
library(gtools)
x = 1:4

# Generujemy wyniki losowania ze zwracaniem
wyniki1 = permutations(4, 3, x, repeats.allowed=TRUE)
print(wyniki1)

# Generujemy wyniki losowania bez zwracania
wyniki2 = permutations(4, 3, x, repeats.allowed=FALSE)
print(wyniki2)
Installing package into /usr/local/lib/R/site-library
(as lib is unspecified)

Warning message in install.packages("gtools"):
“'lib = "/usr/local/lib/R/site-library"' is not writable”
Error in install.packages("gtools"): unable to install packages
Traceback:

1. install.packages("gtools")
2. stop("unable to install packages")

Przykład 2

Losujemy jednocześnie dwie kule z urny, w której znajdują $3$ kule białe i $2$ czarne. Jakie jest prawdopodobieństwo, że wylosujemy dwie białe kule?

# Zaczniemy od wygenerowania wszystkich możliwości
kule = c('b', 'b', 'b', 'c', 'c')
wszystkie = combinations(5, 2, kule, set=FALSE)
print(wszystkie)

# Zwróćmy uwagę, że dzięki ustawieniu parametru set=FALSE, funkcja traktuje kule opisane tymi samymi literami jako rozróżnialne. Gdybyśmy ustawili set=TRUE, to w wektorze kule powinniśmy nadać każdej kuli inną nazwę
biale = combinations(3, 2, kule, set=FALSE)
print(biale)

# Zwróćmy uwagę, że ponieważ n=3, funkcja uwzględnia tylko 3 pierwsze elementy wektora kule
# Aby policzyć prawdopodobieństwo wylosowania samych białych kul, wystarczy policzyć liczbę wierszy macierzy wszystkie i biale. Możemy do tego użyc polecenia nrow
p = nrow(biale)/nrow(wszystkie)
paste("Prawdopodobieństwo wylosowania dwóch białych kul:', p)

Generowanie przestrzeni probabilistycznych

Najważniejsze funkcje, z których będziemy korzystać na tych zajęciach znajdują się w pakiecie probs. W celu wygenerowania przestrzeni probabilistycznej możemy użyć następującego polecenia:

probspace(x, probs),

gdzie x oznacza możliwe wyniki eksperymentu losowego, a probs to wektor odpowiadających im prawdopodobieństw. Jeśli nie podamy wektora probs, to domyślnie każdemu zdarzeniu elementarnemu zostanie przypisane takie samo prawdopodobieństwo, czyli będziemy mieli do czynienia z przestrzenią klasyczną.

Przykład 3

Rzucamy jeden raz standardową, sześcienną kostką do gry. Wygeneruj przestrzeń probabilistyczną odpowiadającą temu doświadczeniu losowemu.

install.packages("probs")
library(probs)
# Możemy założyć, że wszystkie wyniki rzutu kostką są równoprawdopodobne, więc nie jest konieczne podawanie wektora prawdopodobieństw prob
kostki1 = probspace(1:6)
print(kostki1)
Installing package into /usr/local/lib/R/site-library
(as lib is unspecified)

Warning message in install.packages("prob"):
“'lib = "/usr/local/lib/R/site-library"' is not writable”
Error in install.packages("prob"): unable to install packages
Traceback:

1. install.packages("prob")
2. stop("unable to install packages")

Przykład 4

Ania i Bartek grają w grę "Losowe szlaki". Prawdopodobieństwo wygranej Ani wynosi $0.3$, wygranej Bartka to $0.5$, a remisu $0.2$. Wygeneruj przestrzeń probabilistyczną odpowiadającą temu doświadczeniu losowemu.

# Ponieważ w tym przypadku prawdopodobieństwa zdarzeń elementarnych są różne, to musimy zdefiniować wektor prawdopodobieństw, któego wyrazy sumują się do 1.
gra = probspace(c('Ania', 'Bartek', 'remis'), c(0.3, 0.5, 0.2))
print(gra)
Error in probspace(c("Ania", "Bartek", "remis"), c(0.3, 0.5, 0.2)): could not find function "probspace"
Traceback:

Wbudowane przestrzenie probabilistyczne

Podczas zajęć z rachunku prawdopodobieństwa będziemy regularnie omawiać przykłady i zadania związana z pewnymi klasycznymi doświadczeniami losowymi. Niektórym z nich poświęcone są wbudowane funkcje w języku R, które przedstawiono poniżej:

  • tosscoin(times, makespace=FALSE) - przestrzeń probabilistyczna odpowiadająca wielokrotnemu rzutowi symetryczną monetą. Parametr times oznacza liczbę rzutów. Jeśli makespace=TRUE, to każdemu możliwemu wynikowi rzutu monetą zostanie przypisane takie samo prawdopodobieństwo. W przeciwnym przypadku zostaną wygenerowane wszystkie możliwe wyniki rzutów, ale nie zostaną im przypisane prawdopodobieństwa. Parametr makespace będzie działał w analogiczny sposób we wszystkich niżej wymienionych funkcjach.
  • rolldie(times, nsides=6, makespace=FALSE) - przestrzeń probabilistyczna odpowiadająca wielokrotnemu rzutowi symetryczną kostką. Parametr times oznacza liczbę rzutów, a nsides liczbę ścianek kostki.
  • cards(jokers=FALSE, makespace=FALSE) - przestrzeń probabilistyczna odpowiadająca losowaniu jednej karty ze standardowej talii $52$ kart. Jeśli parametr jokers ma wartość TRUE, to dodatkowo w talii uwzględnione są dwa jokery.
  • roulette(european=FALSE, makespace=FALSE) - przestrzeń probabilistyczna odpowiadająca grze w ruletkę. Parametr european przyjmuje wartość _TRUE, jeśli mamy do czynienia z ruletką typu europejskiego ($37$ pól). W przeciwnym przypadku mamy do czynienia z ruletką typu amerykańskiego ($38$ pól).

Przykład 5

Wygeneruj przestrzeń probabilistyczną odpowiadającą doświadczeniu losowemu polegającemu na:

  • losowaniu jednej karty z talii $52$ kart,
  • trzech rzutach sześcienną kostką.
# Losowanie 1 karty
karta = cards(makespace=TRUE)
print(karta)

# Trzy rzuty kostką
kostki3 = rolldie(3, nsides=6, makespace=TRUE)
print(kostki3)

Obliczanie prawdopodobieństwa

Do obliczania prawdopodobieństwa zdarzenia we wcześniej zdefiniownej przestrzeni probabilistycznej możemy użyć polecenia Prob. Istnieją dwa sposoby stosowania tego polecenia:

  • Jeśli A to podzbiór zbioru zdarzeń elementarnych pewnej przestrzeni probabilistycznej, to Prob(A) zwróci prawdopodobieństwo zdarzenia A. W tym przypadku do wyznaczenia zdarzenia A możemy użyć polecenia subset(Y,...), gdzie Y oznacza odpowiednią przestrzeń probabilistyczną, a w miejscu '...' podajemy formułę logiczną opisującą interesujące nas zdarzenie (tutaj odwołujemy się do elementów zdarzenia A poprzez X, np. X >= 2 & X <= 5 zwraca elementy zbioru A z przedziału [2,5]). Możemy też wyznaczyć podzbiór A stosując wprost odpowiednie odwołanie do elementów zbioru zdarzeń elementarnych przestrzeni Y.
  • Jeśli Y jest przestrzenią probabilistyczną, to stosujemy polecenie Prob(Y, event), gdzie w miejscu event należy podać formułę logiczną opisującą interesujące nas zdarzenie.

Przykład 6

Losujemy jedną kartę z talii $52$ kart. Oblicz prawdopodobieństwo, że wylosowana karta jest kierem.

# Wykorzystamy zdefiniowaną wcześniej przestrzeń karta
# Zwróćmy uwagę, że kiery znajdują się w wierszach od 27 do 39
kiery = karta[27:39, ]
print(kiery)
p = Prob(kiery)
print(p)

# Alternatywnie, możemy wyznaczyć wszystkie kiery stosując polecenie subset i odpowiedni warunek logiczny
# Tutaj korzystamy z tego, że każda karta ma swoją figurę (label) oraz kolor (suit)
kiery2 = subset(karta, suit=='Heart')
print(kiery2)
p2 = Prob(kiery2)
print(p2)
Error in eval(expr, envir, enclos): object 'karta' not found
Traceback:

Gdy chcemy wyznaczyć bardziej skomplikowane zdarzenia, pomocne mogą być następujące polecenia związane z działaniami na zbiorach:

  • union(A, B) - suma zbiorów A i B,
  • intersect(A, B) - część wspólna zbiorów A i B,
  • setdiff(A, B) - różnica zbiorów A i B (tzn. elementy, które są w A, ale nie w B).

Przykład 7

Rzucamy trzykrotnie sześcienną kostką. Oblicz prawdopodobieństwo następujących zdarzeń:

  • $A$ - wypadną co najmniej dwie szóstki,
  • $B$ - wypadną mniej niż dwie szóstki.
# Wykorzystamy zdefiniowaną wcześniej przestrzeń kostki3
# Zwróćmy uwagę, że zdarzenie A oznacza, że w pierwszym i drugim rzucie były szóstki LUB w pierwszym i trzecim rzucie były szóstki LUB w drugim i trzecim rzucie były szóstki
# Możemy wyznaczyć prawdopodobieństwo A bezpośrednio przez użycie polecenia prob i odpowiedniej formuły logicznej
pA = Prob(kostki3, (X1==6 & X2==6) | (X1==6 & X3==6) | (X2==6 & X3==6))
print(pA)
# Alternatywnie, możemy wyznaczyć najpierw trzy pomocnicze zdarzenia i na końcu wyznaczyć ich sumę
A1 = subset(kostki3, X1==6 & X2==6)
A2 = subset(kostki3, X1==6 & X3==6)
A3 = subset(kostki3, X2==6 & X3==6)
A = union(A1, union(A2, A3))
pA = Prob(A)
print(pA)

# Zauważmy teraz, że zdarzenie B jest zdarzeniem przeciwnym do zdarzenia A
B = setdiff(kostki3, A)
pB = Prob(B)
print(pB)

Symulacja doświadczeń losowych

Do symulowania wyników doświadczenia losowego służy funkcja sim(X, ntrials), gdzie X jest przestrzenią probabilistyczną, a ntrials liczbą powtórzeń eksperymentu losowego.

Z drugiej strony, jeśli wielokrotnie powtórzymy pewne doświadczenie losowe, to możemy na podstawie wyników spróbować wyznaczyć przestrzeń probabilistyczną. W języku R można to osiągnąć używając polecenia empirical(X), gdzie X zawiera wyniki doświadczenia losowego. Polecenie to szacuje prawdopodobieństwa zdarzeń elementarnych jako ich relatywną częstość występowania.

Przykład 8

Ania i Bartek grają w grę ,,Losowe szlaki''. Prawdopodobieństwo wygranej Ani wynosi $0{,}3$, wygranej Bartka to $0{,}5$, a remisu $0{,}2$. Wykonaj symulacją $100$ powtórzeń tego eksperymentu losowego. Następnie porównaj rozkład wylosowanych wartości z ich rzeczywistym rozkładem.

# Użyjemy zdefiniowanej wcześniej przestrzeni gra
# Wykonujemy symulację
wyniki = sim(gra, 100)
print(wyniki)

# Możemy teraz wyznaczyć rozkład wyników
gra_bis = empirical(wyniki)
print(gra_bis)

# Możemy też porównać otrzymany rozkład z rozkładem pierwotnym na wykresie
w = rbind(gra$probs, gra_bis$probs)
barplot(w, names.arg=gra$x, beside=TRUE, col=c('lightblue','darkred'), xlab='Wyniki gry', ylab='Prawdopodobieństwo', main='Porównanie rozkładu rzeczywistego i wynikającego z symulacji')
legend(7, 0.5, c('Rozkład rzeczywisty', 'Symulacja'), col=c('lightblue', 'darkred'), pch=15)

Bibliografia

Dokumentację dotyczącą omawianych pakietów można znaleźć na stronach: