19 KiB
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 wektorav
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 funkcjacombinations
kombinacje. Od wartości parametrurepeats.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ą. Parametrtimes
oznacza liczbę rzutów. Jeślimakespace=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. Parametrmakespace
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ą. Parametrtimes
oznacza liczbę rzutów, ansides
liczbę ścianek kostki.cards(jokers=FALSE, makespace=FALSE)
- przestrzeń probabilistyczna odpowiadająca losowaniu jednej karty ze standardowej talii $52$ kart. Jeśli parametrjokers
ma wartośćTRUE
, to dodatkowo w talii uwzględnione są dwa jokery.roulette(european=FALSE, makespace=FALSE)
- przestrzeń probabilistyczna odpowiadająca grze w ruletkę. Parametreuropean
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, toProb(A)
zwróci prawdopodobieństwo zdarzeniaA
. W tym przypadku do wyznaczenia zdarzeniaA
możemy użyć poleceniasubset(Y,...)
, gdzieY
oznacza odpowiednią przestrzeń probabilistyczną, a w miejscu '...' podajemy formułę logiczną opisującą interesujące nas zdarzenie (tutaj odwołujemy się do elementów zdarzeniaA
poprzezX
, np.X >= 2 & X <= 5
zwraca elementy zbioruA
z przedziału[2,5]
). Możemy też wyznaczyć podzbiórA
stosując wprost odpowiednie odwołanie do elementów zbioru zdarzeń elementarnych przestrzeniY
. - Jeśli
Y
jest przestrzenią probabilistyczną, to stosujemy polecenieProb(Y, event)
, gdzie w miejscuevent
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ówA
iB
,intersect(A, B)
- część wspólna zbiorówA
iB
,setdiff(A, B)
- różnica zbiorówA
iB
(tzn. elementy, które są wA
, ale nie wB
).
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)