我正在搜索John Tukey算法,该算法使用R进行线性回归计算“抗性线”或“中位数线”。
邮件列表中的学生用以下术语解释此算法:
“它的计算方式是划分 把数据分成三组,找到了 x-中值和y-中值(称为 每个小组的总结点,和 然后使用这三个摘要点 确定线。外面两个 总结点确定坡度, 并且平均所有这些 确定截距。“
关于John tukey好奇的中位数中位数的文章:http://www.johndcook.com/blog/2009/06/23/tukey-median-ninther/
你知道我在哪里可以找到这个算法或R函数吗?在哪些包中, 非常感谢!
答案 0 :(得分: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)))
方法不起作用。
答案 1 :(得分:2)
我参加派对的时间有点晚了,但是您是否尝试过stats包中的line()?
来自帮助文件:
<强>值强>
“tukeyline”类的对象。
<强>参考强>
Tukey,J。W.(1977)。探索性数据分析,阅读马萨诸塞州:Addison-Wesley。
答案 2 :(得分:2)
作为R Core团队的成员,我现在已经深入挖掘了源代码,并研究了它的历史。
结论:源代码C源代码,在19961997中添加,当R仍然被称为alpha(和版本0.14alpha)时,已经计算出的分位数不完全正确...对于某些样本大小。
有关R邮件列表(尚未)的更多信息。