transformada inversa

El método de la transformada inversa es una técnica utilizada en simulación para generar números aleatorios con una distribución específica. Se basa en la propiedad de que si una variable aleatoria \(X\) tiene una función de distribución acumulativa \(F(x)\), entonces su inversa \(F^{-1}(u)\), aplicada a un número aleatorio \(u\) uniforme en \([0,1]\), genera valores de \(X\) con la distribución deseada.

El proceso consiste en generar un número aleatorio \(u\) en \([0,1]\), calcular \(x = F^{-1}(u)\) y usar ese valor como una muestra de la distribución objetivo. Es un método eficiente cuando la función inversa es fácil de calcular, como en las distribuciones exponencial y geométrica.

a <- 781 
c <- 1245  
m <- 221
X_n <- 78 # 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.28054299 0.73755656 0.66515837 0.12217195 0.04977376 0.50678733
##   [7] 0.43438914 0.89140271 0.81900452 0.27601810 0.20361991 0.66063348
##  [13] 0.58823529 0.04524887 0.97285068 0.42986425 0.35746606 0.81447964
##  [19] 0.74208145 0.19909502 0.12669683 0.58371041 0.51131222 0.96832579
##  [25] 0.89592760 0.35294118 0.28054299 0.73755656 0.66515837 0.12217195
##  [31] 0.04977376 0.50678733 0.43438914 0.89140271 0.81900452 0.27601810
##  [37] 0.20361991 0.66063348 0.58823529 0.04524887 0.97285068 0.42986425
##  [43] 0.35746606 0.81447964 0.74208145 0.19909502 0.12669683 0.58371041
##  [49] 0.51131222 0.96832579 0.89592760 0.35294118 0.28054299 0.73755656
##  [55] 0.66515837 0.12217195 0.04977376 0.50678733 0.43438914 0.89140271
##  [61] 0.81900452 0.27601810 0.20361991 0.66063348 0.58823529 0.04524887
##  [67] 0.97285068 0.42986425 0.35746606 0.81447964 0.74208145 0.19909502
##  [73] 0.12669683 0.58371041 0.51131222 0.96832579 0.89592760 0.35294118
##  [79] 0.28054299 0.73755656 0.66515837 0.12217195 0.04977376 0.50678733
##  [85] 0.43438914 0.89140271 0.81900452 0.27601810 0.20361991 0.66063348
##  [91] 0.58823529 0.04524887 0.97285068 0.42986425 0.35746606 0.81447964
##  [97] 0.74208145 0.19909502 0.12669683 0.58371041
# generando una variable exponencial con beta = 3
x <- -3*log(1-random.number)
round(x,1) # redondeando a una cifra decimal
##   [1]  1.0  4.0  3.3  0.4  0.2  2.1  1.7  6.7  5.1  1.0  0.7  3.2  2.7  0.1 10.8
##  [16]  1.7  1.3  5.1  4.1  0.7  0.4  2.6  2.1 10.4  6.8  1.3  1.0  4.0  3.3  0.4
##  [31]  0.2  2.1  1.7  6.7  5.1  1.0  0.7  3.2  2.7  0.1 10.8  1.7  1.3  5.1  4.1
##  [46]  0.7  0.4  2.6  2.1 10.4  6.8  1.3  1.0  4.0  3.3  0.4  0.2  2.1  1.7  6.7
##  [61]  5.1  1.0  0.7  3.2  2.7  0.1 10.8  1.7  1.3  5.1  4.1  0.7  0.4  2.6  2.1
##  [76] 10.4  6.8  1.3  1.0  4.0  3.3  0.4  0.2  2.1  1.7  6.7  5.1  1.0  0.7  3.2
##  [91]  2.7  0.1 10.8  1.7  1.3  5.1  4.1  0.7  0.4  2.6
data.frame(1:length(random.number),random.number,round(x,1))
##     X1.length.random.number. random.number round.x..1.
## 1                          1    0.28054299         1.0
## 2                          2    0.73755656         4.0
## 3                          3    0.66515837         3.3
## 4                          4    0.12217195         0.4
## 5                          5    0.04977376         0.2
## 6                          6    0.50678733         2.1
## 7                          7    0.43438914         1.7
## 8                          8    0.89140271         6.7
## 9                          9    0.81900452         5.1
## 10                        10    0.27601810         1.0
## 11                        11    0.20361991         0.7
## 12                        12    0.66063348         3.2
## 13                        13    0.58823529         2.7
## 14                        14    0.04524887         0.1
## 15                        15    0.97285068        10.8
## 16                        16    0.42986425         1.7
## 17                        17    0.35746606         1.3
## 18                        18    0.81447964         5.1
## 19                        19    0.74208145         4.1
## 20                        20    0.19909502         0.7
## 21                        21    0.12669683         0.4
## 22                        22    0.58371041         2.6
## 23                        23    0.51131222         2.1
## 24                        24    0.96832579        10.4
## 25                        25    0.89592760         6.8
## 26                        26    0.35294118         1.3
## 27                        27    0.28054299         1.0
## 28                        28    0.73755656         4.0
## 29                        29    0.66515837         3.3
## 30                        30    0.12217195         0.4
## 31                        31    0.04977376         0.2
## 32                        32    0.50678733         2.1
## 33                        33    0.43438914         1.7
## 34                        34    0.89140271         6.7
## 35                        35    0.81900452         5.1
## 36                        36    0.27601810         1.0
## 37                        37    0.20361991         0.7
## 38                        38    0.66063348         3.2
## 39                        39    0.58823529         2.7
## 40                        40    0.04524887         0.1
## 41                        41    0.97285068        10.8
## 42                        42    0.42986425         1.7
## 43                        43    0.35746606         1.3
## 44                        44    0.81447964         5.1
## 45                        45    0.74208145         4.1
## 46                        46    0.19909502         0.7
## 47                        47    0.12669683         0.4
## 48                        48    0.58371041         2.6
## 49                        49    0.51131222         2.1
## 50                        50    0.96832579        10.4
## 51                        51    0.89592760         6.8
## 52                        52    0.35294118         1.3
## 53                        53    0.28054299         1.0
## 54                        54    0.73755656         4.0
## 55                        55    0.66515837         3.3
## 56                        56    0.12217195         0.4
## 57                        57    0.04977376         0.2
## 58                        58    0.50678733         2.1
## 59                        59    0.43438914         1.7
## 60                        60    0.89140271         6.7
## 61                        61    0.81900452         5.1
## 62                        62    0.27601810         1.0
## 63                        63    0.20361991         0.7
## 64                        64    0.66063348         3.2
## 65                        65    0.58823529         2.7
## 66                        66    0.04524887         0.1
## 67                        67    0.97285068        10.8
## 68                        68    0.42986425         1.7
## 69                        69    0.35746606         1.3
## 70                        70    0.81447964         5.1
## 71                        71    0.74208145         4.1
## 72                        72    0.19909502         0.7
## 73                        73    0.12669683         0.4
## 74                        74    0.58371041         2.6
## 75                        75    0.51131222         2.1
## 76                        76    0.96832579        10.4
## 77                        77    0.89592760         6.8
## 78                        78    0.35294118         1.3
## 79                        79    0.28054299         1.0
## 80                        80    0.73755656         4.0
## 81                        81    0.66515837         3.3
## 82                        82    0.12217195         0.4
## 83                        83    0.04977376         0.2
## 84                        84    0.50678733         2.1
## 85                        85    0.43438914         1.7
## 86                        86    0.89140271         6.7
## 87                        87    0.81900452         5.1
## 88                        88    0.27601810         1.0
## 89                        89    0.20361991         0.7
## 90                        90    0.66063348         3.2
## 91                        91    0.58823529         2.7
## 92                        92    0.04524887         0.1
## 93                        93    0.97285068        10.8
## 94                        94    0.42986425         1.7
## 95                        95    0.35746606         1.3
## 96                        96    0.81447964         5.1
## 97                        97    0.74208145         4.1
## 98                        98    0.19909502         0.7
## 99                        99    0.12669683         0.4
## 100                      100    0.58371041         2.6
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)

Simulación de variables aleatorias Uniformes en 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.066317702 0.647818725 0.660329644 0.093720540 0.644759734 0.484327536
##   [7] 0.252202729 0.288303507 0.087552351 0.752019070 0.539615407 0.694930516
##  [13] 0.327247418 0.466310045 0.101763971 0.031302725 0.705124795 0.188419771
##  [19] 0.404816976 0.097051066 0.077814986 0.949309494 0.601630764 0.369510190
##  [25] 0.947921028 0.587704056 0.542050369 0.257958061 0.735316550 0.858836607
##  [31] 0.814091909 0.469535445 0.997787841 0.932895571 0.468457134 0.883865749
##  [37] 0.487521160 0.277840608 0.319711561 0.516269665 0.042811441 0.856705106
##  [43] 0.388726447 0.920344198 0.280670570 0.905215520 0.932105407 0.837886164
##  [49] 0.298270947 0.229531495 0.373078042 0.052002487 0.661836772 0.861991438
##  [55] 0.585412223 0.002723046 0.200786686 0.879257825 0.186845483 0.566829416
##  [61] 0.328751972 0.318238591 0.349614625 0.444910442 0.830200236 0.651197281
##  [67] 0.784526685 0.639110588 0.089982634 0.309898692 0.634780825 0.773543593
##  [73] 0.683837365 0.492645047 0.611088883 0.754810081 0.542730004 0.781421755
##  [79] 0.592235660 0.246947993 0.005266654 0.521150763 0.431377983 0.502551051
##  [85] 0.010767682 0.046950902 0.603287578 0.508074364 0.256227744 0.157589250
##  [91] 0.713373981 0.676575510 0.729773654 0.884912286 0.634879266 0.646536714
##  [97] 0.268296790 0.523258046 0.483705681 0.926112759
  1. generando una variable aleatoria de una distribucion normal
#generar 100 variable normales con media 30 y desviacion estandar 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=4, main = "Gráfico de la normal", xlim = c(20,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

5.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