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 メソッドを使用して、データから外れ値を取得しようとしています。しかし、このデータを使用すると、おそらく正常なデータもキャプチャされます。データ ポイントから季節性を取り除き、外れ値ルールを適用したいと考えています。

プロセス列には、何千もの異なるプロセスがあります。通常ではないプロセスの期間をキャプチャする必要があるだけです。データセットから季節性を取り除く方法はありますか? 以下のコードは外れ値を計算しますが、季節要因により、外れ値は正常である可能性があります。外れ値を計算する前に、データ フレームから季節性を取り除きたいと思います。

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]
4

2 に答える 2

6

考えられる季節的なパターンに対処するために、まずacf(df$Duration)さまざまなラグで自己相関を探します。何も見えなかったとしても、それをモデル化するアプリオリな理由がない限り、おそらく気にしないでしょう。常に 1 である自己相関を除いて、唯一の相関はラグ 1 であり、適度であるため、サンプル データは季節性の証拠を示していません。

ここに画像の説明を入力

季節的な要素 (周期的に繰り返されるイベント) だけでなく、トレンド (標準の緩やかな変化) も処理できるアプローチは、 Rob J Hyndman による この投稿stl()で具体的に実装されているように、見事です。

Hyndman が提供するdecomp関数 (以下に再現) は、季節性をチェックし、時系列を季節 (存在する場合)、トレンド、および残差コンポーネントに分解するのに非常に役立ちます。

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

この分析をさらに発展させるため、参照されているブログ投稿を参照する必要があります。

于 2012-11-05T20:14:33.287 に答える
2

smoothそれは、予測可能性または季節性に依存します。ゆるいモデルを作れるものですか?例えば、

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

またはいくつかのバリエーション。次に、予測された季節性と異なる限り、データを分析できます。

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

次に、差分を使用できますIQR。また、差分について言えば、Dateを使用してデータを並べ替えることで、役立つ情報が得られる場合がありますdiff

df <- df[order(df$Date),]
DIF2 <- diff(df$Date)
plot(diff(df$Date))

理論的には、DIF2は で生成された関数の導関数でなければなりませんLM

余談ですが、非常に体系的なアプローチ (つまり、パッケージをロードしてBlindlyGetRidOfOultliersAdjustingForSeasonality(df)、季節性が実際に複雑な場合) を採用することはお勧めしません。

于 2012-11-05T20:00:46.737 に答える