R 上的等渗回归给我一个明显不正确的视觉模型

Isotonic Regression on R is giving me a visual model that is clearly incorrect

我正在尝试使用等渗回归来估计数据集的趋势。这种形式的回归 不是 意味着可以很好地估计趋势,它只是我在时间序列简介 class 中作为家庭作业问题的一部分给出的练习服用。在问题中,我有一系列时间点 t,以及相应的一系列数据点“iPod”。我正在尝试使用以下代码对这个时间序列进行等渗回归:

data <- read.csv("C:/Users/******/Downloads/iPod.csv", header=TRUE)
t <- c(1:189)
iPod <- data$iPod
plot(t, iPod, type='l')

isoreg <- isoreg(t, iPod)
plot(t, iPod, type='l')
lines(t, isoreg$yf, col='red')

然而,当我 运行 它时,我得到

显然有问题,我不确定是什么。知道发生了什么,以及如何修复我的代码吗?

编辑:我在下面包含了一个 dput() 输出:

    dput(data)
structure(list(Month = c("2004-01", "2004-02", "2004-03", "2004-04", 
"2004-05", "2004-06", "2004-07", "2004-08", "2004-09", "2004-10", 
"2004-11", "2004-12", "2005-01", "2005-02", "2005-03", "2005-04", 
"2005-05", "2005-06", "2005-07", "2005-08", "2005-09", "2005-10", 
"2005-11", "2005-12", "2006-01", "2006-02", "2006-03", "2006-04", 
"2006-05", "2006-06", "2006-07", "2006-08", "2006-09", "2006-10", 
"2006-11", "2006-12", "2007-01", "2007-02", "2007-03", "2007-04", 
"2007-05", "2007-06", "2007-07", "2007-08", "2007-09", "2007-10", 
"2007-11", "2007-12", "2008-01", "2008-02", "2008-03", "2008-04", 
"2008-05", "2008-06", "2008-07", "2008-08", "2008-09", "2008-10", 
"2008-11", "2008-12", "2009-01", "2009-02", "2009-03", "2009-04", 
"2009-05", "2009-06", "2009-07", "2009-08", "2009-09", "2009-10", 
"2009-11", "2009-12", "2010-01", "2010-02", "2010-03", "2010-04", 
"2010-05", "2010-06", "2010-07", "2010-08", "2010-09", "2010-10", 
"2010-11", "2010-12", "2011-01", "2011-02", "2011-03", "2011-04", 
"2011-05", "2011-06", "2011-07", "2011-08", "2011-09", "2011-10", 
"2011-11", "2011-12", "2012-01", "2012-02", "2012-03", "2012-04", 
"2012-05", "2012-06", "2012-07", "2012-08", "2012-09", "2012-10", 
"2012-11", "2012-12", "2013-01", "2013-02", "2013-03", "2013-04", 
"2013-05", "2013-06", "2013-07", "2013-08", "2013-09", "2013-10", 
"2013-11", "2013-12", "2014-01", "2014-02", "2014-03", "2014-04", 
"2014-05", "2014-06", "2014-07", "2014-08", "2014-09", "2014-10", 
"2014-11", "2014-12", "2015-01", "2015-02", "2015-03", "2015-04", 
"2015-05", "2015-06", "2015-07", "2015-08", "2015-09", "2015-10", 
"2015-11", "2015-12", "2016-01", "2016-02", "2016-03", "2016-04", 
"2016-05", "2016-06", "2016-07", "2016-08", "2016-09", "2016-10", 
"2016-11", "2016-12", "2017-01", "2017-02", "2017-03", "2017-04", 
"2017-05", "2017-06", "2017-07", "2017-08", "2017-09", "2017-10", 
"2017-11", "2017-12", "2018-01", "2018-02", "2018-03", "2018-04", 
"2018-05", "2018-06", "2018-07", "2018-08", "2018-09", "2018-10", 
"2018-11", "2018-12", "2019-01", "2019-02", "2019-03", "2019-04", 
"2019-05", "2019-06", "2019-07", "2019-08", "2019-09"), iPod = c(17L, 
14L, 15L, 13L, 15L, 17L, 25L, 24L, 23L, 26L, 33L, 53L, 41L, 40L, 
36L, 33L, 36L, 39L, 38L, 36L, 62L, 60L, 71L, 100L, 65L, 52L, 
46L, 42L, 43L, 45L, 44L, 41L, 48L, 45L, 57L, 85L, 54L, 43L, 37L, 
35L, 36L, 39L, 38L, 35L, 60L, 45L, 55L, 76L, 52L, 43L, 40L, 37L, 
38L, 40L, 43L, 40L, 46L, 40L, 51L, 69L, 50L, 44L, 44L, 38L, 39L, 
44L, 41L, 39L, 43L, 37L, 47L, 66L, 48L, 41L, 38L, 41L, 41L, 43L, 
44L, 41L, 48L, 40L, 47L, 61L, 50L, 43L, 40L, 39L, 38L, 40L, 38L, 
35L, 31L, 36L, 43L, 51L, 38L, 32L, 31L, 29L, 29L, 30L, 29L, 27L, 
31L, 29L, 32L, 39L, 25L, 23L, 23L, 20L, 20L, 22L, 20L, 18L, 20L, 
15L, 19L, 22L, 15L, 14L, 13L, 11L, 12L, 12L, 12L, 11L, 12L, 10L, 
12L, 15L, 10L, 9L, 8L, 8L, 8L, 9L, 9L, 9L, 8L, 7L, 9L, 10L, 7L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 6L, 7L, 5L, 4L, 4L, 4L, 4L, 
4L, 5L, 4L, 4L, 4L, 5L, 5L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
2L, 3L, 4L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 2L)), class = 
"data.frame", row.names = c(NA, 
-189L))

isoreg 函数运行良好。您正在为数据拟合一条单调增加的回归线并忽略波动,您的数据先增加一点然后有缓慢下降的趋势。在这种情况下,isoreg 最终坚持一个恒定的平均值,这是最好的解决方案。

尝试在下降趋势开始时截断数据(subt 在我的代码中),您将看到发生了什么。

t <- 1:189
iPod <- data$iPod
plot(t, iPod, type='l')

subt <- 1:85
# also try 1:25

isoreg <- isoreg(subt, iPod[subt])
lines(subt, isoreg$yf, col='red')

在接下来的两个图中,您可以看到当您忽略一些下降趋势部分时它是如何工作的。