## 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 |

## 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)
```

### 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))
```