12 2. Podstawy R i ćwiczenia komputerowe
> curve(pnorm(x),from=xmin,to=xmax,col="blue",add=TRUE)
Test Kołmogorowa-Smirnowa oblicza maksymalną odległość D = J2X \Fn(x) — -F*(a;)|, gdzie Fn jest dystrybuantą empiryczną iF = $.
> ks.test(X,pnorm,exact=TRUE)
Przypomnijmy sobie z wykładu ze statystyki, co znaczy podana przez test p-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 p-wartości w przeprowadzonym powyżej doświadczeniu (polegającym na wylosowaniu próbki X i przeprowadzeniu testu KS). Tak naprawdę powinniśmy znać odpowiedź bez żadnych doświadczeń, ale możemy udawać niewiedzę i symulować.
Przykład 2.2 (Powtarzanie doświadczenia symulacyjnego). Symulacje polegają na powtórzeniu całego doświadczenia wiele razy, powiedzmy m = 10000 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 n (rozmiar próbki w pojedynczym doświadczeniu, a więc „parametr badanego zjawiska”) i m (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 l:m)
> {
> X <- rnorm(n)
> Test <- ks.test(X,pnorm,exact=TRUE)
> D[i] <- Test$statistic
> PCi] <- 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(CDiP)[,2]) # druga kolumna macierzy