I have the following data (cost of a product vs. time) that looks like the following:
annum <- c(1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913,
1914, 1915, 1916, 1917, 1918, 1919)
cost <- c(0.0000, 18.6140, 92.1278, 101.9393, 112.0808, 122.5521,
133.3532, 144.4843, 244.5052, 275.6068, 295.2592, 317.3145,
339.6527, 362.3537, 377.7775, 402.8443, 437.5539)
mydata <- as.data.frame(cbind(annum, cost))
g <- ggplot(mydata, aes(x = annum, y = cost))
g <- g geom_point()
g <- g scale_y_continuous(labels=scales::dollar_format())
g
CodePudding user response:
Here is another solution with package strucchange
but without creating a time series first.
library(strucchange)
# first get a segment size as a fraction
# of the number of observations
n <- nrow(mydata)
segmts <- 3
h <- segmts/n
# now estimate the breakpoints
b <- breakpoints(cost ~ annum, h = h, breaks = (segmts - 1L), data = mydata)
bp <- mydata[b$breakpoints, "annum"]
# create a grouping variable for `ggplot`
# each group is a segment
bp <- c(bp, Inf)
mydata$grp <- findInterval(mydata$annum, bp, left.open = TRUE)
# plot the linear regressions
g geom_smooth(
mapping = aes(group = grp),
method = "lm",
formula = y ~ x,
se = FALSE
)