Inferencia de medias con R

Francisco García García (2014-12-01)


0. Introducción

1. Intervalo de confianza de una media poblacional

2. Test t para una media poblacional

3. Intervalo de confianza de la diferencia de dos medias poblacionales

4. Test t para dos medias poblacionales

5. Pruebas no paramétricas: Wilcoxon

6. Ejercicios

7. Bibliografía





0. Introducción

Los procedimientos t son pruebas paramétricas que permiten realizar inferencia a partir de 1 ó 2 muestras:

Cuando no se verifica la normalidad en la variable respuesta, es aconsejable el uso de una prueba no paramétrica: Wilcoxon, cuyas hipótesis nula y alternativa no se basan en el parámetro de la media sino en la mediana.



1. Intervalo de confianza de una media poblacional

Comenzamos leyendo la base de datos riesgos:

datos <- read.csv("riesgos.csv", header = T, sep = "\t")

Echamos un vistazo a la estructura de los datos:

str(datos)
#> 'data.frame':    91 obs. of  10 variables:
#>  $ id        : int  2 3 6 7 8 10 11 12 14 15 ...
#>  $ contrato  : int  3 1 5 1 3 2 1 3 1 1 ...
#>  $ jornada   : Factor w/ 2 levels "completa","parcial": 1 1 1 1 1 1 1 1 1 1 ...
#>  $ turno     : int  1 1 1 1 1 1 1 1 3 1 ...
#>  $ carfisi   : Factor w/ 2 levels "no","sí": 1 1 2 2 2 1 1 1 1 1 ...
#>  $ carpsiqui : Factor w/ 2 levels "no","sí": 1 1 1 1 1 2 1 1 2 2 ...
#>  $ expquímica: Factor w/ 2 levels "no","sí": 1 1 1 1 2 1 1 1 1 1 ...
#>  $ edad      : int  33 37 35 30 30 32 27 33 31 31 ...
#>  $ peso      : num  74 74 67 57 69 56 74 76 65 NA ...
#>  $ talla     : num  155 170 170 164 160 160 170 165 170 173 ...
head(datos)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160
tail(datos)
#>    id contrato jornada turno carfisi carpsiqui expquímica edad peso talla
#> 86 73        5 parcial     1      no        no         no   32   65   159
#> 87 75        1 parcial     1      no        no         no   33   87   185
#> 88 76        1 parcial     1      sí        no         no   30   76   178
#> 89 80        4 parcial     1      no        no         no   29   65   153
#> 90 82        1 parcial     1      no        no         no   35   78   190
#> 91 86        4 parcial     4      no        no         no   28   65   167

Con la función attach hacemos accesible la base de datos seleccionada:

attach(datos) 
#> The following objects are masked from datos (position 3):
#> 
#>     carfisi, carpsiqui, contrato, edad, expquímica, id, jornada,
#>     peso, talla, turno
#> The following objects are masked from datos (position 4):
#> 
#>     carfisi, carpsiqui, contrato, edad, expquímica, id, jornada,
#>     peso, talla, turno
#> The following objects are masked from datos (position 10):
#> 
#>     carfisi, carpsiqui, contrato, edad, expquímica, id, jornada,
#>     peso, talla, turno

Describimos la variable peso en nuestra muestra:

summary(peso)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>   50.00   62.00   69.00   70.34   76.00   98.00       2
boxplot(peso, col="pink", main ="Peso")

plot of chunk unnamed-chunk-4

¿Cómo determinamos un intervalo de confianza del 95% para la media poblacional del salario?

t.test(peso, conf.level = 0.95)$conf.int 
#> [1] 67.86330 72.81086
#> attr(,"conf.level")
#> [1] 0.95

¿Los datos deben cumplir algún requisito para poder obtener el intervalo de confianza anterior?

Redondea el intervalo de confianza a dos decimales:

round(t.test(peso, conf.level = 0.95)$conf.int,2) 
#> [1] 67.86 72.81
#> attr(,"conf.level")
#> [1] 0.95



2. Test t para una media poblacional

La base de datos riesgos.csv es una muestra aleatoria de la población de trabajadores de un centro hospitalario de Valencia.

Se ha publicado un informe donde se indica que la media de la talla de todos los trabajadores en la Comunidad Valenciana es de 160 cm. Sin embargo, nosotros creemos que no es cierto y por ello nos gustaría utilizar los datos de nuestro estudio. Realizaremos los siguientes pasos: 1. Describimos la variable talla de forma numérica y gráfica.

boxplot(talla, col = "red", main = "talla en población de trabjadores")

plot of chunk unnamed-chunk-7

hist(talla)

plot of chunk unnamed-chunk-7

  1. Plantea el contraste de hipótesis correspondiente. ¿Dos colas o una sola?

  2. Resuelve el contraste en R considerando un nivel de significación de 0.05:

t.test(peso, mu = 160, alt = "two.sided", conf.level = 0.95)
#> 
#>  One Sample t-test
#> 
#> data:  peso
#> t = -72.03, df = 88, p-value < 2.2e-16
#> alternative hypothesis: true mean is not equal to 160
#> 95 percent confidence interval:
#>  67.86330 72.81086
#> sample estimates:
#> mean of x 
#>  70.33708



3. Intervalo de confianza de la diferencia de dos medias poblacionales

Sospechamos que la edad de las personas que tienen exposición a carga física es menor que la edad de las personas no expuestas a este riesgo. Nos gustaría obtener un intervalo de confianza de la diferencia de estas medias:

Primero exploramos la muestra:

mean(edad[carfisi == "sí"])
#> [1] 30.88235
mean(edad[carfisi == "no"])
#> [1] 31.78947
plot(edad ~ carfisi, col = c("red", "green"))

plot of chunk unnamed-chunk-9

mean(edad[carfisi == "sí"]) - mean(edad[carfisi == "no"])
#> [1] -0.9071207

A partir de los datos de la muestra, ¿crees que hay diferencia de edad entre ambos grupos?

Determinamos el intervalo de confianza del 95% para la diferencia de estas dos medias:

t.test(edad ~ carfisi, data = datos, conf.level = 0.95)$conf.int 
#> [1] -0.5142951  2.3285366
#> attr(,"conf.level")
#> [1] 0.95
## Otra opción para obtener el mismo intervalo de confianza:
grupo1 <- edad[carfisi == "no"]
grupo2 <- edad[carfisi == "sí"]
t.test(grupo1, grupo2, conf.level = 0.95)$conf.int 
#> [1] -0.5142951  2.3285366
#> attr(,"conf.level")
#> [1] 0.95

¿El valor 0 está incluido en este intervalo de confianza? ¿Qué significa esto?

4. Test t para dos medias poblacionales

En ocasiones nos gustaría comparar dos poblaciones. Una opción sería comparar las medias de ambos grupos pero antes debemos tener claro si las muestras son relacionadas o independientes. Comenta un ejemplo de cada tipo.

¿Hay diferencias de peso entre las personas que tienen carga psíquica y las que no están expuestas?

Vemos que ocurre en nuestra muestra:

summary(peso[carpsiqui == "sí"])
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>   50.00   64.50   69.00   71.51   78.00   96.00       2
summary(peso[carpsiqui == "no"]) 
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   50.00   59.00   69.00   69.24   76.00   98.00
boxplot(peso ~ carpsiqui,  col= c("pink", "red"), main = "peso vs. carga psíquica")

plot of chunk unnamed-chunk-11

Con esta información, ¿crees que hay diferencias entre ambos grupos? Comprueba si estas diferencias estadísticamente son estadísticamente significativas mediante la utilización del correspondiente test estadístico. t de comparación de 2 medias:

t.test(peso ~ carpsiqui, data = datos, conf.level = 0.95) 
#> 
#>  Welch Two Sample t-test
#> 
#> data:  peso by carpsiqui
#> t = -0.9096, df = 85.665, p-value = 0.3656
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#>  -7.239123  2.694128
#> sample estimates:
#> mean in group no mean in group sí 
#>         69.23913         71.51163

Comenta los resultados obtenidos.

5. Pruebas no paramétricas: Wilcoxon

Los procedimientos t exigen el cumplimiento de normalidad de la variable de estudio. Sin embargo, si no se verifican los requisitos exigidos, no será aconsejable el uso de estas pruebas paramétricas y utilizaremos procedimientos no paramétricos, que no suelen exigir ningún requerimiento a nuestros datos.

El test de Wilcoxon es una opción no paramétrica que nos permite comparar dos poblaciones.

Vamos a evaluar si hay diferencias de peso entre las personas que presentan exposición a carga física y las que no están expuestas, utilizando el test de Wilcoxon:

summary(peso[carfisi == "sí"])
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>   50.00   59.00   68.00   69.52   76.00   93.00       1
summary(peso[carfisi == "no"]) 
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>   50.00   64.75   69.00   70.82   76.50   98.00       1
boxplot(peso ~ carfisi,  col= c("blue", "red"), main = "peso vs. carga psíquica")

plot of chunk unnamed-chunk-13

wilcox.test(peso ~ carfisi, data = datos, paired = F)
#> 
#>  Wilcoxon rank sum test with continuity correction
#> 
#> data:  peso by carfisi
#> W = 978.5, p-value = 0.6458
#> alternative hypothesis: true location shift is not equal to 0



6. Ejercicios

En la base de datos estres.csv se incluye información sobre los niveles de estrés de un grupo de trabajadores, así como otras variables de interés.

Realiza las siguientes actividades en R:

7. Bibliografía y enlaces interesantes: