El método de transformación inversa es una técnica utilizada para generar números aleatorios que sigan una distribución específica. Se basa en aprovechar una propiedad matemática que permite transformar un número aleatorio de una distribución uniforme (valores entre 0 y 1) en un número con la distribución deseada.
Se empieza con un número aleatorio entre 0 y 1, generado de manera uniforme.
Se usa una función matemática que describe cómo se comportan los valores en la distribución objetivo.
Se transforma el número aleatorio utilizando esta función para obtener un valor que siga la distribución deseada.
Imagina que tienes una máquina que genera números aleatorios entre 0 y 1, como si estuvieras girando una ruleta con una aguja que siempre cae en algún punto dentro de ese rango. Si quieres que los números sigan una distribución diferente, como una en la que los valores pequeños aparezcan con más frecuencia que los grandes, puedes usar una regla de transformación para ajustar los resultados.
Por ejemplo, si quieres generar tiempos de espera en una fila donde la mayoría de las personas esperan poco tiempo y solo algunas pocas esperan mucho, aplicarías una transformación que haga que los números pequeños sean más comunes y los grandes menos frecuentes.
✅ Es un método directo y exacto cuando la transformación es fácil de calcular.
❌No siempre es posible encontrar la transformación adecuada de manera sencilla.
Este método es muy útil en simulaciones y en la generación de datos sintéticos en diversas áreas como estadística, inteligencia artificial y videojuegos.
a <- 150
c <- 1025
m <- 5005
X_n <- 28 # 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.043956044 0.798201798 0.935064935 0.464535465 0.885114885 0.972027972
## [7] 0.008991009 0.553446553 0.221778222 0.471528472 0.934065934 0.314685315
## [13] 0.407592408 0.343656344 0.753246753 0.191808192 0.976023976 0.608391608
## [19] 0.463536464 0.735264735 0.494505495 0.380619381 0.297702298 0.860139860
## [25] 0.225774226 0.070929071 0.844155844 0.828171828 0.430569431 0.790209790
## [31] 0.736263736 0.644355644 0.858141858 0.926073926 0.115884116 0.587412587
## [37] 0.316683317 0.707292707 0.298701299 0.009990010 0.703296703 0.699300699
## [43] 0.099900100 0.189810190 0.676323676 0.653346653 0.206793207 0.223776224
## [49] 0.771228771 0.889110889 0.571428571 0.919080919 0.066933067 0.244755245
## [55] 0.918081918 0.917082917 0.767232767 0.289710290 0.661338661 0.405594406
## [61] 0.043956044 0.798201798 0.935064935 0.464535465 0.885114885 0.972027972
## [67] 0.008991009 0.553446553 0.221778222 0.471528472 0.934065934 0.314685315
## [73] 0.407592408 0.343656344 0.753246753 0.191808192 0.976023976 0.608391608
## [79] 0.463536464 0.735264735 0.494505495 0.380619381 0.297702298 0.860139860
## [85] 0.225774226 0.070929071 0.844155844 0.828171828 0.430569431 0.790209790
## [91] 0.736263736 0.644355644 0.858141858 0.926073926 0.115884116 0.587412587
## [97] 0.316683317 0.707292707 0.298701299 0.009990010
Entonces
# generando una variable exponencial con beta = 3
x <- -3*log(1-random.number)
round(x,1) # redondeando a una cifra decimal
## [1] 0.1 4.8 8.2 1.9 6.5 10.7 0.0 2.4 0.8 1.9 8.2 1.1 1.6 1.3 4.2
## [16] 0.6 11.2 2.8 1.9 4.0 2.0 1.4 1.1 5.9 0.8 0.2 5.6 5.3 1.7 4.7
## [31] 4.0 3.1 5.9 7.8 0.4 2.7 1.1 3.7 1.1 0.0 3.6 3.6 0.3 0.6 3.4
## [46] 3.2 0.7 0.8 4.4 6.6 2.5 7.5 0.2 0.8 7.5 7.5 4.4 1.0 3.2 1.6
## [61] 0.1 4.8 8.2 1.9 6.5 10.7 0.0 2.4 0.8 1.9 8.2 1.1 1.6 1.3 4.2
## [76] 0.6 11.2 2.8 1.9 4.0 2.0 1.4 1.1 5.9 0.8 0.2 5.6 5.3 1.7 4.7
## [91] 4.0 3.1 5.9 7.8 0.4 2.7 1.1 3.7 1.1 0.0
data.frame(1:length(random.number),random.number,round(x,1))
## X1.length.random.number. random.number round.x..1.
## 1 1 0.043956044 0.1
## 2 2 0.798201798 4.8
## 3 3 0.935064935 8.2
## 4 4 0.464535465 1.9
## 5 5 0.885114885 6.5
## 6 6 0.972027972 10.7
## 7 7 0.008991009 0.0
## 8 8 0.553446553 2.4
## 9 9 0.221778222 0.8
## 10 10 0.471528472 1.9
## 11 11 0.934065934 8.2
## 12 12 0.314685315 1.1
## 13 13 0.407592408 1.6
## 14 14 0.343656344 1.3
## 15 15 0.753246753 4.2
## 16 16 0.191808192 0.6
## 17 17 0.976023976 11.2
## 18 18 0.608391608 2.8
## 19 19 0.463536464 1.9
## 20 20 0.735264735 4.0
## 21 21 0.494505495 2.0
## 22 22 0.380619381 1.4
## 23 23 0.297702298 1.1
## 24 24 0.860139860 5.9
## 25 25 0.225774226 0.8
## 26 26 0.070929071 0.2
## 27 27 0.844155844 5.6
## 28 28 0.828171828 5.3
## 29 29 0.430569431 1.7
## 30 30 0.790209790 4.7
## 31 31 0.736263736 4.0
## 32 32 0.644355644 3.1
## 33 33 0.858141858 5.9
## 34 34 0.926073926 7.8
## 35 35 0.115884116 0.4
## 36 36 0.587412587 2.7
## 37 37 0.316683317 1.1
## 38 38 0.707292707 3.7
## 39 39 0.298701299 1.1
## 40 40 0.009990010 0.0
## 41 41 0.703296703 3.6
## 42 42 0.699300699 3.6
## 43 43 0.099900100 0.3
## 44 44 0.189810190 0.6
## 45 45 0.676323676 3.4
## 46 46 0.653346653 3.2
## 47 47 0.206793207 0.7
## 48 48 0.223776224 0.8
## 49 49 0.771228771 4.4
## 50 50 0.889110889 6.6
## 51 51 0.571428571 2.5
## 52 52 0.919080919 7.5
## 53 53 0.066933067 0.2
## 54 54 0.244755245 0.8
## 55 55 0.918081918 7.5
## 56 56 0.917082917 7.5
## 57 57 0.767232767 4.4
## 58 58 0.289710290 1.0
## 59 59 0.661338661 3.2
## 60 60 0.405594406 1.6
## 61 61 0.043956044 0.1
## 62 62 0.798201798 4.8
## 63 63 0.935064935 8.2
## 64 64 0.464535465 1.9
## 65 65 0.885114885 6.5
## 66 66 0.972027972 10.7
## 67 67 0.008991009 0.0
## 68 68 0.553446553 2.4
## 69 69 0.221778222 0.8
## 70 70 0.471528472 1.9
## 71 71 0.934065934 8.2
## 72 72 0.314685315 1.1
## 73 73 0.407592408 1.6
## 74 74 0.343656344 1.3
## 75 75 0.753246753 4.2
## 76 76 0.191808192 0.6
## 77 77 0.976023976 11.2
## 78 78 0.608391608 2.8
## 79 79 0.463536464 1.9
## 80 80 0.735264735 4.0
## 81 81 0.494505495 2.0
## 82 82 0.380619381 1.4
## 83 83 0.297702298 1.1
## 84 84 0.860139860 5.9
## 85 85 0.225774226 0.8
## 86 86 0.070929071 0.2
## 87 87 0.844155844 5.6
## 88 88 0.828171828 5.3
## 89 89 0.430569431 1.7
## 90 90 0.790209790 4.7
## 91 91 0.736263736 4.0
## 92 92 0.644355644 3.1
## 93 93 0.858141858 5.9
## 94 94 0.926073926 7.8
## 95 95 0.115884116 0.4
## 96 96 0.587412587 2.7
## 97 97 0.316683317 1.1
## 98 98 0.707292707 3.7
## 99 99 0.298701299 1.1
## 100 100 0.009990010 0.0
hist(x, breaks = 20, probability = TRUE, col = "lightblue", ylim=c(0,0.35), xlim=c(0,12), 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)
# Generar 100 variables aleatorias uniformes entre 0 y 1
uniform_random_01 <- runif(100, min = 0, max = 1)
uniform_random_01
## [1] 0.203188620 0.037238168 0.830683518 0.058743384 0.714994386 0.163217941
## [7] 0.400899055 0.305014292 0.729432806 0.433500827 0.454797344 0.904133111
## [13] 0.077941564 0.728494241 0.577634716 0.869201195 0.358541332 0.905718894
## [19] 0.092891506 0.818078262 0.553845748 0.245526116 0.759526829 0.391395284
## [25] 0.761686163 0.122365176 0.699145439 0.561146070 0.432540365 0.097976551
## [31] 0.018712177 0.305506014 0.367125568 0.876128095 0.696251453 0.522051130
## [37] 0.647840241 0.831020223 0.280442868 0.585330335 0.163867134 0.269748691
## [43] 0.335123484 0.840245211 0.966480910 0.943825999 0.507072674 0.784893696
## [49] 0.099541138 0.001072946 0.118322055 0.172228684 0.584297012 0.068782012
## [55] 0.974849245 0.370516403 0.736564646 0.856020928 0.235654680 0.392051628
## [61] 0.751918664 0.918829392 0.054786938 0.607077630 0.060301358 0.148590586
## [67] 0.311535327 0.478546598 0.195389630 0.670724813 0.666077582 0.103355734
## [73] 0.777097455 0.823847498 0.846734472 0.935311762 0.837063734 0.742371059
## [79] 0.023297840 0.243973676 0.384179164 0.963151049 0.774015653 0.463841447
## [85] 0.493861396 0.317271982 0.214476048 0.592563307 0.979118429 0.669012080
## [91] 0.751540223 0.156113730 0.205976556 0.398569048 0.311674807 0.701420401
## [97] 0.139829845 0.689082203 0.131269941 0.571424262
# Generar 100 variables uniformes [ a, b]
uniform_random_ab <- runif(1000, min = 10, max = 20)
# Generar 100 variables normales con media 30 y desviación estándar 3.5
set.seed(12345)
normal_random <- rnorm(100, mean = 30, sd = 3.5)
normal_random
## [1] 32.04935 32.48313 29.61744 28.41276 32.12061 23.63715 32.20534 29.03336
## [9] 29.00544 26.78237 29.59313 36.36059 31.29720 31.82076 27.37314 32.85915
## [17] 26.89775 28.83948 33.92249 31.04553 32.72868 35.09525 27.74485 24.56402
## [25] 24.40802 36.31784 28.31423 32.17133 32.14243 29.43191 32.84156 37.68892
## [33] 37.17217 35.71356 30.88995 31.71916 28.86570 24.18282 36.18707 30.09030
## [41] 33.94979 21.66875 26.28907 33.27999 32.99058 35.11255 25.05415 31.98591
## [49] 32.04116 25.42620 28.10865 36.81692 30.18757 31.23082 27.65158 30.97284
## [57] 32.41910 32.88328 37.50773 21.78570 30.52357 25.30114 31.93656 35.56487
## [65] 27.94592 23.58668 33.10849 35.57721 31.80899 25.46515 30.19115 27.25373
## [73] 26.32727 38.15679 34.90947 33.29910 32.89190 27.15961 31.66687 33.57440
## [81] 32.25884 33.65100 28.93471 38.66989 33.39927 36.53485 32.35215 28.92216
## [89] 31.87783 32.88705 26.62634 27.00721 36.60431 28.62863 26.56778 32.40566
## [97] 28.23235 37.55202 27.90071 27.56909
hist(normal_random, col="red", main="Gráfico de la normal", xlim=c(17,40))
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] 0.5 0.3 1.0 1.6 7.7 6.5 0.3 0.9 2.6 1.2 3.6 2.2 0.7 0.2 0.8
## [16] 5.2 6.4 0.2 1.5 3.1 2.8 0.4 3.5 0.1 0.8 1.9 1.7 0.8 1.1 0.7
## [31] 1.7 6.3 0.0 5.6 7.2 2.0 1.9 0.2 7.9 1.1 4.7 2.9 4.9 0.1 3.1
## [46] 0.3 7.9 11.1 2.4 4.0 6.4 1.8 0.0 0.1 1.2 2.0 8.9 1.9 4.2 10.4
## [61] 0.6 1.2 0.9 0.5 1.1 6.2 4.9 3.9 2.5 3.5 1.1 2.2 0.7 0.7 3.9
## [76] 3.9 0.0 5.0 5.0 1.4 1.0 6.4 1.4 3.3 1.1 0.8 1.8 0.1 1.1 0.7
## [91] 1.3 0.5 0.5 8.6 1.7 5.5 5.2 2.6 1.3 0.5
binom_random <- rbinom(100,12,0.25)
binom_random
## [1] 3 3 4 5 3 3 3 3 6 2 3 4 4 2 4 4 5 3 2 5 1 4 5 4 2 2 2 2 2 3 1 1 3 2 2 3 2
## [38] 5 2 4 1 3 4 1 0 4 4 3 2 3 1 4 2 2 2 2 5 6 2 2 3 3 1 4 2 1 3 0 5 3 1 4 4 0
## [75] 4 3 5 3 0 6 6 4 3 3 4 3 4 5 2 3 1 3 5 2 5 3 3 3 2 4
evento_pois <- rpois(100,5)
evento_pois
## [1] 4 4 4 7 6 3 4 6 7 5 2 3 3 4 5 4 6 3 7 5 8 7 7 12 5
## [26] 5 4 6 6 7 8 3 7 7 9 6 7 2 6 4 6 6 4 4 6 4 6 3 3 2
## [51] 7 6 3 8 5 5 4 4 5 8 7 4 4 5 6 6 7 2 8 3 4 3 4 3 5
## [76] 6 5 1 6 5 7 8 5 5 8 4 3 3 2 6 4 2 2 5 6 3 4 9 5 6
tablapois <- table(evento_pois)
tablapois
## evento_pois
## 1 2 3 4 5 6 7 8 9 12
## 1 7 14 20 16 19 13 7 2 1