1. Base de datos

Los datos que utilizaremos corresponden con los pesos y tallas de 159 recién nacidos, las variables son: Sex, Lenght (talla), Weight (peso).

La base de datos se encuentra disponible en:

https://liveuclac-my.sharepoint.com/:f:/g/personal/sejjcog_ucl_ac_uk/Emki-iuqFfdHqIz5v-Hb7TYBF_2Pmkmw3926djYBpKZBYw?e=OcyWlO

librerías que vamos a utilizar:

#install.packages('mice')
#install.packages("VIM")
require(mice)
require(VIM)

Primero importamos los datos:

library(readxl)
egdata <- read_excel("~/Desktop/egdata.xlsx")
head(egdata)
## # A tibble: 6 × 3
##     Sex Length Weight
##   <dbl>  <dbl>  <dbl>
## 1     1   59      5.2
## 2     1   96.7   13.9
## 3     1  104.    16.6
## 4     1   66.1    6.3
## 5     1  107.    20.4
## 6     0   55.7   NA

Asignamos etiquetas de la variable sexo:

egdata$Sex<-factor(x=egdata$Sex,levels = c(0,1),labels=c("niña","niño"))
table(egdata$Sex)
## 
## niña niño 
##   79   80

2. Análisis Exploratorio

El resumen de la base de datos:

summary(egdata)
##    Sex         Length           Weight     
##  niña:79   Min.   : 51.40   Min.   : 2.95  
##  niño:80   1st Qu.: 66.60   1st Qu.: 6.77  
##            Median : 76.65   Median : 9.87  
##            Mean   : 81.75   Mean   :11.61  
##            3rd Qu.:100.08   3rd Qu.:16.70  
##            Max.   :118.40   Max.   :26.20  
##            NA's   :11       NA's   :22

Al realizar una tabla desagregada por sexo:

#install.packages("table1")
require(table1)
table1(~ Length  + Weight | Sex, data=egdata)
niña
(N=79)
niño
(N=80)
Overall
(N=159)
Length
Mean (SD) 80.8 (19.2) 82.7 (20.0) 81.8 (19.6)
Median [Min, Max] 74.4 [51.4, 118] 77.6 [51.4, 115] 76.7 [51.4, 118]
Missing 7 (8.9%) 4 (5.0%) 11 (6.9%)
Weight
Mean (SD) 11.1 (5.63) 12.1 (6.02) 11.6 (5.83)
Median [Min, Max] 9.40 [2.95, 23.9] 11.2 [3.28, 26.2] 9.87 [2.95, 26.2]
Missing 11 (13.9%) 11 (13.8%) 22 (13.8%)

Si analizamos el comportamiento de datos perdidos, encontramos que:

md.pattern(egdata)

##     Sex Length Weight   
## 127   1      1      1  0
## 21    1      1      0  1
## 10    1      0      1  1
## 1     1      0      0  2
##       0     11     22 33

El gráfico anterior muestra que 21 individuos no tiene el dato de peso (13.2%), 10 no tienen dato de talla (6.2%) y 2 no tienen ni peso ni talla (1.2%).

Otro gráfico para observar el comportamiento de missing values:

#install.packages("naniar")
require(naniar)
vis_miss(egdata)

Ahora, vamos analizar si en el comportamiento de los datos perdidos observados existe un patrón sistemático o está relacionado con otras variables o si este es aleatorio (MCAR).

Primero, se va a crear un indicador de datos perdidos por cada variable de interés:

missing_Length<-is.na(egdata$Length)

missing_Weight<-is.na(egdata$Weight)

El resultado anterior nos guarda objetos de tipo lógicos (True/false) sobre la condición de si el peso o la talla es NA. Esto nos permitirá comparar el promedio del peso en aquellos que no tiene el dato de la talla, y viceversa.

Para el peso:

tapply(X=egdata$Weight,INDEX=missing_Length,FUN=mean,na.rm=T)
##    FALSE     TRUE 
## 11.50898 12.84000

En el resultado anterior observamos que el peso promedio para los que tienen faltante la talla es superior (diferencia pequeña) respecto a los que tienen el dato.

Para la talla:

tapply(X=egdata$Length,INDEX=missing_Weight,FUN=mean,na.rm=T)
##    FALSE     TRUE 
## 82.34567 78.17143

Mientras que, para los que no tienen el dato de peso, la talla promedio es inferior (diferencia pequeña) comparados con los que si tienen los datos completos.

Para no hablar de diferencias pequeñas o grandes se calcularán pruebas de significancia estadística para comparar estos promedios.

t.test(egdata$Weight~missing_Length)
## 
##  Welch Two Sample t-test
## 
## data:  egdata$Weight by missing_Length
## t = -0.53361, df = 9.7835, p-value = 0.6055
## alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
## 95 percent confidence interval:
##  -6.905552  4.243505
## sample estimates:
## mean in group FALSE  mean in group TRUE 
##            11.50898            12.84000

De acuerdo con el valor p, la diferencia del peso promedio entre quienes tienen el dato de talla y no lo tienen No es significativa estadísticamente (valorp>0.05).

t.test(egdata$Length~missing_Weight)
## 
##  Welch Two Sample t-test
## 
## data:  egdata$Length by missing_Weight
## t = 0.96306, df = 28.463, p-value = 0.3436
## alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
## 95 percent confidence interval:
##  -4.697723 13.046205
## sample estimates:
## mean in group FALSE  mean in group TRUE 
##            82.34567            78.17143

Asi mismo, en la comparación de talla promedio entre los que tienen el dato de peso y no lo tienen la diferencia no resulta ser significativa (valorp>0.05).

Para determinar si existe una relación entre los datos perdidos y el sexo, se calculará una prueba chi2. Para talla:

tbl_Length<-table(egdata$Sex,missing_Length)
prop.table(tbl_Length,margin = 1)
##       missing_Length
##             FALSE       TRUE
##   niña 0.91139241 0.08860759
##   niño 0.95000000 0.05000000
chisq.test(tbl_Length)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_Length
## X-squared = 0.41817, df = 1, p-value = 0.5178

Lo anterior muestra que, no existe relación entre los missing de talla y el sexo, aunque el porcentaje de perdidos en niñas sea mayor este no es significativo.

El mismo proceso para peso:

tbl_Weight<-table(egdata$Sex,missing_Weight)
prop.table(tbl_Weight,margin=1)
##       missing_Weight
##            FALSE      TRUE
##   niña 0.8607595 0.1392405
##   niño 0.8625000 0.1375000
chisq.test(tbl_Weight)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_Weight
## X-squared = 8.292e-31, df = 1, p-value = 1

De igual forma, no existe relación entre los datos perdidos de peso y el sexo, la proporción de datos missing en niños y niñas es casi la misma.

3. Imputación de datos usando el promedio

Uno de los métodos más básicos en imputación es a través de la estimación del promedio, que es reemplazar los datos perdidos por el promedio bajo el supuesto de que los missing se generan de forma aleatoria y no sistemática o sesgada.

Mean_egdata <- mice(egdata, m=1, method = 'mean')
## 
##  iter imp variable
##   1   1  Length  Weight
##   2   1  Length  Weight
##   3   1  Length  Weight
##   4   1  Length  Weight
##   5   1  Length  Weight
MeanData_egdata<-complete(data=Mean_egdata)

La función complete se usa para crear un nuevo dataframe que contiene los valores observados e imputados.

datos de talla con NA´s:

Mean_egdata$data$Length
##   [1]  59.0  96.7 103.6  66.1 106.6  55.7  70.9  93.4 100.5  73.8  78.4    NA
##  [13]  74.1  80.8 101.3  73.5 107.2 114.4  73.3  85.2  97.6 108.1  66.9  73.2
##  [25]  93.7 103.0  65.3  73.7  92.4  93.8  97.8  86.8  90.7    NA  54.0  71.0
##  [37] 100.0  66.3  73.6    NA  73.8  82.9 100.3  70.5 113.7  65.7  77.8 101.4
##  [49] 105.5    NA  98.9  58.4    NA  97.0  57.6  72.1  94.7  74.6  84.6 103.0
##  [61]  55.3  70.8  72.0  97.1  68.8  94.9  97.5  72.4  79.8  97.5  57.5  70.5
##  [73]    NA  67.9  72.9  93.6  86.4  98.8  54.2 103.0  62.5  68.2 115.0  53.6
##  [85]  73.2    NA  55.9  71.2 105.9  56.4  68.1 110.3  52.3  71.5 107.9  69.0
##  [97] 106.3  56.4 106.5  55.0    NA 116.9  58.6 110.0  56.7 118.4    NA 105.5
## [109]  57.0  69.5 104.8  57.0 110.7  51.4  66.7 107.9  56.6  73.3  90.1 110.7
## [121]  58.6  72.2 107.0  53.3  82.3 100.9  55.5  71.6 114.3    NA  74.8 106.6
## [133]  53.4  70.2  94.2  56.7    NA  64.7  77.4  89.5 106.8  56.6  71.6 104.0
## [145]  53.8  98.7  55.0  99.4  60.2  77.2 104.0  51.4  96.1  56.4  72.7 106.0
## [157]  76.1  93.1 104.4

datos para talla imputados:

Mean_egdata$imp$Length
##            1
## 12  81.75338
## 34  81.75338
## 40  81.75338
## 50  81.75338
## 53  81.75338
## 73  81.75338
## 86  81.75338
## 101 81.75338
## 107 81.75338
## 130 81.75338
## 137 81.75338

Finalmente, al comparar el peso entre niños y niñas usando los datos imputados se observa que no existen diferencia significativas:

t.test(data=MeanData_egdata,Weight~Sex)
## 
##  Welch Two Sample t-test
## 
## data:  Weight by Sex
## t = -1.024, df = 156.53, p-value = 0.3074
## alternative hypothesis: true difference in means between group niña and group niño is not equal to 0
## 95 percent confidence interval:
##  -2.5736420  0.8162425
## sample estimates:
## mean in group niña mean in group niño 
##           11.16402           12.04272

Asi mismo, no cambian los resultados sin imputar:

t.test(data=egdata,Weight~Sex)
## 
##  Welch Two Sample t-test
## 
## data:  Weight by Sex
## t = -1.0236, df = 134.64, p-value = 0.3079
## alternative hypothesis: true difference in means between group niña and group niño is not equal to 0
## 95 percent confidence interval:
##  -2.9902880  0.9506503
## sample estimates:
## mean in group niña mean in group niño 
##           11.09250           12.11232

Ejemplo tomado del Dr Chibueze Ogbonnaya.