Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

generate random sequence and plot in R

Tags:

r

I would like to generate a random sequence composed of 3000 points, which follows the normal distribution. The mean is c and the standard deviation is d. But I would like these 3000 points lies in the range of [a,b].

Can you tell me how to do it in R?

If I would like to plot this sequence, if Y-axis uses the generated 3000 points, then how should I generate the points corresponding to X-axis.

like image 978
bit-question Avatar asked Aug 25 '10 22:08

bit-question


People also ask

How do I create a random sequence in R?

To generate random numbers from a uniform distribution you can use the runif() function. Alternatively, you can use sample() to take a random sample using with or without replacements.

How do I generate a random vector in R?

To create a random vector for a range of values, we can use sample function. We just need to pass the range and the sample size inside the sample function.

How do I generate a random number from T-distribution in R?

The R software provides access to the t-distribution by the dt() , pt() , qt() and rt() functions. Apply the help() function on these functions for further information. The rt() function generates random deviates of the t-distribution and is written as rt(n, df) . We may easily generate n number of random samples.

How do you generate a random number from a uniform distribution in R?

The runif() function generates random deviates of the uniform distribution and is written as runif(n, min = 0, max = 1) .


1 Answers

You can do this using standard R functions like this:

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

The pnorm function is used to find the limits to use for the uniform distriution, data is then generated from a uniform and then transformed back to the normal.

This is even simpler using the distr package:

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

Note that in both cases the mean is not c and the sd is not d. If you want the mean and sd of the resulting truncated data to be c and d, then you need the parent distribution (before truncating) to have different values (higher sd, mean depends on the truncating values), finding those values would be a good homework problem for a math/stat theory course. If that is what you really need then add a comment or edit the question to say so specifically.

If you want to generate the data from the untruncated normal, but only plot the data within the range [a,b] then just use the ylim argument to plot:

plot( rnorm(3000, c, d), ylim=c(a,b) )
like image 85
Greg Snow Avatar answered Nov 14 '22 20:11

Greg Snow