我一直在try 将一些数据与某一x值范围内的平均y值的变化进行拟合.一段时间以来,我一直在努力让它发挥作用.

例如,给定一些受控随机数据和所需的拟合度:

library(tidyverse)

Data <- data.frame(Time = c(1:100, 101:500, 501:1000), 
                   Value = c(runif(100, 0, 500), 
                             runif(400, 500, 1000), 
                             runif(500, 0, 100)),
                   Desired_fit = c(rep_len(250,100), 
                                   rep_len(750,400),
                                   rep_len(50,500)))

plot(Data$Time, Data$Value)
lines(Data$Time, Data$Desired_fit, col = "red")

我try 平滑、获得运行平均值并对我的数据进行样条化,但这产生了一条曲线拟合,而不是上面期望的_Fit.本质上,我试图在数据集中的每个拐点上拟合一条水平线.

我try 过的最接近的方法是使用ZOO包中的RolMean():

library(zoo)

moving_average <- rollmean(Data$Value, 50, fill = NA)

plot(Data$Time, Data$Value)
lines(Data$time, moving_average, col = "red")

如有任何帮助或建议,将不胜感激!

谢谢!

推荐答案

使用dpseg计算分段断点.每行dp$segments定义一个具有startend的段 列是该段的开始和结束点的索引,并且x1x2列是相应的时间.最后画出每一段数据的平均值.

library(dpseg)

plot(Value ~ Time, Data)

dp <- with(Data, dpseg(x = Time, y = Value, jumps = TRUE))
segs <- dp$segments

xx <- with(segs, c(rbind(x1, x2)))
yy <- mapply(\(st,en) mean(Data$Value[st:en]), segs$start, segs$end) |> rep(each=2)
lines(xx, yy, col = "red", lwd = 3)

screenshot

如果不需要垂直线段,也可以将上面xx<-...行以上的所有内容替换为以下内容.

nr <- nrow(segs)
for(i in 1:nr) with(segs[i, ],
  segments(x0 = x1, 
           y0 = mean(Data$Value[start:end]),
           x1 = x2, col = "red", lwd = 3))

screenshot

年长的

但这并不奏效.

使用Strucchange中的breakpoints计算断点,然后绘制数据和拟合值.

library(strucchange)
bp <- with(Data, breakpoints(Value ~ 1))
plot(Value ~ Time, Data)
lines(fitted(bp) ~ Time, Data, col = "red", lwd = 2)

screenshot

注意事项

由于在问题中使用随机数来生成数据,因此我们首先使用了set.Seed以使其可重现.

set.seed(123)
Data <- data.frame(Time = c(1:100, 101:500, 501:1000), 
                   Value = c(runif(100, 0, 500), 
                             runif(400, 500, 1000), 
                             runif(500, 0, 100)),
                   Desired_fit = c(rep_len(250,100), 
                                   rep_len(750,400),
                                   rep_len(50,500)))

R相关问答推荐

即使声明引发错误,R函数也会在第二次try 时返回结果

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

R Highcharts与两个位置关联的注释

如何直接从Fortran到R的数组大小?

使用ggsankey调整Sankey图中单个 node 上的标签

根据元素和前一个值之间的差值过滤矩阵的元素

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

通过在colname中查找其相应值来创建列

如何通过判断数据框的一列来压缩另一列?

从服务器在Shiny中一起渲染图标和文本

条形图顶部与其错误条形图不对齐

在多页PDF中以特定布局排列的绘图列表不起作用

如何在反曲线图中更改X标签

在不对R中的变量分组的情况下取两行的平均值

R -基线图-图形周围的阴影区域

按两个因素将观测值分组后计算单独的百分比

在不重复主题的情况下重新排列组

如何将图例文本添加到图例符号中

如何为包创建自定义roxygen2标签?

在一个multiplot中以非对称的方式在R中绘制多个图