# 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))
    }
  }
}