시계열 변화 감지 (R 예)


18

일반적으로 모양이 동일한 시계열 데이터의 변화를 감지하고 싶습니다. 지금까지 내가 함께 작업 한 changepointR에 대한 패키지와 cpt.mean(), cpt.var()cpt.meanvar()기능. cpt.mean()PELT 방법을 사용하면 데이터가 일반적으로 한 수준으로 유지 될 때 잘 작동합니다. 그러나 나는 또한 하강 중에 변화를 감지하고 싶습니다. 내가 감지하고 싶은 변화의 한 예는 검은 곡선이 갑자기 떨어지는 구간인데 실제로는 빨간색 점선을 따라야합니다. cpt.var () 함수를 실험했지만 좋은 결과를 얻지 못했습니다. 권장 사항이 있습니까? 반드시 R을 사용할 필요는 없습니다.

커브 변경

다음은 변경 사항이있는 데이터입니다 (R 객체로).

dat.change <- c(12.013995263488, 11.8460207231808, 11.2845153487846, 11.7884417180764, 
11.6865425802022, 11.4703118125303, 11.4677576899063, 11.0227199625084, 
11.274775836817, 11.03073498338, 10.7771805591742, 10.7383206158923, 
10.5847230134625, 10.2479315651441, 10.4196381241735, 10.467607842288, 
10.3682422713283, 9.7834431752935, 9.76649842404295, 9.78257968297228, 
9.87817694914062, 9.3449034905713, 9.56400153361727, 9.78120084558148, 
9.3445162813738, 9.36767436354887, 9.12070987223648, 9.21909859069157, 
8.85136359917466, 8.8814423003979, 8.61830163359642, 8.44796977628488, 
8.06957847272046, 8.37999165387824, 7.98213210294954, 8.21977468333673, 
7.683960439316, 7.73213584532496, 7.98956476021092, 7.83036046746187, 
7.64496198988985, 4.49693528397253, 6.3459274845112, 5.86993447552116, 
4.58301192892403, 5.63419551523625, 6.67847511602895, 7.2005344054883, 
5.54970477623895, 6.00011922569104, 6.882667104467, 4.74057284230894, 
6.2140437333397, 6.18511450451019, 5.83973575417525, 6.57271194428385, 
5.36261938326723, 5.48948831338016, 4.93968645996861, 4.52598133247377, 
4.56372558828803, 5.74515428123725, 5.45931581984165, 5.58701112949141, 
6.00585679276365, 5.41639695946931, 4.55361875158434, 6.23720558202826, 
6.19433060301002, 5.82989415940829, 5.69321394985076, 5.53585871082265, 
5.42684812413063, 5.80887522466946, 5.56660158483312, 5.7284521523444, 
5.25425775891636, 5.4227645808924, 5.34778016248718, 5.07084809927736, 
5.324066161355, 5.03526881241705, 5.17387528516352, 5.29864121433813, 
5.36894461582415, 5.07436929444317, 4.80619983525015, 4.42858947882894, 
4.33623051506001, 4.33481791951228, 4.38041031792294, 3.90012900415342, 
4.04262777674943, 4.34383842876647, 4.36984816425014, 4.11641092254315, 
3.83985887104645, 3.81813419810962, 3.85174630901311, 3.66434598962311, 
3.4281724860426, 2.99726515704766, 2.96694634792395, 2.94003031547181, 
3.20892607367132, 3.03980832743458, 2.85952185077593, 2.70595278908964, 
2.50931109659839, 2.1912274016859)

R 코드 만 요청하는 경우 여기서는 주제가 맞지 않습니다. 일반적인 방법 론적 조언을 요구한다면 괜찮습니다. R 코드가있을 수 있지만 다시는 그렇지 않을 수 있습니다.
gung-복직 모니카

1
좋은 의견, 나는 일반적인 솔루션에 관심이 있으며 R을 사용하는 것이 편리 할 것입니다.
mlee

답변:


17

시계열 이상치 탐지를 사용하여 시계열의 변화를 감지 할 수 있습니다. Tsay 또는 Chen과 Liu의 절차는 널리 사용되는 시계열 이상치 탐지 방법입니다. 이 사이트에서 내 이전 질문 을 참조하십시오 .

R의 tsoutlier 패키지는 Chen과 Liu의 방법을 사용하여 특이 치를 탐지합니다. SAS / SPSS / Autobox도이 작업을 수행 할 수 있습니다. 시계열의 변화를 감지하는 R 코드는 아래를 참조하십시오.

library("tsoutliers")
dat.ts<- ts(dat.change,frequency=1)
data.ts.outliers <- tso(dat.ts)
data.ts.outliers
plot(data.ts.outliers)

tsoultlier 패키지의 tso 함수는 다음과 같은 특이 치를 식별합니다. 특이 값 유형을 확인하기 위해 설명서를 읽을 수 있습니다.

Outliers:
  type ind time coefhat   tstat
1   TC  42   42 -2.9462 -10.068
2   AO  43   43  1.0733   4.322
3   AO  45   45 -1.2113  -4.849
4   TC  47   47  1.0143   3.387
5   AO  51   51  0.9002   3.433
6   AO  52   52 -1.3455  -5.165
7   AO  56   56  0.9074   3.710
8   LS  62   62  1.1284   3.717
9   AO  67   67 -1.3503  -5.502

패키지는 또한 멋진 음모를 제공합니다. 아래를 참조하십시오. 이 그림은 특이 치의 위치와 특이 치가없는 경우 어떤 일이 있었는지 보여줍니다.

여기에 이미지 설명을 입력하십시오

또한 strucchange 라는 R 패키지를 사용 하여 레벨 이동을 감지했습니다. 귀하의 데이터에 대한 예로서

library("strucchange")
breakpoints(dat.ts~1)

이 프로그램은 중단 점 또는 구조적 변경을 올바르게 식별합니다.

Optimal 4-segment partition: 

Call:
breakpoints.formula(formula = dat.ts ~ 1)

Breakpoints at observation number:
17 41 87 

Corresponding to breakdates:
17 41 87 

도움이 되었기를 바랍니다


1
고마워, tso잘 작동하지만 더 큰 데이터 세트의 경우 약간 느립니다. struccchange의 중단 점 위치는 약간 임의적 인 것으로 보입니다 (위치 41 제외).
mlee

7

나는 다음 관점 에서이 문제에 접근 할 것이다 . 이것들은 내 머리 꼭대기에서 나온 아이디어 일뿐입니다. 소금 한알로 가져 가십시오. 그럼에도 불구하고, 이것이 유용하기를 바랍니다.

  • 시계열 클러스터링 . 예를 들어, 널리 사용되는 DTW (Dynamic Time Warping) 또는 대체 방법을 사용합니다. 내 관련 답변을 참조하십시오 : 분류 / 클러스터링 에 대한 DTWDTW 또는 고르지 않은 시계열에 대한 대안 . 아이디어 는 시계열을 "정상"및 "비정상"(또는 유사한) 범주로 클러스터링 하는 입니다.

  • 엔트로피 측정 . 시계열 엔트로피 측정에 대한 관련 답변 참조하십시오 . 아이디어는 (이 아이디어는의 가정이 "정상적인"시계열의 엔트로피를 결정하고 다른 시간 시리즈와 비교하는 것입니다 엔트로피 편차 "정상"에서 편차의 경우)를.

  • 이상 감지 . 이상 감지에 대한 관련 답변 참조하십시오 (R 리소스 포함). 아이디어 는 다양한 방법을 통해 이상 을 직접 감지 하는 입니다 (참고 자료 참조). 조기 경고 신호 (EWS) 도구 상자R패키지 earlywarnings가 특히 유망한 것 같습니다.


6

AUTOBOX를 사용한 내 응답은 @forecaster와 매우 유사하지만 훨씬 간단한 모델입니다. Box와 Einstein 등은 솔루션을 단순하지만 너무 단순하게 유지하는 데 중점을 두었습니다. 자동으로 개발 된 모델은 여기에 이미지 설명을 입력하십시오입니다. 실제와 정리 된 음모는 매우 유사 여기에 이미지 설명을 입력하십시오합니다. 잔차 그림 (항상 표시해야 함)은 여기에 이미지 설명을 입력하십시오잔차의 필수 acf와 함께 표시 여기에 이미지 설명을 입력하십시오됩니다. 잔차 통계는 항상 "결투 모델"간의 비교에 유용합니다 여기에 이미지 설명을 입력하십시오. 실제 / 적합 / 예측 그래프는 여기여기에 이미지 설명을 입력하십시오


1

데이터를 비추천하면 문제가 크게 단순화 된 것처럼 보입니다. 선형 적으로 하락하는 것으로 보입니다. 데이터를 추론하면 비정상 성이 아닌 다양한 테스트를 적용 할 수 있습니다.


3
역사에는 분명 다른 경사가 있기 때문에이 접근법은 실패 할 것입니다. 여러 "트렌드 / 기울기"를 통합하지 않으면이 방법으로 의미있는 결과를 얻을 수 없습니다. 간단한 간단한 솔루션은 종종 너무 단순합니다.
IrishStat

1

모든 훌륭한 답변이지만 여기에 @MrMeritology에서 제안한 간단한 질문이 있습니다.이 시계열은 문제의 시계열에 적합하고 다른 많은 "유사한"데이터 세트에 적합합니다.

다음은 자체 설명 그래프를 생성하는 R- 스 니펫입니다.

outl = rep( NA, length(dat.change))
detr = c( 0, diff( dat.change))

ix = abs(detr) > 2*IQR( detr)
outl[ix] = dat.change[ix]

plot( dat.change, t='l', lwd=2, main="dat.change TS")
points( outl, col=2, pch=18)

plot( detr, col=4, main="detrended TS", t='l', lwd=2 )
acf( detr, main="ACF of detrended TS")

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


여러 경향 ​​변화와 여러 절편 변화 (레벨 이동)가있을 수 있습니다. 따라서 실제로이를 결정하기 위해 데이터를 진단하는 솔루션을 찾아야합니다.
IrishStat

네, 사실, 나는 당신의 이전 의견을 읽었습니다. 그러나 시계열을 진단하여 여러 추세 / 레벨을 감지하는 것은 그 자체로 문제가됩니다. 여기서 요점은 위의 간단한 접근 방식이 특히 주어진 데이터에 대해 때때로 작동한다는 것을 보여줍니다. 반대로, 단일 접근 방식이 항상 잘 작동하지는 않습니다. R.Hyndman (R-function tsoutliers)의 접근 방식은 내가 추천하는 것입니다.
dnqxt

AUTOBOX는 (적어도 우리가 본 시계열의 수십억에 대해) 항상 잘 작동하는 단일 접근 방식이며 R 버전이 있습니다. 내가 "salesy"에 가고 싶지 않아서 오프라인으로 채팅하고 싶다면 여기에서 완전히 이해 가능하고 투명하지만 쉽게 복제되지 않는 프로세스를 설명 할 수 있습니다.
IrishStat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.