MUESTREO ALEATORIO

# MUESTREO ALEATORIO

LIBRERIAS

Se cargan las siguientes librerías:

  • tidyverse (Manipulación y grafico de datos)
  • TeachingSampling (conjunto de datos)
  • SamplingBook (calculo de tamaños de muestras y muestreo)
  • samplingUtil (calculo de tamaños de muestras)
  • suervey (Inferencias para muestras complejas) Todas las librerías se encuentran en el repositoria oficial de R excepto la librería SamplingUtil, necesitará installar la librería devTools para posteriormente utilizar el comando install_github() para poder obtenerla.

LOS DATOS

Utilizaremos como población el conjunto de datos Lucy y BigLucy que se encuentran en la librería TeachingSampling
library(TeachingSampling)
library(tidyverse)
data(Lucy)      # Carga de datos Lucy  
data(BigLucy)   # carga de datos BigLucy
head(Lucy)      # observamos primeras 5 filas
##      ID Ubication Level Zone Income Employees Taxes SPAM
## 1 AB001      c1k1 Small    A    281        41     3   no
## 2 AB002      c1k2 Small    A    329        19     4  yes
## 3 AB003      c1k3 Small    A    405        68     7   no
## 4 AB004      c1k4 Small    A    360        89     5   no
## 5 AB005      c1k5 Small    A    391        91     7  yes
## 6 AB006      c1k6 Small    A    296        89     3   no
glimpse(Lucy)   # un vistazo de las estructuras de cada variable
## Rows: 2,396
## Columns: 8
## $ ID         AB001, AB002, AB003, AB004, AB005, AB006, AB007, AB008, AB0…
## $ Ubication  c1k1, c1k2, c1k3, c1k4, c1k5, c1k6, c1k7, c1k8, c1k9, c1k10…
## $ Level      Small, Small, Small, Small, Small, Small, Small, Small, Sma…
## $ Zone       A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,…
## $ Income     281, 329, 405, 360, 391, 296, 490, 473, 350, 361, 374, 419,…
## $ Employees  41, 19, 68, 89, 91, 89, 22, 57, 84, 25, 34, 20, 19, 23, 36,…
## $ Taxes      3.0, 4.0, 7.0, 5.0, 7.0, 3.0, 10.5, 10.0, 5.0, 5.0, 6.0, 7.…
## $ SPAM       no, yes, no, no, yes, no, yes, yes, yes, no, yes, no, yes, …

Observamos un conjunto de datos con 2396 filas de compañías industriales con diferentes variables financieras de una ciudad en una año fiscal. (note que Lucy es una muestra aleatoria simple del conjunto datos BigLucy)

MUESTREO ALEATORIO SIMPLE

Muestra aleatoria simple

El muestreo aleatorio simple es una técnica de muestreo en la que todos los elementos que forman la población - y que por lo tanto están incluidos en el marco muestral tienen idéntica probabilidad de ser seleccionados para la muestra. El proceso de muestreo que emplea esta técnica es equivalente a hacer un sorteo entre los individuos de la población.

Para realizar un muestreo en R primero debemos definir el valor de la semilla del algoritmo pseudo aleatorio, esto lo efectuamos con el comando set.seed() en este comando utilizamos un valor numérico para inicializar los números aleatorios.

Ejemplo:

Seleccione una muestra aleatoria simple de tamaño 3 del conjunto de datos Lucy de la librería TeachingSampling

  • con slice_sample() de dplyr
  • con sample()
library(TeachingSampling)
data(Lucy)    # Cargamos el conjunto de datos
set.seed(123) # Definimos el valor de la semilla para obterner resultos reproducibles.

Lucy  %>% 
  slice_sample(n=3)-> muestra
muestra
##       ID Ubication  Level Zone Income Employees Taxes SPAM
## 1 AB1849     c7k96  Small    B    178        36     1  yes
## 2 AB2013     c20k7 Medium    C    570        85    15   no
## 3 AB2148    c10k89  Small    C    475        65    10   no
set.seed(123)
sample(Lucy$Income,size=3)  
## [1] 178 570 475

Como puede observar si utilizamos el comando slice_sample() de la librería dplyr podemos hacer seleccionar una muestra de todas las variables del data frame, sample() solo hacemos el muestreo de la variable que nos interesa. Es importante notar que los resultados son los mismo si definimos la semilla.

Estimaciones con una muestra aleatoria simple

Calcule un intervalo de confianza del 95% para la variable Income utilizando la muestra anterior
parea ello podemos utilizar el comando MeanCI de la librerya DescTools o el t.test que ya viene en R.

library(DescTools)                        #librería para calculo de intervalos de confianza

MeanCI(muestra$Income,conf.level = 0.95)  #  Vector y nivel de confianza
##      mean    lwr.ci    upr.ci 
##  407.6667 -100.3157  915.6490
t.test(muestra$Income,conf.level = 0.95)  #  Vector y nivel de confianza
## 
##  One Sample t-test
## 
## data:  muestra$Income
## t = 3.453, df = 2, p-value = 0.07461
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -100.3157  915.6490
## sample estimates:
## mean of x 
##  407.6667

Cálculo del tamaño de la muestra para estimacion de la media.

Para calcular el tamaño de la muestra necesitamos definir el error absoluto o relativo que nos podemos permitir.

Calcularemos el tamaño de la muestra para la estimación de la media para el ingreso(Income). para ello utilizamos el comando sample.size.mean() del paquete samplingbook, este requiere indicar el error, el valor de σ de la población, el tamaño de la población y el nivel de confianza. Recordemos la fórmula.

  $$n=\frac{N \sigma^2}{(N-1)*\frac{B^2}{4}+\sigma^2}$$
    
    
library(samplingbook)
N=nrow(Lucy)                          # tamaño de la población
s=sd(Lucy$Income)*sqrt(N-1)/sqrt(N)   # sigma de la población
e=20                                  # error absoluto
sample.size.mean(e=e, S=s, N = N, level = 0.95)
## 
## sample.size.mean object: Sample size for mean estimate
## With finite population correction: N=2396, precision e=20 and standard deviation S=266.9235
## 
## Sample size needed: 533

Repetimos el cálculo con el comando nsize de la librería SamplingUtil, utilizamos el comando nsize el cual requiere que ingresemos el vector de datos, luego el error absoluto o el relativo y el nivel de confianza.

library(SamplingUtil)
nsize(Lucy$Income, abs=20, alpha = 0.05)
## $n0
## [1] 685
## 
## $n_adjust
## [1] 533

Ya que sabemos cual debe ser el tamaño de la muestra podemos repetir la estimación de de la media con una muestra de este tamaño.

set.seed(123)
muestra<-sample(Lucy$Income, size = 533)  #muestreo  con comando Sample
MeanCI(muestra,       conf.level = 0.95)  #Intervalo de confianza
##     mean   lwr.ci   upr.ci 
## 426.4390 402.2101 450.6679
error_e= (450.6679-402.2101)/2  #error Estándar
error_e
## [1] 24.2289

Se puede observar que el valor del error estándar(24.2289) que se utilizó para hallar el tamaño de la muestra coincide con el calculado en el intervalo de confianza.

Ejemplo de Cálculo de muestra y estimación para una proporción.

En el conjunto de datos Lucy tenemos la variable SPAM(propaganda con internet) que es del tipo factor con dos categorías. Supongamos que se desea estimar la proporción de la población de empresas que utilizan el Internet para hacer propaganda.

  • Primero calculamos el tamaño de la muestra(debemos definir un valor del error relativo) utilizaremos error del 2%.
  • Posteriormente realizamos el muestreo.
  • Calculamos el intervalo de confianza.
n<-sample.size.prop(e=.02,P = 0.5,N = N,level = 0.95)$n  #tamaño de la muestra
n
## [1] 1200
set.seed(1234)
muestra<-sample(Lucy$SPAM,size =n)
prop.test(table(muestra),conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  table(muestra), null probability 0.5
## X-squared = 56.768, df = 1, p-value = 4.905e-14
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3632064 0.4191675
## sample estimates:
##         p 
## 0.3908333

MUESTREO ESTRATIFICADO.

El muestreo estratificado es un método estadístico que sirve para seleccionar los elementos de una muestra dividiendo la población en grupos (llamados estratos). Es decir, en un muestreo estratificado se divide la población en estratos y se selecciona aleatoriamente unos individuos de cada estrato para formar toda la muestra del estudio.

Los estratos son grupos homogéneos, o dicho de otra forma, los individuos de un estrato tienen unas características propias que los diferencian de los otros estratos. Por lo tanto, un individuo solo puede estar en un único estrato.

Ejemplo de cálculo de tamaño de muestra para estimación de media

Realice un muestreo estratificado para estimar el valor promedio de la variable Income de la población dada por el conjunto de datos de Lucy, Tome como variable de estratificación el Tamaño (Level) de la empresa

Lucy %>% 
  select(Level,Income) ->Lucy_f 

Lucy_f %>% 
  group_by(Level) %>% 
  summarize(Nh=n(),sh=sd(Income)) %>% 
  mutate(wh=Nh/sum(Nh))->Estratos
attach(Estratos)
knitr::kable(Estratos,title="Informacion de los estratos")
Level Nh sh wh
Big 83 253.7679 0.0346411
Medium 737 126.8144 0.3075960
Small 1576 123.0530 0.6577629
# Afijación propocional
n_p <- stratasize(e=20,Nh=Nh,Sh =sh,type = "prop",level = 0.95)$n
ni_p <- nstrata(n=n_p,wh=wh,method = "proportional")
c(n_p, ni_p)
## [1] 155   6  48 102
#Afijación optima
n_o <- stratasize(e=20,Nh,sh,level = 0.95,type = "opt")$n
ni_o <- nstrata(n = n_o,wh = wh,ch =c(1,2,3),sh =sh,method ="optimal")
c(n_o,ni_o)
## [1] 150  16  50  85
#Afijación Optima
n_neyman  <- stratasize(e=20,Nh,sh,level = 0.95,type = "opt")$n
ni_neyman <- nstrata(n=n_neyman,wh=wh,sh=sh,method="neyman")
c(n_neyman,ni_neyman)
## [1] 150  11  46  95
#los tres juntos
rbind(c(n_p, ni_p),c(n_o,ni_o),c(n_neyman,ni_neyman))->todos
colnames(todos)<-c("n","Big","medium","samall")
rownames(todos)<- c("proporcional","neyman","optimo")
todos
##                n Big medium samall
## proporcional 155   6     48    102
## neyman       150  16     50     85
## optimo       150  11     46     95

Muestra estratificada con paquete sampling

Ahora que ya tenemos las tres alternativas escogemos una de todas para realizar el muestreo, para realizar este paso podemos construir una función o bien utilizamos la función. strata() del paquete sampling

set.seed(1234)
strata(Lucy,stratanames = c("Level"),size = ni_neyman[c(3,2,1)])->m

getdata(Lucy,m)->muestra
head(muestra)
##       ID Ubication Zone Income Employees Taxes SPAM Level ID_unit       Prob
## 15 AB015     c1k15    A    411        36     7   no Small      15 0.06027919
## 21 AB021     c1k21    A    425        49     8  yes Small      21 0.06027919
## 22 AB022     c1k22    A    381        42     6  yes Small      22 0.06027919
## 63 AB066     c1k63    A    340        28     5  yes Small      63 0.06027919
## 64 AB067     c1k64    A    475        57    10   no Small      64 0.06027919
## 71 AB075     c1k71    A    360        57     5  yes Small      71 0.06027919
##    Stratum
## 15       1
## 21       1
## 22       1
## 63       1
## 64       1
## 71       1
nrow(muestra)
## [1] 152

Ejemplo de la estimación de la media

para realizar estimación de la media y totales utilizamos las funciónes del paquete survey

  • svymean devuelve la estimación de la media.
  • svytotal se utilza para estimación de totales.
  • svyby se utilza para aplicar cualquiera de las funciones anteriores para los diferentes estratos.
muestra %>% 
  mutate(Peso=1/Prob)->muestra

library(survey)
#indicar a R el diseño de muestreo 
svydesign(ids = ~1,        # se idican los cluster
          data = muestra,  # muestra.
          weights = ~Peso, # peso o inverso de probabilidad
          strata = ~Level  # Estratos.
          )->d  

summary(d)
## Stratified Independent Sampling design (with replacement)
## svydesign(ids = ~1, data = muestra, weights = ~Peso, strata = ~Level)
## Probabilities:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.06028 0.06028 0.06028 0.06615 0.06242 0.13253 
## Stratum Sizes: 
##            Big Medium Small
## obs         11     46    95
## design.PSU  11     46    95
## actual.PSU  11     46    95
## Data variables:
##  [1] "ID"        "Ubication" "Zone"      "Income"    "Employees" "Taxes"    
##  [7] "SPAM"      "Level"     "ID_unit"   "Prob"      "Stratum"   "Peso"
# Estimación de la media para el ingreso
svymean(~Income,design=d)
##          mean    SE
## Income 437.25 10.24
# Estimación de la media dentro de cada grupo
svyby(~Income,            # formula
      by=Level,           # Estratos 
      design=d,           # Diseño
      FUN =svymean,       # Media
      keep.names = F) ->Ingreso
Ingreso
##       by   Income       se
## 1    Big 429.4419 26.85466
## 2 Medium 447.8687 33.48123
## 3  Small 434.4197 28.47694
#Gráfico  comparativo del ingreso
Ingreso %>% 
  ggplot(aes(x=by,y=Income,
             fill=by,
             ymin=Income-se,
             ymax=Income+se))+
  geom_col()+
  geom_errorbar()

Inferencia para proporciones

Para realizar la inferencia sobre una proporción utilizamos las funciónes del paquete survey svmean y svtable

  • Svytable se utilza para aplicar la estimación de la proporción a la población.
# estimación De una proporción
svymean(~SPAM,
        d)  
##            mean   SE
## SPAMno  0.37821 0.04
## SPAMyes 0.62179 0.04
# Tabla   de empresas que utilizan internet
svytable(~SPAM,
         d)  
## SPAM
##        no       yes 
##  906.1824 1489.8176
# tabla de contingencia Spam y tamaño de la empresa
svytable(~SPAM+Level,
         d) 
##      Level
## SPAM         Big     Medium      Small
##   no    37.72727  304.41304  564.04211
##   yes   45.27273  432.58696 1011.95789
# Estimacion de proporciones en los estratos.
svyby(~SPAM,
        design=d
        ,by=Level,
        FUN=svymean,
      keep.names = T) 
##            by    SPAMno   SPAMyes  se.SPAMno se.SPAMyes
## Big       Big 0.3959124 0.6040876 0.06929549 0.06929549
## Medium Medium 0.3683738 0.6316262 0.06897440 0.06897440
## Small   Small 0.3702523 0.6297477 0.06919765 0.06919765