# Elimina outliers si son significativamente distintos de la media.
# Comprueba si la distribución es normal antes de empezar
# Usa test de Grubbs para eliminar outliers
# Devuelve los datos sin outliers
# x: Vector que contiene los datos
# p.o: nivel de significación para eliminar outliers
# p.n: nivel de significación para el test de distribución normal
# norm.test: Indica si se realizará el test de normalidad (T / F)
del.outliers <- function(x, p.g=0.05, p.n=0.01, norm.test=T) {
if(!is.vector(x) || !is.numeric(x)) {
cat("El argumento debe ser un vector numérico\n")
return(invisible(NULL))
}
if(norm.test) {
norm <- shapiro.test(x)
if (norm$p.value <= p.n ) {
cat("La distribución no es normal.
Programa interrumpido\n")
return(norm)
}
}
if (!require(outliers)) {
r<- readline("Se necesita la librería 'outliers'.\n
¿Instalar? (s/n): ")
if (r=="S" || r == "s") {
install.packages("outliers")
} else {
return("Programa terminado\n")
}
}
ou <- 0
i <- 0
n <- length(x)
repeat {
if(grubbs.test(x)$p.value <= p.g) {
i <- i + 1
ou[i] <- outlier(x)
x <- rm.outlier(x)
} else {
n <- n - length(x)
if ( n == 1){
cat("Se ha eliminado 1 outlier:\n",ou)
} else {
if (n == 0) {
cat("No se ha eliminado ningún outlier\n")
} else {
cat("Se han eliminado",n,"outliers:\n",ou)
}
}
return(invisible(x))
}
}
}