(V) Pętla „for”, pętla „repeat”, instrukcja „if” i instrukcja „break”

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *