2012-11-05 2 views
1
dput(df) 
structure(list(Process = c("PROC050D", "PROC051D", "PROC100D", 
"PROC103D", "PROC104D", "PROC106D", "PROC106D", "PROC110D", "PROC111D", 
"PROC112D", "PROC113D", "PROC114D", "PROC130D", "PROC131D", "PROC132D", 
"PROC154D", "PROC155D", "PROC156D", "PROC157D", "PROC158D", "PROC159D", 
"PROC160D", "PROC161D", "PROC162D", "PROC163D", "PROC164D", "PROC165D", 
"PROC166D", "PROC170D", "PROC171D", "PROC173D", "PROC174D", "PROC177D", 
"PROC180D", "PROC181D", "PROC182D", "PROC185D", "PROC186D", "PROC187D", 
"PROC190D", "PROC191D", "PROC192D", "PROC196D", "PROC197D", "PROC201D", 
"PROC202D", "PROC203D", "PROC204D", "PROC205D", "PROC206D"), 
    Date = structure(c(15393, 15393, 15393, 15393, 15393, 15393, 
    15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 
    15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 
    15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 
    15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393, 
    15393, 15393, 15393, 15393, 15393, 15393, 15393, 15393), class = "Date"), 
    Duration = c(30L, 78L, 20L, 15L, 129L, 56L, 156L, 10L, 1656L, 
    1530L, 52L, 9L, 10L, 38L, 48L, 9L, 26L, 90L, 15L, 23L, 13L, 
    9L, 34L, 12L, 11L, 16L, 24L, 11L, 236L, 104L, 9L, 139L, 11L, 
    10L, 22L, 11L, 55L, 35L, 12L, 635L, 44L, 337L, 44L, 9L, 231L, 
    32L, 19L, 170L, 22L, 19L)), .Names = c("Process", "Date", 
"Duration"), row.names = c(NA, 50L), class = "data.frame") 

IQR 방법을 사용하여 데이터에서 outliers를 캡처하려고합니다. 그러나이 데이터를 사용할 때 정상적인 데이터를 캡처합니다. 내 데이터 포인트에서 계절성을 제거한 다음 이상 값 규칙을 적용하는 것이 좋습니다.일별 시계열 데이터에서 계절성을 제거합니다.

프로세스 열에는 수천 개의 서로 다른 프로세스가 있습니다. 난 그냥 정상이 아닌 프로세스의 지속 시간을 캡처해야합니다. 내 데이터 세트에서 계절성을 제거하는 방법에 대한 아이디어가 있습니까? 아래의 코드는 특이점을 계산하지만 특이점으로 인해 특이점이 될 수 있습니다. 특이점을 계산하기 전에 내 데이터 프레임에서 계절성을 제거하고 싶습니다.

library(data.table) 

df<-df[, seventyFifth := quantile(Duration, .75), by = Process] 
df<-df[, twentyFifth := quantile(Duration, .25), by = Process] 
df<-df[, IQR := (seventyFifth-twentyFifth), by = Process] 

df$diff<-df$Duration-df$seventyFifth 

df<-df[, outlier := diff > 3 * IQR, by = Process] 
+0

@GSee, no. 게시물을 업데이트했습니다. 계절 데이터가 이상치 계산에 나타나지 않도록 데이터를 제거하거나 마사지하고 싶습니다. 계절 데이터 포인트를 제외하고 내 데이터 세트에서 이상 치를 캡처해야합니다. – user1471980

답변

2

예측 가능성 또는 계절성이 smooth에 달려 있습니다. 당신이 느슨한 모델을 만들 수있는 곳인가요? 예 :

LM <- lm(duration~sin(Date)+cos(Date)) 

또는 일부 변형입니다.

P <- predict(LM) 
DIF <- P-df$duration 

이 그럼 당신은 DIF에 IQR을 사용할 수 그들이 예측 계절과 다를 그런 다음 당신은 단지까지 데이터를 분석 할 수 있습니다. dif의 경우, 데이터를 Date으로 정렬하고 diff을 사용하여 유용한 정보를 얻을 수 있습니다. 이론적
df <- df[order(df$Date),] 
DIF2 <- diff(df$Date) 
plot(diff(df$Date)) 

, DIF2LM 제조 함수의 도함수되어야한다. 보조 노트로

, 존재하는 경우, 내가, 즉 (매우 체계적인 접근 방식을 복용하는 패키지를로드하고 계절이 참으로 복잡한 경우 BlindlyGetRidOfOultliersAdjustingForSeasonality(df) 일을 권하고 싶지 않다.

6

이 가능한 계절 패턴을 해결하기 위해, 처음에는 acf(df$Duration)을 사용하여 서로 다른 시차를두고 자기 상관을 찾았습니다. 아무 것도 보지 못했지만 모델링 할 선험적 인 이유가 없다면 걱정하지 않을 것입니다. 샘플 데이터에는 계절성의 증거가 없습니다. - 항상 상관 관계가있는 자기 상관 이외의 유일한 상관 관계는 지연 1이며 겸손하다 :

enter image description here

계절 구성 요소 (주기적으로 반복되는 이벤트)뿐만 아니라 경향 (표준의 느린 변동)을 처리 할 수있는 방법은 특히 stl()이며 특히 Rob J Hyndman이 this posting에 구현 한 방식입니다.

Hyndman에서 제공하는 기능 (아래에 재현)은 계절성을 확인하고 시계열을 계절적 (존재하는 경우), 추세 및 나머지 구성 요소로 분해하는 데 매우 유용합니다. 어떤 계절이없는 경우 계절과 범 회귀 스플라인이있는 경우

decomp <- function(x,transform=TRUE) 
{ 
    #decomposes time series into seasonal and trend components 
    #from http://robjhyndman.com/researchtips/tscharacteristics/ 
    require(forecast) 
    # Transform series 
    if(transform & min(x,na.rm=TRUE) >= 0) 
    { 
    lambda <- BoxCox.lambda(na.contiguous(x)) 
    x <- BoxCox(x,lambda) 
    } 
    else 
    { 
    lambda <- NULL 
    transform <- FALSE 
    } 
    # Seasonal data 
    if(frequency(x)>1) 
    { 
    x.stl <- stl(x,s.window="periodic",na.action=na.contiguous) 
    trend <- x.stl$time.series[,2] 
    season <- x.stl$time.series[,1] 
    remainder <- x - trend - season 
    } 
    else #Nonseasonal data 
    { 
    require(mgcv) 
    tt <- 1:length(x) 
    trend <- rep(NA,length(x)) 
    trend[!is.na(x)] <- fitted(gam(x ~ s(tt))) 
    season <- NULL 
    remainder <- x - trend 
    } 
    return(list(x=x,trend=trend,season=season,remainder=remainder, 
    transform=transform,lambda=lambda)) 
} 

당신이 그것을 볼 수 있듯이

은 (황토를 사용하는) stl()을 사용합니다. 그것은 더이 분석을 개발하고 있기 때문에

# makemodel 
df.decomp <- decomp(df$Duration) 

# add results into df 
if (!is.null(df.decomp$season)){ 
    df$season <- df.decomp$season} else 
    {df$season < - 0} 
df$trend <- df.decomp$trend 
df$Durationsmoothed <- df.decomp$remainder 

# if you don't want to detrend 
df$Durationsmoothed <- df$Durationsmoothed+df$trend 

당신은 참조 된 블로그 게시물을 참조해야합니다 :

는 귀하의 경우에는 기능이 방법을 사용할 수 있습니다.