Xavi de Blas
2009-Dec-10 20:20 UTC
[R-es] Detectar outliers en un gráfico de dispersión SOLUCION
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 >> >