Warning: package 'mice' was built under R version 4.2.3
Attaching package: 'mice'
The following object is masked from 'package:stats':
filter
The following objects are masked from 'package:base':
cbind, rbind
Code
library(dplyr)
Warning: package 'dplyr' was built under R version 4.2.3
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
Code
library(VIM)
Warning: package 'VIM' was built under R version 4.2.3
Loading required package: colorspace
Loading required package: grid
The legacy packages maptools, rgdal, and rgeos, underpinning this package
will retire shortly. Please refer to R-spatial evolution reports on
https://r-spatial.org/r/2023/05/15/evolution4.html for details.
This package is now running under evolution status 0
VIM is ready to use.
Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
Attaching package: 'VIM'
The following object is masked from 'package:datasets':
sleep
Code
library(foreign)
Warning: package 'foreign' was built under R version 4.2.2
Code
library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.2.3
Code
library(lattice)
Warning: package 'lattice' was built under R version 4.2.3
Code
library(outliers)library(EnvStats)
Warning: package 'EnvStats' was built under R version 4.2.3
Attaching package: 'EnvStats'
The following objects are masked from 'package:stats':
predict, predict.lm
Se reemplaza con NA los valores de las mediciones medicas que no tienen sentido que sean 0, lo cual representaria la falta de informacion de ese valor.
Code
columnas<-colnames(Diabetes[,-c(ncol(Diabetes),1)])for (i in columnas){ Diabetes[[i]][Diabetes[[i]]==0]<-NA }
Observamos las primeras filas del conjunto de datos con NA (Pregnancies y Outcome si pueden tomar valores de 0)
se puede observar que hay 392 filas sin datos faltantes, 140 filas que solo tienen faltantes en la caracteristica de insulina, 26 filas que contienen faltantes en BLB, SkinThickness e Insuline, y observando la matriz dada se evidencia que esas 3 caracteristicas son las que representan casi todos los datos faltantes, donde hay unos 5 y 11 para glucose y BMI los cuales son pocos.
Code
aggr(Diabetes, numbers=TRUE)
Como se evidencio anteriormente, las caracteristicas que mas valores faltantes presentan son: Ins,SKT,MIP. Donde SkT prsenta casi un 30% de datos faltantes y en Ins podemos observar mas del 40% de datos faltantes. El 25% de los datos les hace falta los datos de Ins y Skt y el 18% solo el dato de Ins y el 51% de filas no tienen datos faltantes, lo cual es muy poco.
Se haran imputacion de datos por emparejamiento predictivo medio para los valores faltantes y se evaluara el resultado en comparacion de los datos originales, con el fin de encontrar la mejor manera de manejar estos valores faltantes.
variable<-"Ins"# Crear el gráfico de frecuencias de líneasggplot(dat, aes(x = Ins, color = df)) +geom_freqpoly(linewidth=1) +theme_minimal() +labs(x ="Ins", y ="Frecuencia", title ="Frecuencia de lineas Ins")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Debido a que los metodos “norm”,“norm.nob”,“norm.pred” resultan en datos negativos no es util para imputar dichos datos, debido a que no es posible valores negativos para estas caracteristicas, lo cual se usaria la imputacion usando el metodo “pmm”
Code
xyplot(imp_pmm, Ins ~ Prg + Glu + BlP + SkT + BMI + DPF + Age + Out, pch=18, cex=1)
realizando unos graficos de dispersion podemos observar que los datos originales y los imputados siguen la mismas tendencias.
Code
densityplot(imp_pmm)
Como se dijo previamente, los datos inputados siguen distribuciones muy similares a los datos originales.
Datos Atipicos
Histograma
Code
par(mfrow=c(2,4))hist(imp_pmm_df$Prg,xlab ="Prg",main ="Histogram of Prg ",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$Glu,xlab ="Glu",main ="Histogram of Glu",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$BlP,xlab ="BlP",main ="Histogram of BlP",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$SkT,xlab ="SkT",main ="Histogram of SkT",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$Ins,xlab ="Ins",main ="Histogram of Ins",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$BMI,xlab ="BMI",main ="Histogram of BMI",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$DPF,xlab ="DPF",main ="Histogram of DPF",breaks =sqrt(nrow(imp_pmm_df)))hist(imp_pmm_df$Age,xlab ="Age",main ="Histogram of Age",breaks =sqrt(nrow(imp_pmm_df)))
Se puede observar que la mayoria de caracteristicas son sesgadas a la izquierda, en la cual se pueden observar claros datos atipicos en SkT, en Age con un valor de 80, BMI con valores aproximadamente 70 y en INS valores por encima de los 600, lo cual teniendo en cuenta que en los datos originales casi el 50% eran faltantes, por medio de practicidad academica se dejara la variable, la cual es candidata a eliminar por la cantidad de datos faltantes.
Se eliminan los datos Atipicos encontrados y se asignan NA, para luego hacer imputacion de datos mediante el metodo pmm y tener unos datos sin valores atipicos.
A modo de practica academica se procedera a realizar las otras maneras de identificacion de datos atipicos de la columna “BIP” sin imputacion, solo extrayendo los valores atipicos.
Grubbs test for one outlier
data: imp_pmm_2_df$BMI
G = 2.70371, U = 0.99046, p-value = 1
alternative hypothesis: highest value 50 is an outlier
El valor p es de 1. Al nivel de significación del 5%, no rechazamos la hipótesis de que el valor más alto 50 no es un valor atípico. No tenemos evidencia suficiente para decir que 50 es un valor atípico.
Code
test <-grubbs.test(imp_pmm_2_df$BMI,opposite =TRUE)test
Grubbs test for one outlier
data: imp_pmm_2_df$BMI
G = 2.15842, U = 0.99392, p-value = 1
alternative hypothesis: lowest value 18.2 is an outlier
El valor p es de 1. Al nivel de significación del 5%, no rechazamos la hipótesis de que el valor más bajo 18.2 no es un valor atípico. No tenemos evidencia suficiente para decir que 18.2 es un valor atípico.
Prueba de Dixon
Code
#dado que la prueba dixon solo acepta conjuntos de datos de 3 a 30 obs se hace un sample en modo de demostraciontest <-dixon.test(sample(imp_pmm_2_df$BMI,30))test
Dixon test for outliers
data: sample(imp_pmm_2_df$BMI, 30)
Q = 0.096899, p-value = 0.3924
alternative hypothesis: highest value 47.9 is an outlier
El valor p es de 0.3536. Al nivel de significación del 5%, no rechazamos la hipótesis de que el valor más alto 45.6 no es un valor atípico. No tenemos evidencia suficiente para decir que 45.6 es un valor atípico.
Code
test <-dixon.test(sample(imp_pmm_2_df$BMI,30),opposite =TRUE)test
Dixon test for outliers
data: sample(imp_pmm_2_df$BMI, 30)
Q = 0.048913, p-value = 0.1211
alternative hypothesis: lowest value 21.8 is an outlier
El valor p es de 1. Al nivel de significación del 5%, no rechazamos la hipótesis de que el valor más bajo 21.8 no es un valor atípico. No tenemos evidencia suficiente para decir que 21.8 es un valor atípico. ### Prueba de Rosner
Code
test <-rosnerTest(imp_pmm_2_df$BMI, k =10)test$all.stats