시계열에서 노이즈 패치를 강조 표시하려면 어떻게해야합니까?


9

수위와 속도 대 시간과 같은 많은 시계열 데이터가 있습니다. 유압 모델 시뮬레이션의 출력입니다. 모델이 예상대로 작동하는지 확인하기위한 검토 프로세스의 일부로, 데이터에 "흔들림"이 없도록 각 시계열을 플로팅해야합니다 (아래의 작은 흔들림 참조). 모델링 소프트웨어의 UI를 사용하는 것은이 데이터를 확인하는 매우 느리고 힘든 방법입니다. 따라서 짧은 VBA 매크로를 작성하여 결과를 포함하여 모델의 다양한 데이터 비트를 Excel로 가져 와서 한 번에 플롯했습니다. 시계열 데이터를 분석하고 의심되는 섹션을 강조하기 위해 또 다른 짧은 VBA 매크로를 작성하고 싶습니다.

지금까지 나의 유일한 생각은 데이터의 기울기에 대한 분석을 할 수 있다는 것입니다. 주어진 검색 창 내에서 기울기가 빠르게 양에서 음으로 여러 번 빠르게 변하는 곳은 불안정한 것으로 분류 할 수 있습니다. 더 간단한 트릭을 놓치고 있습니까? 기본적으로 "안정된"시뮬레이션은 매우 부드러운 곡선을 제공해야합니다. 갑작스런 변화는 계산이 불안정한 결과 일 수 있습니다.

사소한 불안정성 예


1
간단한 방법에 대해서는 Tukey의 저서 EDA 를 읽으십시오 . 예를 들어, 책 초반에는 간단한 스무더와 잔차를 얻는 데 사용하는 방법에 대해 설명합니다. 절대 잔차의 후속 순조로 인해 곡선의 로컬 변동성이 차트로 나타나고, 급격한, 갑작스런 또는 외부 변화가있는 경우에는 높아지고, 그렇지 않으면 낮게 유지됩니다. 훨씬 더 복잡한 방법이 가능하지만 아마도 이것으로 충분할 것입니다. Tukey에의 smoothers은 VBA 코드에 상대적으로 쉽게 : 나는 그것을 수행했다 .
whuber

@ whuber 이것은 본질적으로 슬라이딩 하이 패스 필터의 힘입니까?
amoeba

@amoeba 아마. 이러한 필터에 대한 나의 이해는 그것들이 완전히 국지적이지 않고 확실히 강하지는 않지만 Tukey의 스무더는 이러한 중요한 특성을 모두 가지고 있다는 것입니다. (오늘날 사람들은 스무딩을 위해 Loess 또는 GAM을 사용하지만, 이는 구현하기가 훨씬 간단합니다.)
whuber

답변:


11

간단하게하기 위해, 데이터의 강력한 평활도와 관련하여 잔차의 크기 (절대 값)를 분석하는 것이 좋습니다. 자동 감지의 경우 해당 크기를 표시기로 대체하는 것을 고려하십시오.1α, 그렇지 않으면 0 이 표시기를 매끄럽게하고 초과하는 평활화 된 값을 강조 표시합니다α.

그림

왼쪽 그림의 그래픽 1201데이터 포인트는 파란색으로 튼튼하고 로컬에서는 부드러운 검정색으로 표시됩니다. 오른쪽의 그래픽은 해당 부드러운 잔차의 크기를 보여줍니다. 검은 색 점선은 80 번째 백분위 수입니다 (α=0.2). 빨간색 곡선은 위에서 설명한대로 구성되었지만 (01) 플로팅을위한 절대 잔차의 중간 범위까지.

다양한 α정밀도를 제어 할 수 있습니다. 이 경우 설정α 이하 0.20 설정하는 동안 약 22 시간 동안 소음의 짧은 간격을 식별합니다. α ~보다 큰 0.20 0 시간 근처에서 급격한 변화를 포착합니다.

매끄러운 세부 사항은별로 중요하지 않습니다. 이 예에서 황토는 (구현 부드럽게 Rloessspan=0.05를 지역화하는)를 사용했지만, 심지어 윈도우 평균 완료 벌금을 것이다. 절대 잔차를 매끄럽게하기 위해 너비 17의 창 평균 (약 24 분)을 실행 한 다음 창 중앙값을 실행했습니다. 이러한 윈도우 스무딩은 Excel에서 비교적 쉽게 구현할 수 있습니다. 효율적인 VBA 구현 (이전 버전의 Excel 용이지만 소스 코드는 새 버전에서도 작동해야 함)은 http://www.quantdec.com/Excel/smoothing.htm 에서 사용할 수 있습니다 .


R 암호

#
# Emulate the data in the plot.
#
xy <- matrix(c(0, 96.35,  0.3, 96.6, 0.7, 96.7, 1, 96.73, 1.5, 96.74, 2.5, 96.75, 
               4, 96.9, 5, 97.05, 7, 97.5, 10, 98.5, 12, 99.3, 12.5, 99.35, 
               13, 99.355, 13.5, 99.36, 14.5, 99.365, 15, 99.37, 15.5, 99.375, 
               15.6, 99.4, 15.7, 99.41, 20, 99.5, 25, 99.4, 27, 99.37),
             ncol=2, byrow=TRUE)
n <- 401
set.seed(17)
noise.x <- cumsum(rexp(n, n/max(xy[,1])))
noise.y <- rep(c(-1,1), ceiling(n/2))[1:n]
noise.amp <- runif(n, 0.8, 1.2) * 0.04
noise.amp <- noise.amp * ifelse(noise.x < 16 | noise.x > 24.5, 0.05, 1)
noise.y <- noise.y * noise.amp

g <- approxfun(noise.x, noise.y)
f <- splinefun(xy[,1], xy[,2])
x <- seq(0, max(xy[,1]), length.out=1201)
y <- f(x) + g(x)
#
# Plot the data and a smooth.
#
par(mfrow=c(1,2))
plot(range(xy[,1]), range(xy[,2]), type="n", main="Data", sub="With Smooth",
     xlab="Time (hours)", ylab="Water Level")
abline(h=seq(96, 100, by=0.5), col="#e0e0e0")
abline(v=seq(0, 30, by=5), col="#e0e0e0")
#curve(f(x) + g(x), xlim=range(xy[,1]), col="#2070c0", lwd=2, add=TRUE, n=1201)
lines(x,y, type="l", col="#2070c0", lwd=2)

span <- 0.05
fit <- loess(y ~ x, span=span)
y.hat <- predict(fit)
lines(fit$x, y.hat)
#
# Plot the absolute residuals to the smooth.
#
r <-  abs(resid(fit))
plot(fit$x, r, type="l", col="#808080",
     main="Absolute Residuals", sub="With Smooth and a Threshold",
     xlab="Time hours", ylab="Residual Water Level")
#
# Smooth plot an indicator of the smoothed residuals.
#
library(zoo)
smooth <- function(x, window=17) {
  x.1 <- rollapply(ts(x), window, mean)
  x.2 <- rollapply(x.1, window, median)
  return(as.vector(x.2))
}
alpha <- 0.2
threshold <- quantile(r, 1-alpha)
abline(h=threshold, lwd=2, lty=3)
r.hat <- smooth(r >threshold)
x.hat <- smooth(fit$x)
z <- max(r)/2 * (r.hat > alpha)
lines(x.hat, z, lwd=2, col="#c02020")
par(mfrow=c(1,1))

1
+1. OP의 음모에서 데이터를 어떻게 긁어 냈습니까?
amoeba 2012

2
@Amoeba 특히 15 시간 후 흔들기에는 너무 많은 문제가 될 것입니다. 곡선에서 12 개의 점을 보았고, 스플라인을 플로팅하고, 스플라인이 생성 할 수있는 이상한 스파이크를 제거하기 위해 중간 점을 삽입했으며, 음의이 분산 상관 오류를 추가했습니다. 전체 프로세스는 몇 분 밖에 걸리지 않았으며 질문에 표시된 것과 같은 질적으로 데이터 세트가 생성되었습니다.
whuber

내 줄거리에서 데이터를 얻는 방법이 궁금합니다! 건배! 나는 그것을 줄 것이다.
davehughes87

FWIW, 나는 그림을 만드는 데 사용한 코드를 게시했습니다. VBA는 아니지만 세부 사항을 명확하게 설명합니다. (cc @amoeba)
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.