Witam chciałbym zdefiniować funkcję, która zwraca wykres dla odstający (zdefiniowanego poniżej) w oparciu o specified date range
i jednocześnie działek oryginalnej serii (i rachunki w tym kontekście ewentualnych wskaźników):Jak wykreślić wartości odstające i oryginalne serie?
Defing odstających:
anomaly <- function(x)
{ tt <- 1:length(x)
resid <- residuals(loess(x ~ tt))
resid.q <- quantile(resid,prob=c(0.25,0.75))
iqr <- diff(resid.q)
limits <- resid.q + 1.5*iqr*c(-1,1)
score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
return(score)
}
# defining dates
dates <- as.POSIXct(seq(as.Date("2015-08-20"), as.Date("2015-10-08"), by = "days"))
Niektóre dane:
a<-runif(50, 5.0, 7.5)
b<-runif(50, 4, 8)
c<-runif(50, 1, 2)
d<-runif(50, 3, 3.5)
ca<-c/a
cb<-c/b
df<-data.frame(dates,a,b,c,d,ca,cb)
Przedstawiamy poboczna
df[49,4]<-0
df[50,6]<-0
Loop nad danymi znaleźć anomalie
new<-lapply(df[,2:7],anomaly)
library(stringi) # binding list with differing rows
# from list to data frame
res <- as.data.frame((stri_list2matrix(new)))
# rename columns
colnames(res) <- names(new)
# depends on dates at the beginning
res<-(cbind(dates,res[,1:6]))
# melt to plot
library(reshape)
library(reshape2)
new <- melt(res , id.vars = 'dates', variable.name = 'series')
Defing działkę z określonym date range
(ostatnie 4 dni):
library(ggplot2)
nrdays <- 4
a.plot<-ggplot(subset(new, new$dates >= as.POSIXct(max(new$dates)- (nrdays*60*60*24))),
aes(x=dates,y=value,colour=variable,group=variable)) +
geom_line() +
facet_grid(variable ~ ., scales = "free_y")+
ylab("Outliers")+
xlab("Date")
Definiowanie funkcji transmisji danych należy sprawdzić:
check_data <- function(df) {
if(tail(df, 1) > 0) { # check only last date
return(a.plot)
# and the corresponding original series
}
}
# check and plot data
check_data(df)
My Problem polega na tym, że mam setki funkcji i chciałbym tylko wykreślić te, gdzie outlier
stało się. Jak widać na wykresie, jestem w stanie wymyślić fabułę, która zwraca wszystkie serie czasowe, w tym serię z odejściem raczej niż te, w których miał miejsce tylko outlier
. Dodatkowo chciałbym również zgłosić oryginalną serię (w tym ratios
, czyli biorąc pod uwagę odstęp w stosunku ca
Chciałbym również uzyskać oryginalną serię c
i a
... jak mogę podejść do tego problemu. Więc wyjście może wyglądać tak:
including original series:
and the outlier as well:
tylko rzucanie wysoką nagrodę na problem może nie być najlepszym ... wyjaśnianiu kwestii może pomóc bardziej w kategoriach uzyskania przydatnej odpowiedzi. – PascalVKooten
Co jest dla ciebie niejasne? Możesz być bardziej precyzyjny? –
Wiesz, że to zabawne, że tworzę powtarzalny przykład, przestrzegając zasad "SO" tak dobrze jak to możliwe dla początkującego. Starałem się być tak klarowny, jak to tylko możliwe. Miał 5 "Upvotes" zainteresowanych użytkowników i po 5 dniach bounty. A niektórzy ludzie po prostu zgodzili się z tym bez konstruktywnej krytyki i bez sugestii, jak to poprawić. –