Skip to content

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

1 message · Xavi de Blas

#
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>: