# MUESTREO ALEATORIO
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.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)
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
slice_sample()
de dplyr
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.
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
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.
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.
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
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.
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
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
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()
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