[R-es] Detectar outliers en un gráfico de dispersión SOLUCION

Xavi de Blas xaviblas en gmail.com
Jue Dic 10 21:20:40 CET 2009


Bueno, ya lo he solucionado gracias a Carlos

me ha enviado un correo en privado (supongo que se ha despistado, si
no lo querías hacer público ya es tarde) con esta info:

--
Creo que lo tienes (en formato básico) aquí:

https://stat.ethz.ch/pipermail/r-help/2007-November/146285.html

Aunque pensaba que si tu objetivo último es el de que usuarios
"potencialmente tontos" sean capaces de usar un software y arreglar
una regresión (con todo lo que conlleva), tal vez un método "robusto",
como el descrito en

http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-robust-regression.pdf

puede resultar más automático y evita en determinados casos la
manipulación manual (valga la redundancia) de los datos.

En el ejemplo de ese articulillo verás tres "regresiones": una con
todos los puntos, otra quitando dos y una tercera usando un método
robusto...
--

Así que he seguido el primer método. En mi caso me he dado cuenta de
que no es tan importante que los outliers se pinten diferente y no se
tengan en cuenta en la correlación, pues con la presente solución el
usuario los puede advertir y seleccionar para que no sean tenidos en
cuenta desde mi soft. La solución (por si le sirve a alguien) es:

--
serie0 <- c(0.651, 0.712, 0.614, 0.645, 0.559, 0.647, 0.642, 0.534,
0.616, 0.621, 0.623)
serie1 <- c(0.572, 0.641, 0.565, 0.596, 0.518, 0.604, 0.602, 0.501,
0.58, 0.589, 0.596)
data <- cbind(serie0, serie1)
colnames(data) <- c('ABK', 'CMJ')
rownames(data) <- c('CV', 'JN', 'MM', 'AT', 'NS', 'JA', 'SR', 'PC',
'JS', 'CB', 'AG')
colors=gray.colors(length(rownames(data)))
rang <- c(1:length(rownames(data)))

plot(serie0,serie1,xlim=c(min(serie0),max(serie0)),ylim=c(min(serie1),max(serie1)),
pch=rang, col='black', xlab='ABK', ylab='CMJ')
legend('bottomright' ,legend=rownames(data), pch=rang, col='black', cex=.7)
title(main='IUB (abk-cmj)/cmj *100 (XY)',
sub=paste('correlation:',cor(serie0,serie1)), cex.sub=0.75,
font.sub=3, col.sub='grey30')

mylm<-lm(serie1~serie0)
abline(mylm,col="red")

newx<-seq(min(serie0),max(serie0),length.out=length(serie0))
prd<-predict(mylm,newdata=data.frame(serie0=newx),interval =
c("confidence"), level = 0.90,type="response")

lines(newx,prd[,3],col="red",lty=2)
lines(newx,prd[,2],col="red",lty=2)

text(newx[1],prd[1,3],"90%", cex=0.6)
text(newx[1],prd[1,2],"90%", cex=0.6)
text(newx[length(newx)],prd[length(newx),3],"90%", cex=0.6)
text(newx[length(newx)],prd[length(newx),2],"90%", cex=0.6)
--


Gracias a todos




2009/12/10 Carlos J. Gil Bellosta <cgb en datanalytics.com>:
> Hola, ¿qué tal?
>
> Si tu regresión es
>
> lm.00 <- lm(serie1 ~ serie0),
>
> entonces
>
> stdres( lm.00 )
>
> es decir, los residuos estandarizados, "deberían" ser normales (de
> hecho, haz plot( lm.00 ) ) con media 0 y varianza unitaria.
>
> Si escribes
>
> which( abs( stdres( lm.00 ) ) > mi.umbral  )
>
> obtendrás los "outliers" dependiendo de tu umbral.
>
> Nada garantiza, sin embargo, que tus residuos sean normales...
>
> Un saludo,
>
> Carlos J. Gil Bellosta
> http://www.datanalytics.com
>
>
>
>
> El día 10 de diciembre de 2009 18:19, Xavi de Blas
> <xaviblas en gmail.com> escribió:
>> Hola amigos, esta es mi primera duda, espero que no sea demasiado fácil.
>>
>> Tengo unos datos de dos variables y quiero mostrar recta de regresión
>> y valor de correlación
>>
>> serie0 <- c(0.651, 0.712, 0.614, 0.645, 0.559, 0.647, 0.642, 0.534,
>> 0.616, 0.621, 0.623)
>> serie1 <- c(0.572, 0.641, 0.565, 0.596, 0.518, 0.604, 0.602, 0.501,
>> 0.58, 0.589, 0.596)
>> data <- cbind(serie0, serie1)
>> colnames(data) <- c('ABK', 'CMJ')
>> rownames(data) <- c('CV', 'JN', 'MM', 'AT', 'NS', 'JA', 'SR', 'PC',
>> 'JS', 'CB', 'AG')
>> colors=gray.colors(length(rownames(data)))
>> rang <- c(1:length(rownames(data)))
>> plot(serie0, serie1, pch=rang, col='black', xlab='ABK', ylab='CMJ')
>> abline(lm(serie1 ~ serie0),col='grey30')
>> legend('bottomright' ,legend=rownames(data), pch=rang, col='black', cex=.7)
>> title(main='IUB (abk-cmj)/cmj *100 (XY)',
>> sub=paste('correlation:',cor(serie0,serie1)), cex.sub=0.75,
>> font.sub=3, col.sub='grey30')
>>
>> ¿cómo podría identificar de forma automatizada los datos atípicos
>> (outliers)?. Me gustaría poder:
>> -pintarlos de otro color
>> -excluirlos de la recta de regresión
>> -excluirlos de la correlación
>>
>> me preocupa sólo la identificación, porque el resto de código ya puedo hacerlo.
>>
>> he cargado el paquete outliers, pero con lo poco que lo conozco sólo
>> encuentro métodos que me devuelven un outlier y no varios (si los hay)
>>
>> http://rss.acs.unt.edu/Rdoc/library/outliers/html/00Index.html
>>
>> gracias, saludos
>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es en r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>



Más información sobre la lista de distribución R-help-es