{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Statystyka i Analiza danych\n", "# Laboratorium 3 - Rozkłady prawdopodobieństwa\n", "\n", "### Ćwiczenie 1: Rozkład normalny\n", "\n", "Zapoznaj się z funkcjami R dotyczącymi rozkładu normalnego:\n", "```\n", "dnorm\n", "pnorm\n", "qnorm\n", "rnorm\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "?dnorm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zaimplementuj funkcję gęstości rozkładu normalnego i porównaj wynik z funkcją `dnorm`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "gestosc <- function(x, mean=0, sd=1) {\n", " # tu wstaw wzór na gęstość rozkładu normalnego\n", "}\n", "\n", "\n", "#### sprawdzenie wyniku w postaci wykresu ####\n", "mean <- 0; sd <- 1\n", "x <- -50:50/10 # x = -5, -4.9, ..., 4.9, 5\n", "plot(x, dnorm(x, mean, sd), col=\"red\", pch=20) # wykres punktowy dnorm\n", "lines(x, gestosc(x, mean, sd), col=\"blue\") # dodaj wykres gestosci jako linię" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spróbuj numerycznie zcałkować gęstość rozkładu (metodą prostokątów) aby uzyskać wartość dystrybuanty, a następnie porównaj wynik z funkcją `pnorm`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mean <- 0; sd <- 1\n", "\n", "delta = 0.01\n", "z <- -2000:2000*delta # z od -20 do 20 co 0.01\n", "\n", "# całkuj numerycznie funkcję gęstości; możesz użyć funkcji cumsum\n", "dystrybuanta <- # tu wstaw kod\n", "\n", "\n", "#### sprawdzenie wyniku w postaci wykresu ####\n", "x <- -50:50/10\n", "plot(x, pnorm(x, mean, sd), col=\"red\", pch=20) # wykres punktowy pnorm\n", "lines(z, dystrybuanta, col=\"blue\") # dodaj wykresu dystrybuanty jako linię" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 2: Wstęp do metody Monte Carlo\n", "\n", "Metoda Monte Carlo, wymyślona przez Stanisława Ulama, służy do przybliżania wartości różnych całek (np. pola powierzchni figury, pola pod wykresem funkcji/rozkładu) poprzez wielokrotne losowanie liczb z odpowiedniego rozkładu prawdopodobieństwa.\n", "\n", "Zaczniemy od próby oszacowania metodą Monte Carlo pola powierzchni koła o promieniu 1, wpisanego w kwadrat o bokach [-1,1]. W tym utwórz funkcję, która losuje n par liczb x i y z rozkładu jednostajnego na odcinku [-1,1], a następnie zlicza, jaka część z nich trafiła w koło i na postawie tego szacuje pole koła." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "poleMC <- function(n) {\n", " x <- runif(n, min=-1, max=1)\n", " y <- runif(n, min=-1, max=1)\n", "\n", " # uzupełnij resztę kodu\n", "}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Porównaj wyniki funkcji `poleMC` z wartością pola figury obliczonej za pomocą wzoru dla różnych wartości `n`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 3: Metoda Monte Carlo dla rozkładu normalnego\n", "\n", "Rozpoczniemy od napisania funkcji, która generuje liczby losowe z rozkładu normalnego mając do dyspozycji tylko funkcję `runif` (do losowania z rozkładu jednostajnego). Możesz użyć funkcji `qnorm`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "losowe <- function(n, mean=0, sd=1) {\n", " p <- runif(n)\n", " # uzupełnij resztę kodu\n", "\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Następnie przetestujemy funkcję poprzez utworzenie histogramu wylosowanych wartości i porównanie z prawdziwą gęstością rozkładu oraz funkcją R `rnorm`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "mean <- 0; sd <- 1\n", "n <- 100000\n", "\n", "par(mfrow=c(2,1)) \n", "\n", "hist(losowe(n, mean, sd), prob=TRUE, main=\"Funkcja losowe\")\n", "curve(dnorm(x, mean, sd), add=TRUE, col=\"blue\")\n", "\n", "hist(rnorm(n), prob=TRUE, main=\"Funkcja rnorm\")\n", "curve(dnorm(x, mean, sd), add=TRUE, col=\"blue\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Napiszemy teraz funkcję szacującą wartość dystrybuanty rozkładu normalnego metodą Monte Carlo:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dystrybuantaMC <- function(x, mean=0, sd=1, n=10000) {\n", " # uzupełnij kod\n", "\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Porównaj wartości funkcji `dystrybuantaMC` z wartościami zwracanymi przez funkcję `pnorm` dla kilku wartości x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x <- 0.5\n", "dystrybuantaMC(x, n=1000000)\n", "pnorm(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ćwiczenie 4: Centralne Twierdzenie Graniczne\n", "\n", "W celu pogłębienia intuicji dotyczącej Centralnego Twierdzenia Granicznego (CTW), będziemy badać jak zmienia się rozkład sum zmiennych losowych o rozkładzie:\n", "\n", " - dwupunktowym z parametrem *p=0.5*,\n", " - jednostajnym na [0,1],\n", " - normalnym (funkcja `rnorm`).\n", " \n", "W tym celu należy utworzyć funkcje, które zwracają `N` losowych sum, każda składająca się z `n` elementów. Można to zrobić poprzez utworzenie losowej macierzy `N` na `n`, a następnie zsumowanie wierszy (funkcja `rowSums`)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sumyDwupunktowy <- function(n, N=100000) {\n", " # uzupełnij kod \n", "}\n", "\n", "sumyJednostajny <- function(n, N=100000) {\n", " # uzupełnij kod \n", "}\n", "\n", "sumyNormalny <- function(n, N=100000) {\n", " # uzupełnij kod \n", " \n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utwórz wykresy słupkowe dla sum zmiennych o rozkładzie dwupunktowym, dla *n = 5, 10, 20, 50*:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "par(mfrow=c(2,2))\n", "for (n in c(5, 10, 20, 50)) {\n", " hist(sumyDwupunktowy(n), main=paste(\"Dwupunktowy, n =\", n), prob=TRUE, breaks=0:n)\n", " \n", " # 1. Dodaj krzywą reprezentującą funkcję gęstości w rozkładzie normalnym (curve).\n", " # Uwzględnij odpowiednie parametry tego rozkładu, biorąc pod uwagę rozkład poszczególnych zmiennych\n", " # oraz fakt ich sumowania.\n", " # 2. Przeskaluj oś Y na histogramie, aby funkcja gęstości nie była przycinana.\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podobnie, utwórz histogramy dla sum losowych z rozkładu jednostajnego dla *n = 1, 2, 3, 5, 10, 50*. Można dodać krzywą gęstości rozkładu normalnego za pomocą komendy `curve` (**uwaga**: trzeba odpowiednio dobrać wartość oczekiwaną i wariancję!)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "par(mfrow=c(3,2))\n", "for (n in c(1, 2, 3, 5, 10, 50)) {\n", " # uzupełnij kod\n", " \n", " # Informacje o wartości oczekiwaniej i wariancji w rozkładzie jednostajnym\n", " # https://pl.wikipedia.org/wiki/Rozk%C5%82ad_jednostajny_ci%C4%85g%C5%82y\n", " # Uwaga: tutaj wyznaczamy SUMĘ zmiennych o takim rozkładzie, stąd konieczna odpowiednia korekta\n", "\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Na koniec, utwórz podobne wykresy dla zmiennych o rozkładzie normalnym." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "par(mfrow=c(2,2))\n", "for (n in c(5, 10, 20, 50)) {\n", " # uzupełnij kod \n", " \n", " # 1. Dodaj histogram dla sum zmiennych o rozdkładzie normalnym (sumyNormalny)\n", " # 2. Dodaj krzywą reprezentującą funkcję gęstości w rozkładzie normalnym (curve).\n", " # Uwzględnij odpowiednie parametry tego rozkładu, biorąc pod uwagę rozkład poszczególnych zmiennych\n", " # oraz fakt ich sumowania.\n", " # 3. Przeskaluj oś Y na histogramie, aby funkcja gęstości nie była przycinana.\n", "}" ] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.2" } }, "nbformat": 4, "nbformat_minor": 2 }