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
> n <- 100
> X <- rnorm(n)
> X
(aby przyjrzeć się funkcji rnorm, napiszmy ?rnorm). Wektor X zawiera
,,realizacje” niezależnych zmiennych losowych
> mean(X)
> var(X)
Porównajmy kwantyl empiryczny rzędu, powiedzmy
> 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ść
> 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ą
> plot(ecdf(X))
> curve(pnorm(x),from=xmin,to=xmax,col="blue",add=TRUE)
Test Kołmogorowa-Smirnowa oblicza maksymalną odległość
> ks.test(X,pnorm,exact=TRUE)
Przypomnijmy sobie z wykładu ze statystyki, co znaczy podana przez test
Jest teraz dobra okazja, aby pokazać jak się symulacyjnie bada rozkład zmiennej losowej. Przypuśćmy, że interesuje nas rozkład
prawdopodobieństwa
Symulacje polegają na
powtórzeniu całego doświadczenia wiele razy, powiedzmy
> 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,
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
> # 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
> 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
W Przykładzie 2.4 znany jest dokładny rozkład prawdopodobieństwa sumy
Przeprowadzić podobne doświadczenie jak w Przykładzie 2.4 (CTG), dla
Przeprowadzić podobne doświadczenie jak w Ćwiczeniu 2.3, ale zastępując sumę przez medianę dla
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
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.