Generate Continuous Random Variable in R
- 1 Uniform distribution
-               2              The dunif function- 2.1 Plot uniform density in R
 
-               3              The punif function- 3.1 punif function example
- 3.2 Plot uniform cumulative distribution function in R
 
-               4              The qunif function- 4.1 Plot of the uniform quantile function
 
- 5 The runif function
Uniform distribution
Let X \sim U(a, b), this is, a random variable with uniform distribution in the interval (a, b), with a, b \in \mathbb{R}, a < b:
- The probability density function (PDF) of x is f(x) = \frac{1}{b - a} if x \in (a, b) and 0 otherwise.
- The cumulative distribution function (CDF) is F(x) = P(X \leq x) = \frac{x-a}{b-a}.
- The quantile function is Q(p) = F^{-1}(p).
- The expected mean and variance of X are E(X) = \frac{a + b}{2} and Var(X) = \frac{(b-a)^2}{12}, respectively.
The different functions of the uniform distribution can be calculated in R for any value of          x. These R functions are          dnorm, for the density function,          pnorm, for the cumulative distribution and          qnorm, for the quantile function. Moreover, the          rnorm          function allows obtaining          n          random observations from the uniform distribution. These functions are described below:
| Function | Description | 
|---|---|
| dunif | Continuous uniform density (Probability density function) | 
| punif | Continuous uniform distribution (Cumulative distribution function) | 
| qunif | Quantile function of the uniform distribution | 
| runif | Random number generation of the uniform distribution | 
By default, these functions consider the uniform distribution on the interval (0, 1), also known as standard uniform distribution.
The dunif function
In order to calculate the uniform density function in R in the interval          (a, b)          for any value of          x          you can make use of the          dunif          function, which has the following syntax:
          dunif(x,           # X-axis values (grid of values)       min = 0,     # Lower limit of the distribution (a)       max = 1,     # Upper limit of the distribution (b)       log = FALSE) # If TRUE, probabilities are given as log                Consider that you want to calculate the uniform probability density function in the interval (1, 3) for a grid of values. For that purpose you can type:
          x <- 0:4 # Grid dunif(x, min = 1, max = 3)                          0.0 0.5 0.5 0.5 0.0                        Plot uniform density in R
You can plot the PDF of a uniform distribution with the following function:
          # x: grid of X-axis values (optional) # min: lower limit of the distribution (a) # max: upper limit of the distribution (b) # lwd: line width of the segments of the graph # col: color of the segments and points of the graph # ...: additional arguments to be passed to the plot function plotunif <- function(x, min = 0, max = 1, lwd = 1, col = 1, ...) {      # Grid of X-axis values     if (missing(x)) {         x <- seq(min - 0.5, max + 0.5, 0.01)     }      if(max < min) {         stop("'min' must be lower than 'max'")     }         plot(x, dunif(x, min = min, max = max),          xlim = c(min - 0.25, max + 0.25), type = "l",          lty = 0, ylab = "f(x)", ...)      segments(min, 1/(max - min), max, 1/(max - min), col = col, lwd = lwd)     segments(min - 2, 0, min, 0, lwd = lwd, col = col)     segments(max, 0, max + 2, 0, lwd = lwd, col = col)     points(min, 1/(max - min), pch = 19, col = col)     points(max, 1/(max - min), pch = 19, col = col)     segments(min, 0, min, 1/(max - min), lty = 2, col = col, lwd = lwd)     segments(max, 0, max, 1/(max - min), lty = 2, col = col, lwd = lwd)     points(0, min, pch = 21, col = col, bg = "white")     points(max, min, pch = 21, col = col, bg = "white") }                As an example, if you want to plot the uniform density function in the interval (0, 1) in blue you can type:
          plotunif(min = 0, max = 1, lwd = 2, col = 4, main = "Uniform PDF")                 
          The punif function
In R, you can use the          punif          function to calculate the uniform cumulative distribution function, this is, the probability of a variable          X          taking a value lower than          x. This function has the following syntax:
          punif(q,                  # Vector of quantiles       min = 0,            # Lower limit of the distribution (a)       max = 0,            # Upper limit of the distribution (b)       lower.tail = TRUE,  # If TRUE, probabilities are P(X <= x), or P(X > x) otherwise       log.p = FALSE)      # If TRUE, probabilities are given as log                As an example, if you want to calculate the probability of a uniform variable on the interval (0, 1) taking a value equal or lower to 0.6 is:
          punif(0.6) # 0.6                        punif function example
Consider, for instance, that X is the time (in minutes) that a person has to wait in order to take a flight. If each flight takes off each hour X \sim U(0, 60). Taking the latter into account:
- The probability of waiting less than 15 minutes is P(X < 15) = P(X \leq 15):
          punif(15, min = 0, max = 60) # 0.25 or 25% 1 - punif(15, min = 0, max = 60, lower.tail = FALSE) # Equivalent                We have developed the following function to shade the area over an interval of the uniform probability density function with a single line of code:
            # min: lower limit of the distribution (a) # max: upper limit of the distribution (b) # lb: lower bound of the area # ub: upper bound of the area # col: color of the lines and points # acolor: color of the area # ...: additional arguments to be passed to the plot function unif_area <- function(min = 0, max = 1, lb, ub, col = 1,                       acolor = "lightgray", ...) {     x <- seq(min - 0.25 * max, max + 0.25 * max, 0.001)           if (missing(lb)) {        lb <- min(x)     }     if (missing(ub)) {         ub <- max(x)     }     if(max < min) {         stop("'min' must be lower than 'max'")     }      x2 <- seq(lb, ub, length = 1000)      plot(x, dunif(x, min = min, max = max),          xlim = c(min - 0.25 * max, max + 0.25 * max), type = "l",          ylab = "f(x)", lty = 0, ...)         y <- dunif(x2, min = min, max = max)     polygon(c(lb, x2, ub), c(0, y, 0), col = acolor, lty = 0)     segments(min, 1/(max - min), max, 1/(max - min), lwd = 2, col = col)     segments(min - 2 * max, 0, min, 0, lwd = 2, col = col)     segments(max, 0, max + 2 * max, 0, lwd = 2, col = col)     points(min, 1/(max - min), pch = 19, col = col)     points(max, 1/(max - min), pch = 19, col = col)     segments(min, 0, min, 1/(max - min), lty = 2, col = col, lwd = 2)     segments(max, 0, max, 1/(max - min), lty = 2, col = col, lwd = 2)     points(0, min, pch = 21, col = col, bg = "white")     points(max, min, pch = 21, col = col, bg = "white") }                    As an example, if you want to plot the area between 0 and 0.5 of a uniform distribution on the interval            (0, 1), which can be calculated with            punif(0.5), you can type:
            unif_area(min = 0, max = 1, lb = 0, ub = 0.5,           main = "punif(0.5)", acolor = "white")                     
            The calculated probability (0.25) corresponds to the following area:
          unif_area(min = 0, max = 60, lb = 0, ub = 15) text(8, 0.008, "25%", srt = 90, cex = 1.2)                 
          - The probability of waiting more than 45 minutes is P(X > 45) = 1 - P(X \leq 45):
          punif(45, min = 0, max = 60, lower.tail = FALSE) # 0.25 or 25% 1 - punif(45, min = 0, max = 60) # Equivalent                That corresponds to:
          unif_area(min = 0, max = 60, lb = 45, ub = 60) text(51, 0.008, "25%", srt = 90, cex = 1.2)                 
          - The probability of waiting between 20 and 30 minutes is P(X \leq 30) - P(X \leq 20):
          punif(30, min = 0, max = 60) - punif(20, min = 0, max = 60) # 0.167 or 16.7%                The calculated probability can be represented with the following code:
          unif_area(min = 0, max = 60, lb = 20, ub = 30) text(24, 0.008, "16.7%", srt = 90, cex = 1.2)                 
          As the uniform distribution is a continuous distribution P(X = x) = 0, so P(X \geq x) = P(X > x) and P(X \leq x) = P(X < x).
          Plot uniform cumulative distribution            
            function in R        
        You can also plot the cumulative distribution function of the uniform distribution in R. You just need to type the following:
          # Grid of X-axis values x <- seq(-0.5, 1.5, 0.01)  # Uniform distribution between 0 and 1 plot(x, punif(x), type = "l", main = "Uniform CDF",      ylab = "F(x)", lwd = 2, col = "red")  # Equivalent to: plot(punif, -0.5, 1.5, type = "l", main = "Uniform CDF",      ylab = "F(x)", lwd = 2, col = "red")                 
          The qunif function
In R, you can calculate the corresponding quantile for any probability (p) for a uniform distribution with the          qunif          function, which has the following syntax:
          qunif(p,                 # Vector of probabilities       min = 0,           # Lower limit of the distribution (a)       max = 1,           # Upper limit of the distribution (b)       lower.tail = TRUE, # If TRUE, probabilities are P(X <= x), or P(X > x) otherwise       log.p = FALSE)     # If TRUE, probabilities are given as log                In case you want to calculate the quantile for the probability 0.5 of a uniform distribution on the interval (0, 60) you can type:
          qunif(0.5, min = 0, max = 60) # 30                          unif_area(min = 0, max = 60, lb = 0, ub = 30) text(15, 0.008, "50%", srt = 90, cex = 1.2) arrows(38, 0.005, 31, 0.0005, length = 0.15) text(44, 0.006, "qunif(0.5)")                 
          Plot of the uniform quantile function
It is possible to create the graph of a uniform quantile function in R. For that purpose you can type the following to plot the function on the interval (0, 1):
          plot(qunif, punif(0), punif(1), lwd = 2,      main = "Uniform quantile function",      xlab = "p", ylab = "Q(p)") segments(0, 0.5, punif(0.5), 0.5, lty = 2, lwd = 2) segments(punif(0.5), 0, punif(0.5), qunif(0.5), lty = 2, lwd = 2)                 
          Recall that          punif(0.5) = 0.5          and          qunif(0.5) = 0.5.
The runif function
The R          runif          function allows drawing          n          random observations from a uniform distribution. The arguments of the function are described below:
          runif(n        # Number of observations to be generated       min = 0, # Lower limit of the distribution (a)       max = 0) # Upper limit of the distribution (b)                As an example, you can draw ten observations from a uniform distribution on the interval (-1, 1) typing:
          runif(n = 10, min = -1, max = 1)                          -0.20757312 -0.46819001 -0.80643735 -0.92675885  0.80520074  0.39716130 -0.39939392  0.78837145  0.28130687  0.09807602                However, every time you run the previous code you will obtain ten different numbers. If you want to make the output reproducible, you can set a seed with the          set.seed          function.
          set.seed(1) runif(n = 10, min = -1, max = 1)                          -0.4689827 -0.2557522  0.1457067  0.8164156 -0.5966361  0.7967794  0.8893505  0.3215956  0.2582281 -0.8764275                Observe that as we increase the number of generated observations, the histogram of the sampled data approaches to the true uniform density function:
          # Three columns par(mfrow = c(1, 3))  x <- seq(-0.5, 1.5, 0.01)  set.seed(1)  # n = 10 hist(runif(10), main = "n = 100", xlim = c(-0.2, 1.25),      xlab = "", prob = TRUE) lines(x, dunif(x), col = "red", lwd = 2)  # n = 1000 hist(runif(1000), main = "n = 10000", xlim = c(-0.2, 1.25),      xlab = "", prob = TRUE) lines(x, dunif(x), col = "red", lwd = 2)  # n = 100000 hist(runif(100000), main = "n = 1000000", xlim = c(-0.2, 1.25),      xlab = "", prob = TRUE) lines(x, dunif(x), col = "red", lwd = 2)  # Back to the original graphics device par(mfrow = c(1, 1))                 
          Source: https://r-coder.com/uniform-distribution-r/
0 Response to "Generate Continuous Random Variable in R"
Postar um comentário