Javier Villacampa González
2014-Feb-04 11:02 UTC
[R-es] Resumen de R-help-es, Vol 59, Envío 18
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])), labelsabbreviate(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]]