"# Modelowanie przestrzeni probabilistycznych w języku R"
]
},
{
"cell_type": "markdown",
"id": "5641f18b-be0b-43b5-ae95-caf4e2899a22",
"metadata": {},
"source": [
"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."
" * `r` - liczba elementów, które chcemy wybrać;\n",
" * `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; \n",
" * 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`;\n",
" * `repeats.allowed` - parametr, który ustala czy dokonujemy wyborów z powtórzeniami;\n",
"\n",
"* Funkcja `permutations` generuje wariacje, a funkcja `combinations` kombinacje. Od wartości parametru `repeats.allowed` zależy, czy dopuszczamy powtórzenia.\n",
" \n",
"**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. \n"
"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ę:\n",
"# 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ę\n",
"biale = combinations(3, 2, kule, set=FALSE)\n",
"print(biale)\n",
"\n",
"# Zwróćmy uwagę, że ponieważ n=3, funkcja uwzględnia tylko 3 pierwsze elementy wektora kule\n",
"# 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\n",
"p = nrow(biale)/nrow(wszystkie)\n",
"paste(\"Prawdopodobieństwo wylosowania dwóch białych kul:', p)"
]
},
{
"cell_type": "markdown",
"id": "df5f6b1e-cc51-416b-ae65-8e09a083831d",
"metadata": {},
"source": [
"## Generowanie przestrzeni probabilistycznych\n",
"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:\n",
"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ą. "
]
},
{
"cell_type": "markdown",
"id": "86adc4b9-a0ec-43bc-bdcb-f349364a5292",
"metadata": {},
"source": [
"**Przykład 3**\n",
"\n",
"Rzucamy jeden raz standardową, sześcienną kostką do gry. Wygeneruj przestrzeń probabilistyczną odpowiadającą temu doświadczeniu losowemu."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7c834a09-aa05-4095-87e4-c6d953498882",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Installing package into ‘/usr/local/lib/R/site-library’\n",
"(as ‘lib’ is unspecified)\n",
"\n",
"Warning message in install.packages(\"prob\"):\n",
"“'lib = \"/usr/local/lib/R/site-library\"' is not writable”\n"
]
},
{
"ename": "ERROR",
"evalue": "Error in install.packages(\"prob\"): unable to install packages\n",
"output_type": "error",
"traceback": [
"Error in install.packages(\"prob\"): unable to install packages\nTraceback:\n",
"# Możemy założyć, że wszystkie wyniki rzutu kostką są równoprawdopodobne, więc nie jest konieczne podawanie wektora prawdopodobieństw prob\n",
"kostki1 = probspace(1:6)\n",
"print(kostki1)"
]
},
{
"cell_type": "markdown",
"id": "3090320c-cd09-4129-bea8-b2d1da70f8a6",
"metadata": {},
"source": [
"**Przykład 4**\n",
"\n",
"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. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0b0b900b-f0bc-43d3-be33-addbabf287f9",
"metadata": {},
"outputs": [
{
"ename": "ERROR",
"evalue": "Error in probspace(c(\"Ania\", \"Bartek\", \"remis\"), c(0.3, 0.5, 0.2)): could not find function \"probspace\"\n",
"output_type": "error",
"traceback": [
"Error in probspace(c(\"Ania\", \"Bartek\", \"remis\"), c(0.3, 0.5, 0.2)): could not find function \"probspace\"\nTraceback:\n"
]
}
],
"source": [
"# Ponieważ w tym przypadku prawdopodobieństwa zdarzeń elementarnych są różne, to musimy zdefiniować wektor prawdopodobieństw, któego wyrazy sumują się do 1.\n",
"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:\n",
"* `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.\n",
"* `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.\n",
"* `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.\n",
"* `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).\n"
"Do obliczania prawdopodobieństwa zdarzenia we wcześniej zdefiniownej przestrzeni probabilistycznej możemy użyć polecenia `Prob`. Istnieją dwa sposoby stosowania tego polecenia:\n",
"* 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`.\n",
"* 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. "
"# 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\n",
"# Możemy wyznaczyć prawdopodobieństwo A bezpośrednio przez użycie polecenia prob i odpowiedniej formuły logicznej\n",
"# Zauważmy teraz, że zdarzenie B jest zdarzeniem przeciwnym do zdarzenia A\n",
"B = setdiff(kostki3, A)\n",
"pB = Prob(B)\n",
"print(pB)"
]
},
{
"cell_type": "markdown",
"id": "8ab57858-c7fe-4e58-b7aa-f015587cf030",
"metadata": {},
"source": [
"## Symulacja doświadczeń losowych\n",
"\n",
"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.\n",
"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."
"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."