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