回归分析中的数据清洗

机器算法验证 r 回归 异常值 配件 数据预处理
2022-04-15 06:54:51

我有一个温度和千瓦时的数据集,我目前正在执行下面的回归。(基于系数的进一步回归在 PHP 中执行)

# Some kind of List structure..
UsageDataFrame  <- data.frame(Energy, Temperatures);

# lm is used to fit linear models. It can be used to carry out regression,
# single stratum analysis of variance and analysis of covariance (although
# aov may provide a more convenient interface for these).
LinearModel     <- lm(Energy ~ 1+Temperatures+I(Temperatures^2), data = UsageDataFrame)

# coefficients
Coefficients    <- coefficients(LinearModel)

system('clear');

cat("--- Coefficients ---\n");
print(Coefficients);
cat('\n\n');

问题与我们的数据有关,我们无法确保没有随机通信故障或只是随机错误。这可以给我们留下像

Temperatures <- c(16,15,13,18,20,17,20);
Energy <- c(4,3,3,4,0,60,4)

Temperatures <- c(17,17,14,17,21,16,19);
Energy <- c(4,3,3,4,0,0,4)

现在作为人类,我们可以清楚地看到 60 千瓦时是基于温度的错误,但是我们有超过 2,000 个系统,每个系统都有多个仪表,每个系统都位于全国不同的位置......并且正常能源使用水平不同。

一个正常的数据集是每米每天 48 个温度和能量值。在一整年中,在 17520 点中,每米可能有大约 0-500 个坏点。

我已经阅读了有关该tawny软件包的其他帖子,但是我还没有真正看到任何可以通过 adata.frame并通过交叉分析处理它们的示例。

我知道可以做的不多,但是肯定可以根据温度剥离大量的值吗?以及它发生的次数..

由于 R 是基于数学的,我认为没有理由将其转移到任何其他语言中。

请注意:我是一名软件开发人员,以前从未使用过 R。

- 编辑 -

好的,这是一个真实世界的例子,似乎这个仪表是一个很好的例子。您可以看到零点正在建立,然后插入了一个巨大的值。“23、65、22、24”就是这样的例子。当它的通信失败并且它保存数据值并继续在设备上添加它时,就会发生这种情况。

(只是说通讯故障不在我的控制范围内,我也无法更改软件)

然而,因为零是一个有效值,我想删除任何针对温度或零的大量数字,它们显然是一个错误。

检测这一点并将数据平均化的想法也不是解决这个问题的方法,但是已经讨论过了,但是由于该仪表数据每 30 分钟一次,并且通信故障可能会发生数天。

大多数系统使用的能量比这更多,所以从消除零的角度来看,这可能是一个坏例子。

能源:http://pastebin.com/gBa8y5sM 温度: http: //pastie.org/4371735

(发布这么大的文件后,Pastebin 似乎已经对我失望了)

1个回答

使用坚固的配合,例如lmrobrobustbase包装中。如果数据看起来很异常,这个特定的数据可以自动检测并降低高达 50% 的数据权重。

为了看看可以完成什么,让我们模拟一个令人讨厌的数据集,其中包含大量异常值xy变量:

library(robustbase)
set.seed(17)
n.points <- 17520
n.x.outliers <- 500
n.y.outliers <- 500
beta <- c(50, .3, -.05)
x <- rnorm(n.points)
y <- beta[1] + beta[2]*x + beta[3]*x^2 + rnorm(n.points, sd=0.5)
y[1:n.y.outliers] <- rnorm(n.y.outliers, sd=5) + y[1:n.y.outliers]
x[sample(1:n.points, n.x.outliers)] <- rnorm(n.x.outliers, sd=10)

大部分的x介于44,但也有一些极端的异常值:

原始数据散点图

让我们将普通最小二乘法 ( lm) 与稳健系数进行比较:

summary(fit<-lm(y ~ 1 + x + I(x^2)))
summary(fit.rob<-lmrob(y ~ 1 + x + I(x^2)))

lm报告拟合系数49.94,0.00805, 和0.000479,与预期值相比50,0.3, 和0.05. lmrob报告49.97,0.274, 和0.0229, 分别。他们都没有准确地估计二次项(因为它的贡献很小并且被噪声淹没),但是lmrob对线性项进行了合理的估计,lm但甚至没有接近。

让我们仔细看看:

i <- abs(x) < 10        # Window the data from x = -10 to 10
w <- fit.rob$weights[i] # Extract the robust weights (each between 0 and 1)
plot(x[i], y[i], pch=".", cex=4, col=hsv((w + 1/4)*4/5, w/3+2/3, 0.8*(1-w/2)), 
     main="Least-squares and robust fits", xlab="x", ylab="y")

适合的散点图

lmrob报告数据的权重。在这里,在这个放大的图中,权重按颜色显示:浅绿色表示高度降低权重的值,深栗色表示具有完整权重的值。显然lm合身性很差:x异常值的影响太大。尽管它的二次项是一个很差的估计,但lmrob拟合仍然在良好数据的整个范围内紧密地遵循正确的曲线(x之间44)。