我一直在使用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]}
您会看到R的isoreg函数正在识别比其应有的结更多的结(图中有很多红色的X)。但是在其他地方,它仅正确使用了2节(黑线)。
很明显,问题与R的浮点运算有关。我还注意到isoreg使用.Call
来调用C例程来实际进行等渗回归,因此问题可能出在C语言和R语言之间。
我正在使用isoreg校准模型概率,并且我想尽可能精确。因此,我有2个问题:
1)有什么方法可以更改isoreg函数中使用的x和y变量,以避免这个问题,同时保持尽可能高的精度?
2)我可以手动找到唯一的拟合值和相应的结。但是,可以吗?我可以假设该算法找到了最佳拟合,还是这个问题会使该假设无效?