R 不连续数据的分段线性回归

R 不连续数据的分段线性回归,r,linear-regression,R,Linear Regression,我有一个看起来是分段线性的数据集。我想在R中执行分段线性回归。问题是断点处存在不连续性。通过使用来自的一些代码,我设法得到了一些东西,但我并不满意 数据集 这是一个虚拟数据集 给出: 显然,segmented期望数据是连续的。这里的情况并非如此,因此回归是不正确的 “手动”方法 这种方法更乏味。首先,我们通过尝试所有可能的断点并保留产生最低残差的断点来计算断点。然后,我们在线性回归中添加一个新因子,它告诉我们预测变量是大于还是小于这个断点 # Computation of the break

我有一个看起来是分段线性的数据集。我想在R中执行分段线性回归。问题是断点处存在不连续性。通过使用来自的一些代码,我设法得到了一些东西,但我并不满意

数据集 这是一个虚拟数据集

给出:

显然,
segmented
期望数据是连续的。这里的情况并非如此,因此回归是不正确的

“手动”方法 这种方法更乏味。首先,我们通过尝试所有可能的断点并保留产生最低残差的断点来计算断点。然后,我们在线性回归中添加一个新因子,它告诉我们预测变量是大于还是小于这个断点

# Computation of the break-point
Break<-sort(unique(df$n))
Break<-Break[2:(length(Break)-1)]
d<-numeric(length(Break))
for (i in 1:length(Break)) {
    model_manual<-lm(fn~(n<Break[i])*n + (n>=Break[i])*n, data=df)
    d[i]<-summary(model_manual)[[6]]
}
breakpoint = Break[which.min(d)]

# Linear regression using this break-point
df$group = df$n >= breakpoint
model_manual<-lm(fn~n*group, data=df)
dat_pred = data.frame(n = df$n, fn = predict(model_manual, df))
ggplot(df, aes(x = n, y = fn)) +
    geom_point() +
    geom_line(data=dat_pred[dat_pred$n < breakpoint,], color = 'blue') +
    geom_line(data=dat_pred[dat_pred$n >= breakpoint,], color = 'blue')
#断点的计算

Breakstrucchange将使用统计上有效的方法检测断点。然后,你可以用你想要的任何型号来装配每件衣服。例如,对于季节性时间序列,您可以将单独的ARIMA模型应用于每个分段。

在花费大量时间挖掘之后,我相信chngpt包是一个不错的选择。它可以进行连续和不连续分段回归。链接此处:

感谢您指出chngpt软件包。我认为这个答案应该被接受。chngpt可以使用“分段”模型来实现这一点。请注意“t”。这不是打字错误。您想要的模型称为“分段”,而不是“分段”。我之所以强调这一点,是因为我花了一点时间才弄明白。
library(segmented)
library(ggplot2)
model_segmented = segmented(lm(fn~n, data=df), seg.Z = ~ n)
predict_segmented = data.frame(n = df$n, fn = broken.line(model_segmented)$fit)
ggplot(df, aes(x = n, y = fn)) +
    geom_point() + geom_line(data = predict_segmented, color = 'blue')
# Computation of the break-point
Break<-sort(unique(df$n))
Break<-Break[2:(length(Break)-1)]
d<-numeric(length(Break))
for (i in 1:length(Break)) {
    model_manual<-lm(fn~(n<Break[i])*n + (n>=Break[i])*n, data=df)
    d[i]<-summary(model_manual)[[6]]
}
breakpoint = Break[which.min(d)]

# Linear regression using this break-point
df$group = df$n >= breakpoint
model_manual<-lm(fn~n*group, data=df)
dat_pred = data.frame(n = df$n, fn = predict(model_manual, df))
ggplot(df, aes(x = n, y = fn)) +
    geom_point() +
    geom_line(data=dat_pred[dat_pred$n < breakpoint,], color = 'blue') +
    geom_line(data=dat_pred[dat_pred$n >= breakpoint,], color = 'blue')