R语言 如何比较两个观察结果之间的差异-不包括NA值

jv4diomz  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(116)

我想根据以下条件将极端离群观测值替换为NA:如果观测值与列中的前一个观测值相差大于0.3,我必须在很大程度上进行工作。但由于它考虑的是当前观测值与紧邻上方的观测值之间的差异,因此会留下异常值,如观测值“-82.900”,因为它在0以内。3。我希望脚本仅与上一个值进行比较(如果它不是NA),然后在存在NA时将当前观察值与上一个数值(不是NA)进行比较。因此,2021-06-04的记录-82.900将与本例中的2021-06-01进行比较。
数据集的小片段示例如下:

Date <- c("2021-05-27", "2021-05-28", "2021-05-29", "2021-05-30", "2021-05-31", "2021-06-01", "2021-06-02", "2021-06-03", "2021-06-04", "2021-06-05", "2021-06-06", "2021-06-07")
Temperature <- c(9.974, 9.851, 11.13, 10.31, 10.122, 10.133, -75.43, -83.00, -82.9, 10.1, 10.233, 10.411)

df <- data.frame(Date, Temperature)
view(df)

df输出如下所示:
| 日期|温度|
| - ------|- ------|
| 二〇二一年五月二十七日|九九七四|
| 二〇二一年五月二十八日|九八五一|
| 二〇二一年五月二十九日|十一点一三〇分|
| 2021年5月30日|十、三一零|
| 二○二一年五月三十一日|小十一二二|
| 二○二一年六月一日|十一三三|
| 二○二一年六月二日| -75.430 |
| 二○二一年六月三日| -83.000 |
| 2021年6月4日| -82.900 |
| 二〇二一年六月五日|十点一百分|
| 二〇二一年六月六日|十二三三|
| 二○二一年六月七日|十、四一一|
我已经执行了以下几行代码,它们删除了大多数异常值,但留下了一些异常值,因此产生了我的问题。

absDiffToPrevious <- c(0,abs(diff(df$Temperature)))
aboveThresh <- absDiffToPrevious > 0.3

df$Temperature[aboveThresh] <- NA

view(df)

df输出现在如下所示:
| 日期|温度|
| - ------|- ------|
| 二〇二一年五月二十七日|九九七四|
| 二〇二一年五月二十八日|九八五一|
| 二〇二一年五月二十九日|不适用|
| 2021年5月30日|不适用|
| 二○二一年五月三十一日|小十一二二|
| 二○二一年六月一日|十一三三|
| 二○二一年六月二日|不适用|
| 二○二一年六月三日|不适用|
| 2021年6月4日| -82.900 |
| 二〇二一年六月五日|不适用|
| 二〇二一年六月六日|十二三三|
| 二○二一年六月七日|十、四一一|
有人有什么建议吗?

cyvaqqii

cyvaqqii1#

你的方法有一个很大的缺陷,因为每个异常值都会触发下一个非异常值的删除。另外,如果这代表你的实际数据,我会考虑两个步骤。首先删 debugging 误,例如,如果你的数据应该总是在零度以上,这样做是安全的。
清理后,我会计算平均值和标准差,然后将偏离2 * sd(或3 * sd)的视为离群值。注意,对于您的样本数据,1/4是一个巨大的离群值,需要事先清理,因为sd将非常高,没有将被视为离群值。

v <- c(9.974, 9.851, 11.13, 10.31, 10.122, 10.133, -75.43, -83.00, -82.9, 10.1, 10.233, 10.411)

v[v < 0] <- NA

sd <- sd(v, na.rm = T)
mean <- mean(v, na.rm = T)

n_sigmas <- 2 # usually 3 is used, 2 is used to illustrate one outlier in the "fixed" data

lower <- mean - n_sigmas * sd
upper <- mean + n_sigmas * sd

v[v < lower | v > upper] <- NA

v

# [1]  9.974  9.851     NA 10.310 10.122 10.133     NA     NA     NA 10.100 10.233 10.411

相关问题