2013-10-15 15 views
5

Czy możesz wyjaśnić strukturę/ideę pętli w kodzie R? Nie wiem, od czego zacząć od tego zadania domowego. Udało mi się stworzyć rozkład wykładniczy, co potrzebne zTworzenie pętli

> rexp(n=200, rate=0.5) 

ale teraz muszę utworzyć 2,000 próbki tego Rexp i obliczyć średnią z każdej próbki. Następnie muszę obliczyć średnią i wariancję 2000 próbek. Wiem, jak znaleźć średnią i wariancję prostej dystrybucji (np. mean(rexp) i var(rexp)), więc moim głównym problemem jest zrozumienie tej koncepcji pętli i wprowadzenie jej w życie.

Więc zacząłem wpisując:

> rexp(n=200,rate=0.5) 

Potem Nazwałem ten rozkład wykładniczy:

> exdi = rexp(n=200,rate=0.5) 

Opierając się na przykład do czynienia z kwotami, wszedłem

>y.exdi=vector(length=2000) 
>for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 

The R Workspace nie odpowiedział na to, więc nazwałem funkcję i wypróbowałem to:

>Twothou = for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 
>mean(Twothou) 

Ale wtedy mam ten komunikat o błędzie:

[1] NA 
Warning message: 
In mean.default(Twothou) : argument is not numeric or logical: returning NA 

Co należy zrobić inaczej?

Odpowiedz

3

myślę, że należy umieścić generator liczb losowych rexpwewnątrz swoją for pętlę:

y.exdi=vector(length=2000) 
for(i in 1:2000){ 
    y.exdi[ i ]=mean(rexp(n=200,rate=0.5)) 
} 

W przeciwnym razie, dla każdego i po prostu obliczyć średnią z ustalonym wektorem określonym zewnątrz pętli, zamiast nowego generowane za każdym razem, gdy wzrasta indeks i. Mając powyższe kody, możesz obliczyć średnią używając mean(y.exdi), która daje średnią z 2000 "średnich".

2

Musisz utworzyć swój przykładowy rozkład w pętli. Wypróbuj to:

> set.seed(1) 
> y.exdi=vector(length=2000) 
> for(i in 1:2000){ 
+ exdi = rexp(n=200,rate=0.5) 
+ y.exdi[ i ]=mean(exdi) 
+ } 
> mean(y.exdi) 
[1] 2.001149 
> var(y.exdi) 
[1] 0.01987367 
+0

Jeśli Twoja odpowiedź nie różni się znacząco od czyjejś odpowiedzi od Ciebie, nawet o sekundę szybciej niż Ty, rozważ usunięcie swojego. – flodel

2

Ponieważ musisz wygenerować próbkę 2000 razy, więc generowanie próbek musi być w pętli.

set.seed(1) 
y.exdi <- vector(length=2000, "numeric") 
for (i in 1:2000) 
{ 
    y.exdi[i] <- mean(rexp(200, 0.5)) 
} 

Problem jest również z polecenia

exdi = rexp(n=200,rate=0.5) 

w którym są faktycznie przypisanie exdi numeryczny wektor 200 wykładniczo rozproszonych losowo generowanych wartości, to nie definiuje funkcję. W rzeczywistości, nie musisz ponownie definiować funkcji, możesz po prostu zadzwonić pod numer rexp za każdym razem.

R zapewnia również skróty do tego typu rzeczy.Możesz dostać 2000 oznacza z jednej wkładki

sapply(1:2000, function(x) { mean(rexp(200, 0.5)) }) 
+0

Jeśli Twoja odpowiedź nie różni się zbytnio od tej, na którą ktoś odpowiedział nawet o sekundę szybciej niż Ty, rozważ usunięcie swoich. – flodel

6

Właśnie stworzył naprawdę ładny wektor 2000 elementów o tej samej wartości - w środkach średnią próbkę parzonej dla rozkładu wykładniczego tylko raz. Sprawdź, sprawdzając y.exdi w konsoli.

Jeśli chcesz użyć pętli do tego rozwiązania, powinieneś utworzyć nowe i nowe próbki w każdej iteracji. Możesz to łatwo zrobić na przykład z sapply (owinięcie wokół pętli for) stosowanego do 1:2000:

sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5))) 

A raczej bezpośredniego wywoływania np replicate (która miała być stosowana w takich przypadkach)

replicate(2000, mean(rexp(n = 200, rate = 0.5))) 
+2

+1 dla 'replikuj'. Nie polecałbym w ogóle podejścia "sapply", ponieważ pisanie funkcji ignorującej jej argumenty jest brzydkie. – flodel

+0

@flodel: ... ignorowanie faktu, że 'replicate' zawija' sapply'. :) –

0

tu dwa rozwiązania. Pierwsza nie musi tworzyć próbki dwukrotnie, ale funkcja anonimowa i jej powrót listy są nieparzyste. Drugi jest czystszy, dostajesz nazwy kolumn, ale nie masz już średniej związanej z wariancją tej samej próbki.

library(plyr) 

ldply(1:2000, function(x) {d <- rexp(n = 200, rate = 0.5); c(mean(d), var(d))}) 

ddply(data.frame(x = 1:2000), .(x), summarize, 
    mean = mean(rexp(n = 200, rate = 0.5)), var = var(rexp(n = 200, rate = 0.5))) 

Twoje rozwiązanie umieszcza wartość na liście y.exdi. Jeśli spojrzysz na jego zawartość po skonstruowaniu, będzie ona pełna wartości logicznych FALSE. Po pętli możesz ją ponownie sprawdzić i zobaczyć, że ma średnią jako jej elementy. Oto dwa równie skuteczne sposoby uzupełnienia tego, co próbowaliście zrobić z pętlami z kilkoma sprawami wyczyszczonymi.

y.exdi <- NULL 
for(i in 1:2000) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5)) 

y.exdi <- vector(length = 2000, mode = "numeric") 
for(i in seq(y.exdi)) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5)) 
Powiązane problemy