2010-08-25 19 views
7

Chciałbym wygenerować losową sekwencję złożoną z 3000 punktów, która następuje po normalnym rozkładzie. Średnia wynosi c, a standardowe odchylenie to d. Ale chciałbym, aby te 3000 punktów leżało w zakresie [a, b].generowanie losowej sekwencji i wykresu w R

Czy możesz mi powiedzieć, jak to zrobić w R?

Jeśli chciałbym narysować tę sekwencję, jeśli oś Y wykorzystuje wygenerowane 3000 punktów, to w jaki sposób powinienem wygenerować punkty odpowiadające osi X.

Odpowiedz

5

Można zrobić przy użyciu standardowych funkcji R takich jak:

c <- 1 
d <- 2 

a <- -2 
b <- 3.5 

ll <- pnorm(a, c, d) 
ul <- pnorm(b, c, d) 

x <- qnorm(runif(3000, ll, ul), c, d) 
hist(x) 
range(x) 
mean(x) 
sd(x) 
plot(x, type='l') 

Funkcja pnorm służy do określania limitów wykorzystywanych do jednolitego rozłożenia, dane są następnie generowane z jednolitego, a następnie przekształcane z powrotem do normalnego.

To jeszcze prostsze przy użyciu pakietu distr:

library(distr) 

N <- Norm(c,d) 
N2 <- Truncate(N, lower=a, upper=b) 

plot(N2) 
x <- r(N2)(3000) 
hist(x) 
range(x) 
mean(x) 
sd(x) 
plot(x, type='l') 

Należy zauważyć, że w obu przypadkach średnia nie jest c i SD nie jest d. Jeśli chcesz, aby średnia i sd uzyskanych skróconych danych wynosiły cid, to potrzebujesz dystrybucji macierzystej (przed obcięciem), aby mieć różne wartości (wyższy sd, średnia zależy od wartości obcięcia), znalezienie tych wartości byłoby dobra praca domowa na kurs teorii matematyki/statystyki. Jeśli tak naprawdę potrzebujesz, dodaj komentarz lub edytuj pytanie, aby tak konkretnie powiedzieć.

Jeśli chcesz wygenerować dane z untruncated normalne, ale tylko wykreślić dane w przedziale [a, b], a następnie po prostu korzystać z ylim argumentu do działki:

plot(rnorm(3000, c, d), ylim=c(a,b)) 
3

Generowanie losowe ciąg liczb z dowolnego rozkładu prawdopodobieństwa jest bardzo łatwy w R. Aby to zrobić dla rozkładu normalnego specjalnie

c = 1 
d = 2 
x <- rnorm(3000, c, d) 

Clipping wartości w x tak, że są one tylko w danym zakresie to rodzaj dziwnej rzeczy, którą chcemy zrobić z próbką z normalnej dystrybucji. Być może naprawdę chcesz zrobić próbkę jednolitej dystrybucji.

a = 0 
b = 3 
x2 <- runif(3000, a, b) 

Jeśli chodzi o sposób dystrybucji, nie jestem pewien, czy podążam za pytaniem. można wykreślić oszacowanie gęstości dla próbki z tym kodem

plot(density(x)) 

Ale jeśli chcesz wykreślić te dane jako wykres punktowy jakiegoś, to rzeczywiście trzeba wygenerować drugą próbkę liczb.

0
a = -2; b = 3 
plot(dnorm, xlim = c(a, b)) 
+0

nie robić to, co OP poprosił o. On chce 3000 punktów po normalnej dystrybucji, więc 'rnorm' jest drogą do przejścia – nico

+0

to źle sformułowane pytania ... Zgadłem. Gdyby to było naprawdę spisek na losowe wartości na osi Y, jak sugeruje to część, co do cholery jest żądanie ograniczenia osi X? To nie ma sensu. Domyślam się, że wartości losowe są wymagane do wygenerowania funkcji gęstości, tak jak @joFrhwld i @Joris Mays. Jest to właściwy sposób generowania funkcji gęstości. – John

1

Jeżeli I jak działka tej sekwencji, jeżeli oś Y wykorzystuje wygenerowaną 3000 punktów, a jak należy generować punkty odpowiadające osi x.

Jeśli tylko generują punkty, jak JoFrhwld powiedział

y <- rnorm(3000, 1, 2) 

Następnie

plot(y) 

będzie automatycznie wykreślić je za pomocą indeksów tablicy jako oś x

Powiązane problemy