2017-03-07 98 views
6

我試圖按照這個例子Segmented Regression, Breakpoint analysis實現分段迴歸。二次多項式和strightline的分段迴歸

現在,我該如何實現它,第二部分將是二次多項式,其餘部分是相同的。

我試圖通過更改Z= ~poly(DistanceMeters, 2),但它沒有奏效。

另外,我怎樣才能像

part 1: a1*x+b1 
part 2: a2*x2**2 + b2*x + c1 
part 3 :a3*x + b3 

方程有這樣類似的問題,不過是他們din't使用分段函數解釋。

+1

您是否需要使用'segmented'軟件包,或者只需對數據集進行子集併爲每個段構建單獨的'lm'模型? – C8H10N4O2

+0

是的,因爲我希望休息時間也可以用一些起始值進行計算,如示例 –

+0

準確地說,這是確切數據的確切問題http://stackoverflow.com/q/42643638/4729183 –

回答

2

我有兩個想法,都有缺點。也許你可以根據自己的需要調整其中之一。很抱歉,目前無法訪問雲端硬盤,因此使用了一些仿真數據。

1 「手動」 多項式擬合模型

在這裏你可以指定你最喜歡的機型,某些領域可能是LM的,一些多項式等

代碼:

library(segmented) 
library(ggplot2) 
library(data.table) 

# Data 
set.seed(12) 
xx <- 1:100 
yy <- 2 + 1.5 * pmax(xx-35, 0) - 1.5 * pmax(xx-70, 0) + 15 * pmax(runif(100) - 0.5, 0) + rnorm(100, 0, 2) 

dt <- data.table(x = xx, y = yy, type = 'act') 
dt_all <- copy(dt) 

# lm 
lm_lin <- lm(y ~ x, data = dt) 
summary(lm_lin) 

# Find segments 
lm_seg <- segmented(
    lm_lin, seg.Z = ~ x, psi = list(x = c(30, 80))) 

# "Manual" lm's 
breaks <- unname(lm_seg$psi[, 'Est.']) 
lm_poly1 <- lm(y ~ poly(x, 4), data = dt[x < breaks[1], ]) 
lm_2 <- lm(y ~ x, data = dt[x > breaks[1] & x < breaks[2], ]) 
lm_poly3 <- lm(y ~ poly(x, 4), data = dt[x > breaks[2], ]) 

dt_all <- rbind(
    dt_all, 
    data.table(x = xx, y = c(
    predict(lm_poly1), 
    predict(lm_2), 
    predict(lm_poly3)), 
    type = 'lm_poly' 
) 
) 

2.使用來自segmented和某些樣條的斷點擬合一個gam模型

在這裏你會得到一個段之間的平滑過渡,但是你對發生的事情的控制很少。

# Using splines for smooth segments 
library(mgcv) 

spl <- gam(y ~ s(x, bs = "cc", k = 12), data = dt, knots = list(xx = breaks)) 

# Plot 
dt_all <- rbind(dt_all, data.table(x = xx, y = predict(spl), type = 'spl')) 
ggplot(dt_all, aes(x = x, y = y)) + geom_point(size = 1) + 
    facet_grid(. ~ type) + theme_minimal() 

enter image description here

兩者都可以使用例如進行list()lapply()自動化一點(用於不同數量的休息等)。

編輯:

通過的polys你可以稍微「更好的」擬合模型改變參數,但在邊緣gam錯誤是相當大的,看到degree = 6k = 30

enter image description here