W tym przykładzie losowe próbki o rozmiarze 100 standardowych liczb normalnych są generowane w pętli powtarzania, która znajduje się w pętli for, która przechodzi przez 10 000 iteracji. Dla każdej próbki sumę próbki dzieli się przez pierwiastek kwadratowy z 100, a następnie porównuje z 1,965. Jeśli wartość jest mniejsza niż 1,965, pętla powtarzania jest kontynuowana.
W przeciwnym razie pętla powtarzania zatrzymuje się, rejestrowana jest liczba powtórzeń pętli i rozpoczyna się następna pętla for. Na końcu wektor liczb przechodzących przez pętlę jest wykreślany na histogramie i znajduje średnią i medianę liczby razy. Najpierw ustawiane jest ziarno dla generatora liczb losowych. Wtedy jest wektor n.hist utworzony do przechowywania wyników, z miejscem na każdą iterację pętli for. Następnie otwiera się pętla for i licznik n jest ustawiany na zero. Następnie otwiera się pętla powtarzania. Na początku pętli powtarzania licznik n jest zwiększany o jeden. Następnie pobierana jest próbka, dzielona przez dziesięć, a wynik jest równy x. Następnie wartość x jest porównywana z 1,965 w instrukcji if. Jeśli wartość jest większa niż 1,965, to n.hist dla indeksu i jest równe licznikowi n, a instrukcja break przerywa funkcję z pętli powtarzania. W przeciwnym razie pętla powtarzania będzie kontynuowana w pętli. Na końcu uruchamiana jest funkcja hist () w celu utworzenia histogramu n.hist, średnia () w celu znalezienia średniej z n.hist, a metoda mediana () w celu znalezienia mediany z n.hist. Oto przykład:
> set.seed(69785)
> n.hist = numeric(10000)
> for (i in 1:10000) {
+ n=0
+ repeat{
+ n=n+1
+ x=sum(rnorm(100)/10)
+ if (x>1.965) {n.hist[i]=n; break}
+ }
+ }
> hist(n.hist)
> mean(n.hist)
[1] 40.4769
> median(n.hist)
[1] 28
Należy zauważyć, że średnia jest bliska 40, co jest przewidywaną średnią liczbą prób niezbędnych do zobaczenia zdarzenia z prawdopodobieństwem wystąpienia 0,025. Jednak mediana jest znacznie mniejsza, ponieważ rozkład jest mocno wypaczony.
Korzystanie z indeksów
Aby wykonać ten przykład przy użyciu indeksów, stwierdziliśmy, że pętla powtarzania jest konieczna, ale można zrezygnować z pętli for. Ponownie, ziarno generatora liczb losowych jest ustawione na tę samą liczbę, co w pierwszej części przykładu, a n.hist jest zdefiniowane numerycznie z 10000 elementów. Następnie licznik n jest ustawiany na zero, licznik cl.sv jest ustawiany na zero, a licznik n.col jest ustawiany na 10000. Następnie otwiera się pętla powtarzania. Macierz x jest zdefiniowana jako macierz składająca się ze 100 wierszy i n.col kolumn (początkowo 10 000). Elementy x to 100 razy n.col losowo generowane standardowe liczby normalne. Następnie funkcja apply () jest używana do zsumowania każdej kolumny macierzy, a wynik jest przypisywany do x. Następnie każdy element x jest dzielony przez 10. Następnie długość wektora zawierającego te elementy x, które są większe niż 1,965, jest przypisywana do x. Następnie x jest dodawane do cl.sv, a n jest zwiększane o jeden. Następnie wartości n.hist są równe n, gdzie cl.sv i x są używane do określenia, gdzie wzdłuż wektora n.hist należy umieścić wartość n. Następnie n.col jest zmniejszane o wartość x. Pętla powtarzania trwa do momentu, gdy n.col będzie równe zero. Histogram n.hist jest generowany za pomocą funkcji hist (), średnią z n.hist za pomocą średniej (), a medianę n.hist za pomocą mediany (). Oto przykład:
> set.seed(69785)
> n.hist = numeric(10000)
> n = 0
> cl.sv = 0
> n.col = 10000
> repeat{
+ x = matrix(rnorm(n.col*100), 100, n.col)
+ x = apply(x, 2, sum)
+ x = x/10
+ x = length(x[x>1.965])
+ cl.sv = cl.sv + x
+ n = n+1
+ n.hist[(cl.sv-x+1):cl.sv] = n
+ n.col = n.col-x
+ if (n.col==0) break
+ }
> hist(n.hist)
> mean(n.hist)
[1] 40.5015
> median(n.hist)
[1] 28
Ponownie średnia jest bliska 40, a mediana 28. Obie metody wykorzystują mniej więcej taki sam czas. Jeśli wartość 10 000 zostanie zastąpiona powyżej 100 000, metoda zapętlenia zajmie około 53 sekund, a metoda indeksowania około 56 sekund na moim komputerze. Ponieważ proces generowania próbek losowych jest inny dla obu metod – druga metoda generuje więcej liczb niż pierwsza – wyniki dla dwóch metod nie są identyczne, mimo że materiał początkowy generatora liczb losowych jest taki sam