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))
Questo non fa quello che il Chiesto OP. Vuole 3000 punti seguendo la distribuzione normale, quindi 'rnorm' è la strada da percorrere – nico
è 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