12.3 예측값이 반드시 범위 안에 있도록 만들기

예측값이 양수값이길 바라는 것이나 어떤 특정한 범위 \([a,b]\) 안에 있도록 하는 것은 흔한 일입니다. 변환을 이용하면 이러한 상황 둘 다 상대적으로 쉽게 다룰 수 있습니다.

양수 예측값

양수 제한 조건을 걸려면, 단순히 박스-칵스(Box-Cox) 변환 매개변수를 \(\lambda=0\)로 두고 로그 눈금에서 작업하면 됩니다. 예를 들어, 계란 12개의 실제 가격(1900년부터 1993년까지; 단위: 센트)을 다뤄보면:

eggs %>%
  ets(model="AAN", damped=FALSE, lambda=0) %>%
  forecast(h=50, biasadj=TRUE) %>%
  autoplot()
박스-칵스(Box-Cox) 변환을 이용하여 양수값이 되도록하는 제한을 둔 상황에서 계란 12개 가격 예측값.

Figure 12.3: 박스-칵스(Box-Cox) 변환을 이용하여 양수값이 되도록하는 제한을 둔 상황에서 계란 12개 가격 예측값.

biasadj=TRUE로 두었기 때문에, 예측값은 예측 분포의 평균값입니다.

어떤 범위 안에 제한된 예측값

어떤 범위 안에 제한된 데이터를 다루는 방법을 살펴보기 위해, 계란 가격이 \(a=50\)에서 \(b=400\) 사이에 있었다고 생각해봅시다. 그러면, \((a,b)\)를 전체 실수(real) 선으로 눈금 조절된 로짓(logit) 변환으로 데이터를 변환할 수 있습니다: \[ y = \log\left(\frac{x-a}{b-x}\right), \] 여기에서 \(x\)는 원래의 눈금에 있는 값이고, \(y\)는 변환된 데이터입니다. 변환을 되돌리려면, 다음의 관계식을 사용하면 됩니다. \[ x = \frac{(b-a)e^y}{1+e^y} + a. \] 이것은 내장된 변환이 아니기 때문에, 추가적인 작업이 필요합니다.

    # Bounds
    a <- 50
    b <- 400
    # Transform data and fit model
    fit <- log((eggs-a)/(b-eggs)) %>%
      ets(model="AAN", damped=FALSE)
    fc <- forecast(fit, h=50)
    # Back-transform forecasts
    fc[["mean"]] <- (b-a)*exp(fc[["mean"]]) /
      (1+exp(fc[["mean"]])) + a
    fc[["lower"]] <- (b-a)*exp(fc[["lower"]]) /
      (1+exp(fc[["lower"]])) + a
    fc[["upper"]] <- (b-a)*exp(fc[["upper"]]) /
      (1+exp(fc[["upper"]])) + a
    fc[["x"]] <- eggs
    # Plot result on original scale
    autoplot(fc)
50과 400 사이에 오도록 제한을 둔 상황에서 계란 12개 가격 예측값.

Figure 12.4: 50과 400 사이에 오도록 제한을 둔 상황에서 계란 12개 가격 예측값.

여기에서 편향 조정을 사용하지 않았습니다. 그래서 예측값은 미래 분포의 중간값입니다. 이러한 변환에서 얻은 예측 구간은 단조 증가 변환(monotonically increasing transformation)에도 분위수(quantile)가 보존되기 때문에 변환된 눈금에서 얻은 것과 같은 포함확률(coverage probability)을 갖습니다.

예측구간은 변환 때문에 50 이상에 위치합니다. 이러한 인위적인 (그리고 비현실적인) 제한 조건의 결과로, 예측분포는 극단적으로 쏠리게 됩니다.