Problema de estudio

Se cuenta con una base de datos de 200 individuos y 20 variables que miden características sociodemográficas y el comportamiento de la enfermedad Covid-19 y las siguientes variables:

  • Comuna: Comuna en la que vive el individuo
  • Sexo: Sexo del individuo
  • EdadCat: Grupo de edad en el que se encuentra el individuo
  • Hijos: ¿Tiene hijos? (0: NO; 1:SÍ)
  • NHijos: Cantidad de hijos
  • NPersonas: Cantidad de personas que viven con usted
  • Nhabitaciones: Cantidad de habitaciones en el lugar donde reside
  • Actitud: Actitudes hacia las medidas de prevención del COVID-19
  • Conocimiento: Conocimientos sobre el COVID-19, su manejo y prevención

Las variables dee P91 a P100 tienen como opciones de respuesta (1: Nunca, 2: Pocas veces, 3: Algunas veces, 4: La mayoría de veces, 5: Siempre)

  • P91: Tiene alguien que le ayude cuando tenga que estar en cama
  • P92: Tiene alguien con quien pueda contar cuando necesite hablar
  • P93: Tiene alguien que lo lleve al médico cuando lo necesite
  • P94: Tiene alguien que le de amor y afecto
  • P95: Tiene alguien que le informe y le ayude a entender una situación
  • P96: Tiene alguien que le prepare la comida si no puede hacerlo
  • P97: Tiene alguien que le ayude a sus tareas domésticas si está enfermo
  • P98: Tiene a alguien con quien compartir sus temores o problema íntimos
  • P99: Tiene a alguien con quien divertirse
  • P100: Tiene alguien que comprenda sus problemas ApoyoSocial Apoyo social percibido

Desarrollo

Parte 1 : Estructura y verificación de la base de datos

Covid=read_excel("1. ComportamientoCovid.xlsx", sheet = "Datos")  # Lectura de Datos en R
str(Covid) # Verificar la estructura de las variables
## tibble [200 × 20] (S3: tbl_df/tbl/data.frame)
##  $ Comuna       : chr [1:200] "Comuna 5" "COMUNA 22" "comuna 18" "comuna 17" ...
##  $ Sexo         : chr [1:200] "MUJER" "mujer" "Mujer" "Hombre" ...
##  $ EdadCat      : chr [1:200] "de 18 a 29 años" "de 30 a 59 años" "de 18 a 29 años" "de 30 a 59 años" ...
##  $ Hijos        : num [1:200] 0 0 0 0 0 0 0 0 0 0 ...
##  $ NHijos       : num [1:200] 0 0 0 0 0 0 0 0 0 0 ...
##  $ NPersonas    : num [1:200] 1 3 1 3 0 1 2 4 0 2 ...
##  $ NHabitaciones: num [1:200] 4 1 2 1 2 5 1 2 2 2 ...
##  $ Actitud      : chr [1:200] "Positiva" "Negativa" "Positiva" "Negativa" ...
##  $ Conocimiento : chr [1:200] "Alto" "Alto" "Alto" "Alto" ...
##  $ P91          : num [1:200] 1 3 4 2 3 1 5 4 1 1 ...
##  $ P92          : num [1:200] 1 2 5 5 4 1 2 2 2 2 ...
##  $ P93          : num [1:200] 1 1 1 2 3 1 5 1 2 2 ...
##  $ P94          : num [1:200] 2 2 5 5 4 1 5 1 2 5 ...
##  $ P95          : num [1:200] 1 2 5 2 4 1 5 1 2 5 ...
##  $ P96          : num [1:200] 1 3 2 2 1 1 5 4 2 5 ...
##  $ P97          : num [1:200] 1 3 1 2 4 1 5 4 1 2 ...
##  $ P98          : num [1:200] 1 1 2 1 4 1 1 2 1 4 ...
##  $ P99          : num [1:200] 1 1 2 2 1 1 5 1 1 2 ...
##  $ P100         : num [1:200] 1 1 1 1 1 1 1 1 1 1 ...
##  $ ApoyoSocial  : chr [1:200] "Alto" "Bajo" "Alto" "Alto" ...
attach(Covid)

Parte 2 : Consistencia de la base de datos

Variables cuantitativas:

  • \(65\leq Age \leq 89\)

  • \(2.1\leq CaMol \leq 2.7\)

  • \(0.84\leq PhoMol \leq 1.5\)

  • \(30\leq ALP \leq 115\)

Variables cualitativas:

  • \(Sex=\left \{ 1=Male; 2=Female \right \}\)

  • \(Lab=\left \{ 1=Metpath; 2=Deyor; 3=St. Elizabeth's; 4=CB Rouche; 5=YOH; 6=Horizon\right \}\)

  • \(AgeG=\left \{ 65-69; 70-74; 75-79; 80-84; 85-89 \right \}\)

Aplicando las reglas de consistencia a la base de datos se tiene:

# Carga del archivo de reglas de validación
Rules = editrules::editfile("consistencia.txt")

# Conexión entre las  reglas
plot(Rules)

# Verificación de las reglas sobres los datos
Valid_Data = editrules::violatedEdits(Rules, Covid)
summary(Valid_Data)
## Edit violations, 200 observations, 0 completely missing (0%):
## 
##  editname freq  rel
##      dat1  200 100%
##      dat2  146  73%
##      num1  142  71%
## 
## Edit violations per record:
## 
##  errors freq   rel
##       1   17  8.5%
##       2   78   39%
##       3  105 52.5%
Covid$ComunaN<-as.factor(substring(Covid$Comuna, 8, 9))
Covid$EdadCatN<-substring(Covid$EdadCat, 4, )

#Después de haber creado las nuevas variables, se borran las variables originales

Covid<-Covid[,-c(1,3)]
library(DT)
datatable(Covid)

Parte 3: Visualización e identifiación de datos faltantes

visdat::vis_miss(Covid)                          # Una función que visualiza los datos faltantes en la hoja de calculo
## Warning: `gather_()` was deprecated in tidyr 1.2.0.
## Please use `gather()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

# Una función que evalua e identifica los datos faltantes por variable e individuo
miss<-function(Datos,plot=T){  
   n=nrow(Datos);p=ncol(Datos)
   names.obs<-rownames(Datos)
   
   nobs.comp=sum(complete.cases(Datos))         # Cuenta los registros completos
   Obs.comp=which(complete.cases(Datos))        # Identifica los registros completos
   nobs.miss = sum(!complete.cases(Datos))      # Identifica los registros con datos faltantes.
   Obs.miss=which(!complete.cases(Datos))       # Identifica los registros con datos faltantes.

   Datos.NA<-is.na(Datos)
   Var_Num<- sort(colSums(Datos.NA),decreasing=T)
   Var_per<-round(Var_Num/n,3)
   Obs_Num<-rowSums(Datos.NA)
   names(Obs_Num)<-names.obs
   Obs_Num<-sort(Obs_Num,decreasing=T)
   Obs_per<-round(Obs_Num/p,3)
   lista<-list(n.row = n, n.col = p,n.comp = nobs.comp,Obs.comp = Obs.comp,n.miss = nobs.miss,Obs.miss = Obs.miss, Var.n = Var_Num , Var.p = Var_per, Obs.n= Obs_Num, Obs.per= Obs_per)
    
   if(plot){
     #windows(height=10,width=15)
     par(mfrow=c(1,2))
     coord<-barplot(Var_per,plot=F)
     barplot(Var_per,xaxt="n",horiz=T,yaxt="n",xlim=c(-0.2,1), ylim=c(0,max(coord)+1),main= "% datos faltantes por variable")
      axis(2,at=coord,labels=names(Var_per), cex.axis=0.5,pos=0,las=2)
      axis(1,seq(0,1,0.2),seq(0,1,0.2),pos=0)
   
      coord<-barplot(Obs_per,plot=F)
      barplot(Obs_per,xaxt="n",horiz=T,yaxt="n",xlim=c(-0.2,1), ylim=c(0,max(coord)+1),main= "% datos faltantes por registro")
      axis(2,at=coord,labels=names(Obs_per),cex.axis=0.5,pos=0,las=2)
      axis(1,seq(0,1,0.2),seq(0,1,0.2))
      }
   return(invisible(lista))
}

Summary.NA = miss(Covid)           # Asignamos el resultado a un objeto lista para consultarlo

Parte 4: Correción datos faltantes e inconsistencia en la base de datos

names(Covid)
##  [1] "Sexo"          "Hijos"         "NHijos"        "NPersonas"    
##  [5] "NHabitaciones" "Actitud"       "Conocimiento"  "P91"          
##  [9] "P92"           "P93"           "P94"           "P95"          
## [13] "P96"           "P97"           "P98"           "P99"          
## [17] "P100"          "ApoyoSocial"   "ComunaN"       "EdadCatN"
level_Sexo=c("mujer"="Mujer","MUJER"="Mujer","mujeR"="Mujer","Hombre"="Hombre")
level_Hijos=c("0"="No","1"="Si")
level_EdadCat=c("18 a 29 años"="18 a 29 años","30 a 59 años"="30 a 59 años","60 años o mas"="60 años o mas")
level_Actitud=c("Positiva"="Positiva","Negativa"="Negativa")
level_Conocimiento=c("Alto"="Alto","Bajo"="Bajo")
level_ApoyoSocial=c("Alto"="Alto","Bajo"="Bajo")
  
Covid = transform(Covid,
                  Sexo=factor(dplyr::recode(Sexo,!!!level_Sexo)),
                  Hijos=factor(dplyr::recode(Hijos,!!!level_Hijos)),
                  EdadCatN=factor(dplyr::recode(EdadCatN, !!!level_EdadCat),levels=c("18 a 29 años","30 a 59 años","60 años o mas"),ordered=TRUE),
                  Actitud=factor(dplyr::recode(Actitud,!!!level_Actitud)),
                  Conocimiento=factor(dplyr::recode(Conocimiento,!!!level_Conocimiento),levels=c("Alto","Bajo"),ordered=TRUE),
                  ApoyoSocial=factor(dplyr::recode(ApoyoSocial,!!!level_ApoyoSocial),levels=c("Alto","Bajo"),ordered=TRUE)
)
summary(Covid)  
Sexo Hijos NHijos NPersonas NHabitaciones Actitud Conocimiento P91 P92 P93 P94 P95 P96 P97 P98 P99 P100 ApoyoSocial ComunaN EdadCatN
Hombre: 53 No:142 Min. :0.000 Min. :0.000 Min. :1.000 Negativa: 33 Alto:182 Min. :1.000 Min. :1.000 Min. :1.00 Min. :1.000 Min. :1.0 Min. :1.000 Min. :1.0 Min. :1.00 Min. :1.000 Min. :1.000 Alto:177 17 :51 18 a 29 años : 42
Mujer :147 Si: 58 1st Qu.:0.000 1st Qu.:1.000 1st Qu.:1.000 Positiva:167 Bajo: 18 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.00 1st Qu.:2.000 1st Qu.:2.0 1st Qu.:2.000 1st Qu.:2.0 1st Qu.:2.00 1st Qu.:2.000 1st Qu.:2.000 Bajo: 23 2 :33 30 a 59 años :135
NA NA Median :0.000 Median :2.000 Median :2.000 NA NA Median :4.000 Median :5.000 Median :5.00 Median :5.000 Median :5.0 Median :5.000 Median :5.0 Median :5.00 Median :5.000 Median :2.500 NA 22 :23 60 años o mas: 23
NA NA Mean :0.535 Mean :2.285 Mean :2.285 NA NA Mean :3.375 Mean :3.925 Mean :3.69 Mean :4.075 Mean :3.9 Mean :3.805 Mean :3.6 Mean :3.67 Mean :3.475 Mean :3.185 NA 19 :22 NA
NA NA 3rd Qu.:1.000 3rd Qu.:3.000 3rd Qu.:3.000 NA NA 3rd Qu.:5.000 3rd Qu.:5.000 3rd Qu.:5.00 3rd Qu.:5.000 3rd Qu.:5.0 3rd Qu.:5.000 3rd Qu.:5.0 3rd Qu.:5.00 3rd Qu.:5.000 3rd Qu.:5.000 NA 18 :10 NA
NA NA Max. :5.000 Max. :7.000 Max. :6.000 NA NA Max. :5.000 Max. :5.000 Max. :5.00 Max. :5.000 Max. :5.0 Max. :5.000 Max. :5.0 Max. :5.00 Max. :5.000 Max. :5.000 NA 1 : 7 NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA (Other):54 NA

Parte 5: Visualziación de datos

Exportando datos limpios de R a excel en formato CSV

## Datos limpios de R a excel
write.csv(Covid,"Covid.csv")

La distribución de los individuos por edad, apoyo social y sexo.

barplot(table(Covid$EdadCatN), main="Pacientes por grupo etario",names=levels(Covid$EdadCatN),cex.names=0.8,ylim = c(0,200),xlab="Edad",ylab="Frecuencia")

barplot(table(Covid$Sexo),main="Pacientes por sexo",col=c("blue","gray"),ylim=c(0,200),xlab="Sexo",ylab="Frecuencia")

barplot(table(Covid$ApoyoSocial),main="Pacientes por apoyo social",col=c("blue","gray"),ylim=c(0,200),xlab="Nivel de apoyo social",ylab="Frecuencia")

iii

La estructura de correlación entre las variables cuantitativas: P91-P100

Covid.corNew = cor(na.omit(Covid[,-c(1:7,18:20)]),method="pearson")
corrplot::corrplot(Covid.corNew , method = "ellipse",addCoef.col = "black",type="upper")