Transformada Inversa

El método de la transformada inversa es una técnica utilizada para generar valores aleatorios que siguen una distribución de probabilidad específica. Se usa principalmente en simulaciones y modelos probabilísticos.

El concepto clave es convertir un número aleatorio generado de manera uniforme en otro valor que siga la distribución deseada. Para lograrlo, se utiliza la función que describe cómo los valores de la distribución se acumulan. Se invierte este proceso para obtener un resultado que respete la probabilidad de ocurrencia de cada valor en la distribución.

Este método es especialmente útil cuando se conoce cómo se comporta una distribución y su transformación inversa puede calcularse fácilmente. Se aplica en la generación de valores que siguen distribuciones como la exponencial, la geométrica y otras utilizadas en simulaciones de fenómenos aleatorios.

a <- 400 
c <- 40 
m <- 572
X_n <- 53 # semilla
random.number<-numeric(100) # vector numérico de longitud 50
 for (i in 1:100)
   {X_n<-(a*X_n+c)%%m
   random.number[i]<-X_n/m # números en el intervalo [0,1]
   }
 random.number
##   [1] 0.13286713 0.21678322 0.78321678 0.35664336 0.72727273 0.97902098
##   [7] 0.67832168 0.39860140 0.51048951 0.26573427 0.36363636 0.52447552
##  [13] 0.86013986 0.12587413 0.41958042 0.90209790 0.90909091 0.70629371
##  [19] 0.58741259 0.03496503 0.05594406 0.44755245 0.09090909 0.43356643
##  [25] 0.49650350 0.67132867 0.60139860 0.62937063 0.81818182 0.34265734
##  [31] 0.13286713 0.21678322 0.78321678 0.35664336 0.72727273 0.97902098
##  [37] 0.67832168 0.39860140 0.51048951 0.26573427 0.36363636 0.52447552
##  [43] 0.86013986 0.12587413 0.41958042 0.90209790 0.90909091 0.70629371
##  [49] 0.58741259 0.03496503 0.05594406 0.44755245 0.09090909 0.43356643
##  [55] 0.49650350 0.67132867 0.60139860 0.62937063 0.81818182 0.34265734
##  [61] 0.13286713 0.21678322 0.78321678 0.35664336 0.72727273 0.97902098
##  [67] 0.67832168 0.39860140 0.51048951 0.26573427 0.36363636 0.52447552
##  [73] 0.86013986 0.12587413 0.41958042 0.90209790 0.90909091 0.70629371
##  [79] 0.58741259 0.03496503 0.05594406 0.44755245 0.09090909 0.43356643
##  [85] 0.49650350 0.67132867 0.60139860 0.62937063 0.81818182 0.34265734
##  [91] 0.13286713 0.21678322 0.78321678 0.35664336 0.72727273 0.97902098
##  [97] 0.67832168 0.39860140 0.51048951 0.26573427
# generando una variable exponencial con beta = 3
x <- -3*log(1-random.number)
round(x,1) # redondeando a una cifra decimal
##   [1]  0.4  0.7  4.6  1.3  3.9 11.6  3.4  1.5  2.1  0.9  1.4  2.2  5.9  0.4  1.6
##  [16]  7.0  7.2  3.7  2.7  0.1  0.2  1.8  0.3  1.7  2.1  3.3  2.8  3.0  5.1  1.3
##  [31]  0.4  0.7  4.6  1.3  3.9 11.6  3.4  1.5  2.1  0.9  1.4  2.2  5.9  0.4  1.6
##  [46]  7.0  7.2  3.7  2.7  0.1  0.2  1.8  0.3  1.7  2.1  3.3  2.8  3.0  5.1  1.3
##  [61]  0.4  0.7  4.6  1.3  3.9 11.6  3.4  1.5  2.1  0.9  1.4  2.2  5.9  0.4  1.6
##  [76]  7.0  7.2  3.7  2.7  0.1  0.2  1.8  0.3  1.7  2.1  3.3  2.8  3.0  5.1  1.3
##  [91]  0.4  0.7  4.6  1.3  3.9 11.6  3.4  1.5  2.1  0.9
data.frame(1:length(random.number),random.number,round(x,1))
##     X1.length.random.number. random.number round.x..1.
## 1                          1    0.13286713         0.4
## 2                          2    0.21678322         0.7
## 3                          3    0.78321678         4.6
## 4                          4    0.35664336         1.3
## 5                          5    0.72727273         3.9
## 6                          6    0.97902098        11.6
## 7                          7    0.67832168         3.4
## 8                          8    0.39860140         1.5
## 9                          9    0.51048951         2.1
## 10                        10    0.26573427         0.9
## 11                        11    0.36363636         1.4
## 12                        12    0.52447552         2.2
## 13                        13    0.86013986         5.9
## 14                        14    0.12587413         0.4
## 15                        15    0.41958042         1.6
## 16                        16    0.90209790         7.0
## 17                        17    0.90909091         7.2
## 18                        18    0.70629371         3.7
## 19                        19    0.58741259         2.7
## 20                        20    0.03496503         0.1
## 21                        21    0.05594406         0.2
## 22                        22    0.44755245         1.8
## 23                        23    0.09090909         0.3
## 24                        24    0.43356643         1.7
## 25                        25    0.49650350         2.1
## 26                        26    0.67132867         3.3
## 27                        27    0.60139860         2.8
## 28                        28    0.62937063         3.0
## 29                        29    0.81818182         5.1
## 30                        30    0.34265734         1.3
## 31                        31    0.13286713         0.4
## 32                        32    0.21678322         0.7
## 33                        33    0.78321678         4.6
## 34                        34    0.35664336         1.3
## 35                        35    0.72727273         3.9
## 36                        36    0.97902098        11.6
## 37                        37    0.67832168         3.4
## 38                        38    0.39860140         1.5
## 39                        39    0.51048951         2.1
## 40                        40    0.26573427         0.9
## 41                        41    0.36363636         1.4
## 42                        42    0.52447552         2.2
## 43                        43    0.86013986         5.9
## 44                        44    0.12587413         0.4
## 45                        45    0.41958042         1.6
## 46                        46    0.90209790         7.0
## 47                        47    0.90909091         7.2
## 48                        48    0.70629371         3.7
## 49                        49    0.58741259         2.7
## 50                        50    0.03496503         0.1
## 51                        51    0.05594406         0.2
## 52                        52    0.44755245         1.8
## 53                        53    0.09090909         0.3
## 54                        54    0.43356643         1.7
## 55                        55    0.49650350         2.1
## 56                        56    0.67132867         3.3
## 57                        57    0.60139860         2.8
## 58                        58    0.62937063         3.0
## 59                        59    0.81818182         5.1
## 60                        60    0.34265734         1.3
## 61                        61    0.13286713         0.4
## 62                        62    0.21678322         0.7
## 63                        63    0.78321678         4.6
## 64                        64    0.35664336         1.3
## 65                        65    0.72727273         3.9
## 66                        66    0.97902098        11.6
## 67                        67    0.67832168         3.4
## 68                        68    0.39860140         1.5
## 69                        69    0.51048951         2.1
## 70                        70    0.26573427         0.9
## 71                        71    0.36363636         1.4
## 72                        72    0.52447552         2.2
## 73                        73    0.86013986         5.9
## 74                        74    0.12587413         0.4
## 75                        75    0.41958042         1.6
## 76                        76    0.90209790         7.0
## 77                        77    0.90909091         7.2
## 78                        78    0.70629371         3.7
## 79                        79    0.58741259         2.7
## 80                        80    0.03496503         0.1
## 81                        81    0.05594406         0.2
## 82                        82    0.44755245         1.8
## 83                        83    0.09090909         0.3
## 84                        84    0.43356643         1.7
## 85                        85    0.49650350         2.1
## 86                        86    0.67132867         3.3
## 87                        87    0.60139860         2.8
## 88                        88    0.62937063         3.0
## 89                        89    0.81818182         5.1
## 90                        90    0.34265734         1.3
## 91                        91    0.13286713         0.4
## 92                        92    0.21678322         0.7
## 93                        93    0.78321678         4.6
## 94                        94    0.35664336         1.3
## 95                        95    0.72727273         3.9
## 96                        96    0.97902098        11.6
## 97                        97    0.67832168         3.4
## 98                        98    0.39860140         1.5
## 99                        99    0.51048951         2.1
## 100                      100    0.26573427         0.9
hist(x, breaks = 20, probability = TRUE, col = "lightblue", ylim=c(0,0.35),  main = "Distribución Exponencial (beta = 3)",     xlab = "Valor de X")

# Añadimos la función de densidad teórica de la distribución exponencial
curve(dexp(x,rate=1/3), col = "red", lwd = 2, add = TRUE)

simulando variables aleatorias con funciones propias de r

  1. Generando variable aleatoria uniforme
# Generar 100 variables aleatorias uniformes entre 0 y 1
uniform_random_01 <- runif(100, min = 0, max = 1)
uniform_random_01
##   [1] 0.70121900 0.57341010 0.41153261 0.70051650 0.27150747 0.11131083
##   [7] 0.58385408 0.66119716 0.56341351 0.97467972 0.35879555 0.46698452
##  [13] 0.00927875 0.52023350 0.80225330 0.77120587 0.27020302 0.91903040
##  [19] 0.97924725 0.07774789 0.69086492 0.51425138 0.76372703 0.78805806
##  [25] 0.37710172 0.73134441 0.61047869 0.70537254 0.36103696 0.11661706
##  [31] 0.18112536 0.83307300 0.30766936 0.26176300 0.94881566 0.24582995
##  [37] 0.43031578 0.72170182 0.93069767 0.87623426 0.77788439 0.47296542
##  [43] 0.24367971 0.90661682 0.04372209 0.07768995 0.55251935 0.28790638
##  [49] 0.65471693 0.96296858 0.81447880 0.96899354 0.50974596 0.02376589
##  [55] 0.37281844 0.60905520 0.90536913 0.74177070 0.76425914 0.26579946
##  [61] 0.00785854 0.78099390 0.88475476 0.70252865 0.80060190 0.10757937
##  [67] 0.44905450 0.06021256 0.04714500 0.12501913 0.02332333 0.24476294
##  [73] 0.08274857 0.40245619 0.15846931 0.14318341 0.41828521 0.92543590
##  [79] 0.92684920 0.21336231 0.64167113 0.52968564 0.61751423 0.09177721
##  [85] 0.23631211 0.40905704 0.53075937 0.94394683 0.23533444 0.05290144
##  [91] 0.49773473 0.43160258 0.79903951 0.96549702 0.44336432 0.25514445
##  [97] 0.32992593 0.35823297 0.77213412 0.90253730
  1. Generando una variable aleatoria de una distribucion normal
# Generar 100 variables normales con media 30 y desviación estándar 3.5
set.seed(123)
normal_random <- rnorm(100, mean = 30, sd = 3.5)
normal_random
##   [1] 28.03834 29.19438 35.45548 30.24678 30.45251 36.00273 31.61321 25.57229
##   [9] 27.59602 28.44018 34.28429 31.25935 31.40270 30.38739 28.05456 36.25420
##  [17] 31.74248 23.11684 32.45475 28.34523 26.26262 29.23709 26.40898 27.44888
##  [25] 27.81236 24.09657 32.93225 30.53681 26.01652 34.38835 31.49262 28.96725
##  [33] 33.13294 33.07347 32.87553 32.41024 31.93871 29.78331 28.92913 28.66835
##  [41] 27.56853 29.27229 25.57111 37.59135 34.22787 26.06912 28.58990 28.36671
##  [49] 32.72988 29.70821 30.88661 29.90009 29.84995 34.79011 29.20980 35.30765
##  [57] 24.57937 32.04615 30.43349 30.75580 31.32874 28.24187 28.83377 26.43499
##  [65] 26.24873 31.06235 31.56873 30.18551 33.22794 37.17530 28.28139 21.91791
##  [73] 33.52008 27.51780 27.59197 33.58950 29.00329 25.72749 30.63456 29.51388
##  [81] 30.02017 31.34848 28.70269 32.25532 29.22830 31.16124 33.83894 31.52314
##  [89] 28.85924 34.02083 33.47726 31.91939 30.83556 27.80233 34.76228 27.89909
##  [97] 37.65567 35.36414 29.17505 26.40753
hist(normal_random, col=5,main= "Grafico de la normal", xlim=c(15,40))

  1. Generando variable aleatoria de una exponencial

Para generar variables aleatorias con distribución exponencial con parámetro β. Ejemplo: Simular El tiempo de servicio en una caja de un banco cuyo comportamiento sigue una forma exponencial con media de 3 minutos/cliente

numexp <- rexp(100,1/3)
round(numexp,1)
##   [1]  5.4  0.1  3.9  0.6  5.3  5.3  2.5  1.0  9.9  1.2  3.3  4.0  1.9  0.6  1.4
##  [16]  1.1 10.4  3.8  3.2  0.9  0.3  8.9  5.9  2.0  4.8  1.8  0.3  1.0  5.3  0.8
##  [31]  2.8  1.3  3.9  0.5  4.7  0.2  1.7  5.2  3.9  3.9  1.4  0.1  0.5  3.1  3.2
##  [46] 11.2  0.0  0.0  5.1  1.6  1.4  0.2  1.6  4.4  3.8  4.3  6.4  4.3  2.7  8.1
##  [61]  6.7  1.6  0.2  1.7 13.1  1.7  1.4  0.8  2.1  2.9  2.2  3.3  1.8  2.0  4.9
##  [76]  0.3  1.2  8.2  8.6  0.1  1.4  2.0  2.9  3.4  0.2  4.9  0.5  4.4  0.3  0.7
##  [91]  2.0  4.6  5.8  0.6  1.7  5.8 10.8  4.0  2.8  0.9
  1. Generando variable aleatoria de una binomial
binom_random <- rbinom(100,12,0.25)
binom_random
##   [1] 6 4 2 2 6 3 4 2 4 3 5 2 2 1 2 6 2 4 4 1 2 2 1 1 7 7 1 5 3 3 3 4 1 2 4 2 4
##  [38] 2 3 2 2 6 2 3 0 3 3 3 2 5 3 2 2 2 5 6 3 2 7 2 3 1 3 1 2 2 3 4 2 5 4 4 1 2
##  [75] 4 3 2 2 1 2 5 4 4 1 1 6 3 3 2 3 2 2 4 2 4 1 4 3 4 4
  1. Generando variables aleatorias de una poisson
evento_pois <- rpois(100,5)

tablapois <- table(evento_pois)
tablapois
## evento_pois
##  0  1  2  3  4  5  6  7  8  9 10 11 
##  1  4 10  8 19 17 14 14  5  5  1  2
evento_pois
##   [1]  5  6  0  3  6  3  7  4  6  9  2  3  6  4  7 10  2  5  6  2 11  3  2  6  7
##  [26]  4  4  4  2  4  3  5  5  9  4  5  2  7  4  6  3  5  7  2  7  4  4  4  1  5
##  [51]  6  8  1 11  4  9  6  5  7  1  6  4  7  5  4  7  2  7  4  6  9  2  7  7  4
##  [76]  4  3  5  8  5  5  6  5  5  1  2  8  7  3  6  6  4  7  5  8  5  8  5  4  9