c - 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)我可以手动找到唯一的拟合值和相应的结。然而,这样可以吗?我可以假设算法找到了最合适的,还是这个问题会使这个假设无效?
解决方案
推荐阅读
- python - 基于旧的 groupby 创建新的 DataFrame
- basic - DDE 错误 285(应用程序拒绝执行 DDE)
- java - 在 gem5(或任何非 C 语言)中运行 Java 程序
- html - 反转html中列出的项目的顺序
- c# - 在 C# 中将文件附件发送到 Facebook Messenger API
- ruby - 网格战舰板 - 如何在某些点插入换行符?
- javascript - onfocus="blur()" 仅在移动设备上
- javascript - 仅在加载目标页面的 DOM 时,如何使用 jquery .load 获取数据?
- node.js - 你如何代表明天早上?
- tcp - Netty 和 TCP - 如何正确发送空消息