2010-07-11 17 views
7

Estoy buscando el algoritmo de John Tukey que calcule una "línea resistente" o "línea mediana-mediana" en mi regresión lineal con R.John Tukey "mediana mediana" (o "línea resistente") prueba estadística para R y regresión lineal

un estudiante en una lista mailling explicar este algoritmo en estos términos:

"la forma en que se calcula es dividir los datos en tres grupos, encontrar el x-mediana y y-media valores (llamados el punto de resumen) para cada grupo, y luego use esos tres puntos de resumen para determinar la línea. Los dos puntos de resumen exteriores determinar la pendiente, y un promedio de todos ellos determina la intersección "

artículo sobre la mediana mediana de John Tukey para curiosos:. http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

¿Tiene una idea de donde podría encontrar este algoritmo o R función? En qué paquetes, muchas gracias!

+0

En realidad, la función 'line' hace exactamente eso. O debería ... –

Respuesta

11

Hay una descripción de cómo calcular la línea mediana-mediana here. una implementación R de que es

median_median_line <- function(x, y, data) 
{ 
    if(!missing(data)) 
    { 
    x <- eval(substitute(x), data) 
    y <- eval(substitute(y), data) 
    } 

    stopifnot(length(x) == length(y)) 

    #Step 1 
    one_third_length <- floor(length(x)/3) 
    groups <- rep(1:3, times = switch((length(x) %% 3) + 1, 
    one_third_length, 
    c(one_third_length, one_third_length + 1, one_third_length), 
    c(one_third_length + 1, one_third_length, one_third_length + 1) 
)) 

    #Step 2 
    x <- sort(x) 
    y <- sort(y) 

    #Step 3 
    median_x <- tapply(x, groups, median)         
    median_y <- tapply(y, groups, median) 

    #Step 4 
    slope <- (median_y[3] - median_y[1])/(median_x[3] - median_x[1]) 
    intercept <- median_y[1] - slope * median_x[1] 

    #Step 5 
    middle_prediction <- intercept + slope * median_x[2] 
    intercept <- intercept + (median_y[2] - middle_prediction)/3 
    c(intercept = unname(intercept), slope = unname(slope)) 
} 

Para probarlo, aquí está el segundo ejemplo de esa página:

dfr <- data.frame(
    time = c(.16, .24, .25, .30, .30, .32, .36, .36, .50, .50, .57, .61, .61, .68, .72, .72, .83, .88, .89), 
    distance = c(12.1, 29.8, 32.7, 42.8, 44.2, 55.8, 63.5, 65.1, 124.6, 129.7, 150.2, 182.2, 189.4, 220.4, 250.4, 261.0, 334.5, 375.5, 399.1)) 

median_median_line(time, distance, dfr) 
#intercept  slope 
# -113.6  520.0 

Nota la forma un poco extraña de especificar los grupos. Las instrucciones son bastante delicadas sobre cómo se definen los tamaños de grupo, por lo que el método más obvio de cut(x, quantile(x, seq.int(0, 1, 1/3))) no funciona.

+0

¡Guau! ¡¡¡Muchísimo Richie Cotton !! Es perfecto;) – reyman64

+0

dfr <- data.frame ( time = c (.16, .24, .25, .30, .30, .32, .36, .36, .50, .50, .57, .61, .61, .68, .72, .72, .83, .88, .89), distancia = c (12.1, 29.8, 32.7, 42.8, 44.2, 55.8, 63.5, 65.1, 124.6, 129.7, 150.2, 182.2, 189.4, 220.4, 250.4, 261.0, 334.5, 375.5, 399.1)); línea (dfr); da una respuesta diferente. –

2

Llego un poco tarde a la fiesta, pero ¿has probado line() desde el paquete de estadísticas?

Desde el archivo de ayuda:

Valor

Un objeto de la clase "tukeyline".

Referencias

Tukey, J. W. (1977). Análisis exploratorio de datos, Reading Massachusetts: Addison-Wesley.

+2

Versión enmendada de mi comentario original del 16 de enero: Un poco de experimentación con 'line' en 9 puntos de datos sugiere que esta puede no ser la línea mediana-mediana como se da normalmente. De hecho, si permites que tanto x como y sean 1: 9 (todos los puntos se encuentran en una línea con pendiente 1), ¡la línea tiene una pendiente de 1.2! Aunque originalmente pensé que tal vez la función implementaba alguna otra línea que la línea resistente Tukey (línea mediana-mediana), ahora sospecho que se pretende que sea esa línea, y esto es simplemente un error en la función 'línea'. –

2

Como miembro del equipo R Core, ahora investigué el código fuente y también estudié su historia.

Conclusión: El código fuente fuente C, agregado en 19961997, cuando R todavía se llamaba alfa (y alrededor de la versión 0.14alpha) ya calculó los cuantiles no del todo ... para algunos tamaños de muestra.

Más sobre esto en las listas de distribución R (aún no).

Cuestiones relacionadas