2010-07-11 1 views
7

Sto cercando l'algoritmo di John Tukey che calcola una "linea resistente" o "linea mediana-mediana" sulla mia regressione lineare con R.John Tukey "median median" (o "linea resistente") test statistico per R e regressione lineare

uno studente su un elenco mailling spiegare questo algoritmo in questi termini:

"il modo in cui è calcolata è di dividere i dati in tre gruppi, trovare la x-mediana e y-mediana valori (chiamato il punto di riepilogo) per ciascun gruppo e quindi utilizzare questi tre punti di riepilogo su determinare la linea. I due esterni punti di sintesi determinare la pendenza, e una media di tutti loro determina l'intercetta "

Articolo sulla mediana mediana di John Tukey per curiosità:. http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

Avete un'idea di dove ho potuto trovare questa funzione algoritmo o R? In quali pacchetti, Grazie mille!

+0

In realtà, la funzione 'line' fa esattamente questo. O dovrebbe ... –

risposta

11

C'è una descrizione di come calcolare la linea mediana-mediana here. Un'implementazione R di questo è

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)) 
} 

Per provarlo, ecco il secondo esempio da quella pagina:

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 il modo un po 'strano di specificare i gruppi. Le istruzioni sono piuttosto schizzinose su come si definiscono le dimensioni dei gruppi, quindi il metodo più ovvio di cut(x, quantile(x, seq.int(0, 1, 1/3))) non funziona.

+0

Wow! Grazie mille Richie Cotton !! È perfetto;) – 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), distanza = 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)); linea (dfr); dà una risposta diversa. –

2

Sono un po 'in ritardo per la festa, ma hai provato line() dal pacchetto delle statistiche?

Dal fileguida:

Valore

un oggetto della classe "tukeyline".

Referenze

Tukey, J. W. (1977). Analisi esplorativa dei dati, lettura del Massachusetts: Addison-Wesley.

+2

Versione modificata del mio commento originale del 16 gennaio: Un piccolo esperimento con 'line' su 9 punti di dati suggerisce che questa potrebbe non essere la linea mediana-mediana normalmente fornita. Infatti, se si lascia che sia xey sia 1: 9 (tutti i punti si trovano su una linea con pendenza 1), la linea ha pendenza 1.2! Mentre inizialmente pensavo che forse la funzione avesse implementato qualche altra linea rispetto alla linea resistente di Tukey (linea mediana-mediana), ora sospetto che sia intenzionalmente quella linea, e questo è semplicemente un bug nella funzione 'line'. –

2

Come membro del team R Core, ora ho inserito il codice sorgente e studiato anche la sua storia.

Conclusione: il codice sorgente sorgente C, aggiunto nel 19961997, quando R era ancora chiamato alfa (e intorno alla versione 0.14alpha) già calcolato i quantili non abbastanza correttamente ... per alcune dimensioni del campione.

Ulteriori informazioni sulla mailing list R (non ancora).