首页 > 解决方案 > R 的 isoreg 函数比唯一拟合值产生更多的结

问题描述

我一直在使用 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 来校准模型概率,并且我希望尽可能精确。因此,我有两个问题:

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

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

标签: crfloating-pointregression

解决方案


推荐阅读