PorkGt

R version 4.1.2 (2021-11-01)

Generalidades

Paquetes utilizados

library(tidyverse)
library(readxl)
library(gridExtra)
library(gt)

Notas:

Por practicidad, los data.frames muestran solamente las 6 primeras filas y los bucles muestran solamente las primeras 6 iteraciones.

Metodología

Las dos técnicas comparadas son el Muestreo Aleatorio Simple (M.A.S) sin reposición y el Muestreo Aleatorio Estratificado (M.A.E), para ambas técnicas se utilizó el mismo marco muestral de 30,000 registros de cerdos de entre 10 y 11 semanas de edad, y a partir de él se corrieron por cada técnica 100 muestras cuyas unidades muestrales se seleccionaron mediante simulación utilizando números seudoaleatorios y fijando una semilla de aleatoriedad para la reproductibilidad de los resultados. Se estableció un nivel de confianza del 95% y un error de estimación de 3 libras.

Para ambos métodos se calculó el tamaño muestral con la fórmula para poblaciones infinitas, en el caso del M.A.E la asignación del tamaño muestral para cada estrato se hizo proporcional al tamaño del mismo y se definieron 3 estratos: “Grandes” para cerdos de 70 libras o más, “Medianos” para cerdos entre 56 y 69.99 libras y “Pequeños” para cerdos menores a 56 libras.

Los parámetros estimados fueron el promedio, la desviación estandar y el rango de peso poblacionales; también se estimó el número de muestras cuyos intervalos de confianza no abarcaron al peso promedio poblacional. Adicional a estas estimaciones, se calculó la desviación estandar entre los pesos promedio de cada muestra como indicador de la precisión de cada técnica.

Muestreo Aleatorio Simple (M.A.S)

Función en R para calcular el tamaño de muestra para poblaciones infinitas

n_media_infinita <- function(alfa, s, e){
  (qnorm(1-(alfa/2))^2 * s^2 / e^2)
  }

Cálculo del tamaño de muestra

ene <- ceiling(n_media_infinita(alfa = 0.05, s = sd(datos$Peso), e = 3))
ene
## [1] 71

Bucle para generación de 100 M.A.S con n número de elementos

Esto crea una lista de datos almacenada en una variable llamada “lista_MAS”.

set.seed(7531) #Semilla de aleatoriedad
lista_MAS <- list()
for(i in 1:100) {
  lista_MAS[[i]] <- sample(x = datos$Peso, size = ene, replace = F)
}

head(lista_MAS) #Se muestran tan solo 6 de los 100 muestreos, cada bloque es un muestreo
## [[1]]
##  [1]  58  56  92  86  80  59  68  67  59  62  77  77  72  81  67  79  70  86  79
## [20]  83  53  75  73  77  65  64  74  70  53  80  57  63  67  63  36  45  95  69
## [39]  60  64  57  69  75  88  58  61  81  75  75  31  64  72  62  59  77  54  75
## [58]  75  63  59 112  82  85  76  48  71  52  48  38  91  61
## 
## [[2]]
##  [1] 71 48 58 48 56 82 60 78 58 65 78 60 84 76 53 65 70 51 72 78 70 82 48 56 68
## [26] 81 35 64 78 70 67 68 73 73 81 54 79 50 47 55 56 73 65 44 83 64 65 66 77 75
## [51] 85 54 81 66 75 82 85 74 68 62 88 46 46 70 61 56 76 62 69 63 50
## 
## [[3]]
##  [1] 69 72 82 55 33 60 56 83 66 69 78 73 54 58 58 76 74 78 57 71 55 60 76 74 62
## [26] 92 64 49 80 53 72 63 49 57 73 70 67 54 73 61 63 64 81 54 73 62 59 65 81 76
## [51] 66 65 44 49 72 40 77 87 63 34 76 54 56 52 70 63 86 79 54 66 79
## 
## [[4]]
##  [1] 63 56 68 54 73 45 70 76 53 67 63 62 65 66 62 74 70 43 73 70 60 44 52 92 85
## [26] 74 56 88 75 62 88 56 72 73 50 58 67 81 80 76 76 71 67 57 75 57 65 65 65 91
## [51] 94 49 76 65 82 64 64 57 54 85 62 69 54 82 61 52 78 97 94 28 35
## 
## [[5]]
##  [1] 71 60 72 87 52 78 74 75 67 83 90 82 93 81 89 76 68 47 39 74 56 55 57 75 71
## [26] 65 81 79 48 53 30 67 54 67 53 76 67 57 61 62 90 59 54 84 49 66 70 69 76 59
## [51] 65 47 59 57 75 58 83 72 67 65 71 70 58 47 61 77 45 60 33 51 65
## 
## [[6]]
##  [1] 41 65 67 46 57 72 63 44 57 57 64 63 80 70 82 60 68 72 85 73 59 77 70 51 48
## [26] 73 60 79 68 64 78 41 70 42 80 72 86 79 64 75 67 57 68 87 74 85 74 53 65 61
## [51] 70 84 69 62 62 82 69 76 69 77 56 65 59 60 61 54 75 82 50 52 67

Conversión de la “lista_MAS” a un data.frame (tabla)

df_MAS <- as.data.frame(lista_MAS)
names(df_MAS) <- 1:100

Cálculo de los valores mínimos y máximos de cada M.A.S

min_max_MAS <- df_MAS %>%
  map_df(.f = ~c(Minimo= min(.), Maximo= max(.)))
minimo_MAS <- min(min_max_MAS$Minimo)
maximo_MAS <- max(min_max_MAS$Maximo)

head(min_max_MAS)
## # A tibble: 6 x 2
##   Minimo Maximo
##    <dbl>  <dbl>
## 1     31    112
## 2     35     88
## 3     33     92
## 4     28     97
## 5     30     93
## 6     41     87

Cálculo de intervalos de confianza para cada M.A.S

#IC de cada muestra
IC_MAS <- df_MAS %>% 
    map_df(.f = ~c(t.test(.)$conf.int[1] #Límite inferior
                  ,t.test(.)$conf.int[2])) #Líite superior

IC_MAS %>% 
  select(1:10) #La primera fila es el Límite inferior y la segunda fila es el Límite superior
## # A tibble: 2 x 10
##     `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  65.0  63.3  62.4  63.6  62.3  63.7  65.7  66.3  63.7  63.7
## 2  71.7  69.0  68.2  70.2  68.8  69.1  72.4  72.2  69.9  70.0

Data.frame (tabla) unificado:

En una sola tabla se unen los parámetros de interés del M.A.S, incluyendo una columna llamada “Dentro” cuyos valores pueden ser “1” en caso que los intervalos de confianza de la muestra abarquen al promedio poblacional o “2” en caso que los intervalos de confianza no lo abarquen:

IC_MAS <- as.data.frame(t(IC_MAS))
names(IC_MAS) <- c("Li", "Ls")
MAS_completo <- IC_MAS %>% 
  mutate(Muestra = 1:100,
         Dentro = ifelse(promedio_real >= Li & promedio_real <= Ls,1, 2),
         Promedio = t(df_MAS %>% 
                        map_df(mean)),
          Ds = t(df_MAS %>% 
                  map_df(sd)),
            Minimo = min_max_MAS$Minimo,
              Maximo = min_max_MAS$Maximo) %>%
               select(Muestra, Li, Ls, Promedio,
                        Ds, Minimo, Maximo, Dentro)

head(MAS_completo)
##   Muestra       Li       Ls Promedio       Ds Minimo Maximo Dentro
## 1       1 65.03496 71.72561 68.38028 14.13341     31    112      1
## 2       2 63.26745 69.04241 66.15493 12.19912     35     88      1
## 3       3 62.39564 68.19591 65.29577 12.25257     33     92      1
## 4       4 63.63768 70.24964 66.94366 13.96719     28     97      1
## 5       5 62.33292 68.76567 65.54930 13.58864     30     93      1
## 6       6 63.67627 69.11247 66.39437 11.48350     41     87      1

Creación de gráfica de dispersión del M.A.S

grafica_MAS <- ggplot(MAS_completo, aes(Muestra, Promedio)) +
  geom_point() +
  geom_hline(yintercept = promedio_real) +
  scale_y_continuous(breaks = seq(1, 100, 1)) +
  ggtitle("M.A.S") +
  theme_classic()

grafica_MAS

M.A.E

Asignación de estratos para el M.A.E

Grande <- 70
Mediano <- 56
#Pequeno <- Por descarte, todo lo que no entra en las otras dos categrías es Pequeño.
#Asignación de estratos
datos_estratos <- datos %>%
  select(Peso) %>% 
  mutate(Estrato = ifelse(Peso>= Grande, "Grande",
                          ifelse(Peso >= Mediano, "Mediano", "Pequeno")))

Número de muestras por estratos

No.muestras_estratos <- datos_estratos %>%
  count(Estrato) %>% 
  mutate(Pct = n*100/sum(n), n =round(
           Pct*ene/100), 2) %>% 
  select(Estrato, n)

No.muestras_estratos
## # A tibble: 3 x 2
##   Estrato     n
##   <chr>   <dbl>
## 1 Grande     30
## 2 Mediano    28
## 3 Pequeno    13

Bucles para generación de los 100 M.A.E de cada estrato

Además de generar un bucle por cada estrato se transforma cada lista generada en un data.frame:

Grande <- datos_estratos %>% 
  filter(Estrato == "Grande")
set.seed(7531)
lista_Grande <- list()
for(j in 1:100) {
  lista_Grande[[j]] <- sample(Grande$Peso, size = No.muestras_estratos$n[1], replace = F)
}

df_Grande <- as.data.frame(lista_Grande)
names(df_Grande) <- 1:ncol(df_Grande)

head(df_Grande)
##    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## 1 89 92 76 89 74 76 96 84 75 92 74 87 80 74 98 73 77 87 88 73 81 86 81 71 72 81
## 2 72 70 79 99 80 87 71 71 78 73 79 85 81 72 82 80 79 78 76 73 83 80 80 87 79 73
## 3 89 80 89 85 72 83 79 76 84 80 82 70 89 76 85 72 85 73 88 90 90 75 76 77 90 78
## 4 88 70 86 80 75 71 71 80 74 83 80 81 72 70 81 91 95 81 78 79 77 86 81 73 81 79
## 5 90 70 90 70 76 79 76 74 79 90 70 71 71 79 73 74 71 74 86 74 87 77 76 83 88 78
## 6 72 81 72 75 77 75 71 76 75 75 71 82 80 82 76 71 72 74 75 85 77 85 75 75 72 89
##   27 28 29 30 31 32 33 34 35 36 37  38 39 40 41 42 43 44 45 46 47 48 49 50 51
## 1 79 85 70 72 89 79 71 77 73 71 88  73 80 74 88 81 73 80 85 81 76 77 91 85 81
## 2 71 75 70 77 80 80 83 71 74 90 90 100 70 83 76 70 79 71 72 76 70 94 74 73 71
## 3 93 70 84 70 71 91 76 70 72 83 84  91 76 83 82 81 71 77 92 81 77 70 87 86 75
## 4 75 73 81 97 70 72 72 76 70 71 76  92 81 71 72 74 80 70 94 73 71 71 72 89 75
## 5 91 72 72 75 84 78 71 74 75 71 85  83 76 75 81 73 73 87 88 81 80 76 94 75 88
## 6 70 93 83 84 74 79 75 81 79 73 74  81 74 72 83 83 72 81 85 74 70 75 77 86 70
##   52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68  69  70 71 72 73 74 75  76
## 1 78 85 71 73 89 70 75 78 74 85 74 83 86 75 92 73 70  74  72 79 93 81 75 76  77
## 2 71 71 72 81 72 81 78 70 87 74 70 89 72 77 80 72 79  90  75 78 75 75 74 75  74
## 3 83 72 88 74 84 74 87 90 91 77 71 80 71 71 74 72 71  81  80 74 82 87 81 82 104
## 4 95 80 83 74 84 82 92 76 70 83 77 74 74 71 87 94 74 100  82 79 73 90 91 94  77
## 5 98 75 77 83 71 94 78 96 73 77 86 74 83 93 70 81 70  80  76 76 77 73 79 80  84
## 6 72 73 72 74 80 82 72 72 72 94 83 72 95 80 73 96 84 102 104 72 73 71 91 79  79
##   77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 1 80 86 82 73 95 75 80 80 77 72 73 78 73 71 95 70 83 74 73 81 75 73 76  84
## 2 79 73 73 74 81 94 80 84 71 74 82 72 70 95 82 86 75 82 74 72 86 72 78  71
## 3 92 70 71 76 73 85 79 80 79 95 73 82 73 87 73 79 85 95 80 87 71 73 71  94
## 4 78 72 78 72 71 74 86 81 75 87 86 81 70 80 88 74 77 84 72 79 84 73 76 102
## 5 84 83 75 71 82 89 88 73 79 73 74 90 70 74 77 78 70 71 81 88 91 74 70  74
## 6 78 79 80 80 94 74 70 85 72 71 76 70 79 80 86 74 86 83 74 72 91 81 78  77
Mediano <- datos_estratos %>% 
  filter(Estrato == "Mediano")
set.seed(7531)
lista_Mediano <- list()
for(k in 1:100) {
  lista_Mediano[[k]] <- sample(Mediano$Peso, size = No.muestras_estratos$n[2], replace = F)
}
df_Mediano <- as.data.frame(lista_Mediano)
names(df_Mediano) <- 1:ncol(df_Mediano)

head(df_Mediano)
##    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## 1 61 67 63 60 61 63 59 60 62 63 61 61 57 64 64 65 67 60 65 67 56 64 65 66 65 59
## 2 60 69 68 68 56 68 69 58 58 63 68 60 65 68 58 69 59 62 68 67 66 62 68 60 65 68
## 3 64 57 63 64 60 69 66 68 67 64 66 59 60 63 68 63 59 67 69 56 58 62 56 62 60 61
## 4 67 59 62 63 62 69 69 64 67 69 56 68 67 58 61 61 66 58 66 64 62 64 67 59 64 58
## 5 67 63 59 62 63 57 60 57 61 68 58 69 59 61 60 68 66 61 68 62 66 63 64 69 69 69
## 6 60 64 66 67 67 69 62 63 67 62 68 60 63 66 65 58 62 68 69 65 63 57 57 57 62 67
##   27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
## 1 64 57 65 58 61 62 68 59 59 57 67 69 62 69 57 63 69 65 60 68 56 60 62 56 59 64
## 2 67 60 63 66 58 68 68 64 61 60 69 60 58 67 64 64 56 63 64 68 64 63 57 69 67 58
## 3 67 59 59 61 59 61 69 68 64 68 61 67 66 61 68 67 65 63 62 64 58 65 63 56 58 65
## 4 65 56 67 63 65 67 56 65 68 56 57 67 67 66 63 64 61 66 67 56 56 63 60 60 59 64
## 5 60 57 68 64 62 67 62 63 64 56 58 56 68 64 62 57 60 66 67 67 67 59 69 56 68 64
## 6 61 60 64 68 61 64 56 67 67 57 60 58 68 59 66 59 65 61 68 62 67 64 57 60 68 57
##   53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
## 1 65 59 68 68 58 67 56 59 67 56 64 59 66 63 68 61 60 68 69 60 64 68 68 67 65 65
## 2 64 58 58 68 61 67 69 63 61 62 68 65 68 61 64 58 59 65 60 68 57 65 57 69 60 59
## 3 69 63 56 66 57 68 65 64 60 65 62 68 64 61 68 60 68 69 63 68 66 68 65 66 68 60
## 4 68 65 68 66 57 66 61 66 57 61 56 68 60 60 63 69 62 65 62 60 58 65 66 68 68 60
## 5 62 56 64 68 62 62 60 64 67 58 59 61 69 68 69 69 64 58 69 63 57 58 58 57 56 59
## 6 58 58 64 69 59 61 63 63 65 63 63 66 68 60 66 61 61 68 59 65 68 67 59 59 57 67
##   79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 1 66 62 69 65 66 59 57 68 58 63 62 58 60 64 68 57 63 68 63 64 67  66
## 2 57 63 64 58 65 61 58 66 62 62 65 68 65 63 62 58 61 60 64 56 65  66
## 3 59 67 60 62 64 62 62 68 62 59 60 58 61 57 69 67 58 61 61 62 65  67
## 4 58 56 61 66 65 58 57 59 61 59 61 64 68 64 66 58 68 69 66 63 65  69
## 5 63 69 69 69 56 68 64 57 66 68 69 58 63 59 62 69 68 66 59 64 56  68
## 6 69 56 57 63 67 59 58 60 65 57 56 59 61 61 64 66 66 60 63 69 59  63
Pequeno <- datos_estratos %>% 
  filter(Estrato == "Pequeno")
set.seed(7531)
lista_Pequeno <- list()
for(l in 1:100) {
  lista_Pequeno[[l]] <- sample(Pequeno$Peso, size = No.muestras_estratos$n[3], replace = F)
}
df_Pequeno <- as.data.frame(lista_Pequeno)
names(df_Pequeno) <- 1:ncol(df_Pequeno)

head(df_Pequeno)
##    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## 1 26 51 35 55 51 53 41 29 52 44 50 52 43 52 50 48 53 43 46 49 55 48 52 42 46 44
## 2 48 46 37 51 49 46 44 44 48 42 53 51 32 38 46 48 52 51 32 39 38 41 55 55 48 31
## 3 55 55 55 51 43 51 38 42 49 45 55 54 46 53 50 55 47 54 37 47 51 55 44 51 55 45
## 4 53 51 54 50 55 45 44 36 40 52 51 47 52 46 44 49 42 42 54 50 55 51 49 51 42 43
## 5 53 54 47 51 50 51 50 39 52 46 49 49 48 54 46 45 44 53 53 48 48 48 52 55 53 42
## 6 53 48 49 55 52 37 44 46 47 55 55 48 53 54 49 51 51 52 46 47 44 52 53 43 55 53
##   27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
## 1 46 44 42 54 54 53 45 49 45 54 55 41 54 55 43 50 51 48 55 52 50 55 54 49 45 50
## 2 42 54 46 40 50 54 55 52 30 54 49 43 49 37 55 54 49 54 41 37 48 40 41 53 54 55
## 3 51 48 49 49 54 49 55 54 46 45 51 47 38 54 45 37 44 42 46 47 54 54 42 51 48 45
## 4 53 53 46 53 45 45 55 43 52 47 52 53 41 51 50 51 34 49 42 48 52 54 31 49 54 48
## 5 53 41 55 44 46 40 49 49 42 47 48 50 48 40 28 54 47 54 45 53 49 54 47 44 49 31
## 6 49 48 50 53 46 48 41 55 54 51 55 45 41 33 55 54 54 55 52 52 49 37 54 47 42 54
##   53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
## 1 50 32 45 55 54 46 42 43 43 53 52 36 53 54 49 49 47 48 40 48 54 44 54 52 55 40
## 2 54 41 44 39 47 40 45 50 47 55 51 44 53 55 40 52 55 50 46 42 52 52 39 55 53 51
## 3 53 46 46 44 54 51 53 47 46 50 55 55 42 39 53 48 51 46 50 53 51 43 45 48 52 50
## 4 42 48 50 52 51 54 51 38 50 46 45 47 51 48 54 48 46 52 55 55 51 55 37 52 45 45
## 5 53 55 49 55 41 45 40 52 53 31 49 41 54 51 46 53 47 38 51 55 46 49 55 46 54 46
## 6 51 43 45 50 47 54 52 47 49 52 50 45 53 53 50 55 52 51 48 55 48 48 49 55 54 50
##   79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 1 32 51 45 22 49 52 53 50 50 39 49 54 54 44 51 50 47 55 46 55 46  47
## 2 54 55 38 55 48 47 51 42 54 46 50 54 43 55 53 40 45 48 41 41 45  54
## 3 51 30 44 46 48 49 41 53 53 50 45 45 47 51 45 52 55 39 36 53 55  42
## 4 48 48 54 54 41 41 42 53 44 51 50 45 53 47 52 47 48 48 52 50 46  49
## 5 52 48 54 50 37 46 42 52 51 51 54 50 50 46 49 49 47 43 54 51 51  55
## 6 51 53 54 55 52 46 53 39 55 55 43 48 54 47 46 53 52 54 45 52 48  54

Transformación de data.frame de formato “ancho” a formato “largo”

# Pivots
pivot_df_Grande <- df_Grande %>% 
  pivot_longer(cols = 1:ncol(df_Grande), names_to = "Muestra",
               values_to = "Peso")

pivot_df_Mediano <- df_Mediano %>% 
  pivot_longer(cols = 1:ncol(df_Mediano), names_to = "Muestra",
               values_to = "Peso")

pivot_df_Pequeno <- df_Pequeno %>% 
  pivot_longer(cols = 1:ncol(df_Pequeno), names_to = "Muestra",
               values_to = "Peso")

Unión de los 3 estratos

pivot_MAE <- rbind(pivot_df_Grande, pivot_df_Mediano, pivot_df_Pequeno)

head(pivot_MAE)
## # A tibble: 6 x 2
##   Muestra  Peso
##   <chr>   <dbl>
## 1 1          89
## 2 2          92
## 3 3          76
## 4 4          89
## 5 5          74
## 6 6          76

Cálculo del promedio, desviación estandar, mínimos y máximos

Promedios_MAE <- pivot_MAE %>% 
  group_by(Muestra = as.numeric(Muestra)) %>% 
  summarise(Promedio = mean(Peso), Ds = sd(Peso),
              Minimo = min(Peso), Maximo = max(Peso))

head(Promedios_MAE)
## # A tibble: 6 x 5
##   Muestra Promedio    Ds Minimo Maximo
##     <dbl>    <dbl> <dbl>  <dbl>  <dbl>
## 1       1     65.9  12.6     26     96
## 2       2     67.5  11.5     46     95
## 3       3     67.2  12.9     35    104
## 4       4     67.4  12.9     33     99
## 5       5     66.7  12.8     36     92
## 6       6     66.9  13.6     35     94

Se realiza el cálculo de los intervalos de confianza

MAE_bind <- rbind(df_Pequeno, df_Mediano, df_Grande)

IC_MAE <- MAE_bind %>% 
  map_df(.f = ~c(t.test(.)$conf.int[1],
              t.test(.)$conf.int[2]))
MAE_completo <- data.frame(t(IC_MAE))
names(MAE_completo) <- c("Li", "Ls")

head(MAE_completo)
##         Li       Ls
## 1 62.95505 68.93228
## 2 64.78147 70.23261
## 3 64.16364 70.28707
## 4 64.30918 70.42322
## 5 63.70930 69.78366
## 6 63.65285 70.09363

Se evalúa si los intervalos de confianza abarcan al promedio poblacional:

Para ellos se crea una columna llamada “Dentro” y si los intervalos de confianza de cada muestreo abarcan el promedio poblacional se asigna el valor “1”, de lo contrario se asigna el valor “2”

MAE_completo <- MAE_completo %>% 
  mutate(Dentro = ifelse(promedio_real >= Li & promedio_real <= Ls,
                            1, 2))

head(MAE_completo)
##         Li       Ls Dentro
## 1 62.95505 68.93228      1
## 2 64.78147 70.23261      1
## 3 64.16364 70.28707      1
## 4 64.30918 70.42322      1
## 5 63.70930 69.78366      1
## 6 63.65285 70.09363      1

Se unifican los datos de interés en una sola tabla

MAE_completo <- data.frame(MAE_completo, Promedios_MAE)

MAE_completo <- MAE_completo %>%
  select(Muestra, Li, Ls, Promedio, Ds, Minimo, Maximo, Dentro)

head(MAE_completo)
##   Muestra       Li       Ls Promedio       Ds Minimo Maximo Dentro
## 1       1 62.95505 68.93228 65.94366 12.62638     26     96      1
## 2       2 64.78147 70.23261 67.50704 11.51505     46     95      1
## 3       3 64.16364 70.28707 67.22535 12.93522     35    104      1
## 4       4 64.30918 70.42322 67.36620 12.91537     33     99      1
## 5       5 63.70930 69.78366 66.74648 12.83157     36     92      1
## 6       6 63.65285 70.09363 66.87324 13.60560     35     94      1

Creación de gráfica de dispersión del M.A.E

grafica_MAE <- ggplot(MAE_completo, aes(Muestra,Promedio)) + 
  geom_point() +
  geom_hline(yintercept = promedio_real) +
  scale_y_continuous(breaks = seq(1, 71, 1)) +
  ggtitle("M.A.E") +
  theme_classic()

grafica_MAE

Comparativa entre M.A.S y M.A.E

comparativa <- data.frame(
  Estadístico = c("Promedio",
                  "Mínimo",
                  "Máximo",
                  "Desviación estandar",
                  "Fuera de intervalo"),
      M.A.S = c(round(mean(MAS_completo$Promedio), 2),# Promedio
                 round(min(min_max_MAS$Minimo), 2), # Mínimo 
                 round(max(min_max_MAS$Maximo), 2), # Máximo
                 round(mean(MAS_completo$Ds), 2), # SD DENTRO
                 sum(MAS_completo$Dentro)-100),
          M.A.E = c(round(mean(MAE_completo$Promedio), 2),
                     round(min(MAE_completo$Minimo), 2),
                     round(max(MAE_completo$Maximo), 2),
                     round(mean(MAE_completo$Ds), 2),
                     sum(MAE_completo$Dentro)-100))

comparativa <- comparativa %>%  
  mutate(Real = c(round(mean(datos$Peso), 2),
                  round(min(datos$Peso), 2),
                  round(max(datos$Peso), 2),
                  round(sd(datos$Peso), 2),
                  ""))

comparativa_gt <- comparativa %>%
  gt(rowname_col = "Estadístico") %>%
  tab_stubhead("Estadístico") %>% 
  tab_spanner(label = "Técnica", columns = c("M.A.S", "M.A.E")) %>%
  fmt_number(columns = c("M.A.S", "M.A.E"), rows = c("Mínimo", "Máximo"), decimals = 0) %>%
  fmt_number(columns = c("M.A.S", "M.A.E"), rows = "Fuera de intervalo", decimals = 0) %>% 
  cols_move_to_start("Real") %>% 
  cols_align(align = "right")

comparativa_gt
Estadístico Real Técnica
M.A.S M.A.E
Promedio 66.81 67.03 66.78
Mínimo 19 21 22
Máximo 122 112 113
Desviación estandar 12.83 12.75 12.69
Fuera de intervalo 9 0