2010-08-25 18 views
7

Vorrei generare una sequenza casuale composta da 3000 punti, che segue la distribuzione normale. La media è c e la deviazione standard è d. Ma vorrei che questi 3000 punti si trovassero nell'intervallo [a, b].genera sequenza casuale e trama in R

Puoi dirmi come si fa in R?

Se desidero tracciare questa sequenza, se l'asse Y utilizza i 3000 punti generati, allora come dovrei generare i punti corrispondenti all'asse X.

risposta

5

Si può fare questo usando funzioni R standard come questa:

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') 

La funzione di anomalia viene utilizzata per individuare i limiti da utilizzare per la distribuzione uniforme, i dati vengono quindi generati da un'uniforme e quindi trasformati di nuovo in valori normali.

Questo è ancora più semplice utilizzando il pacchetto 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') 

Si noti che in entrambi i casi la media non è c e la deviazione standard non è d. Se si desidera che la media e la sd dei dati troncati risultanti siano c e d, allora è necessario che la distribuzione padre (prima del troncamento) abbia valori diversi (sd più alto, media dipende dai valori di troncamento), trovare quei valori sarebbe un buon problema a casa per un corso di teoria matematica/statistica. Se è proprio quello di cui hai veramente bisogno, aggiungi un commento o modifica la domanda per dirlo in modo specifico.

Se si desidera generare i dati dal normale untruncated, ma tracciare solo i dati all'interno del campo [a, b] poi basta usare l'argomento ylim per tracciare:

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

Generazione di una sequenza casuale di numeri da qualsiasi distribuzione di probabilità è molto facile in R. Per fare questo per la distribuzione normale specificamente

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

Clipping i valori in x in modo che siano solo all'interno di un determinato intervallo è una specie di cosa strana da voler fare con un campione della distribuzione normale. Forse quello che vuoi veramente è campionare una distribuzione uniforme.

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

Per quanto riguarda la distribuzione della trama, non sono sicuro di seguire la tua domanda. È possibile tracciare una stima della densità per il campione con questo codice

plot(density(x)) 

Ma, se si vuole tracciare questi dati come un grafico a dispersione di qualche tipo, è effettivamente necessario generare un secondo campione di numeri.

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

Questo non fa quello che il Chiesto OP. Vuole 3000 punti seguendo la distribuzione normale, quindi 'rnorm' è la strada da percorrere – nico

+0

è una domanda mal formata ... ho indovinato. Se si trattava solo di plottare i valori casuali sull'asse y, come suggerisce una parte di esso, che diamine è la richiesta limite dell'asse x? Non ha senso. La mia ipotesi è che i valori casuali siano richiesti per generare una funzione di densità come hanno fatto @joFrhwld e @Joris Mays. Questo è il modo giusto per generare una funzione di densità. – John

1

Se desidero tracciare questa sequenza, se Y utilizza i generati 3000 punti, allora come devo generare i punti corrispondenti a X-asse.

Se hai appena generare i punti, come JoFrhwld detto con

y <- rnorm(3000, 1, 2) 

Poi

plot(y) 

traccerà automaticamente utilizzando gli indici degli array come asse x