【问题标题】:How to Create Piecewise Constant (Bin Smooth) Model in R?如何在 R 中创建分段常数(Bin Smooth)模型?
【发布时间】:2018-02-26 21:01:35
【问题描述】:

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

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

我知道segmented 包可用于创建分段非常量模型,但我不知道如何将每个线段的斜率限制为 0。我需要能够使用该模型预测,这就是为什么我不能简单地使用regressogram 函数。

感谢您的帮助,

杰克

【问题讨论】:

    标签: r regression piecewise


    【解决方案1】:

    您可以在基础 R 中使用 approxfun 执行此操作,方法是包含参数 method = "constant" 由于您不提供数据,因此我使用 R 内置的数据做了一个示例。

    StepFun = approxfun(x=iris$Sepal.Length, 
        y = iris$Sepal.Width, method = "constant")
    

    编辑

    我现在认为问题是将 x 的范围分解为 bin 并创建一个分段常数函数(使用每个 bin 的 y 的平均值)。我给出了两个版本。一种更容易,一种更符合 OP 的 cmets。这两个都是使用cut 来完成数据的。

    版本 1:指定 bin 的端点

    如果您只想指定垃圾箱本身,这很容易。请注意,我正在绘制大量中间点。这样可以避免绘图中出现任何倾斜区域。

    ## 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:指定每个 bin 的点数

    此版本的目标不是让 bin 具有相同的宽度,而是每个 bin 包含(大约)相同数量的点。 您实际上不能保证可以做到这一点。如果您的数据中有多个相同的 x 值,则每个 bin 可能无法获得完全相同的点数,但这会让您尽可能接近。这个想法是使用quantiles 告诉您每个 bin 的点数近似相同的 bin 边界。

    ## 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 的 rule 参数。
    • 太棒了。非常感谢。
    • 我刚刚尝试实现这一点,但它并不是我想要的。我希望能够指定 bin 的大小(即每个 bin 包含多少数据点)。另外,即使使用method="constant",连接点的线仍然有斜率?
    • 添加回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2020-08-28
    • 2021-10-18
    • 2017-04-20
    • 2020-11-12
    相关资源
    最近更新 更多