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]]

