通过手动重置线性增加数据

数据挖掘 机器学习 统计数据 时间序列
2021-10-06 11:37:19

我有一个线性增加的传感器时间序列数据集,值范围在 50 到 150 之间。我已经实现了一个简单线性回归算法来拟合此类数据的回归线,并且我正在预测该系列到达的日期120.

当系列向上移动时,一切正常。但是,也有传感器达到110或115左右的情况,会被复位;在这种情况下,这些值会在 50 或 60 处重新开始。

这是我开始面临回归线问题的地方,因为它开始向下移动,并开始预测旧日期。我想我应该只考虑之前重置的数据子集。但是,我试图了解是否有任何算法可以考虑这种情况。

我是数据科学的新手,如果有任何进一步的建议,我将不胜感激。

编辑:应用 nfmcclure 的建议

在应用建议之前

在此处输入图像描述

下面是我在拆分发生重置的数据集后得到的快照,以及两组的斜率。

在此处输入图像描述

找到两个斜率的平均值并从平均值绘制线。

在此处输入图像描述

这个可以吗?

2个回答

我认为这是一个有趣的问题,所以我在 R 中编写了一个示例数据集和一个线性斜率估计器。希望它可以帮助您解决问题。我将做一些假设,最大的假设是你想估计一个恒定的斜率,由数据中的某些部分给出。分离线性数据块的另一个假设是通过比较连续的差异并找到低于平均值的 X 标准偏差来找到自然“重置”。(我选择了 4 个 sd,但这可以更改)

这是数据图,生成它的代码在底部。 样本数据

对于初学者,我们找到中断并拟合每组 y 值并记录斜率。

# Find the differences between adjacent points
diffs = y_data[-1] - y_data[-length(y_data)]
# Find the break points (here I use 4 s.d.'s)
break_points = c(0,which(diffs < (mean(diffs) - 4*sd(diffs))),length(y_data))
# Create the lists of y-values
y_lists = sapply(1:(length(break_points)-1),function(x){
  y_data[(break_points[x]+1):(break_points[x+1])]
})
# Create the lists of x-values
x_lists = lapply(y_lists,function(x) 1:length(x))
#Find all the slopes for the lists of points
slopes = unlist(lapply(1:length(y_lists), function(x) lm(y_lists[[x]] ~ x_lists[[x]])$coefficients[2]))

这是斜坡:(3.309110、4.419178、3.292029、4.531126、3.675178、4.294389)

我们可以取平均值来找到预期的斜率(3.920168)。


编辑:预测系列何时达到 120

我意识到当系列达到 120 时我没有完成预测。如果我们估计斜率为 m 并且我们看到在时间 t 重置为值 x (x<120),我们可以预测需要多长时间才能达到120 通过一些简单的代数。

在此处输入图像描述

这里,t 是重置后达到 120 所需的时间,x 是重置后的值,m 是估计的斜率。我什至不会在这里触及单位的主题,但最好的做法是解决它们并确保一切都有意义。


编辑:创建示例数据

样本数据将包含 100 个点,斜率为 4 的随机噪声(希望我们会对此进行估计)。当 y 值达到截止值时,它们会重置为 50。每次重置时,都会在 115 和 120 之间随机选择截止值。这是创建数据集的 R 代码。

# Create Sample Data
set.seed(1001)
x_data = 1:100 # x-data
y_data = rep(0,length(x_data)) # Initialize y-data
y_data[1] = 50 
reset_level = sample(115:120,1) # Select initial cutoff
for (i in x_data[-1]){ # Loop through rest of x-data
  if(y_data[i-1]>reset_level){ # check if y-value is above cutoff
    y_data[i] = 50             # Reset if it is and
    reset_level = sample(115:120,1) # rechoose cutoff
  }else {
    y_data[i] = y_data[i-1] + 4 + (10*runif(1)-5) # Or just increment y with random noise
  }
}
plot(x_data,y_data) # Plot data

您的问题是重置不是线性模型的一部分。您要么必须在重置时将数据切割成不同的片段,以便在每个片段中都不会发生重置,并且您可以为每个片段拟合线性模型。或者您可以构建一个允许重置的更复杂的模型。在这种情况下,要么重置发生的时间必须手动输入模型,要么重置时间必须是模型中的自由参数,通过将模型拟合到数据来确定。