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