Джон Тьюки "медиана" (или "линия сопротивления") статистический тест для R и линейной регрессии - PullRequest
7 голосов
/ 12 июля 2010

Я ищу алгоритм Джона Тьюки, который вычисляет «устойчивую линию» или «срединно-срединную линию» в моей линейной регрессии с помощью R.

Учащийся в списке рассылки объясняет этот алгоритм в следующих терминах:

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

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

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

Ответы [ 3 ]

11 голосов
/ 12 июля 2010

Здесь описано, как рассчитать срединно-срединную линию здесь Реализация 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))) не работает.

2 голосов
/ 19 декабря 2014

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

Вывод: исходный код C, добавленный в 19961997 году, когда R еще назывался альфа (и около версии 0.14 альфа), уже не совсем правильно вычислил квантили ... для некоторых размеров выборки.

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

2 голосов
/ 31 мая 2013

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

Из файла помощи:

Значение

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

Ссылки

Tukey, JW (1977).Исследовательский анализ данных, Рединг, Массачусетс: Аддисон-Уэсли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...