27.4 기상·기후 예측의 평가

실습 · 연습문제 2개

자기상관을 보정한 추세의 표준오차 trend-effective-n

연평균 기온 편차처럼 자기상관이 있는 시계열에서 최소제곱 추세의 표준오차를 그대로 쓰면, 추세가 실제보다 확실해 보인다. 함수 trend_test(y)를 완성해 (slope, se_naive, n_eff, se_adj)를 반환한다.

y의 길이를 nn, 시점을 가운데로 옮긴 ti=i−(n−1)/2t_i = i - (n-1)/2라 할 때:

  1. 기울기 b=∑itiyi/∑iti2b = \sum_i t_i y_i \big/ \sum_i t_i^2, 잔차 ei=yi−yˉ−b tie_i = y_i - \bar{y} - b\,t_i.
  2. 순진한 표준오차 SE=∑iei2(n−2)∑iti2\mathrm{SE} = \sqrt{\dfrac{\sum_i e_i^2}{(n-2)\sum_i t_i^2}}.
  3. 잔차의 lag-1 자기상관 r1=∑i≥1eiei−1/∑iei2r_1 = \sum_{i \ge 1} e_i e_{i-1} \big/ \sum_i e_i^2.
  4. 유효 표본 수 neff=n 1−r11+r1n_\text{eff} = n\,\dfrac{1 - r_1}{1 + r_1}. 단, 3보다 작으면 3, nn보다 크면 nn으로 자른다(r1<0r_1 < 0이어도 표본 수를 늘리지 않는다).
  5. 보정한 표준오차 SEadj=SEn−2neff−2\mathrm{SE}_\text{adj} = \mathrm{SE}\sqrt{\dfrac{n-2}{n_\text{eff}-2}}.

모든 반환값은 Python float(또는 0차원 NumPy 값)이다.

힌트: 2번의 분모 (n−2)(n-2)가 5번에서 (neff−2)(n_\text{eff}-2)로 바뀐다고 보면 된다. 잔차의 자유도를 유효 표본 수로 다시 세는 것이다.

동서 방향 에너지 스펙트럼으로 흐릿함 재기 zonal-spectrum

RMSE는 예보가 작은 규모의 변동을 잃어도 오히려 좋아질 수 있다. 위도권을 따라(동서 방향) 에너지 스펙트럼을 비교하면 어느 규모에서 변동이 사라졌는지 보인다. 함수 energy_ratio(fc, truth)를 완성해 (ratio, k_half)를 반환한다.

인자 shape 설명
fc (..., nlon) 예보. 마지막 축이 위도권 한 바퀴(주기 경계)
truth (..., nlon) 같은 shape의 정답
  1. 파수별 평균 에너지 P(k)=∣f^k∣2‾/nlon2P(k) = \overline{\lvert \hat f_k \rvert^2} / n_\text{lon}^2를 구한다. f^k\hat f_k는 마지막 축의 np.fft.rfft이고, 윗줄은 앞쪽 모든 축(사례, 위도 등)에 대한 평균이다.
  2. ratio[k-1] =Pfc(k)/Ptruth(k)= P_\text{fc}(k) / P_\text{truth}(k), k=1,…,nlon/2k = 1, \dots, n_\text{lon}/2. 길이는 nlon // 2이다(평균에 해당하는 k=0k=0은 뺀다).
  3. k_half는 비율이 처음으로 0.5보다 작아지는 파수 kk(정수)다. 그런 파수가 없으면 None.

k_half는 "이 예보가 실제로 표현하는 가장 작은 규모"의 대략적인 지표다. 파장으로는 위도권 둘레를 k_half로 나눈 길이다.

힌트: np.fft.rfft(x, axis=-1)의 길이는 nlon // 2 + 1이다. 앞쪽 축이 여러 개면 reshape(-1, nlon)으로 펴서 평균한다.