Cargamos la base de datos

library(readxl)
library(dplyr)
library(flextable)

base <- read_excel("bases/BD_Clase12.xlsx")

head(base) %>% flextable() %>% set_caption("Base BD_Clase12") %>%
  bg(bg="#0E6655", part = "header") %>% bold(part = "header") %>%
  color(color = "white", part = "header") %>% autofit()

Instalamos las librerías que necesitamos

#install.packages("sampling")     #Paquete usado para extraer muestras especificando el diseño
library(sampling)

EXTRAER UNA MUESTRA ALEATORIA SIMPLE

Usaremos la función sample() que genera números que no contienen decimales. Por ejemplo:

set.seed(5)  #Fijamos una semilla o iniciador para obtener el mismo resultado
sample(10,5, replace = FALSE)  #Esto genera 5 números aleatorios entre un rango de 1 a 10. El argumento replace = FALSE es para evitar que se repitan números
[1] 2 9 7 3 1

Conociendo como trabaja la función, vamos a aplicarla a nuestros datos. Supongamos que queremos obtener una muestra de 60 observaciones de nuestra base que vamos a considerar como la población.

Sabemos que el total de observaciones del fichero de Excel es de 138. Pero para asegurarnos usaremos la función nrow() que va a contar la cantidad de filas de nuestra base

N <- nrow(base)                     #Tamaño de la población
n <- 60                             #Tamaño de la muestra

set.seed(6)                         #Solo para efecto de repetir el mismo resultado
a <- sample(N,n,replace = F)
a                                   #Aquí vemos el listado de los 60 números aleatorios, pero desordenados
 [1]  53  10  78 100  60  67 121 130 122  98  30  27   3  21   8  49  86  63  33
[20] 137   7  66  89  50  20  64 112  19  77  71  16  12 136  93  42   2  85  51
[39]  45 106  97  35  13 129  84  62  29  32  18 111  34 113 107 102  40 110  22
[58] 119  31  52
m <- sort(a)                        #Aquí los ordenamos
m                                   #Listado ordenado
 [1]   2   3   7   8  10  12  13  16  18  19  20  21  22  27  29  30  31  32  33
[20]  34  35  40  42  45  49  50  51  52  53  60  62  63  64  66  67  71  77  78
[39]  84  85  86  89  93  97  98 100 102 106 107 110 111 112 113 119 121 122 129
[58] 130 136 137
muestra <- base[m,]                 #Aquí generamos la muestra en función del listado ordenado

head(muestra, 10) %>% flextable() %>% set_caption("Muestra Aleatoria") %>%
  bg(bg="#0E6655", part = "header") %>% bold(part = "header") %>%
  color(color = "white", part = "header") %>% autofit()

MUESTREO SISTEMÁTICO

Usaremos los mismos datos del apartado anterior N y n.

r <- round(N/n, 0)   #Genera el intervalo que vamos a usar para construir la secuencia sistemática
r
[1] 2
m <- seq(r,N,r)       #Genera la secuencia sistemática, desde, hasta, por.  
m
 [1]   2   4   6   8  10  12  14  16  18  20  22  24  26  28  30  32  34  36  38
[20]  40  42  44  46  48  50  52  54  56  58  60  62  64  66  68  70  72  74  76
[39]  78  80  82  84  86  88  90  92  94  96  98 100 102 104 106 108 110 112 114
[58] 116 118 120 122 124 126 128 130 132 134 136 138

Aquí generamos la muestra en función de la secuencia sistemática

muestra2 <- base[m,]

head(muestra2, 10) %>% flextable() %>% set_caption("Muestra sistemática") %>%
  bg(bg="#0E6655", part = "header") %>% bold(part = "header") %>%
  color(color = "white", part = "header") %>% autofit()

MUESTREO ESTRATIFICADO NO-PROPORCIONAL O ASIGNACIÓN IGUAL

Usaremos la variable MP como variable clave por la que queremos estratificar nuestros datos

Revisamos los tamaños o frecuencias de la variable MP

data.frame(table(base$MP)) %>% flextable()

Usaremos la función strata() del paquete sampling que permite generar un muestreo estratificado. En data se agrega la base, en stratanames se agrega la variable categórica para estratificar, en size se agrega los tamaños muestrales deseados para cada estrato (en nuestro caso, queremos que los tres estratos tengan un tamaño de 20 c/u), y en method se coloca srswor para que haga un muestreo aleatorio simple sin reemplazo (simple random sampling without replacement)

set.seed(6)           #Solo para efecto de repetir el mismo resultado

est <- strata(data= base, stratanames = "MP", size = c(20,20,20), method = "srswor") 

data.frame(table(est$MP))  %>% flextable()   #Verificamos el nuevo tamaño de los estratos
muestra3 <- getdata(base, est)  #Generamos la muestra en la base original con el objeto que creamos con strata.

data.frame(table(muestra3$MP)) %>% flextable()  #Verificamos el tamaño de los nuevos estratos en la muestra

MUESTREO ESTRATIFICADO PROPORCIONAL

Volvemos a revisar los tamaños o frecuencias de la variable MP en la base original

data.frame(table(base$MP)) %>% flextable()

Calculamos las proporciones de cada categoría de MP. Por ejemplo Basalto = 57/138 = 0.4130435, Calcedonia = 59/138 = 0.4275362 y Obsidiana = 22/138 = 0.1594203.

bas <- sum(with(base, MP == "Basalto"))/N
cal <- sum(with(base, MP == "Calcedonia"))/N
obs <- sum(with(base, MP == "Obsidiana"))/N
set.seed(6)   #Solo para efecto de repetir el mismo resultado

est2 <- strata(data= base, stratanames = "MP", size = c(round(n*bas), round(n*cal), round(n*obs)), method = "srswor")      #En size se produce el tamaño muestral de cada estrato ajustado a la proporción de los tamaños originales. La fórmula usada es esta:

\[ \Large n_h=(\frac{n}{N})*N_L\]

Donde:

  • nh = Sub-muestra estrato
  • n = Frecuencia del Estrato
  • N = Total Poblacional
  • NL= Tamaño Muestral

Por ejemplo en el caso de Basalto, la muestra ajustada proporcionalmente es: (57/138)*60 = 24.78 usando el redondeo es 25. Y así para el resto de los estratos.

Verificamos el nuevo tamaño de los estratos

data.frame(table(est2$MP))%>% flextable() 

Generamos la muestra en la base original con el objeto que creamos con strata.

muestra4 <- getdata(base, est2)  

MUESTREO POR CONGLOMERADOS

Revisamos la variable de conglomerado Reciento

data.frame(table(base$Recinto))%>% flextable() 

Usaremos la función cluster() del paquete sampling que permite seleccionar de forma aleatoria la cantidad de conglomerados que señalemos en el argumento size. Para este ejemplo seleccionaremos de forma aleatoria 4 recintos de 8 que posee la base BD_Clase12.

Al igual que con strata, en clustername señalamos el nombre de la variable objeto del conglomerado, en este caso Recinto. Mantenemos el método de muestreo aleatorio simple sin reemplazo srswor y en description usamos el TRUE para que nos imprima por consola la salida.

set.seed(6)  #Solo para efecto de repetir el mismo resultado

clus <- cluster(base,  clustername = c("Recinto"), size = 4, method = "srswor", description = TRUE)
Number of selected clusters: 4 
Number of units in the population and number of selected units: 138 67 
data.frame(table(clus$Recinto)) %>% flextable()   #Verificamos los nuevos tamaños de los recintos seleccionados

Generamos la muestra por conglomerados en la base original con el objeto que creamos con cluster.

conglo <- getdata(base, clus)

Si así lo necesitamos, podemos hacer un muestreo estratificado a partir de la muestra por conglomerados que realizamos previamente.

Para este ejemplo, suponemos que queremos seleccionar de forma no-proporcional o igual de 5 observaciones para cada uno de los 4 Recintos. En data seleccionamos la muestra conglo que contiene la muestra por conglomerados.

estra <- strata(data=conglo, stratanames = "Recinto", size = c(5,5,5,5), method = "srswor")

data.frame(table(estra$Recinto)) %>% flextable()  #Aqui generamos el muestreo estratificado

Aquí generamos la muestra final por conglomerados, estratificado y aleatorios

muestra_final <- getdata(conglo, estra) 

head(muestra_final, 20)%>% flextable() %>% 
  set_caption("Muestra por conglomerados, estratificado y aleatorio") %>%
  bg(bg="#0E6655", part = "header") %>% bold(part = "header") %>%
  color(color = "white", part = "header") %>% autofit()

FIN