| Acerca de la autora: Soy estudiante ecuatorina de la Carrera de Ingeniería en Botecnolgía de la Escuala Politécnia del Ejército. En esta página quiero mostrar los conocimientos adquiridos en el Curso de R, dictado por Karen Calva de AsoiMat, EPN . Y motivar a desarrollar habilidades en el tratamiento de datos con herramientas que actualmente están al alcance de muchos, como R:) |
Figura 1.Factores de riesgo cardiovasular
a1. Describir la base de datos y las varibles.
La base de datos “pacientes” consiste en un conjunto de 70 observaciones referentes a los factores de riesgo cardiovascular. Donde se toman en cuenta las siguientes variables:
Edad: variable cuantitativa continua
Sexo: variable cualitativa o categórica
Colesterol: variable cuantitativa continua
Índice de Masa Corporal (IMC): variable cuantitativa continua
Tensión Arterial Diastólica (TAD): variable cuantitativa continua
a2. Leer la base de datos, nombres de columnas adecuados, definir tipo de varibles y etiquetas a las tipo factor.
colnames(datos)[colnames(datos) == "GENERO"] <-"SEXO"
#levels(datos$SEXO) <- c(T,F)
#levels(datos$SEXO) <- c("Masculino","Femenimo")
levels(datos$SEXO) <- list("Masculino" = "Hombre", "Femenino" = "Mujer")
datos$IMC<-as.double(datos$IMC)
datos$TAD<-as.numeric(datos$TAD)
datos$IMC[is.na(datos$IMC)==TRUE] <-ceiling(mean(datos$IMC,na.rm = TRUE))
datos$TAD[is.na(datos$TAD)==TRUE] <-ceiling(mean(datos$TAD,na.rm = TRUE))
print(datos)
## PACIENTE EDAD COLESTEROL IMC TAD SEXO
## 1 1 42 292 57 13 Masculino
## 2 2 64 235 50 11 Masculino
## 3 3 47 200 34 9 Masculino
## 4 4 56 200 38 8 Femenino
## 5 5 54 300 58 3 Masculino
## 6 6 48 215 22 6 Masculino
## 7 7 57 216 13 2 Femenino
## 8 8 52 254 42 7 Masculino
## 9 9 67 310 27 4 Masculino
## 10 10 46 237 16 7 Femenino
## 11 11 58 220 34 7 Masculino
## 12 12 62 233 46 8 Femenino
## 13 13 49 240 44 11 Masculino
## 14 14 56 295 18 12 Masculino
## 15 15 63 310 2 12 Masculino
## 16 16 64 268 49 11 Femenino
## 17 17 67 243 24 10 Femenino
## 18 18 49 239 17 8 Femenino
## 19 19 53 198 41 8 Femenino
## 20 20 59 218 2 10 Masculino
## 21 21 65 215 26 7 Masculino
## 22 22 67 254 47 4 Masculino
## 23 23 49 218 35 10 Masculino
## 24 24 53 221 31 9 Femenino
## 25 25 57 237 33 11 Femenino
## 26 26 47 244 25 10 Femenino
## 27 27 58 223 30 7 Femenino
## 28 28 48 198 36 10 Femenino
## 29 29 51 234 41 9 Masculino
## 30 30 49 175 45 9 Masculino
## 31 31 68 230 51 7 Femenino
## 32 32 58 248 15 8 Femenino
## 33 33 54 218 39 12 Femenino
## 34 34 59 285 55 3 Masculino
## 35 35 45 253 29 8 Masculino
## 36 36 53 187 23 9 Masculino
## 37 37 43 208 43 5 Masculino
## 38 38 57 246 12 9 Masculino
## 39 39 64 275 19 12 Masculino
## 40 40 43 218 7 8 Masculino
## 41 41 47 231 38 8 Masculino
## 42 42 58 200 37 11 Masculino
## 43 43 58 214 39 8 Femenino
## 44 44 48 230 28 7 Femenino
## 45 45 62 280 40 3 Femenino
## 46 46 54 198 12 5 Masculino
## 47 47 67 285 52 12 Masculino
## 48 48 68 201 14 9 Masculino
## 49 49 55 206 6 5 Femenino
## 50 50 50 223 21 8 Femenino
## 51 51 53 290 59 12 Femenino
## 52 52 63 315 53 3 Femenino
## 53 53 60 220 48 9 Femenino
## 54 54 46 230 9 8 Masculino
## 55 55 45 175 18 7 Masculino
## 56 56 53 213 19 7 Femenino
## 57 57 59 220 11 5 Masculino
## 58 58 62 287 59 12 Masculino
## 59 59 60 290 60 11 Masculino
## 60 60 62 209 10 8 Masculino
## 61 61 58 290 54 9 Masculino
## 62 62 57 260 53 12 Masculino
## 63 63 49 202 10 9 Femenino
## 64 64 61 214 5 11 Femenino
## 65 65 52 231 8 8 Femenino
## 66 66 59 280 56 3 Masculino
## 67 67 50 220 32 7 Masculino
## 68 68 46 233 20 8 Masculino
## 69 69 44 215 4 7 Masculino
## 70 70 60 202 3 5 Femenino
1b. Mostral la estructura (str) y resumen de la base de datos (summary) (mínimo, media, máximo, desviación estándar, primer cuartil de cada variable numérica y la frecuencia en el caso de variables categóricas)
ESTRUCTURA
#datos[datos==","]<- " "
str(datos)
## 'data.frame': 70 obs. of 6 variables:
## $ PACIENTE : int 1 2 3 4 5 6 7 8 9 10 ...
## $ EDAD : int 42 64 47 56 54 48 57 52 67 46 ...
## $ COLESTEROL: int 292 235 200 200 300 215 216 254 310 237 ...
## $ IMC : num 57 50 34 38 58 22 13 42 27 16 ...
## $ TAD : num 13 11 9 8 3 6 2 7 4 7 ...
## $ SEXO : Factor w/ 2 levels "Masculino","Femenino": 1 1 1 2 1 1 2 1 1 2 ...
RESUMEN
summary(datos)
## PACIENTE EDAD COLESTEROL IMC
## Min. : 1.00 Min. :42.00 Min. :175.0 Min. : 2.00
## 1st Qu.:18.25 1st Qu.:49.00 1st Qu.:214.2 1st Qu.:16.25
## Median :35.50 Median :56.00 Median :230.0 Median :31.50
## Mean :35.50 Mean :55.24 Mean :236.8 Mean :30.77
## 3rd Qu.:52.75 3rd Qu.:60.00 3rd Qu.:254.0 3rd Qu.:44.75
## Max. :70.00 Max. :68.00 Max. :315.0 Max. :60.00
## TAD SEXO
## Min. : 2.000 Masculino:41
## 1st Qu.: 7.000 Femenino :29
## Median : 8.000
## Mean : 8.157
## 3rd Qu.:10.000
## Max. :13.000
DESVIACIONES ESTÁNDAR
sd(datos$EDAD)
## [1] 7.092424
sd(datos$COLESTEROL)
## [1] 34.60467
sd(datos$IMC)
## [1] 17.25862
sd(datos$TAD)
## [1] 2.684554
2b. genere diagramas de caja para variables continuas y diagramas de barras para variables discretas, describir resultados.
CONTINUASpar(mfrow=c(1,3))
boxplot(datos$COLESTEROL,col=heat.colors(1,alpha = 0.2), ylab="mg/dL",main= "Colesterol")
boxplot(as.double(datos$IMC),col=topo.colors(3,alpha = 0.2), ylab="Unidades",main= "Índice de masa corporal (IMC)")
boxplot(as.integer(datos$TAD),col=terrain.colors(8,alpha = 0.2), ylab="mmHg",main= "Tensión Arterial Distólica (TAD)")
En el diagrama de caja de la variable “Colesterol” hay un dato atípica en el extremo superior; mientras que, en la variable “TAD” hay un dato atípico en el extremo inferior.
En cuanto a la dispersión se observa que en “Colesterol” los datos comprendidos entre el 25% y el 50% de la población está más dispersa que entre el 50% y el 75%. En cambio sucede lo contrario con los valores de la Variable “TAD”. Y en la la varible “IMC”, la dispersión es similar en ambos lados de la mediana.
DISCRETAShist(datos$EDAD,breaks = "Sturges",col=topo.colors(6,alpha = 0.4), xlab="Años",ylab = "Número de pacientes",main= "Edad \n",freq=T,labels = T,ylim = c(0, 20) )
El rango de edad más frecuente es entre 55-60 años, en tanto que los rangos entre 40-45 y 65-70 son los menos frecuentes dentro de la población de pacientes.
3b. Calcule la correlación entre la variable dependiente y cada una de las variables explicativas (numéricas).
library(readr)
library(corrplot)
library(mlbench)
library(ggplot2)
library(Amelia)
library(plotly)
library(reshape2)
library(caret)
library(caTools)
library(dplyr)
cor(select(datos,-PACIENTE,-SEXO))
## EDAD COLESTEROL IMC TAD
## EDAD 1.00000000 0.33144210 0.16302266 -0.02182395
## COLESTEROL 0.33144210 1.00000000 0.43064453 0.06076694
## IMC 0.16302266 0.43064453 1.00000000 0.08993568
## TAD -0.02182395 0.06076694 0.08993568 1.00000000
corrplot(cor(select(datos,-PACIENTE,-SEXO)))
De acuerdo a los datos de correlación el 2Colesterol" presenta más realción con las variables “IMC”(0.43), “Edad”" (0.16), que con “TAD” (0.06). Consecuentemente el “IMC” tiene mayor relación con las variables “Colesterol” (0.43) y “Edad” (0.16), sin embargo con “TAD”(0.08) la correlación es menor.
4b. Muestre el efecto de las variables independientes con respecto a la variable dependiente.
par(mfrow=c(2,2))
datos%>%select(c(COLESTEROL, EDAD,IMC,TAD)) %>%
melt(id.vars = "COLESTEROL") %>%
ggplot(aes(x = value, y = COLESTEROL, colour = variable)) +
geom_point(alpha = 0.7) +
stat_smooth(aes(colour = "black")) +
facet_wrap(~variable, scales = "free", ncol = 2) +
labs(x = "VARIABLES", y = "COLESTEROL ") +
theme_minimal()
Considere una variable categórica y realice un análisis ANOVA (como el revisado en clase).
Mujeres<- datos[,3][datos$SEXO=="Femenino"]
length(Mujeres)
## [1] 29
Hombres<- datos[,3][datos$SEXO=="Masculino"]
length(Hombres)
## [1] 41
Hombres<-sample(Hombres,29)
length(Hombres)
## [1] 29
Generamos dos variables: COLESTEROL es la variable respuesta y SEXO es la variable factor :
colesterol <- c(Mujeres,Hombres)
sexo <- as.factor(c(rep(c("Mujeres","Hombres"), each =29))) #factor
Exploramos los datos de la muestra:
boxplot(colesterol ~ sexo, col = c("khaki1", "lightblue1"), ylab = "Índice de colesterol (mg/mL)")
tapply(colesterol, sexo, mean)
## Hombres Mujeres
## 245.1379 230.7931
Tabla de ANOVA
fm = aov( lm(colesterol ~ sexo) )
summary(fm)
## Df Sum Sq Mean Sq F value Pr(>F)
## sexo 1 2984 2984 2.58 0.114
## Residuals 56 64768 1157
Elementos generados en el ANOVA:
names(fm)
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "contrasts" "xlevels" "call" "terms"
## [13] "model"
:. Las medias son estdísticamente iguales: 0.593>0.05
Prueba de post-hoc
qf(0.05, 1, 56, lower.tail = F)
## [1] 4.012973
Valores del estadístico > 4.012973estarán incluidos en la región de rechazo. En nuetro caso F=0.288 es menor que el valor crítico obtenido.Se acepta la H0, entonces las medias seran estadísticamente iguales.
Intervalo de confianza de la media del nivel de colesterol en Mujeres y Hombres, con un nivel de confianza del 95%:
Mujeres
media <- mean(colesterol[sexo =="Mujeres"])
valor_t <- pt(0.05/2, 56)
sp <- sqrt(1169)
ee <- valor_t * (sp/ sqrt(29))
Límites de intervalo:
#Limite uperior
media + ee
## [1] 234.0307
#Limite inferior
media - ee
## [1] 227.5555
Hombres
media <- mean(colesterol[sexo =="Hombres"])
valor_t <- pt(0.05/2, 56) #prueab T, depende del grado de confianza
sp <- sqrt(1169) #desviación típica de la varianza muestral común,46 esti de la sd en anov arri
ee <- valor_t * (sp/ sqrt(29)) #error de estimación , 6 n de cada grupo
media#PREDICIION DEL NUMERO DE INSECTOS DE UN COLOR A APRTI DE LA MEUSTRA DADA
## [1] 245.1379
Límites de intervalo:
#Limite uperior
media + ee
## [1] 248.3755
#Limite inferior
media - ee
## [1] 241.9004
Prueba de TUKEY HSD
Si hemos detectado diferencias significativas entre las medias de las poblaciones. ¿Sería posible saber cuáles son los grupos que generan estas diferencias:
intervals = TukeyHSD(fm)
intervals
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = lm(colesterol ~ sexo))
##
## $sexo
## diff lwr upr p adj
## Mujeres-Hombres -14.34483 -32.23589 3.546232 0.1138607
El valor de p-adjunto=0.593424 crorrobora que las medias son estadísticamente iguales, ya que este valor se tiende más a 1 que a 0.
plot(intervals,mean.labels = TRUE, connect = FALSE) # si cercano a 0 son diferentse, si son
Si un intervalo no contiene cero, las medias correspondientes son significativamente diferentes.Este caso muestra lo contrario.
Validación del modelo ANOVA
A partir de los residuos del modelo comprobaremos si el modelo ANOVA es adecuado. Los supuestos que se deben cumplir son tres: independencia, homocedasticidad y normalidad
Independencia
plot(fm$residuals)
Si los rediduos son buenos, las predicciones son buenas; mientras mas dispersos mejor, porque no estarían correlacionados.
Normalidad
summary(fm$residuals)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -70.138 -25.052 -7.793 0.000 14.448 84.207
boxplot(fm$residuals)
hist(fm$residuals)
qqnorm(fm$residuals)
qqline(fm$residuals)
La distribución tiende a ser Normal, aunque hay un dato atípico.
Prueba de Shapiro-Wilk para Normalidad
El test de Shapiro-Wilk indica si hay evidencia suficiente para rechazar la hipótesis nula (normalidad de los residuos)
shapiro.test(fm$residuals)
##
## Shapiro-Wilk normality test
##
## data: fm$residuals
## W = 0.96303, p-value = 0.07451
Los residuos son normales pues el p-valor=0.03727 es menor a 0,05.
Homocedasticidad
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos:
boxplot(fm$residuals~sexo, col = c("khaki1", "lightblue1"))
desviaciones <- tapply(fm$residuals, sexo, sd)
desviaciones
## Hombres Mujeres
## 39.01806 28.12012
Comparando la desviación máxima con la mínima obtenemos una orientación sobre la falta de homocedasticidad (>2 aproximadamente)
max(desviaciones) / min(desviaciones) #no hay hocedaticidad, las varinzas no osn iguales
## [1] 1.387549
:.Las varianzas son estadísticamente iguales, pues se cumple que la relacion entre la desviación máxima y mínima es menor a 2.
Prueba de Barlett
El test de Bartlett indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (las varianzas son iguales).
bartlett.test(fm$residuals ~ sexo)
##
## Bartlett test of homogeneity of variances
##
## data: fm$residuals by sexo
## Bartlett's K-squared = 2.8999, df = 1, p-value = 0.08859
Dado que el p-valor=0.1593, menor que 0,05; no se encuentra evidecnai suficiente para rechazar la H0.
Kruskal-Wallis y pruebas post-hoc*
¿Qué hipótesis contrasta el test ANOVA?
Ho: las medias son iguales en todas las poblaciones
Ha: hay alguna media distinta
¿Qué hipótesis contrasta la prueba de Kruskal-Wallis?
Ho: la variable respuesta es la misma en todas las poblaciones valoradas
Ha: la variable respuesta es mayor en alguna de las poblaciones
Cuando no se cumplen las hipótesis exigidas por el modelo ANOVA, es posible utilizar la prueba no paramétrica Kruskal-Wallis: ¿hay diferencias significativas entre las poblaciones?
kruskal.test(colesterol, sexo)#ANOVA mulñtivariable
##
## Kruskal-Wallis rank sum test
##
## data: colesterol and sexo
## Kruskal-Wallis chi-squared = 2.1164, df = 1, p-value = 0.1457
Con un nivel de significación alfa = 0.05. Se acepta la Ha debido a que el p-valor=0.6916, mayor a 0,05 . Es decir que la variable respuesta es mayor en alguna de las poblaciones
Bajo la Ho el estadístico de contraste H del test de Kruskal-Wallis se distribuye como una Chi-cuadrado de grados de libertad (I-1) (donde I es el número de grupos que disponemos). Así obtenemos el cuantil buscado:
qchisq(0.05, 2-1, lower.tail = F)
## [1] 3.841459
Valores del estadístico > 3.841459 estarán incluidos en la región de rechazo. En nuetro caso 0.15738 es menor que el valor crítico obtenido.
1d. Considerando los cálculos anteriores genere el modelo de regresión lineal múltiple que mejor se ajuste a los datos
Train Y Test Data
set.seed(123)
split <- sample.split(datos,SplitRatio =0.75) #Porcentaje de trainimg data: 75%
train <- subset(datos,split==TRUE)
test <- subset(datos,split==FALSE)
Entrenando el modelo
#Primer modelo
#model <- lm(COLESTEROL ~ EDAD + IMC + TAD + SEXO, data = train)
#Modelo corregido
model <- lm(COLESTEROL ~ -1 + EDAD + IMC , data = train)
summary(model)
##
## Call:
## lm(formula = COLESTEROL ~ -1 + EDAD + IMC, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -70.543 -19.796 4.582 24.404 89.187
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## EDAD 3.8438 0.1943 19.780 <2e-16 ***
## IMC 0.7258 0.3265 2.223 0.0313 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 36.73 on 45 degrees of freedom
## Multiple R-squared: 0.9768, Adjusted R-squared: 0.9757
## F-statistic: 946.6 on 2 and 45 DF, p-value: < 2.2e-16
Ecuación del modelo
model$coefficients
## EDAD IMC
## 3.843842 0.725823
paste("COLESTEROL=",round(model$coefficients[1],2)," + ",
round(model$coefficients[2],2),names(model$coefficients[2])
)
## [1] "COLESTEROL= 3.84 + 0.73 IMC"
2d. Realice un análisis detallado de los residuos
Visualizacion del modelo
Regresión lineal de los residuos(diferencia entre el valor observado de la variable dependiente y el valor predicho de y))
res <- residuals(model)
# Convertir residuos en un DataFrame
#
res <- as.data.frame(res)
ggplot(res,aes(res)) + geom_histogram(fill='green3',alpha=0.5)
par(mfrow=c(2,2))
plot(model)
Predicciones
Se prueba el modelo prediciendo en un conjunto de datos de prueba.
test$predicted.COLESTEROL <- predict(model,test)
pl1 <-test %>%
ggplot(aes(COLESTEROL,predicted.COLESTEROL)) +
geom_point(alpha=0.5) +
stat_smooth(aes(colour='black')) + #cacl el intrv de confianza=(meda-desv s),tendencia datos
xlab('Valor real de COLESTEOL') +
ylab('Preciddión de COLESTEROL')+
theme_bw()
ggplotly(pl1)
Evaluación del modelo
nuestros valores predichos.
error <- test$COLESTEROL-test$predicted.COLESTEROL
rmse <- sqrt(mean(error)^2) #RAIZ MEDIA CUADRATICA, si RMSE es cercano a 1 el odelo es bueno
rmse
## [1] 1.964042
3d. Analice la significancia de las variables y los parámetros individuales.
Los códigos de significancia indican qué tan seguros podemos estar de que el coeficiente tiene un impacto en la variable dependiente. Por ejemplo, un nivel de significación de 0.01 indica que hay menos de un 0.1% de probabilidad de que el coeficiente sea igual a 0 y, por lo tanto, sea insignificante. Dicho de otra manera, podemos estar 99.9% seguros de que es significativo. Los códigos de significancia (mostrados por asteriscos) están diseñados para clasificar rápidamente la significancia de cada variable.
De acuerdo al prim.er .entrenamiento del modelo las variables más significativas, fueron El edad (+) e IMC(0.13), desenchándose así las variables: TAD y sexo.
El valor P es una medida de la confianza que puede tener en que las variables independientes predicen de manera confiable la variable dependiente, con un p-valor: < 2.2e-16e.
El R^2 se aproxima a uno y los residuos permiten saber que es un “buen”" modelo.
Al ir corrigiendo el modelo adquiere una distribución más apegada a la Normal y además es capaz de abarcar más datos reales.