Muchas gracias a todos por la ayuda. Por fin tuve tiempo de analizar las
respuestas. Mejoré el método evidentemente el mio sigue quedando
"farragoso" pero en forma de función queda mejor y aunque sigue siendo un
poco complicado de leer es bastante más bonito. Lo cierto es que debería
intentar aprender a programar de manera más elegante. Aun así os paso los
resultados por si los quereis mirar.

Muchas gracias a Rubén por las ideas que le he "robado" y a Javier por los
animos, de vez en cuando los necesitamos. Un placer, como siempre,
consultaros dudas.

PD: siente la tardanza en dar el feedback aunque más vale tarde que nunca


##############################################################################################################################
##############################################################################################################################

threshold = 2.5
###############################################################
# Solucion varianzas iguales
###############################################################

is.outlier <- function(X, INDEX, t.value = threshold) {
  res <- abs( rstudent(aov(X ~ INDEX, na.action = na.exclude))) > t.value
}

if(!require(ez)){
  install.packages("ez")
  require(ez)
}
data(ANT)

ANT$Factor <- interaction(ANT$cue, ANT$flank, ANT$location)

outls <- with(ANT, is.outlier(rt, Factor))

with(ANT, plot(as.numeric(Factor), rt, col = ifelse(outls, "red","black")))

# Puedes acceder a los datos sin atípìcos
ANT[!outls, ]
# quedarte con los indices con which, ...
ANT[outls, ]

data <-  ANT[outls, ]
data
dataT <- ANT

###############################################################
# Solucion varianzas diferentes
###############################################################

is.outlierCh <-  function(DATA, VAR, INDEX, threshold = qnorm(0.995), XLAB
="", YLAB =""){
  # DATA data matrix
  # VAR depende variable where locate outliers
  # INDEX factor for find
  # threshold level for outlier detection
  # XLAB x axis label
  # YLAB y axis label
  DATA[, paste(VAR,"Original",sep="")] <- DATA[,VAR] # save original data

  x <-  # save non outliers by condition
    by( data= DATA ,INDICES= DATA[,INDEX] ,FUN= function(x){
      # print(x[,INDEX][1])
      if(length( x[ abs(scale(x[,VAR]))> threshold & !is.na(x[,VAR]),
][,VAR] ) > 1){
        x[ abs(scale(x[,VAR]))> threshold & !is.na(x[,VAR]), ][,VAR] <- NA
# Quita los outliers que se van por encima de 2.5% en valor absoluto
        x[,VAR]
      }else{
        x[,VAR]
      }
    }
    )

  for(i in levels(DATA[,INDEX])){ # save data in data frame
    DATA[DATA[,INDEX] == i,] [,VAR] <-
      as.vector(x[[i]])
  }
  DATA[,VAR] <- as.numeric(DATA[,VAR])

  DATA$out <- F # variable outlier
  if(length(DATA[( DATA[, VAR] != DATA[, paste(VAR,"Original",sep="")] ) & !
is.na(DATA[, paste(VAR,"Original",sep="")]),]$out )>1 ){
    DATA[ is.na(DATA[, VAR]) & !is.na(DATA[,
paste(VAR,"Original",sep="")]),]$out <- T
  }

  par.df <- par(no.readonly = TRUE)
  par(las =2, cex.axis= 0.7)
  plot(as.numeric(DATA[, INDEX]), DATA[, paste(VAR,"Original",sep="")], col
= as.factor(DATA$out), xlab= XLAB, ylab= YLAB)
  axis(side=1, at= 1:length(levels(DATA[, INDEX])), labels=
abbreviate(levels(DATA[, INDEX]) ) )
  par(par.df)
  return(DATA)
}

###########################

data(ANT)

ANT$Factor <-# Crear el factor para quitar los outliers
  interaction(ANT$cue, ANT$flank, ANT$location)

###########################
# Comparandos gráficamente
###########################
d <- is.outlierCh(DATA= ANT, VAR="rt", INDEX="Factor", threshold= threshold
)
title("Solucion Javier")

with(dataT, plot(as.numeric(Factor), rt, col = ifelse(outls,
"red","black")))
title("Solucion Rubén")

###########################
# Diferentes ouliers encontrados
###########################
summary(row.names(data) %in% row.names(d[ is.na(d$rt) & !is.na(d$rtOriginal)
, ]))
data[!(row.names(data) %in% row.names(d[ is.na(d$rt) & !is.na(d$rtOriginal)
, ]) ),1:10]
# Metodo Ruben encuentra 10 ouliers que no lo son el de Javier

summary(row.names(d[ is.na(d$rt) & !is.na(d$rtOriginal)  , ]) %in%
row.names(data) )
d[ is.na(d$rt) & !is.na(d$rtOriginal)  , ][!( row.names(d[ is.na(d$rt) & !
is.na(d$rtOriginal)  , ]) %in% row.names(data) ),1:10]
# Metodo Javier encuentra 6 ouliers que no lo son el de Ruben


El 17 de enero de 2014, 12:00, <r-help-es-request@r-project.org> escribió:

> Envíe los mensajes para la lista R-help-es a
>         r-help-es@r-project.org
>
> Para subscribirse o anular su subscripción a través de la WEB
>         https://stat.ethz.ch/mailman/listinfo/r-help-es
>
> O por correo electrónico, enviando un mensaje con el texto "help" en
> el asunto (subject) o en el cuerpo a:
>         r-help-es-request@r-project.org
>
> Puede contactar con el responsable de la lista escribiendo a:
>         r-help-es-owner@r-project.org
>
> Si responde a algún contenido de este mensaje, por favor, edite la
> linea del asunto (subject) para que el texto sea mas especifico que:
> "Re: Contents of R-help-es digest...". Además, por favor, incluya en
> la respuesta sólo aquellas partes del mensaje a las que está
> respondiendo.
>
>
> Asuntos del día:
>
>    1. Re: Quitar outliers por condición (rubenfcasal)
>    2. Re: Quitar outliers por condición (Marcuzzi, Javier Rubén)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 16 Jan 2014 13:49:38 +0100
> From: rubenfcasal <rubenfcasal@gmail.com>
> To: r-help-es@r-project.org
> Subject: Re: [R-es] Quitar outliers por condición
> Message-ID: <52D7D562.3000904@gmail.com>
> Content-Type: text/plain
>
> Hola Javier,
>
>      Por curiosidad me dio por pensar como lo haría yo...
>
>      En primer lugar yo devolvería un vector de lógicos para disponer de
> más opciones (eliminar o detectar atípicos). En segundo lugar en
> condiciones normales emplearía los residuos (estudentizados) de un
> modelo adecuado a los datos.
>      Ten en cuenta también que con el valor crítico que empleas, incluso
> en datos sin atípicos, tenderías a filtrar un 5% de los datos. Yo
> tomaría qnorm(0.995) o incluso directamente un valor de 3 (p.e. si hay
> muchos datos). Además si hay atípicos estos pueden influir mucho al
> tipificar los datos (estimación varianza), por lo que recomiendo
> estudentizar.
>
>      En principio (no está muy testeado) yo haría lo siguiente (una de
> las diferencias con lo que proponías es que se supone igualdad de
> varianzas):
>
> is.outlier <- function(X, INDEX, t.value = qnorm(0.995)) {
>      res <- abs( rstudent(aov(X ~ INDEX, na.action = na.exclude))) >
> t.value
> }
>
> if(!require(ez)){
>    install.packages("ez")
>    require(ez)
> }
> data(ANT)
>
> ANT$Factor <- interaction(ANT$cue, ANT$flank, ANT$location)
>
> outls <- with(ANT, is.outlier(rt, Factor, t.value = 3))
>
> with(ANT, plot(as.numeric(Factor), rt, col = ifelse(outls, "red","black")))
>
> # Puedes acceder a los datos sin atípìcos
> ANT[!outls, ]
> # quedarte con los indices con which, ...
>
>      Un saludo,
>          Rubén.
>
> El 16/01/2014 11:22, Javier Villacampa González escribió:
> > Hola buenos días,
> >
> > ahora mismo estaba haciendo una función para quitar outlier por
> condición.
> > Pero lo cierto es que aunque la función consigue quitarlos creo que me ha
> > quedad bastante farragoso. Os dejo el codigo y si me dais algún consejo
> > para mejorarlo mejor que mejor. Mcuhas gracias
> >
> >
> > #############################################################.
> > # Ojo este script puede instalarte librerias que no quieres
> >
> > if(!require(ez)){
> >    install.packages("ez")
> > }
> > require(ez)
> > data(ANT)
> >
> > ANT$Factor <-# Crear el factor para quitar los outliers
> >    interaction(ANT$cue, ANT$flank, ANT$location)
> >
> > y <- ANT$rt # save original data
> > x <-  # save non outliers by condition
> >    by( data= ANT ,INDICES= ANT$Factor,FUN= function(x){
> >      print(x$Factor[1])
> >
> >      if(length( x[ abs(scale(x$rt))> qnorm(0.975) & !is.na(x$rt) , ]$rt
> ) >
> > 1){
> >        x[ abs(scale(x$rt))> qnorm(0.975) & !is.na(x$rt), ]$rt <- NA #
> Quita
> > los outliers que se van por encima de 2.5% en valor absoluto
> >        x$rt
> >      }else{
> >        x$rt
> >      }
> >    }
> >    )
> > x
> > for(i in levels(ANT$Factor)){
> >    ANT[ ANT$Factor == i,]$rt <-
> >      as.vector(x[[i]])
> > }
> >
> > ANT$rt <- as.numeric(ANT$rt)
> > ANT$rtOriginal <- y
> >
> > rm(x,y)
> >
> >
> > head(ANT, 15)
> >
> > # El valor 14 es un otulier no muy extremo pero lo es.
> > --
> >
> >       [[alternative HTML version deleted]]
> >
> >
> >
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es@r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
>         [[alternative HTML version deleted]]
>
>
>
> ------------------------------
>
> Message: 2
> Date: Fri, 17 Jan 2014 07:26:14 -0300
> From: "Marcuzzi, Javier Rubén"  <javier.ruben.marcuzzi@gmail.com>
> To: r-help-es@r-project.org
> Subject: Re: [R-es] Quitar outliers por condición
> Message-ID: <52D90546.3080708@gmail.com>
> Content-Type: text/plain
>
> Estimado Javier Villacampa González
>
> No sabía el uso de la palabra farragoso, entonces consulte (adj. Confuso
> por tener muchas cosas desordenadas o superfluas:) , bueno, que poder
> decir, by, if, for, no conozco todos los lenguajes de programación pero
> casi podría pensar que en todos los conficionales usan estos recursos,
> yo entendí el código, se podría mejorar, optimizar, pero ¿si funciona
> como uno lo piensa y la computadora lo "piensa" igual, para que
> complicarse la vida?
>
> ¿Confuso?, yo lo entendí, ¿desordenado?, los condicionales tienen lógica
> que yo comprendí, ¿útil?, hace lo que necesita.
>
> Es mi pensamiento, como también sería muy bueno que sobre lo que usted
> comparte aparezcan mejoras de otras personas.
>
> Javier Marcuzzi
>
> El 16/01/2014 07:22 a.m., Javier Villacampa González escribió:
> > Hola buenos días,
> >
> > ahora mismo estaba haciendo una función para quitar outlier por
> condición.
> > Pero lo cierto es que aunque la función consigue quitarlos creo que me ha
> > quedad bastante farragoso. Os dejo el codigo y si me dais algún consejo
> > para mejorarlo mejor que mejor. Mcuhas gracias
> >
> >
> > #############################################################.
> > # Ojo este script puede instalarte librerias que no quieres
> >
> > if(!require(ez)){
> >    install.packages("ez")
> > }
> > require(ez)
> > data(ANT)
> >
> > ANT$Factor <-# Crear el factor para quitar los outliers
> >    interaction(ANT$cue, ANT$flank, ANT$location)
> >
> > y <- ANT$rt # save original data
> > x <-  # save non outliers by condition
> >    by( data= ANT ,INDICES= ANT$Factor,FUN= function(x){
> >      print(x$Factor[1])
> >
> >      if(length( x[ abs(scale(x$rt))> qnorm(0.975) & !is.na(x$rt) , ]$rt
> ) >
> > 1){
> >        x[ abs(scale(x$rt))> qnorm(0.975) & !is.na(x$rt), ]$rt <- NA #
> Quita
> > los outliers que se van por encima de 2.5% en valor absoluto
> >        x$rt
> >      }else{
> >        x$rt
> >      }
> >    }
> >    )
> > x
> > for(i in levels(ANT$Factor)){
> >    ANT[ ANT$Factor == i,]$rt <-
> >      as.vector(x[[i]])
> > }
> >
> > ANT$rt <- as.numeric(ANT$rt)
> > ANT$rtOriginal <- y
> >
> > rm(x,y)
> >
> >
> > head(ANT, 15)
> >
> > # El valor 14 es un otulier no muy extremo pero lo es.
> > --
> >
> >       [[alternative HTML version deleted]]
> >
> >
> >
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es@r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
>         [[alternative HTML version deleted]]
>
>
>
> ------------------------------
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
> Fin de Resumen de R-help-es, Vol 59, Envío 18
> *********************************************
>



--

	[[alternative HTML version deleted]]

