16.4 Minimization Failure를 줄이기 위한 변수 변환

임의의 함수를 최적화(여기서는 minimization)하는 과정에서 적합 실패(fitting failure)가 잘 나타난다. 이를 줄이기 위해 많은 노력이 있었는데, NONMEM에서는 다음과 같이 한다.

  1. Uncontsrained miminization을 사용하되 모든 파라미터들의 초기값(initial value)을 모두 0.1에서 시작한다.

  2. 주어진 초기값과 한계값(boundary)을 위의 값이 되도록 변환하는 factor를 구한다.

위의 일을 하기 위하여 \(\theta\)의 경우와 분산인 \(\Omega\)\(\Sigma\) 경우에 다른 변환 방법을 사용한다.

\(\theta\)의 경우에 먼저 다음과 같은 \(\alpha\)라 불리는 변환 factor를 구한다.

\(\alpha = 0.1 - log \left( \frac{(IE - LB)/(UB -LB)}{(1 - (IE - LB)/(UB - LB))} \right)\)

위에서 IE는 initial estimate, LB는 lower bound, UB는 upper bound를 의미한다.

이후 다음 식에 의해 original scale에서의 parameter값을 구하게 된다.

p1 = exp(STP - alpha)
p2 = p1/(p1 + 1)*(UB - LB) + LB

위에서 p2가 original scale에서의 parameter인데, STP는 scaled and transformed parameter의 약어이며, 요즘은 UCP (unconstrained parameter)라고 불린다.

분산들의 경우에는 좀 더 복잡한데, 우선 다음과 같이 scale factor를 구한다.

ScaleVar = function(VarMat, dim1)
{
  M1 = chol(VarMat)
  V1 = diag(M1)
  M2 = abs(10 * (M1 - diag(V1, nrow=dim1))) + diag(V1/exp(0.1), nrow=dim1)
  return(t(M2))
}

위와 같이 VarScale을 구한 뒤에, 매 iteration에서 original scale에서의 값으로 변환하여 목적 함수(objective function) 값을 구하게 된다.

DesclVar = function(mUCP, mSCL)
{
  nRow = dim(mUCP)[1]
  maT = matrix(nrow=nRow, ncol=nRow)

  for (i in 1:nRow) {
    for (j in 1:nRow) {
      if (i==j) {
        maT[i,j] = exp(mUCP[i,j]) * mSCL[i,j]
      } else if(i > j) {
        maT[i,j] = mUCP[i,j] * mSCL[i,j]
      } else {
        maT[i,j] = 0
      }
    }
  }
  return(maT %*% t(maT))
}

분산항(variance term)들의 변환은 기본적으로 Cholesky decomposition을 사용하며, 대각 원소에 대해서는 약간 다르게 계산한다.