我有下表R
df <- structure(list(x = structure(c(12458, 12633, 12692, 12830, 13369,
13455, 13458, 13515), class = "Date"), y = c(6080, 6949, 7076,
7818, 0, 0, 10765, 11153)), .Names = c("x", "y"), row.names = c("1",
"2", "3", "4", "5", "6", "8", "9"), class = "data.frame")
> df
x y
1 2004-02-10 6080
2 2004-08-03 6949
3 2004-10-01 7076
4 2005-02-16 7818
5 2006-08-09 0
6 2006-11-03 0
8 2006-11-06 10765
9 2007-01-02 11153
我可以通过以下方式绘制点和 Tukey 的线性拟合(line函数 in R)
plot(data=df, y ~ x)
lines(df$x, line(df$x, df$y)$fitted.values)
产生:

一切都好。上图显示了能耗值,预计只会增加,所以我很高兴拟合没有通过这两个点(随后将被标记为异常值)。
但是,“只是”删除最后一点并重新绘制
df <- df[-nrow(df),]
plot(data=df, y ~ x)
lines(df$x, line(df$x, df$
)$fitted.values)
结果完全不同。

我的需要是在上述两种情况下都有理想的相同结果。R 似乎还没有准备好使用函数进行单调回归,isoreg但除此之外它是分段常数。
编辑:
正如@Glen_b 指出的那样,对于上面使用的回归技术,异常值与样本大小的比率太大(~28%)。但是,我相信可能还有其他需要考虑的事情。如果我在表的开头添加点:
df <- rbind(data.frame(x=c(as.Date("2003-10-01"), as.Date("2003-12-01")), y=c(5253,5853)), df)
并像上面一样重新计算plot(data=df, y ~ x); lines(df$x, line(df$x,df$y)$fitted.values)我得到相同的结果,比率约为 22%

