带约束的分段线性回归-r

带约束的分段线性回归-r,r,linear-regression,dummy-variable,piecewise,R,Linear Regression,Dummy Variable,Piecewise,我试图在R中使用一个断点进行分段线性OLS回归分析。我有以下回归公式和限制: 其中D是一个虚拟对象。我想施加一个限制,使回归线是连续的(有一个断点)。下面的限制可以正常工作 我的问题是,我如何在R中的lm()函数中表达它?我以前尝试过“分段”包,但我需要在回归摘要中解释两行的截取 我在下面提供了一些数据。这里的断点是0,因此对于x>=0,d是1 x y d 1 4.3047451 11.2660463 1 2 7.0062423 -3.2

我试图在R中使用一个断点进行分段线性OLS回归分析。我有以下回归公式和限制:

其中D是一个虚拟对象。我想施加一个限制,使回归线是连续的(有一个断点)。下面的限制可以正常工作

我的问题是,我如何在R中的lm()函数中表达它?我以前尝试过“分段”包,但我需要在回归摘要中解释两行的截取

我在下面提供了一些数据。这里的断点是0,因此对于x>=0,
d
是1

             x          y d
1    4.3047451 11.2660463 1
2    7.0062423 -3.2897982 1
3    2.7862009 -2.8232636 1
4   -0.8662964  0.4051925 0
5   -0.9553261 -0.9228929 0
6   -1.6626654  3.5044546 0
7    3.4906905  1.4961349 1
8   -0.7072658 -0.2758436 0
9   -7.0054069 -1.3041742 0
10  -2.2510701 -0.1848814 0
11 -13.3617905 -0.2113756 0
12   4.1001251  0.2845748 1
13  -4.6575944 -1.1603290 0
14   5.2243857  3.8324236 1
15   3.5003320 -2.3672985 1
16 -13.2623113 -7.1593177 0
17  -1.7944354 -2.1725478 0
18   0.5885924 -0.2411048 1
19 -19.3744936 -0.1982088 0
20 -17.9876978 -1.5995063 0
编辑:

我添加了一个图形来表示我正在尝试执行的操作。重要的是,两条拟合线在阈值处相交,并且我可以得到4个系数。2个字母和2个β


由于断点是x=0,我们有a=a2,因此:

nls( y ~ (x < 0) * (a + b * x) + (x > 0) * (a + b2 * x), dat,
  start = list(a = 1, b = 1, b2 = 1))
通常,如果B是断点:

B <- 0
nls( y ~ (x < B) * (a + b * (x - B)) + (x > B) * (a + b2 * (x - B)), dat,
  start = list(a = 1, b = 1, b2 = 1))

B <- 0
lm(y ~ I((x - B) * (x < B)) + I((x - B) * (x > B)), dat)
bb)*(a+b2*(x-B)),dat,
开始=列表(a=1,b=1,b2=1))
B),dat)

这不是答案,而是评论部分中无法编辑的评论,因为它要求图像可以理解

事实上,我无法理解您的数据:当在笛卡尔图(下图)上表示时,这些点看起来非常分散。它看起来不像一个分段函数。我错过了什么


顺便说一下,如果点离由两个倾斜段组成的分段函数不太远,有一种非常简单的拟合方法。请参阅本文第12-13页:

谢谢您的回复,这很有意义。但是如果断点不同于零呢?如果我不清楚,我很抱歉,但是提供的数据只是几个具有不同断点的数据集的一个片段。我不确定这里的常量(a和b)是什么,它似乎不是
lm()
中的有效输入。我已经编辑了我的问题,并用图形表示了我正在尝试执行的操作。已修复并移动到回答。如果你想要一个不同的参数化,你可以在lm的情况下使用代数,或者在nls的情况下修改公式。这仅仅是为了获得som(公认较差)示例数据。数据不一定适合分段函数,这是我要探讨的,但首先我想构建问题中指定的模型(r中的回归模型)。谢谢你的链接,我来看看。
B <- 0
nls( y ~ (x < B) * (a + b * (x - B)) + (x > B) * (a + b2 * (x - B)), dat,
  start = list(a = 1, b = 1, b2 = 1))

B <- 0
lm(y ~ I((x - B) * (x < B)) + I((x - B) * (x > B)), dat)