MCMC 추정과 적합도 검정
SNA 이론 · 단계별 학습 차례

단원 5-7MCMC Estimation and Goodness of Fit

MCMC 추정과 적합도 검정

SNA 이론 · 단계별 학습STAGED+ 스터디

1. 오늘의 질문 (The Question)

5-6에서 우리는 아주 불편한 사실을 손으로 확인했다. triangle이나 gwesp가 들어오면 정규화 상수

κ(θ)  =  모든 망 yexp(θ ⁣g(y)) \kappa(\boldsymbol\theta) \;=\; \sum_{\text{모든 망 } y} \exp\bigl(\boldsymbol\theta^{\!\top}\mathbf g(y)\bigr)

쌍마다의 곱으로 쪼개지지 않는다. n=4n=4짜리 망에서 64개를 전부 더해 κ=23.39495646\kappa = 23.39495646을 얻었을 때, 그 값이 6개 인수의 곱과 다르다는 것을 눈으로 봤다.

그런데 5-6에서 우리는 ergm(nwk ~ edges + gwesp(0.5, fixed=TRUE))를 실행해서 계수와 표준오차를 뽑아 썼다. 그러면 이상하다.

오늘의 질문.
κ\kappa를 더할 수 없다면, ergm()은 대체 무엇을 계산해서 계수를 내놓았는가?
그리고 5-6 §8에서 본 did not mix at all이라는 에러 — 그 "mix"는 무엇이고, 에러가 안 났을 때는 제대로 걸었다는 걸 어떻게 확인하는가?
마지막으로, 계수가 나왔다 치자. 그 모형이 진짜 우리 반을 닮았는지는 어떻게 채점하는가?

답은 순서대로 MCMC, mcmc.diagnostics(), gof()다. 오늘은 이 셋을 손으로 여섯 걸음 걸어 보는 것부터 시작한다.

2. 적률 방정식 다시 보기 (The Moment Equation Revisited)

5-1에서 유도했던 것을 다시 쓴다. 관측망 yobsy_{\text{obs}}의 로그가능도는

(θ)  =  θ ⁣g(yobs)    logκ(θ) \ell(\boldsymbol\theta) \;=\; \boldsymbol\theta^{\!\top}\mathbf g(y_{\text{obs}}) \;-\; \log\kappa(\boldsymbol\theta)

이고, θk\theta_k로 미분할 때 두 번째 항은 이렇게 풀린다.

θklogκ(θ)=1κ(θ)ygk(y)eθ ⁣g(y)=ygk(y)eθ ⁣g(y)κ(θ)Pθ(y)=Eθ[gk(Y)] \frac{\partial}{\partial\theta_k}\log\kappa(\boldsymbol\theta) = \frac{1}{\kappa(\boldsymbol\theta)}\sum_{y} g_k(y)\,e^{\boldsymbol\theta^{\!\top}\mathbf g(y)} = \sum_{y} g_k(y)\,\underbrace{\frac{e^{\boldsymbol\theta^{\!\top}\mathbf g(y)}}{\kappa(\boldsymbol\theta)}}_{P_{\boldsymbol\theta}(y)} = E_{\boldsymbol\theta}\bigl[g_k(Y)\bigr]

그래서 /θk=0\partial\ell/\partial\theta_k = 0은 다음과 같다.

  Eθ[g(Y)]  =  g(yobs)   \boxed{\;E_{\boldsymbol\theta}\bigl[\mathbf g(Y)\bigr] \;=\; \mathbf g(y_{\text{obs}})\;}
말로 옮기면. "이 계수로 망을 무수히 만들어 냈을 때 통계량의 평균이 관측값과 정확히 같아지는 계수를 찾아라."
가라테에 edges만 넣었다면 "모의 망의 평균 간선 수가 78이 되게 하라"는 뜻이고, edges + gwesp를 넣었다면 "평균 간선 수 78, 평균 gwesp 82.92858이 되게 하라"는 뜻이다.

이것이 왜 중요한지는 §12에서 다시 나온다. 모형에 넣은 통계량은 정의상 맞을 수밖에 없다는 사실이 gof()를 읽는 핵심이기 때문이다.

3. 왜 그냥 못 푸는가 (Why It Cannot Be Solved Directly)

Eθ[g(Y)]E_{\boldsymbol\theta}[\mathbf g(Y)]를 계산하려면 가능한 모든 망을 다 훑어야 한다. 무방향 망에서 쌍의 개수는 N=(n2)N = \binom{n}{2}이고, 각 쌍이 0 또는 1이니 망은 2N2^N개다.

학급 크기 nn쌍의 개수 N=(n2)N=\binom{n}{2}가능한 망 2N2^N비고
46645-6에서 손으로 다 더했다
7212,097,1525-6에서 R로 다 더했다 (몇 초)
10453.5×1013\approx 3.5\times10^{13}하루 종일 돌려도 안 끝난다
34 (가라테)5617.5×10168\approx 7.5\times10^{168}우주의 원자 수(1080\approx10^{80})의 제곱보다 많다
1461 (FMH)1,066,530210665302^{1066530}쓸 수조차 없다
여기서 착각하기 쉬운 것. "그럼 컴퓨터가 더 빨라지면 되는 것 아닌가?"
아니다. nn이 1 늘 때마다 NNn1n-1만큼 늘고 망의 개수는 2n12^{n-1}가 된다. 가라테에서 한 명만 더 늘어도 계산량이 2332^{33}배 — 약 86억 배가 된다. 속도로는 절대 못 이긴다.

그런데 자세히 보면 우리가 필요한 건 κ\kappa 자체가 아니라 Eθ[g(Y)]E_{\boldsymbol\theta}[\mathbf g(Y)]라는 평균이다. 평균은 다 더하지 않아도 구할 수 있다 — 표본을 뽑으면 된다. 전교생 1000명의 평균 키를 재려고 1000명을 다 재지 않고 무작위 50명을 재는 것과 같은 발상이다.

문제는 "Pθ(y)P_{\boldsymbol\theta}(y)에서 망을 무작위로 뽑는 법"인데, 확률을 알려면 κ\kappa가 필요하고 κ\kappa를 모르니 뽑을 수가 없다 — 처럼 보인다. 이 고리를 끊는 것이 다음 절이다.

4. Metropolis–Hastings — κ\kappa가 약분된다 (Metropolis–Hastings: The Constant Cancels)

핵심 아이디어는 이렇다. 확률을 직접 계산하지 말고, 두 망의 확률 "비"만 쓰자. 비에서는 κ\kappa가 위아래로 똑같이 있어서 약분된다.

4.1 기호 (Notation)

5-3에서 쓴 표기를 그대로 가져온다. 쌍 (i,j)(i,j)만 다르고 나머지는 같은 두 망을

기호
yij+y^{+}_{ij}A[i,j]=1A[i,j]=1인 망 (그 간선이 있는 쪽)
yijy^{-}_{ij}A[i,j]=0A[i,j]=0인 망 (그 간선이 없는 쪽)
δij(y)\boldsymbol\delta_{ij}(y)변화 통계량 g(yij+)g(yij)\mathbf g(y^{+}_{ij}) - \mathbf g(y^{-}_{ij})

4.2 비를 계산하면 κ\kappa가 사라진다 (The Ratio Kills the Constant)

Pθ(yij+)Pθ(yij)=eθ ⁣g(yij+)/  κ(θ)eθ ⁣g(yij)/  κ(θ)=eθ ⁣[g(yij+)g(yij)]=eθ ⁣δij(y) \frac{P_{\boldsymbol\theta}(y^{+}_{ij})}{P_{\boldsymbol\theta}(y^{-}_{ij})} = \frac{e^{\boldsymbol\theta^{\!\top}\mathbf g(y^{+}_{ij})}\big/\;\kappa(\boldsymbol\theta)} {e^{\boldsymbol\theta^{\!\top}\mathbf g(y^{-}_{ij})}\big/\;\kappa(\boldsymbol\theta)} = e^{\boldsymbol\theta^{\!\top}\left[\mathbf g(y^{+}_{ij})-\mathbf g(y^{-}_{ij})\right]} = e^{\boldsymbol\theta^{\!\top}\boldsymbol\delta_{ij}(y)}
5-3에서 만든 변화 통계량이 여기서 값을 한다.
κ\kappa25612^{561}개를 더해야 하지만, δij\boldsymbol\delta_{ij}쌍 하나만 보면 나온다. edges는 항상 1, gwesp는 이웃 몇 개만 세면 되고, nodematch는 두 사람 속성만 비교하면 된다.
불가능한 양(κ\kappa)은 필요 없고, 값싼 양(δ\boldsymbol\delta)만 있으면 된다.

4.3 걸음 규칙 (The Walk)

현재 망을 yy라 하자. 한 걸음은 이렇게 걷는다.

단계할 일
NN개 쌍 중 하나 (i,j)(i,j)균등하게 고른다
그 쌍을 뒤집은yy'을 제안한다 (0이면 1로, 1이면 0으로)
수락 확률 a=min ⁣(1,  Pθ(y)Pθ(y))a = \min\!\left(1,\; \dfrac{P_{\boldsymbol\theta}(y')}{P_{\boldsymbol\theta}(y)}\right)를 계산한다
uUniform(0,1)u \sim \text{Uniform}(0,1)을 뽑아 u<au < a이면 yyy \leftarrow y', 아니면 yy그대로 둔다

③의 비를 §4.2에 넣으면 이렇게 갈린다.

a  =  {min(1,  e+θ ⁣δij)A[i,j]=0— 간선을 켜려는 제안min(1,  eθ ⁣δij)A[i,j]=1— 간선을 끄려는 제안 a \;=\; \begin{cases} \min\bigl(1,\; e^{+\boldsymbol\theta^{\!\top}\boldsymbol\delta_{ij}}\bigr) & A[i,j]=0 \quad \text{— 간선을 켜려는 제안}\\[4pt] \min\bigl(1,\; e^{-\boldsymbol\theta^{\!\top}\boldsymbol\delta_{ij}}\bigr) & A[i,j]=1 \quad \text{— 간선을 끄려는 제안} \end{cases}
부호를 헷갈리지 말 것. δij\boldsymbol\delta_{ij}언제나 "있는 쪽 − 없는 쪽"으로 정의된다. 켜는 제안은 없는 쪽에서 있는 쪽으로 가므로 지수가 +θ ⁣δ+\boldsymbol\theta^{\!\top}\boldsymbol\delta, 끄는 제안은 반대 방향이므로 θ ⁣δ-\boldsymbol\theta^{\!\top}\boldsymbol\delta다.
그리고 기각도 한 걸음이다. ④에서 제자리에 머문 것도 표본 하나로 센다. 이걸 빼먹으면 분포가 틀어진다.

4.4 왜 이게 맞는 답을 주는가 (Why This Works)

이 걸음은 세부 균형(detailed balance)을 만족한다. 즉 임의의 두 이웃 망 y,yy, y'에 대해

Pθ(y)q(y ⁣ ⁣y)a(y ⁣ ⁣y)  =  Pθ(y)q(y ⁣ ⁣y)a(y ⁣ ⁣y) P_{\boldsymbol\theta}(y)\,q(y\!\to\!y')\,a(y\!\to\!y') \;=\; P_{\boldsymbol\theta}(y')\,q(y'\!\to\!y)\,a(y'\!\to\!y)

제안 qq는 대칭이다 — yy에서 (i,j)(i,j)를 골라 yy'로 갈 확률도 1/N1/N, 거꾸로도 1/N1/N. 그래서 qq가 양변에서 지워지고, 확인할 것은 P(y)a(y ⁣ ⁣y)=P(y)a(y ⁣ ⁣y)P(y)a(y\!\to\!y') = P(y')a(y'\!\to\!y)뿐이다. r=P(y)/P(y)r = P(y')/P(y)라 두고 r1r \le 1인 경우를 보면

P(y)min(1,r)=P(y)r=P(y),P(y)min(1,1/r)=P(y)1=P(y) P(y)\cdot\min(1,r) = P(y)\cdot r = P(y'),\qquad P(y')\cdot\min(1,1/r) = P(y')\cdot 1 = P(y')

양변이 같다. r>1r > 1이면 역할만 바뀌므로 마찬가지다. 세부 균형이 성립하면 PθP_{\boldsymbol\theta}가 이 걸음의 정상분포(stationary distribution)이고, 충분히 오래 걸으면 방문 빈도가 PθP_{\boldsymbol\theta}에 수렴한다.

교실 비유. 학교 전체 좌석 배치가 25612^{561}가지라고 하자. 다 그려 볼 수는 없다. 대신 한 번에 두 명 관계만 바꿔 보고, "이렇게 바꾸면 우리 반 규칙에 더 그럴듯한가?"를 물어 그럴듯해지면 무조건 받아들이고, 덜 그럴듯해지면 덜 그럴듯해진 만큼의 확률로만 받아들인다. 이 걸음을 오래 반복하면, 머문 시간의 비율이 곧 그 배치의 확률이 된다.
"덜 그럴듯해도 가끔 받아들인다"가 핵심이다. 늘 좋은 쪽으로만 가면 한 봉우리에 갇혀 전체 분포를 못 본다.

5. 손 계산 ① — 4명 망을 여섯 걸음 (Six Steps by Hand)

5-6 §5에서 전수 계산했던 바로 그 모형을 쓴다. n=4n=4, 항은 edges + triangle,

θedges=0.5,θtriangle=+0.8 \theta_{\text{edges}} = -0.5, \qquad \theta_{\text{triangle}} = +0.8

변화 통계량은 5-6에서 구한 대로다.

δijedges=1,δijtriangle=N(i)N(j) \delta^{\text{edges}}_{ij} = 1, \qquad \delta^{\text{triangle}}_{ij} = \bigl\lvert N(i)\cap N(j)\bigr\rvert

edges의 변화 통계량은 언제나 1이고, triangle의 변화 통계량은 iijj의 공통 친구 수다.

따라서 켜는 제안의 지수는

θ ⁣δij  =  (0.5)(1)+(0.8)N(i)N(j)  =  0.5+0.8pij \boldsymbol\theta^{\!\top}\boldsymbol\delta_{ij} \;=\; (-0.5)(1) + (0.8)\bigl\lvert N(i)\cap N(j)\bigr\rvert \;=\; -0.5 + 0.8\,p_{ij}

여기서 pijp_{ij}그 간선을 뺀 상태에서 센 공통 친구 수다.

5.1 미리 계산해 둘 값 (Values to Prepare)

pijp_{ij}0.5+0.8p-0.5 + 0.8pe0.5+0.8pe^{-0.5+0.8p}
00.5-0.50.6065307공통 친구 없는 쌍을 잇는 제안 → 약 61%만 수락
1+0.3+0.31.3498588공통 친구 1명 → 1을 넘으니 무조건 수락
2+1.1+1.13.0041660공통 친구 2명 → 무조건 수락

끄는 제안은 부호만 뒤집는다.

pijp_{ij}+0.50.8p+0.5 - 0.8pe+0.50.8pe^{+0.5-0.8p}
0+0.5+0.51.6487213고립된 간선 끄기 → 무조건 수락 (망은 성길수록 확률이 높다)
10.3-0.30.7408182삼각형 하나를 부수는 끄기 → 약 74%만 수락
21.1-1.10.3328711삼각형 둘을 부수는 끄기 → 약 33%만 수락

5.2 여섯 걸음 전개 (The Six Steps Expanded)

빈 망에서 출발한다. 쌍은 combn(4,2) 순서로 1=(1,2), 2=(1,3), 3=(1,4), 4=(2,3), 5=(2,4), 6=(3,4)이고, 각 걸음의 난수는 미리 뽑아 고정했다.

걸음고른 쌍현재 A[i,j]A[i,j]제안pijp_{ij}지수rr수락확률 aa난수 uu판정걸음 뒤 간선걸음 뒤 삼각형
1(1,2)0켜기00.5+0.80=0.5-0.5+0.8\cdot 0=-0.50.60653070.60653070.31수락10
2(2,3)0켜기00.5+0.80=0.5-0.5+0.8\cdot 0=-0.50.60653070.60653070.88기각10
3(1,3)0켜기00.5+0.80=0.5-0.5+0.8\cdot 0=-0.50.60653070.60653070.21수락20
4(3,4)0켜기00.5+0.80=0.5-0.5+0.8\cdot 0=-0.50.60653070.60653070.55수락30
5(1,2)1끄기0+0.50.80=+0.5+0.5-0.8\cdot 0=+0.51.64872131 (상한)0.72수락20
6(1,4)0켜기10.5+0.81=+0.3-0.5+0.8\cdot 1=+0.31.34985881 (상한)0.04수락31

5.3 각 걸음을 말로 (Step by Step in Words)

걸음무슨 일이 일어났나
1빈 망에서 (1,2)를 켜자는 제안. 공통 친구가 있을 리 없으니 p=0p=0. 간선이 하나 늘면 θedges=0.5\theta_{\text{edges}}=-0.5만큼 확률이 깎이므로 수락률은 1이 아니라 0.607. u=0.31<0.607u=0.31 < 0.607이라 수락. 망 = 1–2
2(2,3)을 켜자는 제안. 2의 친구는 1뿐, 3은 친구가 없으니 p=0p=0. 수락률 0.607인데 u=0.88u=0.88이 커서 기각. 망은 그대로. 이 걸음도 표본 하나로 센다 — 간선 1개인 망이 두 번 기록된 셈
3(1,3)을 켜자는 제안. 1의 친구는 2, 3의 친구는 없음 → p=0p=0. u=0.21u=0.21로 수락. 망 = 1–2, 1–3. 아직 삼각형은 없다 (2–3이 없으므로)
4(3,4)를 켜자는 제안. 3의 친구는 1, 4는 없음 → p=0p=0. 수락. 망 = 1–2, 1–3, 3–4. 여전히 삼각형 0
5이번엔 이미 있는 간선을 골랐다. (1,2)는 켜져 있으므로 제안은 끄기. (1,2)를 뺀 상태에서 1과 2의 공통 친구는 없으니 p=0p=0, 지수는 +0.5+0.5, 비는 1.649. 1보다 크면 수락확률은 1로 자른다uu가 뭐든 수락. 망 = 1–3, 3–4
6(1,4)를 켜자는 제안. 1의 친구는 3, 4의 친구도 3 → 공통 친구 3번이 있다, p=1p=1. 간선 비용 0.5-0.5를 삼각형 이득 +0.8+0.8이 이기므로 지수가 +0.3+0.3으로 양수 → 무조건 수락. 망 = 1–3, 3–4, 1–4삼각형 {1,3,4} 완성
여섯 걸음에서 배울 것 세 가지.
  1. κ\kappa를 한 번도 쓰지 않았다. 필요한 건 e0.5e^{-0.5}e0.3e^{0.3} 같은 지수 하나씩뿐이었다
  2. 수락확률이 1로 잘리는 순간(걸음 5, 6)이 있다. 확률이 올라가는 방향이면 항상 간다
  3. 걸음 6에서 삼각형 항이 처음으로 일을 했다. p=0p=0일 때는 edges만 있는 모형과 똑같이 굴다가, 공통 친구가 생기는 순간 수락률이 0.607에서 1로 뛴다. 이것이 "친구의 친구가 친구가 되는" 힘이다

6. R 검증 ① — 전수 계산을 재현하는가 (Verification I: Does the Walk Reproduce the Truth?)

n=4n=4는 전수 계산이 가능하니, MCMC가 맞는 답으로 가는지 직접 채점할 수 있다. 5-6에서 64개를 다 더해 얻은 정확값은

κ=23.39495646,E[간선]=2.861800172,E[삼각형]=0.6567705622 \kappa = 23.39495646,\qquad E[\text{간선}] = 2.861800172,\qquad E[\text{삼각형}] = 0.6567705622
## §5의 규칙을 그대로 코드로 옮긴 것
run_mh <- function(nstep, seed) {
  set.seed(seed); A <- matrix(0,4,4); Ee <- integer(nstep); Tt <- integer(nstep)
  for (s in 1:nstep) {
    k <- sample.int(6,1); i <- pr4[k,1]; j <- pr4[k,2]      # ① 쌍 하나 균등 선택
    cur <- A[i,j]; Am <- A; Am[i,j] <- Am[j,i] <- 0
    d_t <- sum(Am[i,]*Am[j,])                                # 공통 친구 수 p_ij
    logr <- if (cur==0) (th_e + th_t*d_t) else -(th_e + th_t*d_t)   # ③ 부호가 갈린다
    if (log(runif(1)) < logr) { A[i,j] <- A[j,i] <- 1-cur }  # ④ u < a 이면 뒤집기
    Ee[s] <- sum(A)/2; Tt[s] <- round(sum(diag(A%*%A%*%A))/6)
  }
  list(e=Ee, t=Tt)
}
r <- run_mh(100000, 20260803)
(가) 손으로 걸은 6걸음의 간선 수 변화, (나) 누적 평균이 정확값 2.8618로 수렴, (다) 전수 분포와 MCMC 추정 분포 막대 비교
그림 70. n=4n=4, edges+triangle 모형에서의 Metropolis 걸음. (가) §5의 여섯 걸음, (나) 누적 평균의 수렴, (다) 10만 걸음 뒤의 분포

6.1 평균이 수렴하는가 (Convergence of the Mean)

걸음 수누적 E[간선]E[\text{간선}]정확값과의 차이누적 E[삼각형]E[\text{삼각형}]정확값과의 차이
1002.600000.2618-0.26180.470000.1868-0.1868
1,0002.745000.1168-0.11680.66600+0.0092+0.0092
10,0002.88100+0.0192+0.01920.66440+0.0076+0.0076
100,0002.86599+0.0042+0.00420.65770+0.0009+0.0009
정확값2.8618001720.6567705622
100걸음에서 멈췄으면 2.60이라고 답했을 것이다. 정확값 2.8618과 9%나 차이가 난다. 그림 70(나)를 보면 1000걸음까지도 위아래로 크게 출렁인다. 얼마나 걸어야 하는가가 실전에서 늘 문제이고, 그것을 판정하는 도구가 §9mcmc.diagnostics()다.

6.2 분포 전체가 맞는가 (Does the Whole Distribution Match?)

평균만 맞추는 건 쉽다. 진짜 확인은 분포 전체다.

간선 수0123456
전수 계산 (64개 망)0.0427440.1555540.2358710.2375050.1718460.1042710.052208
MCMC 10만 걸음0.0421900.1553000.2352700.2372400.1730800.1054100.051510
차이0.000554-0.0005540.000254-0.0002540.000601-0.0006010.000265-0.000265+0.001234+0.001234+0.001139+0.0011390.000698-0.000698

최대 오차가 0.00123이다. 확률 0.17짜리 칸에서 0.001 틀린 것이니 상대오차 0.7%. 전수 계산을 한 번도 하지 않고, 오직 "쌍 하나 뒤집고 지수 하나 계산하기"만 10만 번 반복해서 262^6개 망의 분포를 복원했다.

6.3 걸음은 서로 독립이 아니다 (The Steps Are Not Independent)

여기에 함정이 하나 있다. 한 걸음은 쌍 하나만 바꾸므로 연속한 표본이 거의 같은 망이다. 자기상관을 재 보면

시차 (lag)151020
간선 수의 자기상관0.83270.39750.16130.0251

바로 옆 걸음과는 0.83이나 붙어 있다. 6쌍짜리 망이라 6걸음쯤 지나야 겨우 풀린다. 그래서 10만 걸음이 10만 개의 독립 표본이 아니다.

유효 표본 수 (ESS)=9251.31— 10만 걸음이 실제로는 약 9251개 값어치 \text{유효 표본 수 (ESS)} = 9251.31 \quad\text{— 10만 걸음이 실제로는 약 9251개 값어치}
유효 표본 수(effective sample size)는 "이 상관된 표본이 독립 표본 몇 개에 해당하는가"다. 공식은 ESS=M/(1+2k1ρk)\text{ESS} = M \big/ \bigl(1 + 2\sum_{k\ge1}\rho_k\bigr)로, ρk\rho_k는 시차 kk의 자기상관이다. 여기서는 10만 걸음이 9251개 값어치니 약 11걸음마다 하나씩만 진짜 새로운 정보였던 셈이다.
그래서 ergm은 표본을 솎아낸다(thinning) — 뒤에서 볼 MCMC.interval=256이 "256걸음마다 하나만 기록"이라는 뜻이다.

7. MCMLE — 중요도 표집 (MCMLE: Importance Sampling)

이제 표본은 뽑을 수 있다. 그런데 우리가 원하는 건 θ\boldsymbol\theta를 찾는 것이고, (θ)\ell(\boldsymbol\theta)를 여러 θ\boldsymbol\theta에서 비교해야 한다. θ\boldsymbol\theta를 바꿀 때마다 MCMC를 새로 돌리면 너무 느리다.

Geyer–Thompson의 요령은 한 번 뽑은 표본을 재활용하는 것이다.

7.1 유도 (Derivation)

어떤 시작값 θ0\boldsymbol\theta_0에서 표본을 뽑았다고 하자. 그러면

κ(θ)κ(θ0)=1κ(θ0)yeθ ⁣g(y)=yeθ0 ⁣g(y)κ(θ0)e(θθ0) ⁣g(y)=Eθ0[e(θθ0) ⁣g(Y)] \frac{\kappa(\boldsymbol\theta)}{\kappa(\boldsymbol\theta_0)} = \frac{1}{\kappa(\boldsymbol\theta_0)}\sum_{y} e^{\boldsymbol\theta^{\!\top}\mathbf g(y)} = \sum_{y} \frac{e^{\boldsymbol\theta_0^{\!\top}\mathbf g(y)}}{\kappa(\boldsymbol\theta_0)}\, e^{(\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y)} = E_{\boldsymbol\theta_0}\Bigl[e^{(\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(Y)}\Bigr]

가운데 등호에서 한 일은 eθge^{\boldsymbol\theta^\top g}eθ0g×e(θθ0)ge^{\boldsymbol\theta_0^\top g}\times e^{(\boldsymbol\theta-\boldsymbol\theta_0)^\top g}로 쪼갠 것뿐이다. 그러면 앞부분이 정확히 Pθ0(y)P_{\boldsymbol\theta_0}(y)의 모양이 되고, 합이 기댓값으로 바뀐다. 이 기댓값은 θ0\boldsymbol\theta_0에서 뽑은 표본으로 근사할 수 있다.

κ(θ)κ(θ0)    1Mk=1Me(θθ0) ⁣g(yk),y1,,yMPθ0 \frac{\kappa(\boldsymbol\theta)}{\kappa(\boldsymbol\theta_0)} \;\approx\; \frac{1}{M}\sum_{k=1}^{M} e^{(\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y_k)}, \qquad y_1,\dots,y_M \sim P_{\boldsymbol\theta_0}

그리고 로그가능도의 에서는 우리가 모르는 κ(θ0)\kappa(\boldsymbol\theta_0)마저 지워진다.

  (θ)(θ0)=(θθ0) ⁣g(yobs)    log1Mk=1Me(θθ0) ⁣g(yk)   \boxed{\; \ell(\boldsymbol\theta) - \ell(\boldsymbol\theta_0) = (\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y_{\text{obs}}) \;-\; \log \frac{1}{M}\sum_{k=1}^{M} e^{(\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y_k)} \;}
이 식이 오늘의 심장이다. 오른쪽에 있는 것은 전부 계산 가능하다.
g(yobs)\mathbf g(y_{\text{obs}})는 관측망에서 세면 되고, g(yk)\mathbf g(y_k)는 모의망에서 세면 된다. κ\kappa어디에도 없다.
그래서 θ\boldsymbol\theta를 바꿔 가며 오른쪽을 최대로 만드는 값을 찾으면 그것이 추정값이다. 이것을 MCMLE(Monte Carlo Maximum Likelihood Estimation)라 한다.

7.2 왜 반복해야 하는가 (Why It Must Iterate)

근사식의 정확도는 θ\boldsymbol\thetaθ0\boldsymbol\theta_0에서 얼마나 먼가에 달렸다. θ0\boldsymbol\theta_0에서 뽑은 망들은 θ0\boldsymbol\theta_0이 좋아하는 망들이다. θ\boldsymbol\theta가 멀면 e(θθ0)g(yk)e^{(\boldsymbol\theta-\boldsymbol\theta_0)^\top g(y_k)}몇 개가 나머지를 압도해서, 사실상 표본 몇 개로만 평균을 내는 꼴이 된다 — 오차가 폭발한다.
그래서 ergm반복한다: θ0\boldsymbol\theta_0에서 표본을 뽑아 θ^\hat{\boldsymbol\theta}를 구하고, θ0θ^\boldsymbol\theta_0 \leftarrow \hat{\boldsymbol\theta}로 갱신해 표본을 다시 뽑고… 를 θ^\hat{\boldsymbol\theta}가 움직이지 않을 때까지. 콘솔에 찍히는 Iteration 1 of at most 60이 바로 이 반복이다.

8. R 검증 ② — 답을 아는 문제로 채점 (Verification II: Grading Against a Known Answer)

MCMC를 믿으려면 답을 아는 문제로 채점해 봐야 한다. 가라테에 edges만 넣은 모형이 그런 문제다. 5-2에서 손으로 풀었듯이 답이 닫힌 식으로 나온다.

θ^edges=logmNm=log7856178=log78483=1.823307827 \hat\theta_{\text{edges}} = \log\frac{m}{N-m} = \log\frac{78}{561-78} = \log\frac{78}{483} = -1.823307827 SE=1m+1Nm=178+1483=0.1220283008 \mathrm{SE} = \sqrt{\frac{1}{m}+\frac{1}{N-m}} = \sqrt{\frac{1}{78}+\frac{1}{483}} = 0.1220283008

8.1 중요도 표집이 κ\kappa 비를 맞추는가 (Does Importance Sampling Get the Ratio Right?)

θ0=1.5\boldsymbol\theta_0 = -1.5에서 2000개를 모의하고, §7.1 공식으로 log[κ(θ)/κ(θ0)]\log[\kappa(\theta)/\kappa(\theta_0)]를 여러 θ\theta에서 추정해 정확값과 비교했다. edges만 있는 모형은 κ\kappa가 닫힌 식 (1+eθ)N(1+e^{\theta})^{N}이므로 정확값을 안다.

th0 <- -1.5
sim0 <- simulate(nwk ~ edges, coef=th0, nsim=2000, seed=7,
                 control=control.simulate(MCMC.burnin=10000, MCMC.interval=200))
g0 <- sapply(sim0, network.edgecount)
logIS <- function(th) { d <- (th-th0)*g0; mx <- max(d); mx + log(mean(exp(d-mx))) }
lhat  <- function(th) (th-th0)*mobs - logIS(th)
logIS에서 mx를 빼고 더하는 것은 지수 넘침(overflow) 방지 요령이다. dkd_k40-40 근처면 edke^{d_k}101810^{-18}이라 전부 0으로 뭉개진다. 최댓값을 빼서 가장 큰 항을 1로 만든 뒤 로그에서 되돌려 준다. log1Medk=maxkdk+log1Medkmaxkdk\log\frac1M\sum e^{d_k} = \max_k d_k + \log\frac1M\sum e^{d_k - \max_k d_k}라는 항등식이다.
θ\theta중요도 표집 추정정확값오차비고
1.6-1.69.819242-9.8192429.824533-9.824533+0.005291+0.005291θ0\theta_0에서 0.1
1.7-1.718.869245-18.86924518.864886-18.8648860.004359-0.0043590.2
1.8-1.827.159761-27.15976127.172409-27.172409+0.012648+0.0126480.3
1.823308-1.82330828.982242-28.98224229.008764-29.008764+0.026522+0.026522참 MLE 위치
1.9-1.934.740034-34.74003434.796878-34.796878+0.056843+0.0568430.4
2.0-2.041.903621-41.90362141.786235-41.7862350.117386-0.1173860.5 — 오차가 20배로
§7.2에서 말한 것이 표로 보인다. θ0=1.5\theta_0=-1.5에서 0.1 떨어졌을 때 오차 0.005, 0.5 떨어지니 0.117 — 거리에 따라 급격히 나빠진다. 그래서 한 번에 멀리 가지 않고 조금씩 움직이며 표본을 다시 뽑는 것이다.

이 추정 곡선을 최대로 만드는 값은 θ^=1.814238984\hat\theta = -1.814238984로, 정확한 MLE 1.823307827-1.8233078270.00906884 차이다. 표준오차 0.122의 7% 수준이니 실용적으로 무시할 만하다.

8.2 ergm에게 억지로 MCMC를 시켜 보면 (Forcing ergm to Use MCMC)

ergmedges만 있으면 똑똑하게 닫힌 식으로 풀어 버린다. force.main=TRUE로 MCMC 경로를 강제하면 채점이 된다.

ergm(nwk ~ edges, control=control.ergm(force.main=TRUE, MCMLE.maxit=20, seed=11))
정확한 MLE강제 MCMLE차이
θ^edges\hat\theta_{\text{edges}}1.823307827-1.8233078271.813889774-1.8138897740.00942
표준오차0.12202830080.11984478850.0022
zz14.94-14.9415.135-15.135
pp9.47×10529.47\times10^{-52} — 어느 쪽이든 결론 동일
이 절의 요점. MCMC 추정값은 매번 조금씩 다르다. 난수를 쓰기 때문이다. 소수 셋째 자리까지 똑같이 나오길 기대하면 안 된다. 논문이나 보고서에 쓸 때는 계수를 소수 둘째 자리까지, 그리고 seed를 기록해 두는 게 맞다. 4-8에서 cluster_louvain()QQ가 실행마다 달랐던 것과 같은 성격의 문제다.

9. mcmc.diagnostics() 읽는 법 (Reading the Diagnostics)

5-6에서 적합했던 edges + gwesp(0.5, fixed=TRUE)로 돌아가자. 이번엔 적합 과정을 들여다본다.

fit <- ergm(nwk ~ edges + gwesp(0.5, fixed=TRUE), control=control.ergm(seed=1))
mcmc.diagnostics(fit)

9.1 반복이 수렴하는 모습 (The Iteration Trace)

반복로그가능도 개선수렴 검정 pp판정
13.7244크게 움직인다
20.9982줄어든다
30.1111
40.1364살짝 되튄다 (난수 탓, 정상)
50.04830.4067아직 아님
60.00820.1149가까워짐
70.00410.0004수렴 판정
여기서 pp가 작을수록 좋다는 것이 헷갈린다.pp는 "관측 통계량이 모의 통계량 구름의 가장자리에 있는가"를 검정한 것이 아니라, ergm이 쓰는 Hummel 등의 수렴 판정에서 나온 값이다. 관측점이 모의망 구름의 안쪽 깊숙이 들어왔다는 증거가 강할수록 pp가 작아지도록 설계돼 있다. gof()pp와 정반대이니 섞어 읽지 말 것.

9.2 표본 궤적과 자기상관 (Trace and Autocorrelation)

(가) 관측값과의 차이가 0 주변에서 진동하는 건강한 사슬, (나) 시차에 따라 빠르게 죽는 자기상관, (다) 90번째 표본에서 완전망으로 튀어 못 나오는 죽은 사슬
그림 71. MCMC 사슬 진단. (가) 건강한 궤적, (나) 자기상관과 유효 표본 수, (다) 퇴화한 모형의 죽은 사슬

mcmc.diagnostics()가 보고한 숫자는 이렇다.

항목읽는 법
표본 수657최종 반복에서 기록된 망의 개수
번인 (burn-in)8192첫 8192걸음은 버린다 — 시작 망의 흔적을 지우는 구간
간격 (interval)256256걸음마다 하나만 기록 — §6.3의 자기상관을 끊으려는 솎아내기
평균 (관측값과의 차이)0.315-0.315 / 1.044-1.0440 근처여야 한다 — 적률 방정식이 요구하는 바로 그것
표준편차16.05 / 26.98평균이 표준편차의 2% 수준 → 충분히 0에 가깝다
유효 표본 수166.3 / 194.0657개가 실제로는 166~194개 값어치. 솎았는데도 상관이 남아 있다
Geweke zz2.016-2.016 / 2.126-2.126사슬 앞부분과 뒷부분의 평균 비교. z\lvert z\rvert가 2를 살짝 넘어 경계선
시차12510
edges0.59560.35650.08440.0290
gwesp(0.5)0.54350.31240.07510.0362
건강한 사슬의 조건 네 가지.
  1. 궤적이 0 주변에서 진동한다 — 한쪽으로 흐르거나(추세) 한 값에 붙어 있으면 안 된다 (그림 71가)
  2. 자기상관이 빠르게 죽는다 — 시차 5~10에서 0.1 아래로 (그림 71나)
  3. 유효 표본 수가 충분하다 — 대개 100 이상이면 실용적으로 쓸 만하다
  4. Geweke zz±2\pm2 — 앞부분과 뒷부분의 평균이 같아야 한다
이 적합은 넷 중 셋을 만족하고 Geweke만 경계선이다. 더 확실히 하려면 MCMC.interval을 키우거나 MCMC.samplesize를 늘리면 된다.

10. 죽은 사슬은 어떻게 생겼나 (What a Dead Chain Looks Like)

5-6 §8에서 edges + triangle이 이렇게 죽었다.

Iteration 1 of at most 10:
  1 Optimizing with step length 0.4975.
  The log-likelihood improved by 6.6908.
  Estimating equations are not within tolerance region.
Iteration 2 of at most 10:
  Post-burnin sample is constant; returning.
Error: Unconstrained MCMC sampling did not mix at all. Optimization cannot continue.

이제 이 문장을 정확히 읽을 수 있다. "Post-burnin sample is constant"는 번인을 지난 뒤의 표본이 전부 같은 망이라는 뜻이다. 사슬이 한 망에 도착한 뒤 한 걸음도 못 움직였다.

어떤 망인지 직접 잡아 봤다. 5-6에서 구한 MPLE 계수 θedges=2.6352326078\theta_{\text{edges}}=-2.6352326078, θtriangle=0.6877\theta_{\text{triangle}}=0.6877로 관측망에서 출발해 2000걸음마다 하나씩 200개를 기록했다.

표본 번호간선 수삼각형 수상태
1 ~ 8940 ~ 78수십관측망 근처에서 얼쩡거린다
905615984완전망에 도달 — 34명 전원이 서로 친구
91 ~ 2005615984한 번도 못 나온다

왜 못 나오는가? 완전망에서 간선 하나를 끄자는 제안을 생각해 보자. n=34n=34에서 두 사람의 공통 친구는 나머지 32명 전부다.

끄기 수락확률=min(1,e(θe+θt32))=min(1,e(2.6352+0.6877×32))=e19.373.9×109 \text{끄기 수락확률} = \min\bigl(1, e^{-(\theta_e + \theta_t\cdot 32)}\bigr) = \min\bigl(1, e^{-(-2.6352 + 0.6877\times 32)}\bigr) = e^{-19.37} \approx 3.9\times 10^{-9}
2억 5천만 번 제안해야 한 번 나갈까 말까다. 200걸음은커녕 10억 걸음을 걸어도 못 나온다. 사슬이 죽은 게 아니라, 모형이 완전망을 그만큼 좋아하는 것이다. 5-6 §7의 임계값 θt=3θe/(n2)=0.1709351087\theta_t^{*} = -3\theta_e/(n-2) = 0.1709351087을 넘는 순간 완전망의 지수가 빈 망을 이기고, 그 뒤로는 아무리 걸어도 빠져나올 수 없다. θt=0.6877\theta_t = 0.6877은 임계값의 4배다.
실전에서 이 에러를 만나면 할 일.
  1. 번인을 늘리는 것은 도움이 안 된다 — 오래 걸을수록 완전망에 더 확실히 갇힌다
  2. seed를 바꾸는 것도 소용없다 — 우연이 아니라 모형의 성질이다
  3. 항을 바꿔야 한다. triangle을 빼고 gwesp를 넣는 것이 5-6에서 배운 처방이다. gwesp는 공통 친구가 늘어날수록 한계 이득이 τp\tau^p로 체감하므로, 완전망으로 폭주하는 되먹임 고리가 끊어진다

11. gof()는 무엇을 채점하는가 (What GOF Grades)

계수가 나왔고 사슬도 건강하다고 하자. 그래도 남는 질문이 있다.

"이 모형이 만들어 내는 망이, 진짜 우리 반을 닮았는가?"

gof()의 절차는 간단하다.

단계할 일
적합된 θ^\hat{\boldsymbol\theta}로 망을 200개 모의한다 (§4의 걸음으로)
200개 각각에서 어떤 특성(차수 분포 등)을 잰다
관측망에서도 같은 특성을 잰다
관측값이 200개가 만든 분포의 어디쯤에 있는지 본다

④의 위치를 수치로 요약한 것이 MC pp-value다. 관측값보다 크거나 같은 모의값의 비율과 작거나 같은 비율 중 작은 쪽을 두 배 한 값 (대략적으로는 "관측값이 얼마나 가장자리인가")이다.

MC pp읽는 법
1.00에 가까움관측값이 모의 분포 한가운데 — 모형이 이 특성을 잘 재현한다
0.10 근처가장자리 — 애매하다
0.05 미만관측값이 모의 분포 — 모형이 이 특성을 못 맞춘다
여기서 pp의 방향이 §9.1과 반대다. mcmc.diagnostics()의 수렴 pp작아야 좋고, gof()pp커야 좋다. 같은 글자를 쓰지만 전혀 다른 검정이다.

11.1 무엇을 채점 대상으로 삼는가 (Which Features to Grade)

GOF재는 것교실에서의 뜻
degree차수가 kk인 사람 수 (k=0,1,2,k=0,1,2,\dots)"친구가 하나도 없는 아이가 몇 명인가", "인기 있는 아이가 몇 명인가"
espartners공유 파트너가 kk명인 간선의 수"이 우정이 공통 친구를 통해 맺어졌는가, 단둘이 맺어졌는가"
distance최단 거리가 kk의 수"소문이 몇 다리 만에 반 전체로 퍼지는가"
model모형에 넣은 통계량 그 자체채점이 아니다 — 다음 절 참조

12. 모형 통계량이 맞는 것은 당연하다 (Model Statistics Are Matched by Construction)

§2의 적률 방정식을 다시 보자.

Eθ^[g(Y)]  =  g(yobs) E_{\hat{\boldsymbol\theta}}\bigl[\mathbf g(Y)\bigr] \;=\; \mathbf g(y_{\text{obs}})
이것이 바로 추정의 정의였다. θ^\hat{\boldsymbol\theta}는 "모의망의 평균 통계량이 관측 통계량과 같아지도록" 고른 값이다.
그러니 θ^\hat{\boldsymbol\theta}로 망을 모의해서 모형에 넣은 통계량을 재면, 평균이 관측값과 같은 것은 발견이 아니라 정의다.
모형 통계량의 gof는 채점이 아니라 "계산이 제대로 됐는지" 확인일 뿐이다.

가라테 두 모형에서 실제로 확인해 보자.

모형통계량관측모의 평균MC pp
edgesedges7877.630.99
edges + gwesp(0.5)edges7878.421.00
gwesp(0.5)82.9285884.051950.99
(가) 두 모형 모두 관측 간선 수 78과 모의 평균이 거의 겹침, (나) edges 모형의 공유 파트너 분포는 관측선이 상자 밖으로 벗어남, (다) gwesp 모형은 관측선이 모두 상자 안
그림 72. (가) 모형 통계량은 언제나 맞는다 — 채점이 아니다. (나)(다) 공유 파트너(ESP) 분포는 모형에 안 들어간 특성이라 진짜 채점이 된다
흔한 오독. 논문에서 "모형 통계량 gof가 p=0.99p=0.99로 매우 좋았다"고 쓰는 것은 아무 말도 안 한 것이다. 그건 ergm이 계산을 끝냈다는 뜻일 뿐이다.
진짜 채점은 모형에 넣지 않은 특성으로 해야 한다.

13. R 검증 ③ — 가라테 두 모형 채점 (Verification III: Grading Two Karate Models)

gof(fit, GOF = ~ degree + espartners + distance + model,
    control = control.gof.ergm(nsim=200, seed=3))

13.1 공유 파트너 분포 — gwesp가 고친다 (ESP: Fixed by GWESP)

공유 파트너 수관측edgesedges + gwesp(0.5)
모의 최소모의 평균MC pp모의 최소모의 평균MC pp
0112641.7250.00312.3600.88
135925.8650.271327.7600.21
21408.2000.24421.8400.37
31101.5600.01010.9550.93
4300.2450.0104.0301.00
5200.0300.0001.1700.59
6000.0051.0000.2551.00
edges만 있는 모형이 무엇을 틀렸는지 읽어 보자.
공유 파트너가 0인 간선 — 즉 "공통 친구 없이 단둘이만 아는 사이" — 이 관측에서는 78개 중 11개인데, 모의망에서는 평균 41.7개, 최소가 26개다. 200번 모의해서 단 한 번도 11 근처로 못 내려갔다.
반대로 공유 파트너가 5명인 간선이 관측에는 2개 있는데 모의 최댓값은 1이다.
해석: 무작위로 간선을 뿌리면 우정이 뿔뿔이 흩어지는데, 실제 가라테 도장의 우정은 뭉쳐 있다. 이것이 5-6에서 "삼각형이 유의하게 많다"고 했던 것의 분포판이다.
gwesp를 넣으면 가장 작은 pp가 0.21이 된다. 일곱 칸 전부 상자 안이다. 5-6에서 triangle 대신 gwesp를 쓰기로 한 결정이 계수의 유의성뿐 아니라 분포 재현 능력으로도 정당화된 것이다.

13.2 거리 분포 (Geodesic Distance Distribution)

(가) edges 모형의 거리 분포는 거리 3에서 관측값이 상자 아래로 벗어남, (나) gwesp 모형은 전부 상자 안, (다) 차수 분포는 두 모형 모두 차수 2에서 관측 11명을 못 맞춤
그림 73. (가)(나) 거리 분포 — gwesp가 고친다. (다) 차수 분포 — 둘 다 못 맞춘다
최단 거리관측 쌍 수edgesedges + gwesp(0.5)
모의 최소모의 평균MC pp모의 최소모의 평균MC pp
1785377.6300.993778.4201.00
2265130223.2800.1661197.4550.21
3137147201.2050.0068149.9550.56
473145.0000.29047.3950.40
5804.8100.45011.1600.88

edges만 있는 모형에서 거리 3인 쌍이 관측 137개인데 모의는 최소가 147이다. 200개 중 하나도 137 이하로 못 내려갔다. 뭉친 우정은 거리를 단축시키는데, 무작위 망은 그 단축을 만들지 못한 것이다.

13.3 차수 분포 — 둘 다 실패한다 (Degree: Both Models Fail)

차수관측 인원edgesedges + gwesp(0.5)
모의 최소모의 평균MC pp모의 최소모의 평균MC pp
0000.2451.0002.0750.38
1101.3801.0002.9950.45
21103.5050.0104.0450.00
3605.5550.9704.1900.51
4616.6850.9704.6200.58
5316.2350.2404.0350.79
6204.7300.3403.6850.63
7003.0650.0502.6950.12
8001.5500.4401.9950.28
정직하게 보고할 것. 차수가 2인 사람이 관측에는 11명인데, 모의망 평균은 edges 모형 3.5명, gwesp 모형 4.0명이다. pp는 0.01과 0.00 — 둘 다 실패다. gwesp는 이 칸을 전혀 못 고쳤다.
가라테 도장은 "친구가 딱 둘인 사람"이 3분의 1이나 되는, 대단히 주변부가 두꺼운 망인데 두 모형 모두 그 주변부를 재현하지 못한다.
gof()는 통과 도장이 아니라 진단서다.
"실패한 칸이 어디인가"가 곧 다음에 넣을 항이 무엇인가를 알려 준다. 차수 분포가 안 맞으면 degree(2)gwdegree를, ESP가 안 맞으면 gwesp를, 거리가 안 맞으면 gwdsp를 검토한다.
5-8에서 FMH 종합 모형을 만들 때 이 표를 다시 쓰게 된다.

14. 교실 적용 (Classroom Application)

상황. 6학년 2반 28명의 교우관계를 조사해 ERGM을 적합했다. 성별 동질성, 모둠 동질성, 그리고 gwesp를 넣었더니 계수가 다 나왔다. 결과를 학년 협의회에서 발표하려 한다.

14.1 발표 전에 반드시 확인할 것 (A Checklist Before Presenting)

확인할 것안 하면 생기는 일
에러 없이 끝났는가 — did not mix가 안 떴는가퇴화한 모형의 계수를 해석하게 된다 (5-6)
mcmc.diagnostics()의 궤적이 0 주변에서 진동하는가덜 수렴한 계수를 소수점까지 읽고 "0.31 차이"를 논한다
유효 표본 수가 100을 넘는가표준오차가 과소평가되어 유의하지 않은 것을 유의하다고 말한다
gof()에서 모형에 안 넣은 특성이 맞는가"모형 통계량이 완벽했다"고 자랑하는데 그건 자동이다
차수 분포에서 차수 0 칸이 맞는가소외 학생 수를 틀리게 예측한다 — 교실에서 가장 중요한 칸
seed를 기록했는가다음 주에 다시 돌렸을 때 숫자가 달라 설명이 안 된다

14.2 각 gof 항을 교실 언어로 (GOF in Classroom Language)

gof가 실패한 곳교실에서의 의미모형에 빠진 것
차수 0이 관측보다 적게 나온다모형은 "이 반에 소외 학생이 거의 없다"고 말하는데 실제로는 3명 있다고립을 만드는 힘 — isolates, degree(0)
차수 2가 관측보다 적게 나온다실제 반은 "친구 딱 둘"인 아이가 많은데 모형은 골고루 퍼뜨린다degree(2) 또는 gwdegree
높은 차수가 관측보다 많이 나온다모형이 "인기 스타"를 실제보다 많이 만든다인기 상한 — 음수 gwdegree
ESP 0이 관측보다 많이 나온다모형의 우정이 흩어져 있다. 실제 우정은 공통 친구를 끼고 맺어진다gwesp (5-6)
거리 3이 관측보다 많이 나온다모형에서는 소문이 한 다리 더 걸려서 퍼진다뭉침 항 또는 모둠 nodematch
협의회에서 할 수 있는 정직한 말.
"성별 동질성과 뭉침은 모형이 잘 잡았습니다. 다만 친구가 둘뿐인 아이가 11명이라는 이 반의 특징은 모형이 재현하지 못합니다(모형은 4명쯤으로 예측합니다). 그러니 이 모형으로 소외 위험을 예측하지는 마시고, 관계 유형 해석에만 쓰겠습니다."
— gof를 읽을 줄 알면 모형을 어디까지 믿을지를 말할 수 있다. 그것이 gof의 진짜 쓸모다.

15. 연습문제 (Exercises)

연습 1. Metropolis 세 걸음 (Three Metropolis Steps)
n=4n=4, edges + triangle, θedges=0.5\theta_{\text{edges}}=-0.5, θtriangle=0.8\theta_{\text{triangle}}=0.8 (§5와 같은 모형). 시작 망은 간선 두 개 1–2, 1–3이다.
아래 세 걸음을 손으로 걸어라. 각 걸음마다 ① 켜는 제안인가 끄는 제안인가 ② 공통 친구 수 pijp_{ij} ③ 지수 ④ 비 rr ⑤ 수락확률 aa ⑥ 판정 ⑦ 걸음 뒤의 간선 수와 삼각형 수를 모두 쓸 것.
걸음고른 쌍난수 uu
1(2,3)0.65
2(1,2)0.91
3(3,4)0.42
덧붙여: 걸음 2에서 같은 쌍 (1,2)를 끄는 제안인데도 §5의 걸음 5와 수락확률이 다르다. 왜 다른가?
§16 해설에서 맞춰 볼 것 — 먼저 직접 풀어 볼 것.
연습 2. 중요도 표집 손 계산 (Importance Sampling by Hand)
같은 n=4n=4 모형에서 θ0=(0.5,  0.8)\boldsymbol\theta_0 = (-0.5,\; 0.8)로 망 다섯 개를 모의해 다음 통계량을 얻었다고 하자.
모의망 kk12345
간선 수32436
삼각형 수10104
관측망은 간선 3개, 삼각형 1개다. 후보 계수 θ=(0.7,  0.8)\boldsymbol\theta = (-0.7,\; 0.8)에 대해
(가) 각 kk의 지수 (θθ0) ⁣g(yk)(\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y_k)를 다섯 개 모두 구하라
(나) log[κ(θ)/κ(θ0)]\log\bigl[\kappa(\boldsymbol\theta)/\kappa(\boldsymbol\theta_0)\bigr]의 중요도 표집 추정값을 구하라
(다) (θ)(θ0)\ell(\boldsymbol\theta) - \ell(\boldsymbol\theta_0)의 추정값을 구하고, θ\boldsymbol\thetaθ0\boldsymbol\theta_0 중 어느 쪽이 관측망을 더 잘 설명한다고 이 추정은 말하는가?
(라) 전수 계산으로 얻은 정확값은 log[κ(θ)/κ(θ0)]=0.5278778824\log[\kappa(\boldsymbol\theta)/\kappa(\boldsymbol\theta_0)] = -0.5278778824다. 추정값과 왜 이렇게 차이가 나는가? 그리고 (다)의 결론은 여전히 맞는가?
§16 해설 참조. 먼저 풀고 나서 §16 해설과 맞춰 볼 것.
연습 3. gof 표 읽기 (Reading a GOF Table)
어떤 5학년 학급(n=25n=25)에 edges + nodematch("성별") + gwesp(0.5)를 적합하고 gof()를 돌렸더니 아래를 얻었다.
항목관측모의 평균MC pp
edges (모형 통계량)6261.80.98
nodematch.성별 (모형 통계량)4848.30.97
gwesp (모형 통계량)51.251.60.99
차수 0인 학생 수30.40.01
차수 1인 학생 수21.90.92
ESP 0인 간선 수1819.50.71
거리 2인 쌍의 수121118.40.83
(가) 담임이 "pp가 0.97~0.99로 셋이나 나왔으니 모형이 아주 좋다"고 말한다. 어디가 틀렸는가?
(나) 이 모형에서 진짜 문제인 칸은 어디이며, 그것은 교실 언어로 무슨 뜻인가?
(다) 이 모형으로 "우리 반에 소외 학생이 몇 명이나 생길 위험이 있는가"를 예측해도 되는가?
(라) 다음에 무슨 항을 넣어 보겠는가?
§16 해설 참조. 먼저 풀고 나서 §16 해설과 맞춰 볼 것.

16. 해설과 답 (Solutions)

연습 1 해설 (Solution 1)

① 무엇을 보는가. 시작 망의 인접행렬은 이렇다. 색칠한 칸이 1인 자리다.

1234
10110
21000
31000
40000

차수는 (2,1,1,0)(2,1,1,0), 간선 2개, 삼각형 0개다. 공통 친구 수 pijp_{ij}ii행과 jj행을 나란히 놓고 둘 다 1인 열을 세는 것이다 (단, 쌍 (i,j)(i,j) 자신은 0으로 지워 놓고 센다).

② 전개 — 0인 항도 모두 쓴다.

걸음 1: 쌍 (2,3), 현재 A[2,3]=0A[2,3]=0 → 켜는 제안

cc1234
A[2,c]A[2,c]1000
A[3,c]A[3,c]1000
A[2,c]A[3,c]A[2,c]\cdot A[3,c]1×1=11\times1=10×0=00\times0=00×0=00\times0=00×0=00\times0=0p23=1p_{23}=1
왜 그 값인가1은 2의 친구이자 3의 친구2 자신3 자신4는 아무와도 안 이어짐
θ ⁣δ23=0.5+0.8×1=+0.3,r=e+0.3=1.3498588,a=min(1,1.3498588)=1 \boldsymbol\theta^{\!\top}\boldsymbol\delta_{23} = -0.5 + 0.8\times 1 = +0.3, \qquad r = e^{+0.3} = 1.3498588, \qquad a = \min(1,\,1.3498588) = 1

u=0.65<1u = 0.65 < 1수락. 망 = 1–2, 1–3, 2–3, 간선 3개, 삼각형 1개({1,2,3}).

걸음 2: 쌍 (1,2), 현재 A[1,2]=1A[1,2]=1 → 끄는 제안

먼저 A[1,2]=A[2,1]=0A[1,2]=A[2,1]=0으로 지운 상태에서 공통 친구를 센다.

cc1234
A[1,c]A[1,c] ((1,2)(1,2) 지움)0010
A[2,c]A[2,c] ((1,2)(1,2) 지움)0010
0×0=00\times0=00×0=00\times0=01×1=11\times1=10×0=00\times0=0p12=1p_{12}=1
왜 그 값인가1 자신2 자신걸음 1에서 생긴 2–3 덕분에 3이 공통 친구가 됐다4는 고립

끄는 제안이므로 지수의 부호가 뒤집힌다.

θ ⁣δ12=(0.5+0.8×1)=0.3,r=e0.3=0.7408182,a=min(1,0.7408182)=0.7408182 -\boldsymbol\theta^{\!\top}\boldsymbol\delta_{12} = -(-0.5 + 0.8\times 1) = -0.3, \qquad r = e^{-0.3} = 0.7408182, \qquad a = \min(1,\,0.7408182) = 0.7408182

u=0.91>0.7408182u = 0.91 > 0.7408182기각. 망은 그대로. 간선 3개, 삼각형 1개.

걸음 3: 쌍 (3,4), 현재 A[3,4]=0A[3,4]=0 → 켜는 제안

cc1234
A[3,c]A[3,c]1100
A[4,c]A[4,c]0000
1×0=01\times0=01×0=01\times0=00×0=00\times0=00×0=00\times0=0p34=0p_{34}=0
왜 그 값인가1은 3의 친구지만 4의 친구가 아님2도 마찬가지3 자신4는 아직 친구가 하나도 없다
θ ⁣δ34=0.5+0.8×0=0.5,r=e0.5=0.6065307,a=0.6065307 \boldsymbol\theta^{\!\top}\boldsymbol\delta_{34} = -0.5 + 0.8\times 0 = -0.5, \qquad r = e^{-0.5} = 0.6065307, \qquad a = 0.6065307

u=0.42<0.6065307u = 0.42 < 0.6065307수락. 망 = 1–2, 1–3, 2–3, 3–4, 간선 4개, 삼각형 1개.

답.
걸음제안pijp_{ij}지수rraauu판정간선삼각형
1(2,3) 켜기1+0.3+0.31.349858810.65수락31
2(1,2) 끄기10.3-0.30.74081820.74081820.91기각31
3(3,4) 켜기00.5-0.50.60653070.60653070.42수락41
최종 인접행렬:
1234
10110
21010
31101
40010
덧붙임에 대한 답: §5의 걸음 5도 (1,2)를 끄는 제안이었지만 그때는 p12=0p_{12}=0이었다. 그때 망은 1–2, 1–3, 3–4여서 2는 1 말고 친구가 없었기 때문이다. 여기서는 p12=1p_{12}=1이다 — 걸음 1에서 2–3이 켜지면서 3이 공통 친구가 됐다.
같은 쌍의 같은 방향 제안이라도 나머지 망이 달라지면 수락확률이 달라진다. 이것이 5-6에서 말한 "쌍 독립이 깨졌다"는 말의 실물이다. edges만 있는 모형이라면 두 경우 모두 a=e0.51a=e^{0.5}\to1똑같았을 것이다.
교실 해석. 걸음 2에서 1–2 우정을 끊자는 제안이 기각됐다. 같은 제안이 §5에서는 무조건 받아들여졌는데 여기서는 26%나 거부된다. 차이는 하나 — 1과 2에게 공통 친구 3이 생겼기 때문이다. "둘만 아는 사이"는 쉽게 끊어지지만 "같은 친구를 공유하는 사이"는 잘 안 끊어진다는, 전이성 모형이 담고 있는 바로 그 이야기다.

연습 2 해설 (Solution 2)

① 무엇을 곱하는가. 계수 차부터 구한다.

θθ0=(0.7,  0.8)(0.5,  0.8)=(0.2,    0) \boldsymbol\theta - \boldsymbol\theta_0 = (-0.7,\;0.8) - (-0.5,\;0.8) = (\,-0.2,\;\;0\,)

삼각형 계수는 바뀌지 않았으므로 삼각형 수는 계산에 전혀 기여하지 않는다. 지수는 0.2×(간선 수)+0×(삼각형 수)-0.2 \times (\text{간선 수}) + 0 \times (\text{삼각형 수})다.

② (가) 전개 — 0인 항도 모두.

kk간선 g1g_1삼각형 g2g_20.2×g1-0.2\times g_10×g20\times g_2지수 dkd_kedke^{d_k}왜 그 값인가
1310.6-0.600.6-0.60.5488116간선 3개 × 0.2-0.2
2200.4-0.400.4-0.40.6703200가장 성긴 망 → 가중치가 가장 크다
3410.8-0.800.8-0.80.4493290간선 4개
4300.6-0.600.6-0.60.5488116삼각형 수가 1번과 달라도 지수는 같다
5641.2-1.201.2-1.20.3011942완전망 → 가중치가 가장 작다
2.5184665평균 = 2.5184665/52.5184665/5

③ (나)

15k=15edk=2.51846655=0.5036933 \frac{1}{5}\sum_{k=1}^{5} e^{d_k} = \frac{2.5184665}{5} = 0.5036933 log[κ(θ)κ(θ0)]    log0.5036933  =  0.6857877 \log\Bigl[\frac{\kappa(\boldsymbol\theta)}{\kappa(\boldsymbol\theta_0)}\Bigr] \;\approx\; \log 0.5036933 \;=\; -0.6857877

④ (다) 관측망은 g(yobs)=(3,1)\mathbf g(y_{\text{obs}}) = (3,\,1)이므로

(θθ0) ⁣g(yobs)=(0.2)(3)+(0)(1)=0.6 (\boldsymbol\theta-\boldsymbol\theta_0)^{\!\top}\mathbf g(y_{\text{obs}}) = (-0.2)(3) + (0)(1) = -0.6 (θ)(θ0)    0.6(0.6857877)  =  +0.0857877 \ell(\boldsymbol\theta) - \ell(\boldsymbol\theta_0) \;\approx\; -0.6 - (-0.6857877) \;=\; +0.0857877
답 (가)~(다). 지수는 0.6,0.4,0.8,0.6,1.2-0.6,\,-0.4,\,-0.8,\,-0.6,\,-1.2. log[κ(θ)/κ(θ0)]0.6857877\log[\kappa(\boldsymbol\theta)/\kappa(\boldsymbol\theta_0)] \approx -0.6857877. (θ)(θ0)+0.0857877>0\ell(\boldsymbol\theta)-\ell(\boldsymbol\theta_0) \approx +0.0857877 > 0이므로 이 추정은 θ=(0.7,0.8)\boldsymbol\theta=(-0.7,0.8)이 더 낫다고 말한다.

⑤ (라) 정확값과 비교 — 여기가 진짜 문제다.

표본 5개 추정전수 계산 정확값차이
log[κ(θ)/κ(θ0)]\log[\kappa(\boldsymbol\theta)/\kappa(\boldsymbol\theta_0)]0.6857877-0.68578770.5278779-0.52787790.1579099-0.1579099
(θ)(θ0)\ell(\boldsymbol\theta)-\ell(\boldsymbol\theta_0)+0.0857877+0.08578770.0721221-0.0721221부호가 뒤집혔다
답 (라). 차이의 원인은 표본이 다섯 개뿐이고, 그 다섯 개가 편향됐다는 것이다.
θ0=(0.5,0.8)\boldsymbol\theta_0=(-0.5,0.8)에서의 참 평균은 E[간선]=2.8618E[\text{간선}]=2.8618, E[삼각형]=0.6568E[\text{삼각형}]=0.6568인데, 주어진 다섯 표본의 평균은 간선 3.6, 삼각형 1.2다. 간선이 참값보다 0.74개나 많다.
지수 dk=0.2g1d_k = -0.2 g_1간선이 많을수록 작아지므로, 간선이 과대표집된 표본에서는 1Medk\frac1M\sum e^{d_k}과소평가되고, 로그도 과소평가되고, (θ)(θ0)=log()\ell(\boldsymbol\theta)-\ell(\boldsymbol\theta_0) = \cdots - \log(\cdots)과대평가된다.
결론: (다)의 답은 틀렸다. 정확값은 0.0721-0.0721로 음수이므로 θ0=0.5\boldsymbol\theta_0 = -0.5 쪽이 더 낫다. 실제로 θt=0.8\theta_t=0.8을 고정하고 E[간선]=3E[\text{간선}]=3을 맞추는 적률 방정식의 해는 θe=0.4399703\theta_e = -0.4399703로, 0.5-0.50.7-0.7보다 훨씬 가깝다.
이 문제가 가르치는 것. 중요도 표집은 공짜가 아니다. 표본이 적으면 부호가 뒤집힐 수 있다 — 즉 잘못된 방향으로 계수를 옮긴다. 그래서 ergm은 표본을 수백~수천 개 뽑고, 한 번에 멀리 가지 않고 step length를 줄여 가며 조금씩 움직인다(§9.1의 Optimizing with step length 0.4975가 그것이다).
§8.1의 표에서 θ0\theta_0에서 0.5 떨어졌을 때 오차가 20배로 뛴 것과 같은 현상이다.

연습 3 해설 (Solution 3)

① 표를 두 덩어리로 갈라 본다. 이것이 gof 표를 읽는 첫 동작이다.

항목MC pp모형에 들어간 항인가채점 가치
edges0.98들어감없음 — 적률 방정식이 강제
nodematch.성별0.97들어감없음
gwesp0.99들어감없음
차수 00.01안 들어감진짜 채점 — 실패
차수 10.92안 들어감진짜 채점 — 통과
ESP 00.71안 들어감진짜 채점 — 통과
거리 20.83안 들어감진짜 채점 — 통과
답 (가). 담임이 자랑한 세 개는 전부 모형에 넣은 통계량이다. θ^\hat{\boldsymbol\theta}는 애초에 "모의망의 평균 통계량 = 관측 통계량"이 되도록 고른 값이므로 (§2 적률 방정식), 이 셋의 pp가 1에 가까운 것은 모형이 좋다는 증거가 아니라 ergm이 계산을 제대로 끝냈다는 확인일 뿐이다. 관측 62 vs 모의 61.8, 관측 48 vs 모의 48.3처럼 소수점까지 붙어 나오는 것이 그 증거다. 어떤 모형을 넣어도 이 세 줄은 통과한다.
답 (나). 문제는 차수 0인 학생 수 한 칸이다.
관측 3명 vs 모의 평균 0.4명, p=0.01p=0.01. 모형이 만드는 25명짜리 학급에서는 친구가 하나도 없는 아이가 거의 안 생긴다 (100번 모의하면 40번쯤 한 명 나올까 말까).
그런데 실제 이 반에는 3명이 있다.
교실 언어로: 이 모형은 소외 학생의 존재를 설명하지 못한다. 모형이 보는 세상은 "간선 수와 성별 동질성과 뭉침으로 다 설명되는 세상"인데, 그 세상에서는 아무도 완전히 혼자 남지 않는다. 현실은 다르다.
참고로 차수 1은 관측 2명 vs 모의 1.9명으로 잘 맞는다 — "친구가 적은 것"이 아니라 "친구가 아예 없는 것"이 별개의 현상임을 보여 준다.
답 (다). 안 된다. 하필 실패한 그 칸이 예측하려는 대상이다. 차수 0을 못 맞추는 모형으로 소외 위험을 예측하면 체계적으로 과소추정한다 — 실제 3명인데 0~1명으로 예측한다.
반대로 이 모형으로 해도 되는 말은 있다: 성별 동질성의 크기, 뭉침 경향의 크기, ESP 분포와 거리 분포의 재현(둘 다 통과). gof가 통과한 영역 안에서만 모형을 믿는다가 원칙이다.
답 (라). 차수 0 칸을 직접 겨냥하는 항을 넣는다.
후보하는 일비고
isolates고립된 정점의 수를 직접 세는 항가장 직접적. 계수가 양수로 나오면 "이 반은 우연보다 소외가 많다"
degree(0)차수 0인 정점 수 (isolates와 사실상 같다)차수 분포의 특정 칸을 겨냥할 때
gwdegree차수 분포 전체의 모양을 기하가중으로 조절한 칸이 아니라 분포 전체가 틀렸을 때. gwesp와 같은 발상
넣은 뒤에는 반드시 gof()를 다시 돌려 차수 0이 고쳐졌는지, 그리고 고치는 과정에서 통과했던 칸이 망가지지 않았는지를 확인한다. 그리고 mcmc.diagnostics()로 사슬이 여전히 건강한지도 본다 — 차수 항은 triangle만큼은 아니지만 퇴화를 일으킬 수 있다.
세 문제를 관통하는 것.
연습 1은 MCMC 한 걸음이 무엇인지를 손으로 확인했고 (그리고 "쌍 독립이 깨졌다"는 말의 실물을 봤다),
연습 2는 표본이 적으면 답이 뒤집힌다는 것을 숫자로 확인했으며,
연습 3은 gof의 절반은 읽을 가치가 없고, 나머지 절반이 전부라는 것을 확인했다.
셋 다 "결과를 믿기 전에 과정을 본다"는 같은 습관을 가리킨다.