Capítulo 7 Práctica 3

7.1 Preparamos todo

# setwd("C:/your/dir")
load('../../data/Framingham2.RData')
load('../../data/Datos2.RData')
summary(Framingham) # y comprobamos lo cargado
##       OBS             SEX                        CHD            AGE       
##  Min.   :   1.0   Hombre:669   Sin evidencia de CHD:1095   Min.   :45.00  
##  1st Qu.: 352.2   Mujer :737   Casos prevalentes   :  43   1st Qu.:48.00  
##  Median : 703.5                Casos incidentes 4  :  39   Median :52.00  
##  Mean   : 703.6                Casos incidentes 6  :  37   Mean   :52.44  
##  3rd Qu.:1054.8                Casos incidentes 7  :  31   3rd Qu.:56.00  
##  Max.   :1406.0                Casos incidentes 10 :  30   Max.   :62.00  
##                                (Other)             : 131                  
##       SBP            SBP10          DBP              CHOL            FRW       
##  Min.   : 90.0   Min.   : 94   Min.   : 50.00   Min.   : 96.0   Min.   : 52.0  
##  1st Qu.:130.0   1st Qu.:130   1st Qu.: 80.00   1st Qu.:200.0   1st Qu.: 94.0  
##  Median :142.0   Median :145   Median : 90.00   Median :230.0   Median :103.0  
##  Mean   :148.1   Mean   :148   Mean   : 90.15   Mean   :234.6   Mean   :105.5  
##  3rd Qu.:160.0   3rd Qu.:160   3rd Qu.: 98.00   3rd Qu.:264.0   3rd Qu.:114.5  
##  Max.   :300.0   Max.   :264   Max.   :160.00   Max.   :430.0   Max.   :222.0  
##                  NA's   :635                                    NA's   :11     
##       CIG            YRS_CHD         YRS_DTH     
##  Min.   : 0.000   Min.   : 0.00   Min.   : 1.00  
##  1st Qu.: 0.000   1st Qu.: 9.00   1st Qu.:18.00  
##  Median : 0.000   Median :16.00   Median :18.00  
##  Mean   : 8.041   Mean   :13.32   Mean   :16.19  
##  3rd Qu.:20.000   3rd Qu.:18.00   3rd Qu.:18.00  
##  Max.   :60.000   Max.   :18.00   Max.   :18.00  
##  NA's   :1        NA's   :43                     
##                        DEATH                       CAUSE        AGE.MONTH    
##  Vivo en el examen 10     :1055   Vivo en el examen 10:1056   Min.   :540.0  
##  Fallecido en el examen 10:  60   Cáncer              :  79   1st Qu.:576.0  
##  Fallecido en el examen 9 :  54   CHD no súbita       :  60   Median :624.0  
##  Fallecido en el examen 6 :  49   Otras CHD           :  57   Mean   :629.3  
##  Fallecido en el examen 8 :  48   Otras enfermedades  :  56   3rd Qu.:672.0  
##  Fallecido en el examen 5 :  38   (Other)             :  79   Max.   :744.0  
##  (Other)                  : 102   NA's                :  19                  
##        Genero           AGE.CAT        AGE.CAT2        CHD2           CIG2    
##  Femenino :737   50 a 54    :445   (50, 56]:523   Caso   : 311   Fuma   :633  
##  Masculino:669   54 a 59    :398   (56, 62]:343   No caso:1095   No fuma:772  
##                  60 o más   :117   [45, 50]:540                  NA's   :  1  
##                  Menos de 50:446                                              
##                                                                               
##                                                                               
##                                                                               
##          SBP2             DBP2                     CHOL2             FRW2     
##  Hipertenso:825   Hipertenso:717   Hipercolesterolemia:1081   Normopeso:1150  
##  Normotenso:581   Normotenso:689   Normocolesterolemia: 325   Sobrepeso: 245  
##                                                               NA's     :  11  
##                                                                               
##                                                                               
##                                                                               
## 

7.2 Cálculo de porcentajes

genPercentage <- table(Framingham$SEX) *100/nrow(Framingham)
genPercentage
## 
##   Hombre    Mujer 
## 47.58179 52.41821

7.3 Visualización de datos

7.3.1 Objetivo

Gráficas y datos numéricos para facilitar el análisis ### Framingham por sexo (cualitativa discreta) Por medio de un pie chart

pie(genPercentage, main="Distribución por sexo")

O por un gráfico de barras:

barplot(genPercentage, main="Distribución por sexo")

O por un histograma:

hist(Framingham$AGE, main="Distribución por sexo")

7.3.2 Framingham por edad (cuantitativa discreta)

boxplot(Framingham$AGE, main="Distribución de edades en el estudio") 

# tercer cuartil = percentil 75

7.3.3 Framingham, hábito de fumar y nivel de colesterol (cualitativa ordinal y cuantitativa continua respectivamente)

Visualizamos las tablas:

# CIG2
summary(Framingham$CIG2)*100/nrow(Framingham)
##        Fuma     No fuma        NA's 
## 45.02133713 54.90753912  0.07112376
# CHOL
summary(Framingham$CHOL)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    96.0   200.0   230.0   234.6   264.0   430.0

La gráfica sobre el habito de fumar:

plot(Framingham$CIG2, main="Hábito de fumar en el estudio de Framingham")

La gráfica sobre el colesterol

boxplot(Framingham$CHOL, main="Nivel de colesterol en el estudio de Framingham")

7.3.4 Análisis simultáneo de varias variables

7.3.4.1 Sexo y caso de enfermedad coronaria (ambas cualitativas nominales)

chd2VsSex <- table(Framingham$CHD2, Framingham$SEX)
rbind(chd2VsSex, colSums(chd2VsSex))
##         Hombre Mujer
## Caso       190   121
## No caso    479   616
##            669   737
# In percentage
chd2VsSexPerc <- prop.table(chd2VsSex, margin = 2)*100
rbind(chd2VsSexPerc, colSums(chd2VsSexPerc))
##           Hombre     Mujer
## Caso     28.4006  16.41791
## No caso  71.5994  83.58209
##         100.0000 100.00000
chd2VsSex <- table(Framingham$CHD2, Framingham$SEX)
barplot(chd2VsSex, beside = T) 

# var dep CHD2 y var de fila/indepe 

7.3.4.2 Relación entre casos (cualitativa discreta) y la variable dependiente cualitativa discreta clasificación de peso relativo, FRW2

chd2VsFrw2 <- table(Framingham$CHD2, Framingham$FRW2)
rbind(chd2VsFrw2, colSums(chd2VsFrw2))
##         Normopeso Sobrepeso
## Caso          241        66
## No caso       909       179
##              1150       245
# In percentage
chd2VsFrw2 <- prop.table(chd2VsFrw2, margin = 2)*100
rbind(chd2VsFrw2, colSums(chd2VsFrw2))
##         Normopeso Sobrepeso
## Caso     20.95652  26.93878
## No caso  79.04348  73.06122
##         100.00000 100.00000
barplot(chd2VsFrw2, beside=T)

7.3.4.3 Variables agrupadas

table(Framingham$AGE.CAT, Framingham$CHD2) 
##              
##               Caso No caso
##   50 a 54       95     350
##   54 a 59      110     288
##   60 o más      35      82
##   Menos de 50   71     375
# Ordenar "Menos de 50", que aparece en la última posición
# http://www.cookbook-r.com/Manipulating_data/Changing_the_order_of_levels_of_a_factor/
Framingham$AGE.CAT <- factor(Framingham$AGE.CAT, levels=c("Menos de 50", "50 a 54", "54 a 59", "60 o más"))

# Show stats
ageVsChd2 <- table(Framingham$CHD2, Framingham$AGE.CAT) 
ageVsChd2
##          
##           Menos de 50 50 a 54 54 a 59 60 o más
##   Caso             71      95     110       35
##   No caso         375     350     288       82
summary(ageVsChd2) # return chisq.test
## Number of cases in table: 1406 
## Number of factors: 2 
## Test for independence of all factors:
##  Chisq = 21.27, df = 3, p-value = 9.254e-05
ageVsChd2 <- prop.table(ageVsChd2, margin=2) * 100
rbind(ageVsChd2, colSums(ageVsChd2))
##         Menos de 50   50 a 54   54 a 59  60 o más
## Caso       15.91928  21.34831  27.63819  29.91453
## No caso    84.08072  78.65169  72.36181  70.08547
##           100.00000 100.00000 100.00000 100.00000

Ahora ya podemos mostrar la relación entre franjas de edad y caso de enfermedad coronaria:

barplot(table(Framingham$AGE.CAT, Framingham$CHD2), beside=T) 

# "parece que el número de casos aumenta con la edad"

Podemos expresar la tabla de contingencia usando el gráfico en mosaico:

pacman::p_load("graphics")
mosaicplot(ageVsChd2, shade = TRUE, las=2,
           main = "Relación entre edad y enfermedad coronaria")

7.3.4.4 Relación entre casos, var. cuantitativa discreta y var. cualitativa

# Porcentaje de cigarrillos al día en base al sexo
# sexVsCig <- table(Framingham$CIG, Framingham$SEX)
sexVsCig <- Framingham[,c("SEX", "CIG")]
sexVsCigPerc<-round(prop.table(table(sexVsCig), margin = 2)*100, 2)
rbind(sexVsCigPerc, colSums(sexVsCigPerc))
##             0      1      5     10  15     20  25     30  33  35     40  45  50
## Hombre  33.16  24.14  40.32  49.09  60  76.19  84  84.31 100  75  96.55  50 100
## Mujer   66.84  75.86  59.68  50.91  40  23.81  16  15.69   0  25   3.45  50   0
##        100.00 100.00 100.00 100.00 100 100.00 100 100.00 100 100 100.00 100 100
##         60
## Hombre 100
## Mujer    0
##        100
# Distribución de cigarrillos al día en hombres
# methd. 1
data <- split(Framingham$CIG, Framingham$SEX)
# typeof(data) check type list
summary(data$Hombre) # distribution in men
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    0.00   10.00   12.91   20.00   60.00
summary(data$Mujer) #distribution in women
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   0.000   0.000   3.617   5.000  45.000       1
# meth. 2
# names(data) # rownames but for list
lapply(split(sexVsCig, sexVsCig$SEX), summary) # returns list (sapply does amtrix)
## $Hombre
##      SEX           CIG       
##  Hombre:669   Min.   : 0.00  
##  Mujer :  0   1st Qu.: 0.00  
##               Median :10.00  
##               Mean   :12.91  
##               3rd Qu.:20.00  
##               Max.   :60.00  
## 
## $Mujer
##      SEX           CIG        
##  Hombre:  0   Min.   : 0.000  
##  Mujer :737   1st Qu.: 0.000  
##               Median : 0.000  
##               Mean   : 3.617  
##               3rd Qu.: 5.000  
##               Max.   :45.000  
##               NA's   :1

Y la gráfica:

boxplot(data)

Con la libreria ggplot2:

library(ggplot2)
plot <- ggplot(Framingham, aes(SEX, CIG, color=SEX)) + geom_boxplot() + stat_summary(fun=mean, geom="point", shape=10, size=4) # añadir media
plot + labs(SEX="Sexo")
## Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).
## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).

7.3.4.5 Entre sexo y colesterol CHOL

# sexVsChd <- split(Framingham$CHD, Framingham$SEX) # groups=

# total por filas y porcentaje
sexVsChd <- table(Framingham$CHD, Framingham$SEX)
# https://stackoverflow.com/a/15866750/11688263
sexVsChd <- cbind(sexVsChd, rowSums(sexVsChd), rowSums(sexVsChd)*100 / sum(sexVsChd))

# y por columnas
sexVsChd <- rbind(sexVsChd, colSums(sexVsChd[,-c(3, 4)]), colSums(sexVsChd[,-c(3, 4)]*100/sum(sexVsChd[,-c(3,4)])))
sexVsChd[nrow(sexVsChd), c(3,4)]<-NaN # rm 
sexVsChd[nrow(sexVsChd)-1, c(3,4)]<-NaN # rm
colnames(sexVsChd) <- c(colnames(sexVsChd)[1:2], "Total", "Perc")
sexVsChd
##                         Hombre     Mujer Total      Perc
## Sin evidencia de CHD 479.00000 616.00000  1095 77.880512
## Casos prevalentes     26.00000  17.00000    43  3.058321
## Casos incidentes 2    20.00000   5.00000    25  1.778094
## Casos incidentes 3    15.00000   7.00000    22  1.564723
## Casos incidentes 4    25.00000  14.00000    39  2.773826
## Casos incidentes 5    15.00000  14.00000    29  2.062589
## Casos incidentes 6    26.00000  11.00000    37  2.631579
## Casos incidentes 7    17.00000  14.00000    31  2.204836
## Casos incidentes 8    15.00000  12.00000    27  1.920341
## Casos incidentes 9    16.00000  12.00000    28  1.991465
## Casos incidentes 10   15.00000  15.00000    30  2.133713
##                      669.00000 737.00000   NaN       NaN
##                       47.58179  52.41821   NaN       NaN
# entiende que H, M y Total son float /!
# lapply(prop.table(sexVsChd), summary)

Podemos expresar la tabla de contingencia usando el gráfico de barras:

barplot(table(Framingham$SEX, Framingham$CHD), beside = TRUE,
           main = "Relación entre sexo y casos incidentes")

De nuevo, usando ggplot2:

ggplot(Framingham, aes(x=CHD, fill=SEX)) + geom_bar(position = "dodge") + theme(axis.text.x = element_text(angle=90)) + labs(title="Frec. de casos de enfermedad coronaria, según número y sexo", fill ="Sexo", x="Número de casos de enfermedad coronaria", y="Frecuencia absoluta")

7.3.4.6 Entre variable cuantitativa y cuantitativa

# variance
var(Framingham[, c("AGE", "CIG")], use="complete")
##           AGE        CIG
## AGE 22.926380  -7.782218
## CIG -7.782218 134.372285
#covariance
cov(Framingham[, c("AGE", "CIG")], use="complete")
##           AGE        CIG
## AGE 22.926380  -7.782218
## CIG -7.782218 134.372285
#corelation
cor(Framingham[, c("AGE", "CIG")], use="complete")
##            AGE        CIG
## AGE  1.0000000 -0.1402106
## CIG -0.1402106  1.0000000
plot(Framingham$CHOL~Framingham$AGE) # ~ left side is the dependent

pacman::p_load("ggpubr")
library(ggpubr)
ggscatter(Framingham, x = "AGE", y = "CHOL", add = "reg.line", conf.int = TRUE, main="Relación entre edad y colesterol", cor.coef = TRUE, xlab = "Edad (años)", ylab = "Nivel de colesterol")