2010-07-11 2 views
7

Я ищу алгоритм John Tukey, который вычисляет «устойчивую линию» или «медианную медианную линию» на моей линейной регрессии с Р.Джон Туки «медианная медиана» (или «устойчивая линия») статистический тест для R и линейной регрессии

студента в списке mailling объяснить этот алгоритм в этих терминах:

«путь это вычисленный разделить данных на три группы, найти х-срединную и у-медианы значения (называемые суммарной точкой) для каждой группы и , затем используйте эти три сводные точки для определить линию. Два внешние сводных точки определяют наклон, и в среднее они все определяют перехватывать «

Статьи о средних медианах Тьюков для любопытного:. http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

У вас есть представление о том, где я мог бы найти этот алгоритм или R функцию? в какие пакеты, большое спасибо!

+0

На самом деле функция 'line' делает именно это. Или нужно ... –

ответ

11

Там есть описание того, как вычислить медиану-срединной линии here. реализация R этого является

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

Чтобы проверить это, вот второй пример с этой страницы:

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 

Обратите внимание на несколько странным способом определения групп. Инструкции довольно разборчивы в том, как вы определяете размеры групп, поэтому более очевидный метод cut(x, quantile(x, seq.int(0, 1, 1/3))) не работает.

+0

Вау! Thx много Ричи Хлопок !! Совершенно;) – reyman64

+0

dfr <- data.frame ( время = 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)), строка (dfr); дает другой ответ. –

2

Я немного опоздал на вечеринку, но вы пробовали строку() из пакета статистики?

От HelpFile:

Значение

Объект класса "tukeyline".

Ссылки

Тьюки, Дж У. (1977). Анализ разведочных данных, Чтение Массачусетс: Эддисон-Уэсли.

+2

Измененная версия моего оригинального комментария от 16 января: Немного экспериментируя с 'line' на 9 точках данных, это говорит о том, что это, возможно, не средняя медианная линия, как обычно. На самом деле, если вы дадите x и y равным 1: 9 (все точки лежат на линии со скруглением 1), линия имеет наклон 1,2! Хотя я изначально думал, что, возможно, функция реализовала какую-то другую линию, чем линия устойчивости Tukey (медианная медиана), теперь я подозреваю, что она намерена быть той линией, и это просто ошибка в функции 'line'. –

2

Будучи членом команды R Core, я теперь выкопал исходный код, а также изучил его историю.

Заключение: исходный исходный код C, добавленный в 1996 году1997, когда R по-прежнему назывался альфа (и около версии 0.14alpha), уже вычислил квантили не совсем правильно ... для некоторых размеров выборки.

Подробнее об этом в списках рассылки R (еще нет).

Смежные вопросы