¿Puede scipy.stats identificar y enmascarar valores atípicos obvios?

Con scipy.stats.linregress estoy realizando una regresión lineal simple en algunos conjuntos de datos experimentales de x, y altamente correlacionados, e inicialmente inspecciono visualmente cada diagtwig de dispersión de x, y para valores atípicos. De manera más general (es decir, mediante progtwigción), ¿hay una manera de identificar y enmascarar los valores atípicos?

El paquete statsmodels tiene lo que necesitas. Mira este pequeño fragmento de código y su salida:

 # Imports # import statsmodels.api as smapi import statsmodels.graphics as smgraphics # Make data # x = range(30) y = [y*10 for y in x] # Add outlier # x.insert(6,15) y.insert(6,220) # Make graph # regression = smapi.OLS(x, y).fit() figure = smgraphics.regressionplots.plot_fit(regression, 0) # Find outliers # test = regression.outlier_test() outliers = ((x[i],y[i]) for i,t in enumerate(test) if t[2] < 0.5) print 'Outliers: ', list(outliers) 

Figura de ejemplo 1

Outliers: [(15, 220)]

Editar

Con la nueva versión de statsmodels , las cosas han cambiado un poco. Aquí hay un nuevo fragmento de código que muestra el mismo tipo de detección de valores atípicos.

 # Imports # from random import random import statsmodels.api as smapi from statsmodels.formula.api import ols import statsmodels.graphics as smgraphics # Make data # x = range(30) y = [y*(10+random())+200 for y in x] # Add outlier # x.insert(6,15) y.insert(6,220) # Make fit # regression = ols("data ~ x", data=dict(data=y, x=x)).fit() # Find outliers # test = regression.outlier_test() outliers = ((x[i],y[i]) for i,t in enumerate(test.icol(2)) if t < 0.5) print 'Outliers: ', list(outliers) # Figure # figure = smgraphics.regressionplots.plot_fit(regression, 1) # Add line # smgraphics.regressionplots.abline_plot(model_results=regression, ax=figure.axes[0]) 

Figura de ejemplo 2

Outliers: [(15, 220)]

scipy.stats no tiene nada directamente para los valores atípicos, así que responda a algunos enlaces y publicidad de statsmodels (que es un complemento de estadísticas para scipy.stats)

para identificar los valores atípicos

http://jpktd.blogspot.ca/2012/01/influence-and-outlier-measures-in.html

http://jpktd.blogspot.ca/2012/01/anscombe-and-diagnostic-statistics.html

http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.outliers_influence.OLSInfluence.html

En lugar de enmascarar, un mejor enfoque es utilizar un estimador robusto.

http://statsmodels.sourceforge.net/devel/rlm.html

con ejemplos, donde desafortunadamente las plots no se muestran actualmente http://statsmodels.sourceforge.net/devel/examples/generated/tut_ols_rlm.html

RLM reduce los valores atípicos. Los resultados de la estimación tienen un atributo de weights y, para los valores atípicos, las ponderaciones son más pequeñas que 1. Esto también se puede utilizar para encontrar valores atípicos. RLM también es más robusto si hay varios valores atípicos.

De manera más general (es decir, mediante progtwigción), ¿hay una manera de identificar y enmascarar los valores atípicos?

Existen varios algoritmos de detección de valores atípicos; scikit-learn implementa algunos de ellos.

[Descargo de responsabilidad: soy un colaborador de scikit-learn.]

También es posible limitar el efecto de los valores atípicos utilizando scipy.optimize.least_squares . Especialmente, eche un vistazo al parámetro f_scale :

Valor del margen blando entre los residuos inlier y outlier, por defecto es 1.0 … Este parámetro no tiene efecto con la pérdida = ‘lineal’, pero para otros valores de pérdida es de crucial importancia.

En la página, comparan 3 funciones diferentes: los least_squares normales y dos métodos que involucran f_scale :

 res_lsq = least_squares(fun, x0, args=(t_train, y_train)) res_soft_l1 = least_squares(fun, x0, loss='soft_l1', f_scale=0.1, args=(t_train, y_train)) res_log = least_squares(fun, x0, loss='cauchy', f_scale=0.1, args=(t_train, y_train)) 

Comparación de cuadrados mínimos

Como puede verse, los mínimos cuadrados normales se ven mucho más afectados por los valores atípicos de los datos, y puede valer la pena jugar con diferentes funciones de loss en combinación con diferentes f_scales . Las posibles funciones de pérdida son (tomadas de la documentación):

 'linear' : Gives a standard least-squares problem. 'soft_l1': The smooth approximation of l1 (absolute value) loss. Usually a good choice for robust least squares. 'huber' : Works similarly to 'soft_l1'. 'cauchy' : Severely weakens outliers influence, but may cause difficulties in optimization process. 'arctan' : Limits a maximum loss on a single residual, has properties similar to 'cauchy'. 

El libro de cocina Scipy tiene un tutorial limpio sobre regresión no lineal robusta.