En esta parte del curso examinaremos las siguientes herramientas de inferencia estadística
Base de datos para estos ejercicios: Familia y roles de género 2012, a descargar de:
http://iop-data.pucp.edu.pe/busqueda/encuesta/71?
Se sugiere descargar también el cuestionario para utilizarlo como referencia de libro de códigos. Descomprimir y grabar el archivo SPSS en el directorio de trabajo de R
# Importar la base de datos del SPSS a un data frame de R
library(foreign)
genero <- as.data.frame(read.spss("IOP_1212_01_B.sav"))
En estos ejemplos trabajaremos con las siguientes variables:
Antes de utilizar estas variables es necesario evaluar si necesitan algún tipo de acondicionamiento (identificar valores perdidos o “raros”, recodificar, etc)
Las siguientes transformaciones nos permitirán acondicionar las variables para utilizarlas en el análisis:
genero$p1r <- genero$P1
genero$p2r <- genero$P2
genero$p1r[genero$P1 > 40] <- NA
genero$p2r[genero$P2 == 99] <- NA
genero$p19ar <- genero$P19A
genero$p19ar[genero$P19A >= 140] <- NA
genero$p28ar <- genero$P28A
genero$p28ar[genero$P28A > 120] <- NA
Para calcular el intervalo de confianza de la media de una variable que proviene de una muestra simple al azar usamos la siguiente fórmula: \[ \begin{aligned} IC_{1-\alpha}=\bar{x} \pm Z\sigma_{\bar{x}} \end{aligned} \]
Donde:
\[ \begin{aligned} \sigma_{\bar{x}} = \frac{S_{x}}{\sqrt{n}} \end{aligned} \]
Entonces para calcular el intervalo de confianza para una media podemos proceder de la siguiente manera:
media <- mean(na.omit(genero$p19ar)) # Pedimos la media
desv <- sd(na.omit(genero$p19ar)) # La desviación estándar
N <- length(na.omit(genero$p19ar)) # El tamaño válido de la muestra
error.est <- desv/sqrt(N) # Calculamos el error estándar
error <- 2*error.est # Fijamos Z=2 para indicar un nivel de confianza de 95%
lim.inf <- media-error # Límite inferior del intervalo
lim.sup <- media+error # Límite superior del intervalo
# Guardamos todos los datos generados en un objeto data frame
resultado1 <- data.frame(media, desv, N, error.est, error, lim.inf, lim.sup)
resultado1
## media desv N error.est error lim.inf lim.sup
## 1 22.61037 19.94936 1196 0.5768506 1.153701 21.45667 23.76407
media <- mean(na.omit(genero$p19ar))
desv <- sd(na.omit(genero$p19ar))
N <- length(na.omit(genero$p19ar))
error.est <- desv/sqrt(N)
error <- qt(0.975, df= N-1) * error.est # Usar el cuantil 0.975 de t
lim.inf <- media-error
lim.sup <- media+error
resultado2 <- data.frame(media, desv, N, error.est, error, lim.inf, lim.sup)
resultado2
## media desv N error.est error lim.inf lim.sup
## 1 22.61037 19.94936 1196 0.5768506 1.131753 21.47862 23.74212
resultado1
## media desv N error.est error lim.inf lim.sup
## 1 22.61037 19.94936 1196 0.5768506 1.153701 21.45667 23.76407
Una función es un pequeño programa en R que sirve para automatizar algunos procedimientos. En este caso la función calcula los estadísticos necesarios para generar el intervalo de confianza de una media.
Generamos la función:
int.conf <- function(x, ic = 95) {
y <- na.omit(x)
Media <- mean(y)
Desv.Est <- sd(y)
N <- length(y)
Error.Est <- Desv.Est/sqrt(N)
ci.y <- 1-(((100-ic)/100)/2)
Error <- Error.Est * qt(ci.y, df = N-1)
Lim.Inf <- Media - Error
Lim.Sup <- Media + Error
result <- data.frame(Media, Desv.Est, N, Error.Est, Error, Lim.Inf, Lim.Sup)
return(result)
}
Usamos la función para calcular un intervalo de confianza al 95% (ic por defecto de la función)
int.conf(genero$p19ar)
## Media Desv.Est N Error.Est Error Lim.Inf Lim.Sup
## 1 22.61037 19.94936 1196 0.5768506 1.131753 21.47862 23.74212
En vez de un intervalo de 95% podemos usar otros niveles de confianza:
int.conf(genero$p19ar, ic=99) # Intervalo de 99% de confianza
## Media Desv.Est N Error.Est Error Lim.Inf Lim.Sup
## 1 22.61037 19.94936 1196 0.5768506 1.488246 21.12212 24.09861
int.conf(genero$p19ar, ic=90) # Intervalo de 90% de confianza
## Media Desv.Est N Error.Est Error Lim.Inf Lim.Sup
## 1 22.61037 19.94936 1196 0.5768506 0.949571 21.6608 23.55994
También podemos calcular un intervalo de confianza para una proporción a partir de una muestra grande.
\[ \begin{aligned} IC_{1-\alpha}= p \pm Z\sigma_{p} \end{aligned} \]
Donde:
\[ \begin{aligned} \sigma_{p} = \sqrt{\frac{pq}{n}} \end{aligned} \]
Donde:
Vamos a usar la variable P32
library(descr)
freq(genero$P32, plot = FALSE)
## genero$P32
## Frequency Percent Valid Percent
## Hago mucho más de lo que me corresponde 147 12.219 21.304
## Hago algo más de lo que me corresponde 141 11.721 20.435
## Hago más o menos lo que me corresponde 256 21.280 37.101
## Hago algo menos de lo que me corresponde 65 5.403 9.420
## Hago mucho menos de lo que me corresponde 53 4.406 7.681
## No contesta 28 2.328 4.058
## NA's 513 42.643
## Total 1203 100.000 100.000
Preparamos los datos para el cálculo del intervalo de confianza, en este caso vamos a seleccionar una categoría: las personas que a la pregunta P32 responden “Hago más o menos lo que me corresponde” en la distribución de las tareas domésticas en su hogar.
p32r <- na.omit(genero$P32)
cat <- ifelse(p32r=="Hago más o menos lo que me corresponde", 1, 0)
prop.table(table(cat))
## cat
## 0 1
## 0.6289855 0.3710145
p <- mean(cat)
p # Esta es la proporción de personas que respondieton esta opción
## [1] 0.3710145
Preparamos el resto de la información
n <- length(cat) # Tamaño de la muestra
error.est.p <- sqrt((p*(1-p))/n) # Error estándar de la propoción
error.p <- 2 * error.est.p # Usamos Z = 2 para indicar un nivel de confianza del 95%
lim.inf.p <- p - error.p
lim.sup.p <- p + error.p
result.p <- data.frame(p, n, error.est.p, error.p, lim.inf.p, lim.sup.p)
result.p
## p n error.est.p error.p lim.inf.p lim.sup.p
## 1 0.3710145 690 0.0183904 0.0367808 0.3342337 0.4077953
Generamos la función
int.conf.p <- function(x, cat, ic = 95){
vcat <- na.omit(x)
p <- mean(ifelse(vcat==cat, 1, 0))
n <- length(vcat)
error.est.p <- sqrt((p*(1-p))/n)
beta <- 1-(((100-ic)/100)/2)
error <- error.est.p * qt(beta, df = n-1)
lim.inf.p <- p - error
lim.sup.p <- p + error
result.p <- data.frame(p, n, error.est.p, error, lim.inf.p, lim.sup.p)
return(result.p)
}
Usamos la función
int.conf.p(genero$P32, "Hago más o menos lo que me corresponde")# IC95%
## p n error.est.p error lim.inf.p lim.sup.p
## 1 0.3710145 690 0.0183904 0.03610795 0.3349065 0.4071224
int.conf.p(genero$P32, "Hago más o menos lo que me corresponde", ic=99)# IC99%
## p n error.est.p error lim.inf.p lim.sup.p
## 1 0.3710145 690 0.0183904 0.04750211 0.3235124 0.4185166
int.conf.p(genero$P32, "Hago más o menos lo que me corresponde", ic=90)# IC90%
## p n error.est.p error lim.inf.p lim.sup.p
## 1 0.3710145 690 0.0183904 0.03029025 0.3407242 0.4013047
freq(genero$P10, plot=FALSE)
## genero$P10
## Frequency Percent
## Si 1070 88.94431
## No 132 10.97257
## No contesta 1 0.08313
## Total 1203 100.00000
int.conf.p(genero$P10, "Si")
## p n error.est.p error lim.inf.p lim.sup.p
## 1 0.8894431 1203 0.009041058 0.01773801 0.871705 0.9071811
Podemos crear un gráfico del intervalo de confianza de la media de una variable. En este ejemplo usaremos el gráfico de puntos del paquete ggplot2. Vamos a representar gráficamente el promedio de horas semanales dedicadas a labores domésticas que le dedican los hombres y las mujeres.
Primero vamos a generar un data frame que contenga los estadísticos que necesitamos graficar (la media, los límites inferior y superior del intervalo de confianza). Para ello usaremos la función “summarySE” del paquete “Rmisc” (que debe instalarse en su sistema). Esta función summaySE hace algo parecido a la función que hemos creado en una de las diapositivas anteriores.
library(Rmisc)
## Loading required package: lattice
## Loading required package: plyr
df <- summarySE(genero, measurevar="p19ar", groupvars="SEXO", na.rm=T)
df
## SEXO N p19ar sd se ci
## 1 Masculino 587 13.70187 13.50444 0.5573881 1.094722
## 2 Femenino 609 31.19704 21.35332 0.8652803 1.699301
Un gráfico de puntos que muestra las medias de p19ar según sexo
library(ggplot2)
graf.punto1 <- ggplot(df, aes(x=SEXO, y=p19ar)) +
geom_point(size = 3) + ylim(0, 40)
graf.punto1
Ahora añadimos las barras que indican el intervalo de confianza, con títulos
graf.punto <- graf.punto1 + geom_errorbar(aes(ymin=p19ar-ci, ymax=p19ar+ci), width = 0.2) + ylab("Horas semanales") +
ggtitle("Intervalo de confianza al 95% para la media de las horas semanales\n dedicadas al trabajo doméstico, según sexo")
graf.punto
Podemos graficar el mismo concepto con barras:
graf.barra1 <- ggplot(df, aes(x=SEXO, y=p19ar)) +
geom_bar(width=0.5, fill="white", colour="black", stat="identity") +
geom_errorbar(aes(ymin=p19ar-ci, ymax=p19ar+ci), width = 0.2) +
ylab("Horas semanales") + ggtitle("Intervalo de confianza al 95% para la media de las horas semanales\n dedicadas al trabajo doméstico, según sexo")
graf.barra1
Según ámbito y sexo del entrevistado
df2 <- summarySE(genero, measurevar="p19ar", groupvars=c("SEXO", "Ambito"),
na.rm=T)
df2
## SEXO Ambito N p19ar sd se ci
## 1 Masculino Lima-Callao 218 14.49083 14.27131 0.9665754 1.905078
## 2 Masculino Interior Urbano 246 12.68293 12.26298 0.7818591 1.540023
## 3 Masculino Interior Rural 123 14.34146 14.42552 1.3007051 2.574876
## 4 Femenino Lima-Callao 229 30.15721 19.83378 1.3106528 2.582541
## 5 Femenino Interior Urbano 264 29.62500 19.59105 1.2057460 2.374144
## 6 Femenino Interior Rural 116 36.82759 26.70557 2.4795498 4.911511
graf.punto2 <- ggplot(df2, aes(x=Ambito, y=p19ar, colour=SEXO)) +
geom_point(size = 3) + ylim(0, 50) +
geom_errorbar(aes(ymin=p19ar-ci, ymax=p19ar+ci), width = 0.2) +
ylab("Horas semanales") +
ggtitle("Intervalo de confianza al 95% para la media\n de las horas semanales dedicadas al trabajo\n doméstico, según ámbito, por sexo")
graf.punto2
graf.bar2 <- ggplot(df2, aes(x=Ambito, y=p19ar, fill=SEXO)) +
geom_bar(position="dodge", stat = "identity") +
geom_errorbar(aes(ymin=p19ar-ci, ymax=p19ar+ci), width = 0.2,
position=position_dodge(.9)) + ylab("Horas semanales") +
ggtitle("Intervalo de confianza al 95% para la media\n de las horas semanales dedicadas al trabajo\n doméstico, según ámbito, por sexo")
graf.bar2