子设置以发现异常
Sub-setting to find the anomaly
在一个数据框中,我试图寻找偏离均值超过 (threshold * s.d.) 的数据点。数据框的dim
如下:
[1] 4032 4
为了找到上述条件的数据点,我做了:
df$mean = rollapply(df$value, width = 2, FUN = mean, align = "right", fill = "extend")
df$sd = rollapply(df$value, width = 2, FUN = sd, align = "right", fill = "extend")
在上面的 head(df)
之后看起来像:
timestamp value mean sd
2007-03-14 1393577520 37.718 38.088 0.5232590
2007-03-15 1393577220 38.458 38.088 0.5232590
2007-03-16 1393576920 37.912 38.185 0.3860803
2007-03-17 1393576620 40.352 39.132 1.7253405
2007-03-18 1393576320 38.474 39.413 1.3279465
2007-03-19 1393576020 39.878 39.176 0.9927779
查找数据点:
anomaly = df[df$value > abs((threshold*df$sd + df$mean) |
(df$mean - threshold*df$sd)),]
高于查找与均值相距超过 (threshold * s.d.) 的数据点的正确方法。我怀疑的原因是 anomaly
的 dim
与 df
.
相同
这样就可以了
# creating some dummy data
m <- matrix(runif(16128,-1,1), ncol = 4)
tresh <- .004+1
m[which(abs(m-mean(m)) > tresh*sd(m), arr.ind = T)]
其中 m
表示您的矩阵(或您的列 value
取决于您选择 mean/sd 中的哪一个)和 tresh
您的阈值。
更新 以下是我的结果的前几个条目:
dat <- df$value[which(abs(df$value-mean(df$value)) > tresh*sd(df$value))]
head(dat)
[1] 51.846 48.568 44.986 49.108 53.404 46.314
在一个数据框中,我试图寻找偏离均值超过 (threshold * s.d.) 的数据点。数据框的dim
如下:
[1] 4032 4
为了找到上述条件的数据点,我做了:
df$mean = rollapply(df$value, width = 2, FUN = mean, align = "right", fill = "extend")
df$sd = rollapply(df$value, width = 2, FUN = sd, align = "right", fill = "extend")
在上面的 head(df)
之后看起来像:
timestamp value mean sd
2007-03-14 1393577520 37.718 38.088 0.5232590
2007-03-15 1393577220 38.458 38.088 0.5232590
2007-03-16 1393576920 37.912 38.185 0.3860803
2007-03-17 1393576620 40.352 39.132 1.7253405
2007-03-18 1393576320 38.474 39.413 1.3279465
2007-03-19 1393576020 39.878 39.176 0.9927779
查找数据点:
anomaly = df[df$value > abs((threshold*df$sd + df$mean) |
(df$mean - threshold*df$sd)),]
高于查找与均值相距超过 (threshold * s.d.) 的数据点的正确方法。我怀疑的原因是 anomaly
的 dim
与 df
.
这样就可以了
# creating some dummy data
m <- matrix(runif(16128,-1,1), ncol = 4)
tresh <- .004+1
m[which(abs(m-mean(m)) > tresh*sd(m), arr.ind = T)]
其中 m
表示您的矩阵(或您的列 value
取决于您选择 mean/sd 中的哪一个)和 tresh
您的阈值。
更新 以下是我的结果的前几个条目:
dat <- df$value[which(abs(df$value-mean(df$value)) > tresh*sd(df$value))]
head(dat)
[1] 51.846 48.568 44.986 49.108 53.404 46.314