【发布时间】:2018-02-26 21:01:35
【问题描述】:
我已经到处寻找这个问题的答案。
如果你有一个解释变量 x 和一个响应 y,你如何在 R 中拟合分段常数回归模型?
我知道segmented 包可用于创建分段非常量模型,但我不知道如何将每个线段的斜率限制为 0。我需要能够使用该模型预测,这就是为什么我不能简单地使用regressogram 函数。
感谢您的帮助,
杰克
【问题讨论】:
标签: r regression piecewise
我已经到处寻找这个问题的答案。
如果你有一个解释变量 x 和一个响应 y,你如何在 R 中拟合分段常数回归模型?
我知道segmented 包可用于创建分段非常量模型,但我不知道如何将每个线段的斜率限制为 0。我需要能够使用该模型预测,这就是为什么我不能简单地使用regressogram 函数。
感谢您的帮助,
杰克
【问题讨论】:
标签: r regression piecewise
您可以在基础 R 中使用 approxfun 执行此操作,方法是包含参数 method = "constant"
由于您不提供数据,因此我使用 R 内置的数据做了一个示例。
StepFun = approxfun(x=iris$Sepal.Length,
y = iris$Sepal.Width, method = "constant")
我现在认为问题是将 x 的范围分解为 bin 并创建一个分段常数函数(使用每个 bin 的 y 的平均值)。我给出了两个版本。一种更容易,一种更符合 OP 的 cmets。这两个都是使用cut 来完成数据的。
如果您只想指定垃圾箱本身,这很容易。请注意,我正在绘制大量中间点。这样可以避免绘图中出现任何倾斜区域。
## 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)
此版本的目标不是让 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 参数。
method="constant",连接点的线仍然有斜率?