如何在R中创建分段常数(Bin平滑)模型?

如何在R中创建分段常数(Bin平滑)模型?,r,regression,piecewise,R,Regression,Piecewise,我到处寻找这个问题的答案 如果你有一个解释变量x和一个响应y,你如何在R中拟合一个分段常数回归模型 我知道可以使用segmented包创建分段非常量模型,但我无法确定如何将每条线段的坡度约束为0。我需要能够使用模型进行预测,这就是为什么我不能简单地使用回归图函数的原因 谢谢你的帮助 Jack您可以在base R中使用approxfun通过包含参数method=“constant” 因为您不提供数据,所以我使用R中内置的数据做了一个示例 StepFun = approxfun(x=iris$Sep

我到处寻找这个问题的答案

如果你有一个解释变量x和一个响应y,你如何在R中拟合一个分段常数回归模型

我知道可以使用
segmented
包创建分段非常量模型,但我无法确定如何将每条线段的坡度约束为0。我需要能够使用模型进行预测,这就是为什么我不能简单地使用
回归图
函数的原因

谢谢你的帮助


Jack

您可以在base R中使用
approxfun
通过包含参数
method=“constant”
因为您不提供数据,所以我使用R中内置的数据做了一个示例

StepFun = approxfun(x=iris$Sepal.Length, 
    y = iris$Sepal.Width, method = "constant")
编辑 我现在认为问题是将x的范围分成若干个单元,并创建一个分段常数函数(使用每个单元y的平均值)。我给出了两个版本。一个更容易,更符合OP的评论。这两项操作都是使用
cut
来存储数据的

版本1:指定存储箱的端点 如果您只想指定存储箱本身,那么这很容易。请注意,我正在使用大量中间点进行打印。这样可以避免在打印中出现任何倾斜区域

## To specify break boundaries
BREAKS = seq(4,8,0.5)
BINS  = cut(iris$Sepal.Length, breaks=BREAKS, labels=FALSE)
MEANS = aggregate(iris$Sepal.Length, list(BINS), mean)$x

Step2 = approxfun(x=BREAKS[-1], y = MEANS, method = "constant")
curve(Step2, xlim=c(4.5,8),n=1001)

版本2:指定每个箱子的点数 此版本的目标不是使箱子具有相同的宽度,而是每个箱子包含(大约)相同数量的点。 你不能保证这是可以做到的。如果数据中有多个相同的x值,则可能无法获得与每个箱子完全相同的点数,但这将使您尽可能接近。其思想是使用
分位数
告诉您每个箱子的点数近似相同的箱子边界

## To specify number of points per bin
PointsPerBin = 15
Q = seq(0,1, PointsPerBin/length(iris$Sepal.Length))
QBREAKS = quantile(iris$Sepal.Length, Q)
QBINS  = cut(iris$Sepal.Length, breaks=QBREAKS, labels=FALSE)
QMEANS = aggregate(iris$Sepal.Length, list(QBINS), mean)$x

Step3 = approxfun(x=QBREAKS[-1], y = QMEANS, method = "constant")
curve(Step3, xlim=c(4.5,8),n=1001)
同样,如果使用少量的点,则绘图中似乎有倾斜区域


非常感谢您的回答。然后你能用它来预测新的数据吗?是的。只需使用
StepFun(YourXValue)
。这仅适用于原始x范围内的x,除非您向
approxfun
添加其他参数。如果需要,请查看approxfun.Brilliant的
规则
参数。非常感谢。我刚刚尝试实现这一点,但这并不是我想要的。我希望能够指定存储箱的大小(即,每个存储箱包含多少个数据点)。此外,即使使用
method=“constant”
连接点的线仍然有坡度?增加答案。