8

Rを使用した線形回帰で「耐性線」または「中央値-中央値線」を計算するJohn Tukeyアルゴリズムを検索しています.

メーリング リストの学生が、このアルゴリズムを次の用語で説明しています。

「計算方法は、データを 3 つのグループに分割し、各グループの x 中央値と y 中央値 (要約点と呼ばれる) を見つけ、それらの 3 つの要約点を使用して線を決定することです。外側の 2 つの要約ポイントが勾配を決定し、それらすべての平均がインターセプトを決定します。」

John tukey's median median for Curious に関する記事: http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/

このアルゴリズムまたはR関数をどこで見つけることができるか考えていますか? どのパッケージで、ありがとうございました !

4

3 に答える 3

12

中央値-中央線の計算方法の説明がここにあります。それの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)))機能しません。

于 2010-07-12T13:36:28.903 に答える
2

R コア チームのメンバーとして、私は現在、ソース コードを掘り下げ、その歴史も研究しています。

結論: 1996 年に追加されたソース C ソース コードは、R がまだアルファ (およびバージョン 0.14alpha 前後) と呼ばれていた 1996 年 1997 年に追加されました。

これについては、R メーリング リストで詳しく説明します (まだ)。

于 2014-12-19T17:18:37.587 に答える