단원 5-7MCMC Estimation and Goodness of Fit
MCMC 추정과 적합도 검정
- 오늘의 질문 (The Question)
- 적률 방정식 다시 보기 (The Moment Equation Revisited)
- 왜 그냥 못 푸는가 (Why It Cannot Be Solved Directly)
- Metropolis–Hastings — 가 약분된다 (Metropolis–Hastings: The Constant Cancels)
- 손 계산 ① — 4명 망을 여섯 걸음 (Six Steps by Hand)
- R 검증 ① — 전수 계산을 재현하는가 (Verification I: Does the Walk Reproduce the Truth?)
- MCMLE — 중요도 표집 (MCMLE: Importance Sampling)
- R 검증 ② — 답을 아는 문제로 채점 (Verification II: Grading Against a Known Answer)
mcmc.diagnostics()읽는 법 (Reading the Diagnostics)- 죽은 사슬은 어떻게 생겼나 (What a Dead Chain Looks Like)
gof()는 무엇을 채점하는가 (What GOF Grades)- 모형 통계량이 맞는 것은 당연하다 (Model Statistics Are Matched by Construction)
- R 검증 ③ — 가라테 두 모형 채점 (Verification III: Grading Two Karate Models)
- 교실 적용 (Classroom Application)
- 연습문제 (Exercises)
- 해설과 답 (Solutions)
1. 오늘의 질문 (The Question)
5-6에서 우리는 아주 불편한 사실을 손으로 확인했다. triangle이나 gwesp가
들어오면 정규화 상수
가 쌍마다의 곱으로 쪼개지지 않는다. 짜리 망에서 64개를 전부 더해 을 얻었을 때, 그 값이 6개 인수의 곱과 다르다는 것을 눈으로 봤다.
그런데 5-6에서 우리는 ergm(nwk ~ edges + gwesp(0.5, fixed=TRUE))를 실행해서
계수와 표준오차를 뽑아 썼다. 그러면 이상하다.
를 더할 수 없다면,
ergm()은 대체 무엇을 계산해서 계수를 내놓았는가?그리고 5-6 §8에서 본 did not mix at all이라는 에러 — 그 "mix"는 무엇이고, 에러가 안 났을 때는 제대로 걸었다는 걸 어떻게 확인하는가?
마지막으로, 계수가 나왔다 치자. 그 모형이 진짜 우리 반을 닮았는지는 어떻게 채점하는가?
답은 순서대로 MCMC, mcmc.diagnostics(), gof()다.
오늘은 이 셋을 손으로 여섯 걸음 걸어 보는 것부터 시작한다.
2. 적률 방정식 다시 보기 (The Moment Equation Revisited)
5-1에서 유도했던 것을 다시 쓴다. 관측망 의 로그가능도는
이고, 로 미분할 때 두 번째 항은 이렇게 풀린다.
그래서 은 다음과 같다.
가라테에
edges만 넣었다면 "모의 망의 평균 간선 수가 78이 되게 하라"는 뜻이고,
edges + gwesp를 넣었다면 "평균 간선 수 78, 평균 gwesp 82.92858이 되게 하라"는 뜻이다.
이것이 왜 중요한지는 §12에서 다시 나온다.
모형에 넣은 통계량은 정의상 맞을 수밖에 없다는 사실이 gof()를 읽는 핵심이기 때문이다.
3. 왜 그냥 못 푸는가 (Why It Cannot Be Solved Directly)
를 계산하려면 가능한 모든 망을 다 훑어야 한다. 무방향 망에서 쌍의 개수는 이고, 각 쌍이 0 또는 1이니 망은 개다.
| 학급 크기 | 쌍의 개수 | 가능한 망 | 비고 |
|---|---|---|---|
| 4 | 6 | 64 | 5-6에서 손으로 다 더했다 |
| 7 | 21 | 2,097,152 | 5-6에서 R로 다 더했다 (몇 초) |
| 10 | 45 | 하루 종일 돌려도 안 끝난다 | |
| 34 (가라테) | 561 | 우주의 원자 수()의 제곱보다 많다 | |
| 1461 (FMH) | 1,066,530 | 쓸 수조차 없다 |
아니다. 이 1 늘 때마다 이 만큼 늘고 망의 개수는 배가 된다. 가라테에서 한 명만 더 늘어도 계산량이 배 — 약 86억 배가 된다. 속도로는 절대 못 이긴다.
그런데 자세히 보면 우리가 필요한 건 자체가 아니라 라는 평균이다. 평균은 다 더하지 않아도 구할 수 있다 — 표본을 뽑으면 된다. 전교생 1000명의 평균 키를 재려고 1000명을 다 재지 않고 무작위 50명을 재는 것과 같은 발상이다.
문제는 "에서 망을 무작위로 뽑는 법"인데, 확률을 알려면 가 필요하고 를 모르니 뽑을 수가 없다 — 처럼 보인다. 이 고리를 끊는 것이 다음 절이다.
4. Metropolis–Hastings — 가 약분된다 (Metropolis–Hastings: The Constant Cancels)
핵심 아이디어는 이렇다. 확률을 직접 계산하지 말고, 두 망의 확률 "비"만 쓰자. 비에서는 가 위아래로 똑같이 있어서 약분된다.
4.1 기호 (Notation)
5-3에서 쓴 표기를 그대로 가져온다. 쌍 만 다르고 나머지는 같은 두 망을
| 기호 | 뜻 |
|---|---|
| 인 망 (그 간선이 있는 쪽) | |
| 인 망 (그 간선이 없는 쪽) | |
| 변화 통계량 |
4.2 비를 계산하면 가 사라진다 (The Ratio Kills the Constant)
는 개를 더해야 하지만, 는 쌍 하나만 보면 나온다.
edges는 항상 1, gwesp는 이웃 몇 개만 세면 되고,
nodematch는 두 사람 속성만 비교하면 된다.즉 불가능한 양()은 필요 없고, 값싼 양()만 있으면 된다.
4.3 걸음 규칙 (The Walk)
현재 망을 라 하자. 한 걸음은 이렇게 걷는다.
| 단계 | 할 일 |
|---|---|
| ① | 개 쌍 중 하나 를 균등하게 고른다 |
| ② | 그 쌍을 뒤집은 망 을 제안한다 (0이면 1로, 1이면 0으로) |
| ③ | 수락 확률 를 계산한다 |
| ④ | 을 뽑아 이면 , 아니면 를 그대로 둔다 |
③의 비를 §4.2에 넣으면 이렇게 갈린다.
그리고 기각도 한 걸음이다. ④에서 제자리에 머문 것도 표본 하나로 센다. 이걸 빼먹으면 분포가 틀어진다.
4.4 왜 이게 맞는 답을 주는가 (Why This Works)
이 걸음은 세부 균형(detailed balance)을 만족한다. 즉 임의의 두 이웃 망 에 대해
제안 는 대칭이다 — 에서 를 골라 로 갈 확률도 , 거꾸로도 . 그래서 가 양변에서 지워지고, 확인할 것은 뿐이다. 라 두고 인 경우를 보면
양변이 같다. 이면 역할만 바뀌므로 마찬가지다. 세부 균형이 성립하면 가 이 걸음의 정상분포(stationary distribution)이고, 충분히 오래 걸으면 방문 빈도가 에 수렴한다.
"덜 그럴듯해도 가끔 받아들인다"가 핵심이다. 늘 좋은 쪽으로만 가면 한 봉우리에 갇혀 전체 분포를 못 본다.
5. 손 계산 ① — 4명 망을 여섯 걸음 (Six Steps by Hand)
5-6 §5에서 전수 계산했던 바로 그 모형을 쓴다. , 항은 edges + triangle,
변화 통계량은 5-6에서 구한 대로다.
즉 edges의 변화 통계량은 언제나 1이고, triangle의 변화 통계량은
와 의 공통 친구 수다.
따라서 켜는 제안의 지수는
여기서 는 그 간선을 뺀 상태에서 센 공통 친구 수다.
5.1 미리 계산해 둘 값 (Values to Prepare)
| 뜻 | |||
|---|---|---|---|
| 0 | 0.6065307 | 공통 친구 없는 쌍을 잇는 제안 → 약 61%만 수락 | |
| 1 | 1.3498588 | 공통 친구 1명 → 1을 넘으니 무조건 수락 | |
| 2 | 3.0041660 | 공통 친구 2명 → 무조건 수락 |
끄는 제안은 부호만 뒤집는다.
| 뜻 | |||
|---|---|---|---|
| 0 | 1.6487213 | 고립된 간선 끄기 → 무조건 수락 (망은 성길수록 확률이 높다) | |
| 1 | 0.7408182 | 삼각형 하나를 부수는 끄기 → 약 74%만 수락 | |
| 2 | 0.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)이고, 각 걸음의 난수는 미리 뽑아 고정했다.
| 걸음 | 고른 쌍 | 현재 | 제안 | 지수 | 비 | 수락확률 | 난수 | 판정 | 걸음 뒤 간선 | 걸음 뒤 삼각형 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | (1,2) | 0 | 켜기 | 0 | 0.6065307 | 0.6065307 | 0.31 | 수락 | 1 | 0 | |
| 2 | (2,3) | 0 | 켜기 | 0 | 0.6065307 | 0.6065307 | 0.88 | 기각 | 1 | 0 | |
| 3 | (1,3) | 0 | 켜기 | 0 | 0.6065307 | 0.6065307 | 0.21 | 수락 | 2 | 0 | |
| 4 | (3,4) | 0 | 켜기 | 0 | 0.6065307 | 0.6065307 | 0.55 | 수락 | 3 | 0 | |
| 5 | (1,2) | 1 | 끄기 | 0 | 1.6487213 | 1 (상한) | 0.72 | 수락 | 2 | 0 | |
| 6 | (1,4) | 0 | 켜기 | 1 | 1.3498588 | 1 (상한) | 0.04 | 수락 | 3 | 1 |
5.3 각 걸음을 말로 (Step by Step in Words)
| 걸음 | 무슨 일이 일어났나 |
|---|---|
| 1 | 빈 망에서 (1,2)를 켜자는 제안. 공통 친구가 있을 리 없으니 . 간선이 하나 늘면 만큼 확률이 깎이므로 수락률은 1이 아니라 0.607. 이라 수락. 망 = 1–2 |
| 2 | (2,3)을 켜자는 제안. 2의 친구는 1뿐, 3은 친구가 없으니 . 수락률 0.607인데 이 커서 기각. 망은 그대로. 이 걸음도 표본 하나로 센다 — 간선 1개인 망이 두 번 기록된 셈 |
| 3 | (1,3)을 켜자는 제안. 1의 친구는 2, 3의 친구는 없음 → . 로 수락. 망 = 1–2, 1–3. 아직 삼각형은 없다 (2–3이 없으므로) |
| 4 | (3,4)를 켜자는 제안. 3의 친구는 1, 4는 없음 → . 수락. 망 = 1–2, 1–3, 3–4. 여전히 삼각형 0 |
| 5 | 이번엔 이미 있는 간선을 골랐다. (1,2)는 켜져 있으므로 제안은 끄기. (1,2)를 뺀 상태에서 1과 2의 공통 친구는 없으니 , 지수는 , 비는 1.649. 1보다 크면 수락확률은 1로 자른다 → 가 뭐든 수락. 망 = 1–3, 3–4 |
| 6 | (1,4)를 켜자는 제안. 1의 친구는 3, 4의 친구도 3 → 공통 친구 3번이 있다, . 간선 비용 를 삼각형 이득 이 이기므로 지수가 으로 양수 → 무조건 수락. 망 = 1–3, 3–4, 1–4 → 삼각형 {1,3,4} 완성 |
- 를 한 번도 쓰지 않았다. 필요한 건 와 같은 지수 하나씩뿐이었다
- 수락확률이 1로 잘리는 순간(걸음 5, 6)이 있다. 확률이 올라가는 방향이면 항상 간다
- 걸음 6에서 삼각형 항이 처음으로 일을 했다. 일 때는
edges만 있는 모형과 똑같이 굴다가, 공통 친구가 생기는 순간 수락률이 0.607에서 1로 뛴다. 이것이 "친구의 친구가 친구가 되는" 힘이다
6. R 검증 ① — 전수 계산을 재현하는가 (Verification I: Does the Walk Reproduce the Truth?)
는 전수 계산이 가능하니, MCMC가 맞는 답으로 가는지 직접 채점할 수 있다. 5-6에서 64개를 다 더해 얻은 정확값은
## §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)
edges+triangle 모형에서의 Metropolis 걸음.
(가) §5의 여섯 걸음, (나) 누적 평균의 수렴, (다) 10만 걸음 뒤의 분포6.1 평균이 수렴하는가 (Convergence of the Mean)
| 걸음 수 | 누적 | 정확값과의 차이 | 누적 | 정확값과의 차이 |
|---|---|---|---|---|
| 100 | 2.60000 | 0.47000 | ||
| 1,000 | 2.74500 | 0.66600 | ||
| 10,000 | 2.88100 | 0.66440 | ||
| 100,000 | 2.86599 | 0.65770 | ||
| 정확값 | 2.861800172 | — | 0.6567705622 | — |
mcmc.diagnostics()다.
6.2 분포 전체가 맞는가 (Does the Whole Distribution Match?)
평균만 맞추는 건 쉽다. 진짜 확인은 분포 전체다.
| 간선 수 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| 전수 계산 (64개 망) | 0.042744 | 0.155554 | 0.235871 | 0.237505 | 0.171846 | 0.104271 | 0.052208 |
| MCMC 10만 걸음 | 0.042190 | 0.155300 | 0.235270 | 0.237240 | 0.173080 | 0.105410 | 0.051510 |
| 차이 |
최대 오차가 0.00123이다. 확률 0.17짜리 칸에서 0.001 틀린 것이니 상대오차 0.7%. 전수 계산을 한 번도 하지 않고, 오직 "쌍 하나 뒤집고 지수 하나 계산하기"만 10만 번 반복해서 개 망의 분포를 복원했다.
6.3 걸음은 서로 독립이 아니다 (The Steps Are Not Independent)
여기에 함정이 하나 있다. 한 걸음은 쌍 하나만 바꾸므로 연속한 표본이 거의 같은 망이다. 자기상관을 재 보면
| 시차 (lag) | 1 | 5 | 10 | 20 |
|---|---|---|---|---|
| 간선 수의 자기상관 | 0.8327 | 0.3975 | 0.1613 | 0.0251 |
바로 옆 걸음과는 0.83이나 붙어 있다. 6쌍짜리 망이라 6걸음쯤 지나야 겨우 풀린다. 그래서 10만 걸음이 10만 개의 독립 표본이 아니다.
그래서
ergm은 표본을 솎아낸다(thinning) — 뒤에서 볼 MCMC.interval=256이
"256걸음마다 하나만 기록"이라는 뜻이다.
7. MCMLE — 중요도 표집 (MCMLE: Importance Sampling)
이제 표본은 뽑을 수 있다. 그런데 우리가 원하는 건 를 찾는 것이고, 를 여러 에서 비교해야 한다. 를 바꿀 때마다 MCMC를 새로 돌리면 너무 느리다.
Geyer–Thompson의 요령은 한 번 뽑은 표본을 재활용하는 것이다.
7.1 유도 (Derivation)
어떤 시작값 에서 표본을 뽑았다고 하자. 그러면
가운데 등호에서 한 일은 를 로 쪼갠 것뿐이다. 그러면 앞부분이 정확히 의 모양이 되고, 합이 기댓값으로 바뀐다. 이 기댓값은 에서 뽑은 표본으로 근사할 수 있다.
그리고 로그가능도의 차에서는 우리가 모르는 마저 지워진다.
는 관측망에서 세면 되고, 는 모의망에서 세면 된다. 는 어디에도 없다.
그래서 를 바꿔 가며 오른쪽을 최대로 만드는 값을 찾으면 그것이 추정값이다. 이것을 MCMLE(Monte Carlo Maximum Likelihood Estimation)라 한다.
7.2 왜 반복해야 하는가 (Why It Must Iterate)
그래서
ergm은 반복한다: 에서 표본을 뽑아
를 구하고, 로 갱신해
표본을 다시 뽑고… 를 가 움직이지 않을 때까지.
콘솔에 찍히는 Iteration 1 of at most 60이 바로 이 반복이다.
8. R 검증 ② — 답을 아는 문제로 채점 (Verification II: Grading Against a Known Answer)
MCMC를 믿으려면 답을 아는 문제로 채점해 봐야 한다.
가라테에 edges만 넣은 모형이 그런 문제다. 5-2에서 손으로 풀었듯이 답이 닫힌 식으로 나온다.
8.1 중요도 표집이 비를 맞추는가 (Does Importance Sampling Get the Ratio Right?)
에서 2000개를 모의하고, §7.1 공식으로
를 여러 에서 추정해 정확값과 비교했다.
edges만 있는 모형은 가 닫힌 식 이므로 정확값을 안다.
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) 방지 요령이다.
가 근처면 가 이라 전부 0으로 뭉개진다.
최댓값을 빼서 가장 큰 항을 1로 만든 뒤 로그에서 되돌려 준다.
라는 항등식이다.
| 중요도 표집 추정 | 정확값 | 오차 | 비고 | |
|---|---|---|---|---|
| 에서 0.1 | ||||
| 0.2 | ||||
| 0.3 | ||||
| 참 MLE 위치 | ||||
| 0.4 | ||||
| 0.5 — 오차가 20배로 |
이 추정 곡선을 최대로 만드는 값은 로, 정확한 MLE 과 0.00906884 차이다. 표준오차 0.122의 7% 수준이니 실용적으로 무시할 만하다.
8.2 ergm에게 억지로 MCMC를 시켜 보면 (Forcing ergm to Use MCMC)
ergm은 edges만 있으면 똑똑하게 닫힌 식으로 풀어 버린다.
force.main=TRUE로 MCMC 경로를 강제하면 채점이 된다.
ergm(nwk ~ edges, control=control.ergm(force.main=TRUE, MCMLE.maxit=20, seed=11))
| 정확한 MLE | 강제 MCMLE | 차이 | |
|---|---|---|---|
| 0.00942 | |||
| 표준오차 | 0.1220283008 | 0.1198447885 | 0.0022 |
| — | |||
| — 어느 쪽이든 결론 동일 | — | ||
seed를 기록해 두는 게 맞다.
4-8에서 cluster_louvain()의 가 실행마다 달랐던 것과 같은 성격의 문제다.
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)
| 반복 | 로그가능도 개선 | 수렴 검정 | 판정 |
|---|---|---|---|
| 1 | 3.7244 | — | 크게 움직인다 |
| 2 | 0.9982 | — | 줄어든다 |
| 3 | 0.1111 | — | |
| 4 | 0.1364 | — | 살짝 되튄다 (난수 탓, 정상) |
| 5 | 0.0483 | 0.4067 | 아직 아님 |
| 6 | 0.0082 | 0.1149 | 가까워짐 |
| 7 | 0.0041 | 0.0004 | 수렴 판정 |
ergm이 쓰는
Hummel 등의 수렴 판정에서 나온 값이다. 관측점이 모의망 구름의 안쪽 깊숙이
들어왔다는 증거가 강할수록 가 작아지도록 설계돼 있다.
gof()의 와 정반대이니 섞어 읽지 말 것.
9.2 표본 궤적과 자기상관 (Trace and Autocorrelation)
mcmc.diagnostics()가 보고한 숫자는 이렇다.
| 항목 | 값 | 읽는 법 |
|---|---|---|
| 표본 수 | 657 | 최종 반복에서 기록된 망의 개수 |
| 번인 (burn-in) | 8192 | 첫 8192걸음은 버린다 — 시작 망의 흔적을 지우는 구간 |
| 간격 (interval) | 256 | 256걸음마다 하나만 기록 — §6.3의 자기상관을 끊으려는 솎아내기 |
| 평균 (관측값과의 차이) | / | 0 근처여야 한다 — 적률 방정식이 요구하는 바로 그것 |
| 표준편차 | 16.05 / 26.98 | 평균이 표준편차의 2% 수준 → 충분히 0에 가깝다 |
| 유효 표본 수 | 166.3 / 194.0 | 657개가 실제로는 166~194개 값어치. 솎았는데도 상관이 남아 있다 |
| Geweke | / | 사슬 앞부분과 뒷부분의 평균 비교. 가 2를 살짝 넘어 경계선 |
| 시차 | 1 | 2 | 5 | 10 |
|---|---|---|---|---|
| edges | 0.5956 | 0.3565 | 0.0844 | 0.0290 |
| gwesp(0.5) | 0.5435 | 0.3124 | 0.0751 | 0.0362 |
- 궤적이 0 주변에서 진동한다 — 한쪽으로 흐르거나(추세) 한 값에 붙어 있으면 안 된다 (그림 71가)
- 자기상관이 빠르게 죽는다 — 시차 5~10에서 0.1 아래로 (그림 71나)
- 유효 표본 수가 충분하다 — 대개 100 이상이면 실용적으로 쓸 만하다
- 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 계수 , 로 관측망에서 출발해 2000걸음마다 하나씩 200개를 기록했다.
| 표본 번호 | 간선 수 | 삼각형 수 | 상태 |
|---|---|---|---|
| 1 ~ 89 | 40 ~ 78 | 수십 | 관측망 근처에서 얼쩡거린다 |
| 90 | 561 | 5984 | 완전망에 도달 — 34명 전원이 서로 친구 |
| 91 ~ 200 | 561 | 5984 | 한 번도 못 나온다 |
왜 못 나오는가? 완전망에서 간선 하나를 끄자는 제안을 생각해 보자. 에서 두 사람의 공통 친구는 나머지 32명 전부다.
- 번인을 늘리는 것은 도움이 안 된다 — 오래 걸을수록 완전망에 더 확실히 갇힌다
seed를 바꾸는 것도 소용없다 — 우연이 아니라 모형의 성질이다- 항을 바꿔야 한다.
triangle을 빼고gwesp를 넣는 것이 5-6에서 배운 처방이다.gwesp는 공통 친구가 늘어날수록 한계 이득이 로 체감하므로, 완전망으로 폭주하는 되먹임 고리가 끊어진다
11. gof()는 무엇을 채점하는가 (What GOF Grades)
계수가 나왔고 사슬도 건강하다고 하자. 그래도 남는 질문이 있다.
gof()의 절차는 간단하다.
| 단계 | 할 일 |
|---|---|
| ① | 적합된 로 망을 200개 모의한다 (§4의 걸음으로) |
| ② | 200개 각각에서 어떤 특성(차수 분포 등)을 잰다 |
| ③ | 관측망에서도 같은 특성을 잰다 |
| ④ | 관측값이 200개가 만든 분포의 어디쯤에 있는지 본다 |
④의 위치를 수치로 요약한 것이 MC -value다. 관측값보다 크거나 같은 모의값의 비율과 작거나 같은 비율 중 작은 쪽을 두 배 한 값 (대략적으로는 "관측값이 얼마나 가장자리인가")이다.
| MC | 읽는 법 |
|---|---|
| 1.00에 가까움 | 관측값이 모의 분포 한가운데 — 모형이 이 특성을 잘 재현한다 |
| 0.10 근처 | 가장자리 — 애매하다 |
| 0.05 미만 | 관측값이 모의 분포 밖 — 모형이 이 특성을 못 맞춘다 |
mcmc.diagnostics()의 수렴 는 작아야 좋고,
gof()의 는 커야 좋다. 같은 글자를 쓰지만 전혀 다른 검정이다.
11.1 무엇을 채점 대상으로 삼는가 (Which Features to Grade)
GOF 항 | 재는 것 | 교실에서의 뜻 |
|---|---|---|
degree | 차수가 인 사람 수 () | "친구가 하나도 없는 아이가 몇 명인가", "인기 있는 아이가 몇 명인가" |
espartners | 공유 파트너가 명인 간선의 수 | "이 우정이 공통 친구를 통해 맺어졌는가, 단둘이 맺어졌는가" |
distance | 최단 거리가 인 쌍의 수 | "소문이 몇 다리 만에 반 전체로 퍼지는가" |
model | 모형에 넣은 통계량 그 자체 | 채점이 아니다 — 다음 절 참조 |
12. 모형 통계량이 맞는 것은 당연하다 (Model Statistics Are Matched by Construction)
§2의 적률 방정식을 다시 보자.
그러니 로 망을 모의해서 모형에 넣은 통계량을 재면, 평균이 관측값과 같은 것은 발견이 아니라 정의다.
모형 통계량의 gof는 채점이 아니라 "계산이 제대로 됐는지" 확인일 뿐이다.
가라테 두 모형에서 실제로 확인해 보자.
| 모형 | 통계량 | 관측 | 모의 평균 | MC |
|---|---|---|---|---|
edges | edges | 78 | 77.63 | 0.99 |
edges + gwesp(0.5) | edges | 78 | 78.42 | 1.00 |
| gwesp(0.5) | 82.92858 | 84.05195 | 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)
| 공유 파트너 수 | 관측 | edges만 | edges + gwesp(0.5) | ||||
|---|---|---|---|---|---|---|---|
| 모의 최소 | 모의 평균 | MC | 모의 최소 | 모의 평균 | MC | ||
| 0 | 11 | 26 | 41.725 | 0.00 | 3 | 12.360 | 0.88 |
| 1 | 35 | 9 | 25.865 | 0.27 | 13 | 27.760 | 0.21 |
| 2 | 14 | 0 | 8.200 | 0.24 | 4 | 21.840 | 0.37 |
| 3 | 11 | 0 | 1.560 | 0.01 | 0 | 10.955 | 0.93 |
| 4 | 3 | 0 | 0.245 | 0.01 | 0 | 4.030 | 1.00 |
| 5 | 2 | 0 | 0.030 | 0.00 | 0 | 1.170 | 0.59 |
| 6 | 0 | 0 | 0.005 | 1.00 | 0 | 0.255 | 1.00 |
edges만 있는 모형이 무엇을 틀렸는지 읽어 보자.공유 파트너가 0인 간선 — 즉 "공통 친구 없이 단둘이만 아는 사이" — 이 관측에서는 78개 중 11개인데, 모의망에서는 평균 41.7개, 최소가 26개다. 200번 모의해서 단 한 번도 11 근처로 못 내려갔다.
반대로 공유 파트너가 5명인 간선이 관측에는 2개 있는데 모의 최댓값은 1이다.
해석: 무작위로 간선을 뿌리면 우정이 뿔뿔이 흩어지는데, 실제 가라테 도장의 우정은 뭉쳐 있다. 이것이 5-6에서 "삼각형이 유의하게 많다"고 했던 것의 분포판이다.
gwesp를 넣으면 가장 작은 가 0.21이 된다. 일곱 칸 전부 상자 안이다.
5-6에서 triangle 대신 gwesp를 쓰기로 한 결정이
계수의 유의성뿐 아니라 분포 재현 능력으로도 정당화된 것이다.
13.2 거리 분포 (Geodesic Distance Distribution)
gwesp가 고친다.
(다) 차수 분포 — 둘 다 못 맞춘다| 최단 거리 | 관측 쌍 수 | edges만 | edges + gwesp(0.5) | ||||
|---|---|---|---|---|---|---|---|
| 모의 최소 | 모의 평균 | MC | 모의 최소 | 모의 평균 | MC | ||
| 1 | 78 | 53 | 77.630 | 0.99 | 37 | 78.420 | 1.00 |
| 2 | 265 | 130 | 223.280 | 0.16 | 61 | 197.455 | 0.21 |
| 3 | 137 | 147 | 201.205 | 0.00 | 68 | 149.955 | 0.56 |
| 4 | 73 | 1 | 45.000 | 0.29 | 0 | 47.395 | 0.40 |
| 5 | 8 | 0 | 4.810 | 0.45 | 0 | 11.160 | 0.88 |
edges만 있는 모형에서 거리 3인 쌍이 관측 137개인데 모의는 최소가 147이다.
200개 중 하나도 137 이하로 못 내려갔다. 뭉친 우정은 거리를 단축시키는데,
무작위 망은 그 단축을 만들지 못한 것이다.
13.3 차수 분포 — 둘 다 실패한다 (Degree: Both Models Fail)
| 차수 | 관측 인원 | edges만 | edges + gwesp(0.5) | ||||
|---|---|---|---|---|---|---|---|
| 모의 최소 | 모의 평균 | MC | 모의 최소 | 모의 평균 | MC | ||
| 0 | 0 | 0 | 0.245 | 1.00 | 0 | 2.075 | 0.38 |
| 1 | 1 | 0 | 1.380 | 1.00 | 0 | 2.995 | 0.45 |
| 2 | 11 | 0 | 3.505 | 0.01 | 0 | 4.045 | 0.00 |
| 3 | 6 | 0 | 5.555 | 0.97 | 0 | 4.190 | 0.51 |
| 4 | 6 | 1 | 6.685 | 0.97 | 0 | 4.620 | 0.58 |
| 5 | 3 | 1 | 6.235 | 0.24 | 0 | 4.035 | 0.79 |
| 6 | 2 | 0 | 4.730 | 0.34 | 0 | 3.685 | 0.63 |
| 7 | 0 | 0 | 3.065 | 0.05 | 0 | 2.695 | 0.12 |
| 8 | 0 | 0 | 1.550 | 0.44 | 0 | 1.995 | 0.28 |
edges 모형 3.5명, gwesp 모형 4.0명이다.
는 0.01과 0.00 — 둘 다 실패다. gwesp는 이 칸을 전혀 못 고쳤다.가라테 도장은 "친구가 딱 둘인 사람"이 3분의 1이나 되는, 대단히 주변부가 두꺼운 망인데 두 모형 모두 그 주변부를 재현하지 못한다.
gof()는 통과 도장이 아니라 진단서다."실패한 칸이 어디인가"가 곧 다음에 넣을 항이 무엇인가를 알려 준다. 차수 분포가 안 맞으면
degree(2)나 gwdegree를,
ESP가 안 맞으면 gwesp를, 거리가 안 맞으면 gwdsp를 검토한다.5-8에서 FMH 종합 모형을 만들 때 이 표를 다시 쓰게 된다.
14. 교실 적용 (Classroom Application)
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)
,
edges + triangle, ,
(§5와 같은 모형). 시작 망은 간선 두 개 1–2, 1–3이다.아래 세 걸음을 손으로 걸어라. 각 걸음마다 ① 켜는 제안인가 끄는 제안인가 ② 공통 친구 수 ③ 지수 ④ 비 ⑤ 수락확률 ⑥ 판정 ⑦ 걸음 뒤의 간선 수와 삼각형 수를 모두 쓸 것.
| 걸음 | 고른 쌍 | 난수 |
|---|---|---|
| 1 | (2,3) | 0.65 |
| 2 | (1,2) | 0.91 |
| 3 | (3,4) | 0.42 |
§16 해설에서 맞춰 볼 것 — 먼저 직접 풀어 볼 것.
같은 모형에서 로 망 다섯 개를 모의해 다음 통계량을 얻었다고 하자.
| 모의망 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 간선 수 | 3 | 2 | 4 | 3 | 6 |
| 삼각형 수 | 1 | 0 | 1 | 0 | 4 |
(가) 각 의 지수 를 다섯 개 모두 구하라
(나) 의 중요도 표집 추정값을 구하라
(다) 의 추정값을 구하고, 와 중 어느 쪽이 관측망을 더 잘 설명한다고 이 추정은 말하는가?
(라) 전수 계산으로 얻은 정확값은 다. 추정값과 왜 이렇게 차이가 나는가? 그리고 (다)의 결론은 여전히 맞는가?
§16 해설 참조. 먼저 풀고 나서 §16 해설과 맞춰 볼 것.
어떤 5학년 학급()에
edges + nodematch("성별") + gwesp(0.5)를 적합하고
gof()를 돌렸더니 아래를 얻었다.
| 항목 | 관측 | 모의 평균 | MC |
|---|---|---|---|
| edges (모형 통계량) | 62 | 61.8 | 0.98 |
| nodematch.성별 (모형 통계량) | 48 | 48.3 | 0.97 |
| gwesp (모형 통계량) | 51.2 | 51.6 | 0.99 |
| 차수 0인 학생 수 | 3 | 0.4 | 0.01 |
| 차수 1인 학생 수 | 2 | 1.9 | 0.92 |
| ESP 0인 간선 수 | 18 | 19.5 | 0.71 |
| 거리 2인 쌍의 수 | 121 | 118.4 | 0.83 |
(나) 이 모형에서 진짜 문제인 칸은 어디이며, 그것은 교실 언어로 무슨 뜻인가?
(다) 이 모형으로 "우리 반에 소외 학생이 몇 명이나 생길 위험이 있는가"를 예측해도 되는가?
(라) 다음에 무슨 항을 넣어 보겠는가?
§16 해설 참조. 먼저 풀고 나서 §16 해설과 맞춰 볼 것.
16. 해설과 답 (Solutions)
연습 1 해설 (Solution 1)
① 무엇을 보는가. 시작 망의 인접행렬은 이렇다. 색칠한 칸이 1인 자리다.
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 |
차수는 , 간선 2개, 삼각형 0개다. 공통 친구 수 는 행과 행을 나란히 놓고 둘 다 1인 열을 세는 것이다 (단, 쌍 자신은 0으로 지워 놓고 센다).
② 전개 — 0인 항도 모두 쓴다.
걸음 1: 쌍 (2,3), 현재 → 켜는 제안
| 열 | 1 | 2 | 3 | 4 | 합 |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | — | |
| 1 | 0 | 0 | 0 | — | |
| 곱 | |||||
| 왜 그 값인가 | 1은 2의 친구이자 3의 친구 | 2 자신 | 3 자신 | 4는 아무와도 안 이어짐 | — |
→ 수락. 망 = 1–2, 1–3, 2–3, 간선 3개, 삼각형 1개({1,2,3}).
걸음 2: 쌍 (1,2), 현재 → 끄는 제안
먼저 으로 지운 상태에서 공통 친구를 센다.
| 열 | 1 | 2 | 3 | 4 | 합 |
|---|---|---|---|---|---|
| ( 지움) | 0 | 0 | 1 | 0 | — |
| ( 지움) | 0 | 0 | 1 | 0 | — |
| 곱 | |||||
| 왜 그 값인가 | 1 자신 | 2 자신 | 걸음 1에서 생긴 2–3 덕분에 3이 공통 친구가 됐다 | 4는 고립 | — |
끄는 제안이므로 지수의 부호가 뒤집힌다.
→ 기각. 망은 그대로. 간선 3개, 삼각형 1개.
걸음 3: 쌍 (3,4), 현재 → 켜는 제안
| 열 | 1 | 2 | 3 | 4 | 합 |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | — | |
| 0 | 0 | 0 | 0 | — | |
| 곱 | |||||
| 왜 그 값인가 | 1은 3의 친구지만 4의 친구가 아님 | 2도 마찬가지 | 3 자신 | 4는 아직 친구가 하나도 없다 | — |
→ 수락. 망 = 1–2, 1–3, 2–3, 3–4, 간선 4개, 삼각형 1개.
| 걸음 | 제안 | 지수 | 판정 | 간선 | 삼각형 | ||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | (2,3) 켜기 | 1 | 1.3498588 | 1 | 0.65 | 수락 | 3 | 1 | |
| 2 | (1,2) 끄기 | 1 | 0.7408182 | 0.7408182 | 0.91 | 기각 | 3 | 1 | |
| 3 | (3,4) 켜기 | 0 | 0.6065307 | 0.6065307 | 0.42 | 수락 | 4 | 1 |
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0 |
| 2 | 1 | 0 | 1 | 0 |
| 3 | 1 | 1 | 0 | 1 |
| 4 | 0 | 0 | 1 | 0 |
즉 같은 쌍의 같은 방향 제안이라도 나머지 망이 달라지면 수락확률이 달라진다. 이것이 5-6에서 말한 "쌍 독립이 깨졌다"는 말의 실물이다.
edges만 있는 모형이라면 두 경우 모두 로 똑같았을 것이다.
연습 2 해설 (Solution 2)
① 무엇을 곱하는가. 계수 차부터 구한다.
삼각형 계수는 바뀌지 않았으므로 삼각형 수는 계산에 전혀 기여하지 않는다. 지수는 다.
② (가) 전개 — 0인 항도 모두.
| 간선 | 삼각형 | 지수 | 왜 그 값인가 | ||||
|---|---|---|---|---|---|---|---|
| 1 | 3 | 1 | 0 | 0.5488116 | 간선 3개 × | ||
| 2 | 2 | 0 | 0 | 0.6703200 | 가장 성긴 망 → 가중치가 가장 크다 | ||
| 3 | 4 | 1 | 0 | 0.4493290 | 간선 4개 | ||
| 4 | 3 | 0 | 0 | 0.5488116 | 삼각형 수가 1번과 달라도 지수는 같다 | ||
| 5 | 6 | 4 | 0 | 0.3011942 | 완전망 → 가중치가 가장 작다 | ||
| 합 | 2.5184665 | 평균 = | |||||
③ (나)
④ (다) 관측망은 이므로
⑤ (라) 정확값과 비교 — 여기가 진짜 문제다.
| 표본 5개 추정 | 전수 계산 정확값 | 차이 | |
|---|---|---|---|
| 부호가 뒤집혔다 |
에서의 참 평균은 , 인데, 주어진 다섯 표본의 평균은 간선 3.6, 삼각형 1.2다. 간선이 참값보다 0.74개나 많다.
지수 은 간선이 많을수록 작아지므로, 간선이 과대표집된 표본에서는 가 과소평가되고, 로그도 과소평가되고, 는 과대평가된다.
결론: (다)의 답은 틀렸다. 정확값은 로 음수이므로 쪽이 더 낫다. 실제로 을 고정하고 을 맞추는 적률 방정식의 해는 로, 가 보다 훨씬 가깝다.
ergm은 표본을 수백~수천 개 뽑고, 한 번에 멀리 가지 않고
step length를 줄여 가며 조금씩 움직인다(§9.1의
Optimizing with step length 0.4975가 그것이다).§8.1의 표에서 에서 0.5 떨어졌을 때 오차가 20배로 뛴 것과 같은 현상이다.
연습 3 해설 (Solution 3)
① 표를 두 덩어리로 갈라 본다. 이것이 gof 표를 읽는 첫 동작이다.
| 항목 | MC | 모형에 들어간 항인가 | 채점 가치 |
|---|---|---|---|
| edges | 0.98 | 들어감 | 없음 — 적률 방정식이 강제 |
| nodematch.성별 | 0.97 | 들어감 | 없음 |
| gwesp | 0.99 | 들어감 | 없음 |
| 차수 0 | 0.01 | 안 들어감 | 진짜 채점 — 실패 |
| 차수 1 | 0.92 | 안 들어감 | 진짜 채점 — 통과 |
| ESP 0 | 0.71 | 안 들어감 | 진짜 채점 — 통과 |
| 거리 2 | 0.83 | 안 들어감 | 진짜 채점 — 통과 |
ergm이 계산을 제대로 끝냈다는 확인일 뿐이다.
관측 62 vs 모의 61.8, 관측 48 vs 모의 48.3처럼 소수점까지 붙어 나오는 것이 그 증거다.
어떤 모형을 넣어도 이 세 줄은 통과한다.
관측 3명 vs 모의 평균 0.4명, . 모형이 만드는 25명짜리 학급에서는 친구가 하나도 없는 아이가 거의 안 생긴다 (100번 모의하면 40번쯤 한 명 나올까 말까).
그런데 실제 이 반에는 3명이 있다.
교실 언어로: 이 모형은 소외 학생의 존재를 설명하지 못한다. 모형이 보는 세상은 "간선 수와 성별 동질성과 뭉침으로 다 설명되는 세상"인데, 그 세상에서는 아무도 완전히 혼자 남지 않는다. 현실은 다르다.
참고로 차수 1은 관측 2명 vs 모의 1.9명으로 잘 맞는다 — "친구가 적은 것"이 아니라 "친구가 아예 없는 것"이 별개의 현상임을 보여 준다.
반대로 이 모형으로 해도 되는 말은 있다: 성별 동질성의 크기, 뭉침 경향의 크기, ESP 분포와 거리 분포의 재현(둘 다 통과). gof가 통과한 영역 안에서만 모형을 믿는다가 원칙이다.
| 후보 | 하는 일 | 비고 |
|---|---|---|
isolates | 고립된 정점의 수를 직접 세는 항 | 가장 직접적. 계수가 양수로 나오면 "이 반은 우연보다 소외가 많다" |
degree(0) | 차수 0인 정점 수 (isolates와 사실상 같다) | 차수 분포의 특정 칸을 겨냥할 때 |
gwdegree | 차수 분포 전체의 모양을 기하가중으로 조절 | 한 칸이 아니라 분포 전체가 틀렸을 때. gwesp와 같은 발상 |
gof()를 다시 돌려 차수 0이 고쳐졌는지,
그리고 고치는 과정에서 통과했던 칸이 망가지지 않았는지를 확인한다.
그리고 mcmc.diagnostics()로 사슬이 여전히 건강한지도 본다 —
차수 항은 triangle만큼은 아니지만 퇴화를 일으킬 수 있다.
연습 1은 MCMC 한 걸음이 무엇인지를 손으로 확인했고 (그리고 "쌍 독립이 깨졌다"는 말의 실물을 봤다),
연습 2는 표본이 적으면 답이 뒤집힌다는 것을 숫자로 확인했으며,
연습 3은 gof의 절반은 읽을 가치가 없고, 나머지 절반이 전부라는 것을 확인했다.
셋 다 "결과를 믿기 전에 과정을 본다"는 같은 습관을 가리킨다.
오늘까지 5장의 도구가 다 갖춰졌다. 항을 고르는 법(5-2~5-5), 퇴화를 피하는 법(5-6), 추정을 믿는 법과 채점하는 법(5-7). 5-8에서는 이것을 전부 써서 FMH(1461명) 종합 모형을 처음부터 끝까지 만든다 — 항을 하나씩 넣으며 AIC와 gof를 함께 보고, 진단으로 걸러 내고, 최종 해석까지. 그리고 QAP 로지스틱 회귀(
netlogit)를 붙여
"ERGM이 아닌 다른 길로 갔을 때 결론이 같은가"를 대조한다.
오늘 정직하게 실패로 남긴 차수 분포가 거기서 다시 주인공이 된다.