Oczekuję, że Czytelnik uruchomił pakiet (lub ,,otoczenie”, environment) R. Nie zakładam żadnej wstępnej znajomości tego języka programowania. Oczywiście, podstaw programowania w R można się nauczyć z odpowiednich źródeł. Ale prawdę mówiąc, prostych rzeczy można się szybko domyślić i zacząć zabawę natychmiast.
Wylosujmy ,,próbkę” średniego rozmiaru, powiedzmy z rozkładu normalnego
:
> n <- 100
> X <- rnorm(n)
> X
(aby przyjrzeć się funkcji rnorm, napiszmy ?rnorm). Wektor X zawiera
,,realizacje” niezależnych zmiennych losowych .
Możemy obliczyć średnią
i wariancję próbkową
. Jakich wyników oczekujemy? Zobaczmy:
> mean(X)
> var(X)
Porównajmy kwantyl empiryczny rzędu, powiedzmy , z teoretycznym:
> quantile(X,p)
> qnorm(p)
Możemy powtórzyć nasze ,,doświadczenie losowe” i zobaczyć jakie są losowe fluktuacje wyników. Warto wykonać nasz mini-programik jeszcze raz, albo parę razy. Teraz sprobujmy ,,zobaczyć” próbkę. Najlepiej tak:
> hist(X,prob=TRUE) ( proszę się dowiedzieć co znaczy parametr `prob' ! )
> rug(X)
Możemy łatwo narysować wykres gęstości. Funkcja obliczająca gęstość rozkładu
nazywa
się dnorm, a curve jest funkcją rysującą wykresy.
> curve(dnorm(x),col="blue",add=TRUE)
(nawiasem mówiąc, zachęcam początkujących pRobabilistów do oznaczania wygenerowanych wektorów losowych dużymi literami, np. X, a deterministycznych zmiennych i wektorów – małymi, np. x, podobnie jak na rachunku prawdopodobieństwa).
Podobnie, możemy porównać dystrybuantę empiryczną z prawdziwą dystrybuantą .
Funkcja obliczająca dystrybuantę empiryczną nazywa się ecdf, zaś
dystrybuantę rozkładu
– pnorm.
> plot(ecdf(X))
> curve(pnorm(x),from=xmin,to=xmax,col="blue",add=TRUE)
Test Kołmogorowa-Smirnowa oblicza maksymalną odległość , gdzie
jest dystrybuantą empiryczną i
.
> ks.test(X,pnorm,exact=TRUE)
Przypomnijmy sobie z wykładu ze statystyki, co znaczy podana przez test -wartość. Jakiego wyniku ,,spodziewaliśmy się”?
Jest teraz dobra okazja, aby pokazać jak się symulacyjnie bada rozkład zmiennej losowej. Przypuśćmy, że interesuje nas rozkład
prawdopodobieństwa -wartości w przeprowadzonym powyżej doświadczeniu (polegającym na wylosowaniu próbki
i przeprowadzeniu testu KS).
Tak naprawdę powinniśmy znać odpowiedź bez żadnych doświadczeń, ale możemy udawać niewiedzę i symulować.
Symulacje polegają na
powtórzeniu całego doświadczenia wiele razy, powiedzmy razy, zanotowaniu wyników i uznaniu powstałego rozkładu
empirycznego za przybliżenie badanego rozkładu prawdopodobieństwa. Bardzo ważne jest zrozumienie różnej roli jaką pełni tu
(rozmiar próbki
w pojedynczym doświadczeniu, a więc ,,parametr badanego zjawiska”) i
(liczba powtórzeń, która powinna być możliwie największa aby
zwiększyć dokładność badania symulacyjnego).
Następujący progarmik podkreśla logiczną konstrukcję powtarzanego doświadczenia:
> m <- 10000
> n <- 100
>
> # Przygotowujemy wektory w którym zapiszemy wyniki:
> D <- c()
> P <- c()
>
> for (i in 1:m)
> {
> X <- rnorm(n)
> Test <- ks.test(X,pnorm,exact=TRUE)
> D[i] <- Test$statistic
> P[i] <- Test$p.value
> } # koniec pętli for
>
> # Analizujemy wyniki:
> hist(D, prob=TRUE)
> hist(P, prob=TRUE)
Co prawda powyższy programik spełnia swoją rolę, jednak struktura pakiektu R jest dostosowana do innego stylu pisania programów. Zamiast pętli for zalecane jest używanie funkcji które powtarzają pewne operacje i posługiwanie się, kiedykolwiek to możliwe, całymi wektorami a nie pojedynczymi komponentami. Poniższy fragment kodu zastępuje pętlę for
> DiP <- replicate(m, ks.test(rnorm(n),pnorm,exact=TRUE)[1:2]))
>
> DiP <- t(DiP) # transpozycja macierzy ułatwia oglądanie wyników
> D <- as.numeric((DiP)[,1]) # pierwsza kolumna macierzy
> P <- as.numeric((DiP)[,2]) # druga kolumna macierzy
> # obiekty typu ,,list'' przerobimy na wektory liczbowe:
> D <- as.numeric(D); P <- as.numeric(D)
Symulacje dają okazję ,,namacalnego” przedstawienia twierdzeń probabilistycznych (i nie tylko twierdzeń, ale także stwierdzeń, przypuszczeń prawdziwych lub fałszywych).
Wylosujmy próbkę z ,,jakiegoś” rozkładu prawdopodobieństwa. Weźmy na przykład niezależne zmienne o rozkładzie wykładniczym,
. Obliczmy średnie empiryczne
![]() |
Zróbmy wykres ciągu średnich .
> nmax <- 1000 # komputerowy odpowiednik ,,''
> n <- (1:nmax)
> lambda <- 2
> X <- rexp(nmax,rate=lambda)
> S <- cumsum(X) # ciąg narastających sum
> M <- S/n # działania w R (np. dzielenie) są wykonywane ,,po współrzędnych''
> plot(n,M,type="l") # ,,zaklęcie'' type="l" powoduje narysowanie łamanej
Teraz spóbujmy podobne doświadczenie zrobić dla zmiennych , gdzie
(
są próbką z tak zwanego rozkładu Pareto).
> # potrzebujemy dużej próbki, żeby się zorientować, co się dzieje...
> nmax <- 100000
> n <- (1:nmax)
> X <- 1/runif(nmax)-1
> M <- cumsum(X)/n
> plot(log(n),M,type="l") # i zrobimy wykres w skali logarytmicznej
CTG jest jednym ze ,,słabych” twierdzeń granicznych rachunku prawdopodobieństwa, to znaczy dotyczy zbieżności rozkładów. Symulacyne ,,sprawdzenie” lub ilustracja takich twierdzeń wymaga powtarzania doświadczenia wiele razy, podobnie jak w Przykładzie 2.2. Pojedyncze doświadczenie polega na obliczeniu sumy
![]() |
gdzie jest próbką z ,,jakiegoś” rozkładu prawdopodobieństwa i
jest ,,duże”.
Weźmy na przykład niezależne zmienne o rozkładzie wykładniczym, jak w Przykładzie 2.3.
> m <- 10000
> n <- 100
> lambda <- 2
> S <- replicate(m, sum(rexp(n,rate=lambda)))
> hist(S,prob=TRUE)
> curve(dnorm(x,mean=n/lambda,sd=sqrt(n)/lambda),col="blue",add=TRUE)
> # wydaje się na podstawie obrazka, że dopasowanie jest znakomite
> ks.test(S,pnorm,mean=n/lambda,sd=sqrt(n)/lambda)
> # ale test Kołmogorowa-Smirnowa ,,widzi'' pewne odchylenie od rozkładu normalnego
>
Wyjaśnić dlaczego w Przykładzie 2.4 nie musieliśmy (choć mogliśmy) rozpatrywać unormowanych zmiennych losowych
![]() |
gdzie i
.
W Przykładzie 2.4 znany jest dokładny rozkład prawdopodobieństwa sumy . Co to za rozkład? Sprawdzić symulacyjnie zgodność z tym rozkładem.
Przeprowadzić podobne doświadczenie jak w Przykładzie 2.4 (CTG), dla i
.
Skomentować wynik.
Przeprowadzić podobne doświadczenie jak w Ćwiczeniu 2.3, ale zastępując sumę przez medianę dla
i
. Wypróbować przybliżenie normalne
(jeśli teoretyczna wartość wariancji mediany nie jest znana, można zastąpić ją przez przybliżenie empiryczne). Skomentować wynik.
W Ćwiczeniu 2.3, znany jest dokładny rozkład prawdopodobieństwa mediany. Co to za rozkład?
Sprawdzić symulacyjnie zgodność z tym rozkładem. Można wziąć mniejsze, nieparzyste . Dlaczego nieparzyste?
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i
Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach
Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.