R的isoreg函数比唯一的拟合值产生更多的节

时间:2018-08-18 05:51:56

标签: c r floating-point regression

我一直在使用R的isoreg函数,但遇到了一个问题:该函数产生的结数比唯一的拟合值还要多。

从R帮助中,

  

iKnots [是]整数矢量,它给出了拟合曲线跳跃处的索引,即凸次要点有扭结的地方

我相信我对问题的原因有所了解,并且有一个可重现的示例:

# Demonstrating the problem
set.seed(100)
x<-runif(88000,0,1)
x<-x[order(x)]
y<- c(rep(c(0.1000001,0.1000000),11000),rep(c(0.1000002,0.1000003),11000),rep(c(0.2000002,0.2000003),11000),rep(1,22000))
plot(test<-isoreg(x,y))
length(unique(test$yf))
length(test$iKnots)

# Evidence of a floating point arithmetic problem
unique(test$yf)
print(c(unique(test$yf)[1],unique(test$yf)[2]),digits=18)
unique(test$yf)[1]==unique(test$yf)[2]
print(c(unique(test$yf)[4],unique(test$yf)[5]),digits=18)
unique(test$yf)[4]==unique(test$yf)[5]}

这是此示例生成的图: enter image description here

您会看到R的isoreg函数正在识别比其应有的结更多的结(图中有很多红色的X)。但是在其他地方,它仅正确使用了2节(黑线)。

很明显,问题与R的浮点运算有关。我还注意到isoreg使用.Call来调用C例程来实际进行等渗回归,因此问题可能出在C语言和R语言之间。

我正在使用isoreg校准模型概率,并且我想尽可能精确。因此,我有2个问题:

1)有什么方法可以更改isoreg函数中使用的x和y变量,以避免这个问题,同时保持尽可能高的精度?

2)我可以手动找到唯一的拟合值和相应的结。但是,可以吗?我可以假设该算法找到了最佳拟合,还是这个问题会使该假设无效?

0 个答案:

没有答案