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