Nuestra Fotografía
Somos dos estudiantes de Biotecnología, que ademas compartimos una estrecha amistad, además de muchos gustos en común, estamos proximas a graduarnos y cumplir la meta de ser ingenieras, ha sido un camino largo y complicado, pero anhelamos cumplirlo lo antes posibles.
“La Felicidad radica ante todo en la salud.”
La salud es fundamental para la vida, una manera de saber el estado de salud de una persona o tener una idea consiste en análisis simples como: IMC (Indice de masa corporal), TAD (Tension Areterial Diastolica),colesterol, edad y genero en base a estas se sabe la condicion de una persona o un grupo de personas, que permiten al ministerio de salud tomar medidas para mejorar el estado de salud de una poblacion.
library(readr)
library(ggplot2)
library(corrplot)
library(mlbench)
library(Amelia)
library(plotly)
library(reshape2)
library(caret)
library(caTools)
library(dplyr)
library(readxl)
pacientes <- read_excel("pacientes.xlsx", col_types = c("text", "numeric", "numeric",
"numeric", "numeric", "text"), skip = 2)
pacientes <-as.data.frame(cbind(pacientes))
str(pacientes)# se observa la determinación que tiene cada columna
## 'data.frame': 70 obs. of 6 variables:
## $ PACIENTE : chr "1" "2" "3" "4" ...
## $ EDAD : num 42 64 47 56 54 48 57 52 67 46 ...
## $ COLESTEROL: num 292 235 200 200 300 215 216 254 310 237 ...
## $ IMC : num 31.6 30.8 25.6 26.2 32 ...
## $ TAD : num 97 90 80 75 100 ...
## $ GENERO : chr "Hombre" "Hombre" "Hombre" "Mujer" ...
Se cambia la variable genero de caracter a factor ya que esta solo tiene dos valores, “Hombre” y “Mujer”
pacientes$PACIENTE<- as.character(pacientes$PACIENTE)
pacientes$GENERO<- as.factor(pacientes$GENERO)
str(pacientes)
## 'data.frame': 70 obs. of 6 variables:
## $ PACIENTE : chr "1" "2" "3" "4" ...
## $ EDAD : num 42 64 47 56 54 48 57 52 67 46 ...
## $ COLESTEROL: num 292 235 200 200 300 215 216 254 310 237 ...
## $ IMC : num 31.6 30.8 25.6 26.2 32 ...
## $ TAD : num 97 90 80 75 100 ...
## $ GENERO : Factor w/ 2 levels "Hombre","Mujer": 1 1 1 2 1 1 2 1 1 2 ...
Análisis de datos
colnames(pacientes)# muestra los nombres de las columnas
## [1] "PACIENTE" "EDAD" "COLESTEROL" "IMC" "TAD"
## [6] "GENERO"
rownames(pacientes) # muestra el numero de filas
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
## [15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
## [29] "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42"
## [43] "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56"
## [57] "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70"
summary(pacientes) #muestra un resumen de la base de datos
## PACIENTE EDAD COLESTEROL IMC
## Length:70 Min. :42.00 Min. :175.0 Min. : 0.00
## Class :character 1st Qu.:49.00 1st Qu.:214.2 1st Qu.:21.90
## Mode :character Median :56.00 Median :230.0 Median :25.34
## Mean :55.24 Mean :236.8 Mean :24.74
## 3rd Qu.:60.00 3rd Qu.:254.0 3rd Qu.:27.76
## Max. :68.00 Max. :315.0 Max. :33.91
## TAD GENERO
## Min. : 65.0 Hombre:41
## 1st Qu.: 73.0 Mujer :29
## Median : 80.0
## Mean : 81.5
## 3rd Qu.: 90.0
## Max. :105.0
Exploramos los datos de la muestra:
boxplot(pacientes$EDAD ~ pacientes$GENERO, col = c("pink", "blue"), ylab = "EDAD de los pacientes")
En la gráfica se observa que la media de la edad de los pacientes que corresponde a las MUJERES es mayor en comparación a la media entre los hombres. No existe una diferencia entre los cuartiles tanto de hombres como de mujeres.
tapply(pacientes$EDAD, pacientes$GENERO, mean)
## Hombre Mujer
## 54.78049 55.89655
Como se muestra en los datos existe una variación de la media muy pequeña entre hombre y mujer.
boxplot(pacientes$COLESTEROL ~ pacientes$GENERO, col = c("pink", "blue"), ylab = "Colesterol de los pacientes")
En la gráfica se observa una variación en los cuartiles de “Hombres”, el segundo cuartil es mas pequeño en relacion a los otros, y en la “Mujer” existe una dispersión de 3 datos y notandose que no existe ninguna variación entre los cuartiles.
boxplot(pacientes$IMC ~ pacientes$GENERO, col = c("pink", "blue"), ylab = "Indice de masa corporal de los pacientes")
En los hombres no se muestra una variación entre los cuartiles, mientras que en la mujer existe una variacion en el tercer cuartil que es mas pequeño en relacion a los otros cuartiles.
boxplot(pacientes$TAD ~ pacientes$GENERO, col = c("pink", "blue"), ylab = "TAD de los pacientes")
En la gráfica tanto en hombre como mujeres existe una variacion en el cuartil dos tiene un menor tamaño en comparación a los demas cuartiles
barplot(prop.table(table(pacientes$GENERO, pacientes$EDAD)),col=c("orange","blue"),
ylim=c(0,0.1),main="Variable Discreta: Genero y Edad",
ylab ="Frecuencias Relativas",las=1)
*Calcule la correlación entre la variable dependiente y cada una de las variables explicativas (numéricas).
fm = aov(lm(pacientes$EDAD ~ pacientes$GENERO) )
Pedimos un resumen de la tabla del ANOVA
summary(fm)
## Df Sum Sq Mean Sq F value Pr(>F)
## pacientes$GENERO 1 21 21.16 0.417 0.521
## Residuals 68 3450 50.73
El valor p es 0.521
Valor Crítico de F es 0.417
qf(0.05, 2-1, 70-2, lower.tail = F)
## [1] 3.981896
Valores del estadístico > 3.981896 estarán incluidos en la región de rechazo. En nuetro caso 50.73 es mucho mayor que el valor crítico obtenido.
media <- mean(pacientes$EDAD [pacientes$GENERO =="HOMBRE"])
valor_t <- pt(0.05/2, 70-2) #depende del grado de confianza que tengamos
sp <- sqrt(50.73) #desviación típica de la varianza muestral com?n
ee <- valor_t * (sp/ sqrt(35)) #error de estimacion, nos ayuda a sacar el intervalo de confianza
media
## [1] NaN
límite superior del intervalo de confianza de la media de pacientes$EDAD por genero
media + ee
## [1] NaN
límite inferior del intervalo de confianza de la pacientes$EDAD por el genero
media - ee
## [1] NaN
intervals = TukeyHSD(fm)
intervals
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = lm(pacientes$EDAD ~ pacientes$GENERO))
##
## $`pacientes$GENERO`
## diff lwr upr p adj
## Mujer-Hombre 1.116064 -2.332515 4.564643 0.5205863
plot(intervals)
En la gráfica al estar presente el 0 en el limite inferior como en el superior NO son estadisticamente significativas
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.
plot(fm$residuals)
La dispersion de los datos NO lleva una una secuencia como se observa en la gráfica. Por lo que existe una menor correlacion entre los datos residuales.
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos:
summary(fm$residuals)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -12.7805 -5.8675 0.6034 0.0000 4.8825 13.2195
para que los residuos sean normales aplicamos gráficos descriptivos
boxplot(fm$residuals,col=c("blue"))
Los cuartiles son del mismo ancho por lo que hay una misma variabilidad, sin embargo existe una marcada diferencia entre el tercero y cuarto quartil que nos indica una diferente variabilidad, se muestra un dato atípico.
hist(fm$residuals,col=c("pink"))
La gráfica les histograma muestra no una similitud con una campana de Gauss, por lo que los datos no siguen una distribución normal.
qqnorm(fm$residuals)
qqline(fm$residuals)
La gráfica muestra una dispersion de datos con una duistribucion normal ya que no se mantienen tan alejadas de la linea recta.
shapiro.test(fm$residuals)
##
## Shapiro-Wilk normality test
##
## data: fm$residuals
## W = 0.96603, p-value = 0.05433
En base a la prueba de shapiro se puede argumentar que existe presencia de Normalidad.
Los graficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos: gráfico de caja a los residuales da, el dato real y el dato ajustadose lo ve como la varianza a partir de los residuos la carianza de los grupos se la obtiene atravess de los residuos
boxplot(fm$residuals~pacientes$GENERO, col = c("white","green"))
desviaciones <- tapply(fm$residuals, pacientes$GENERO, sd)
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)
## [1] 1.290679
El valor es 1.20679 por lo que indica presencia de homocedasticidad.
El test de Bartlett indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (las varianzas son iguales), la hipótesis nula en esta son iguales.
bartlett.test(fm$residuals ~ pacientes$GENERO)
##
## Bartlett test of homogeneity of variances
##
## data: fm$residuals by pacientes$GENERO
## Bartlett's K-squared = 2.0301, df = 1, p-value = 0.1542
Dado que el p-value es superior a 0.05 no hay evidencias suficientes para considerar que al menos dos medias son distintas. La representación gráfica de los residuos no muestra falta de homocedasticidad y en el qqplot los residuos se distribuyen muy cercanos a la linea de la normal.
boxplot(pacientes$COLESTEROL ~ pacientes$GENERO, col = c("purple", "orange"), ylab = "Colesterol")
La media entre “MUJER” y “HOMBRE” se encuentra igual, existe una variación en el cuartil 2 en el hombre ya que tiene un tamaño reducido en cambio en la mujer existe una variación en el cuartil 4 que es mucho más grande en relación a los otros y ademas existe la dispersion de 2 datos.
tapply(pacientes$COLESTEROL, pacientes$GENERO, mean)
## Hombre Mujer
## 241.0000 230.7931
Como se muestra en los datos existe una variación de la media pequeña entre hombre y mujer
fm = aov( lm(pacientes$COLESTEROL ~ pacientes$GENERO) )
Pedimos un resumen de la tabla del ANOVA
summary(fm)
## Df Sum Sq Mean Sq F value Pr(>F)
## pacientes$GENERO 1 1770 1770 1.488 0.227
## Residuals 68 80857 1189
Valor Crítico de F es ]1.488 el valor p es 0.227
qf(0.05, 2-1, 70-2, lower.tail = F)
## [1] 3.981896
Valores del estadítico > 3.981896 estarán incluidos en la region de rechazo. En nuetro caso 1189 es mucho mayor que el valor crítico obtenido.
media <- mean(pacientes$EDAD [pacientes$GENERO =="HOMBRE"])
valor_t <- pt(0.05/2, 70 - 2) #depende del grado de confianza que tengamos
sp <- sqrt(1189) #desviación tipica de la varianza muestral comun
ee <- valor_t * (sp/ sqrt(35)) #error de estimación, nos ayuda a sacar el intervalo de confianza
media
## [1] NaN
límite superior del intervalo de confianza de la media
media + ee
## [1] NaN
límite inferior del intervalo de confianza de la media
media - ee
## [1] NaN
intervals = TukeyHSD(fm)
intervals
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = lm(pacientes$COLESTEROL ~ pacientes$GENERO))
##
## $`pacientes$GENERO`
## diff lwr upr p adj
## Mujer-Hombre -10.2069 -26.90268 6.488886 0.2267087
plot(intervals)
La media al estar presente el cero en el intervalo las medias son semejantes
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.
plot(fm$residuals)
Existe una dispersion de datos por lo que indica que no existe correlacion entre los residuos.
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos:
summary(fm$residuals)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -66.000 -24.345 -7.793 0.000 16.207 84.207
para que los residuos sean normales aplicamos graficos descriptivos
boxplot(fm$residuals)
Existe la dispersion de un dato y una pequeña variabilidad entre los cuartiles por lo que existe una diferencia entre la variabilidad.
hist(fm$residuals,col=c("yellow"))
La grafica se asemeja a una campana de Gauss, aun cuando 1 de las columnas no siga la distribucion normal.
qqnorm(fm$residuals)
qqline(fm$residuals)
Existe una dispersion de datos con una distribucion normal la dispersion se mantiene en linea con la recta.
shapiro.test(fm$residuals)
##
## Shapiro-Wilk normality test
##
## data: fm$residuals
## W = 0.9565, p-value = 0.01611
En base a la prueba de shapiro se confirma la presencia de normalidad.
Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos: gráfico de caja a los residuales da, el dato real y el dato ajustado se lo ve como la varianza a partir de los residuosla carianza de los grupos se la obtiene atraves de los residuos
boxplot(fm$residuals~pacientes$GENERO, col = c("yellow", "blue"))
desviaciones <- tapply(fm$residuals, pacientes$GENERO, sd)
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)
## [1] 1.362483
Con el valor obtenido se muestra la presencia de homocedasticidad
El test de Bartlett indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (las varianzas son iguales), la hpotesis nula en esta son iguales
bartlett.test(fm$residuals ~ pacientes$GENERO)
##
## Bartlett test of homogeneity of variances
##
## data: fm$residuals by pacientes$GENERO
## Bartlett's K-squared = 2.9511, df = 1, p-value = 0.08582
Dado que el p-value es superior a 0.05 no hay evidencias suficientes para considerar que al menos dos medias son distintas. La representación gráfica de los residuos no muestra falta de homocedasticidad y en el qqplot los residuos se distribuyen muy cercanos a la linea de la normal.
boxplot(pacientes$IMC ~ pacientes$GENERO, col = c("green", "grey"), ylab = "IMC")
En la grafica de IMC se encuentra que las medias estan a la misma altura entre HOMBRE y MUJER. En el hombre se encuentra una variacion en el cuartil 3 que tiene un tamaño mayor, en la mujer el cuartil 3 tiene un tamaño menor y el 4 un tamano mayor.
tapply(pacientes$IMC, pacientes$GENERO, mean)
## Hombre Mujer
## 24.69073 24.81931
fm = aov( lm(pacientes$IMC ~ pacientes$GENERO) )
Pedimos un resumen de la tabla del ANOVA
summary(fm)
## Df Sum Sq Mean Sq F value Pr(>F)
## pacientes$GENERO 1 0.3 0.28 0.008 0.928
## Residuals 68 2312.2 34.00
Valor Crítico de F
qf(0.05, 2-1, 70-2, lower.tail = F)
## [1] 3.981896
Valores del estadístico > 3.981896 estarán incluidos en la región de rechazo. En nuetro caso 1.437 es menor que el valor crítico obtenido.
media <- mean(pacientes$EDAD [pacientes$GENERO =="HOMBRE"])
valor_t <- pt(0.05/2, 70 - 2) #depende del grado de confianza que tengamos
sp <- sqrt(1.437 ) #desviación típica de la varianza muestral común
ee <- valor_t * (sp/ sqrt(35)) #error de estimación, nos ayuda a sacar el intervalo de confianza
media
## [1] NaN
media + ee
## [1] NaN
media - ee
## [1] NaN
intervals = TukeyHSD(fm)
intervals
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = lm(pacientes$IMC ~ pacientes$GENERO))
##
## $`pacientes$GENERO`
## diff lwr upr p adj
## Mujer-Hombre 0.1285786 -2.694721 2.951878 0.927857
plot(intervals)
La media al estar presente el cero en el intervalo las medias son semejantes
Dado que el p-value es superior a 0.05 no hay evidencias suficientes para considerar que al menos dos medias son distintas. La representación gráfica de los residuos no muestra falta de homocedasticidad y en el qqplot los residuos se distribuyen muy cercanos a la linea de la normal.
Correlación entre las variables. En las estadística, la dependencia o asociación es una relación estadística, causal o no, entre dos variables aleatorias o dos conjuntos de datos. La correlación es cualquiera de una amplia clase de relaciones estadíticas que involucran dependencia, aunque en el uso común a menudo se refiere a la medida en que dos variables tienen una relación lineal entre sí. Si r=1 Correlación lineal directa linea hacia arriba / y de colores fríos Si r=-1 Correlación lineal inversa linea hacia abajo y de colores cálidos Si r=0 no tiene correlacion lineal
corrplot(cor(select(pacientes,-PACIENTE,-GENERO)))
correlacion<-corrplot(cor(select(pacientes,-PACIENTE,-GENERO)))
Correlacion Si r=1 Correlacion lineal directa linea hacia arriba / y de colores frios
correlacion
## EDAD COLESTEROL IMC TAD
## EDAD 1.00000000 0.3314421 0.06297175 0.3833463
## COLESTEROL 0.33144210 1.0000000 0.26466284 0.6932144
## IMC 0.06297175 0.2646628 1.00000000 0.2809006
## TAD 0.38334634 0.6932144 0.28090064 1.0000000
str(pacientes)
## 'data.frame': 70 obs. of 6 variables:
## $ PACIENTE : chr "1" "2" "3" "4" ...
## $ EDAD : num 42 64 47 56 54 48 57 52 67 46 ...
## $ COLESTEROL: num 292 235 200 200 300 215 216 254 310 237 ...
## $ IMC : num 31.6 30.8 25.6 26.2 32 ...
## $ TAD : num 97 90 80 75 100 ...
## $ GENERO : Factor w/ 2 levels "Hombre","Mujer": 1 1 1 2 1 1 2 1 1 2 ...
head(pacientes)
## PACIENTE EDAD COLESTEROL IMC TAD GENERO
## 1 1 42 292 31.64 97 Hombre
## 2 2 64 235 30.80 90 Hombre
## 3 3 47 200 25.61 80 Hombre
## 4 4 56 200 26.17 75 Mujer
## 5 5 54 300 31.96 100 Hombre
## 6 6 48 215 23.18 67 Hombre
summary(pacientes)
## PACIENTE EDAD COLESTEROL IMC
## Length:70 Min. :42.00 Min. :175.0 Min. : 0.00
## Class :character 1st Qu.:49.00 1st Qu.:214.2 1st Qu.:21.90
## Mode :character Median :56.00 Median :230.0 Median :25.34
## Mean :55.24 Mean :236.8 Mean :24.74
## 3rd Qu.:60.00 3rd Qu.:254.0 3rd Qu.:27.76
## Max. :68.00 Max. :315.0 Max. :33.91
## TAD GENERO
## Min. : 65.0 Hombre:41
## 1st Qu.: 73.0 Mujer :29
## Median : 80.0
## Mean : 81.5
## 3rd Qu.: 90.0
## Max. :105.0
*Limpieza de datos.
missmap(pacientes,col=c('yellow','black'),y.at=1,y.labels='',legend=TRUE)
*Análisis exploratorio de datos, nos permite indagar si la base de datos presenta valores sin asignar o a su vez si existen datos con algún tipo de error.
**Visualizaciones
pacientes %>% ggplot(aes(pacientes$TAD))+stat_density()+theme_bw()
pacientes %>% ggplot(aes(pacientes$IMC))+stat_density()+theme_bw()
pacientes %>% ggplot(aes(pacientes$COLESTEROL))+stat_density()+theme_bw()
pacientes %>%
select(c(EDAD, COLESTEROL, IMC, TAD, GENERO)) %>%
melt(id.vars = "EDAD") %>%
ggplot(aes(x = value, y = EDAD, colour = variable)) +
geom_point(alpha = 0.7) +
stat_smooth(aes(colour = "black")) +
facet_wrap(~variable, scales = "free", ncol = 2) +
theme_minimal()
set.seed(123)
split <- sample.split(pacientes,SplitRatio =0.75)
train <- subset(pacientes,split==TRUE)
test <- subset(pacientes,split==FALSE)
pacientes$GENERO<- as.numeric(pacientes$GENERO)
model <- lm(EDAD ~ COLESTEROL + IMC + TAD, data = train)
summary(model)
##
## Call:
## lm(formula = EDAD ~ COLESTEROL + IMC + TAD, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.589 -4.901 0.434 3.599 15.555
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 40.84979 8.50591 4.803 1.93e-05 ***
## COLESTEROL 0.03197 0.03880 0.824 0.415
## IMC -0.13729 0.16165 -0.849 0.400
## TAD 0.12112 0.12013 1.008 0.319
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.762 on 43 degrees of freedom
## Multiple R-squared: 0.1096, Adjusted R-squared: 0.04753
## F-statistic: 1.765 on 3 and 43 DF, p-value: 0.1681
Visualizando el módelo
res <- residuals(model)
res <- as.data.frame(res)
ggplot(res,aes(res)) + geom_histogram(fill='blue',alpha=0.5)
Un módelo es aceptable si: Las variables son significativas El r^2 ajustado a >= 0.5, residual standard, en el nuestro tenemos 6,43. Residuos que se ajustan a una distribución normal donde la media 0-1, se ve como una campana de Gauss reflejada en el histograma, que no estan relacionados, es decir que no sigan un patron deben estar dispersos, el gráfico del histograma no se asocia a la campana por lo que el modelo no es aceptable. Visualmente se comprueba al asociar a una campana.
**Al cumplir dos de las tres condiciones podemos asociar a que es un modelo relativamente aceptable.
plot(model)
La primera grafica es la diferencia entre la realidad y lo ajustado Los datos atipicos que se encuentran fuera del ajuste, generalmente son incorrectos
Lo ideal es que sea una linea recta, ya que estamos viendo que tran cerca esta lo real de lo hecho
La grafica 2, son residuos estandarizados, si se suporne la distribucion teorica con la teorica
La grafica 3, son residuos estandarizados quitan la distancia de la escala, para ver la naturaleza, para medir el ajuste de los datos, lo ideal es la linea recta
test$predicted.COLESTEROL <- predict(model,test)
pl1 <-test %>%
ggplot(aes(COLESTEROL,predicted.COLESTEROL)) +
geom_point(alpha=0.5) +
stat_smooth(aes(colour='black')) +
xlab('Actual value of COLESTEROL') +
ylab('Predicted value of COLESTEROL')+
theme_bw()
ggplotly(pl1)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
test$predicted.TAD <- predict(model,test)
pl1 <-test %>%
ggplot(aes(TAD,predicted.TAD)) +
geom_point(alpha=0.5) +
stat_smooth(aes(colour='black')) +
xlab('Actual value of TAD') +
ylab('Predicted value of TAD')+
theme_bw()
ggplotly(pl1)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
test$predicted.IMC <- predict(model,test)
pl1 <-test %>%
ggplot(aes(IMC,predicted.IMC)) +
geom_point(alpha=0.5) +
stat_smooth(aes(colour='black')) +
xlab('Actual value of IMC') +
ylab('Predicted value of IMC')+
theme_bw()
ggplotly(pl1)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'