Skip to content

Latest commit

 

History

History
372 lines (289 loc) · 19.2 KB

README.md

File metadata and controls

372 lines (289 loc) · 19.2 KB

뎅기열 / 중증 뎅기 (Dengue Shock Syndrome) — QSP 모델

Dengue · Severe Dengue · DSS — one antibody response, two channels of opposite sign

Dengue QSP mechanistic map


이 모델의 출발점 (The one idea)

뎅기는 하나의 항체 반응을 부호가 반대인 두 경로로 읽는 병으로 기술했다.

무엇이 일어나는가 관찰되는 것
경로 1 (보호) 중화 IgG가 비리온을 제거 → 바이러스혈증 ↓ → 인터페론 ↓ 해열
경로 2 (파괴) 같은 IgG가 NS1·비리온과 결합 → 면역복합체 → 보체·비만세포 chymase·교차반응 T세포 TNF → 내피 글리코칼릭스 박리 → 반사계수 σ 하락 혈장 누출

두 경로가 같은 구동변수를 공유하므로 "열이 떨어지고 나서 환자가 나빠진다"는 것은 두 개의 사건이 아니라 한 사건을 두 번 본 것이며, 24–48시간의 위험기(critical phase)는 항체 상승의 폭 그 자체다.

모델 안에서 체온은 인터페론 → 시상하부 PGE₂ 로만 계산되고, 누출은 NS1·TNF·VEGF·chymase → 글리코칼릭스 로만 계산된다. 항체 상승 이후 두 사슬은 어떤 방정식도 공유하지 않는다. 그런데도 최저 맥압은 해열보다 21.5시간 앞서고 헤마토크릿 정점은 20.5시간 앞선다 — 하루 안이다. 이것이 이 모델의 중심 주장이며, 규칙이 아니라 계산 결과다.

두 번째 축은 누출은 오직 쇼크를 통해서만 스스로 멈춘다는 것이다.

J = Kf · [ (Pc − Pi) − σ·(Πp − Πi) ]

σ가 떨어졌을 때 여과를 멈출 만큼 빠르게 내려갈 수 있는 항은 Pc 하나뿐이고, Pc는 그것을 먹여 살리던 혈장량이 사라졌기 때문에 내려간다. 그래서 수액소생술은 누출을 다시 켜는 방식으로 관류를 회복시키며, 수액 용량-반응은 단조가 아니라 내부 최적점을 갖는 U자가 된다.


구성 파일

파일 내용
denv_qsp_model.dot · .svg · .png 기계론적 지도 — 129 노드 · 17 클러스터 · 225 엣지
denv_mrgsolve_model.R mrgsolve QSP 모델 — 45 ODE, 18개 치료 시나리오, WHO 수액 사다리
denv_reference_model.py 독립 Python/scipy 재구현 (검증용)
denv_reference_output.txt 위 스크립트의 전체 출력 — 아래 모든 숫자의 출처
denv_scenario_results.json 시나리오·스윕 결과 (기계 판독용)
denv_shiny_app.R Shiny 대시보드 — 10개 탭
denv_references.md 121개 PubMed 링크, 14개 섹션

검증 방법 (How this was checked)

mrgsolve 모델의 45개 ODE를 코드 번역이 아니라 적어 놓은 방정식으로부터 Python/scipy로 다시 구현하고 LSODA로 풀었다. 이 재구현이 초기 원고의 결함 다섯 가지를 드러냈고, 모두 수정했다.

  1. Landis–Pappenheimer 교질삼투압 식을 알부민 농도에 적용했다. 이 식은 총단백 용이다. 그 결과 기저 순여과압이 1.5 mmHg가 아니라 13 mmHg가 되어 건강한 사람이 시간당 5 L를 누출했고, 하류의 모든 숫자가 무의미해졌다.
  2. 식욕부진 항이 실행 기간 동안 15 L를 배출하고 있었다. 혈장량 감소가 모세혈관 누출이 아니라 탈수에서 나오고 있었으므로, 병태생리가 통째로 가짜였다. 기저 섭취/배설을 균형시키고 ANOREX를 0.42 → 0.12로 낮췄다.
  3. 삼출액이 쌓일 수 있는 구획이 없었다. 전신 간질은 림프가 보호하므로 (140 → 1100 mL/h) 흉수·복수가 생기지 않았다. 실제로 삼출액이 쌓이는 이유는 벽측 흉막 림프의 흡수 한계가 ~0.65 mL/kg/h로 전신 림프의 1/100이기 때문이다 (Miserocchi 1997). 자체 압력-용적 관계와 배액 상한을 가진 두 번째 Starling 구획을 넣었다.
  4. Kf를 손으로 정한 뒤 모세혈관전/후 저항비를 바꿨다. 기저가 어긋나 감염되지 않은 사람이 시간당 +52 mL를 누출했다. 이제 calibrate()가 "감염되지 않은 숙주는 정지 상태여야 한다"는 조건에서 Kf와 Kfs를 유도한다 (Kf = 91.77, Kfs = 13.89 mL/h/mmHg — 자유 파라미터가 아니다).
  5. 일차 감염이 만성화됐다. 자가 항체가 중간 역가에 머물며 스스로를 증강시켰기 때문이다. 동종형 IgG의 4차 구조 에피토프 결합력 우위 (AVIDN = 3, de Alwis 2012)를 넣자 회복기 재발이 사라졌다.

기저 자가검정 (감염 없는 숙주, 14일): ΔVp +1.9 mL · ΔVi −33.8 mL · ΔTP +0.004 g/dL · ΔHct −0.016 % · ΔMAP +0.012 mmHg. 정지 상태다.


핵심 결과 (모두 solver 출력, 주장이 아님)

1. 증강 곡선이 종 모양인 것은 그것이 곱이기 때문이다

같은 항체 풀에서 두 개의 점유율을 읽는다. 중화는 다중 결합이 필요해 가파른 Hill 함수이고, 옵소닌화는 비리온당 IgG 하나면 FcγR에 걸리므로 빠르게 포화한다.

E(A) = (1 − N) · [ 1 + (Φ−1)·A/(A+K) ]
       ↑ 떨어지는 Hill    ↑ 올라가며 포화

떨어지는 항 × 올라가며 포화하는 항 = 종 모양. 가정한 것이 아니라 나온 것이다.

역가 1:0 1:20 1:40 1:57 1:80 1:320 1:696 1:1280 1:2560
E 1.00 11.81 12.69 12.83 (정점) 12.65 4.85 1.00 0.231 0.042

Salje 2018 (Nature 557:719) 은 코호트에서 1:21–1:80에서 위험 상승, 1:1280 초과에서 보호를 측정했다. 모델의 정점은 1:57, 보호 전환점은 1:696이다.

2. 영아 뎅기의 최대 중증도 연령은 나눗셈 문제다

모체 IgG는 제대혈 역가 1:1280에서 반감기 43일로 감소한다. 최대 증강 역가 1:57까지 내려가는 데 필요한 반감기 횟수는 log₂(1280/57) = 4.49.

4.49 × 43일 = 193일 = 6.3개월 관찰된 영아 DHF 발생 정점: 6–8개월 (Kliks 1988; Chau 2009)

입력은 제대혈 역가와 IgG 반감기 두 개뿐이며, 영아 데이터는 모델에 전혀 들어가지 않았다.

3. 헤마토크릿 20 % 상승은 이미 800 mL가 사라졌다는 뜻이다

값
기저 Hct (적혈구 2000 mL, 혈장 2800 mL) 41.7 %
WHO 혈액농축 기준 (+20 %) 50.0 %
그 Hct에서의 혈장량 2000 mL
이미 소실된 혈장 800 mL = 구획의 28.6 %

기준이 늦게 울리는 이유이자, 이미 수액을 준 환자에서 이 기준이 지워지는 이유다.

4. σ가 곧 병이다 — 병변별 절제(lesion-by-lesion)

변형 혈장 소실 % 최저 총단백 최저 맥압 삼출액 mL 중증도
전체 모델 30.6 5.21 10.8 1825 0.372
σ를 0.97로 고정 6.6 6.94 30.7 77 0.091
Kf를 기저로 고정 27.6 5.15 14.8 1768 0.262
단백 체질 제거 (PS=0) 31.3 5.86 10.3 1420 0.337
장막 배액 무제한 28.8 5.29 13.3 1128 0.261
압수용체반사 제거 29.8 5.51 9.7 1117 0.661

σ를 고정하면 병이 사라지고, Kf를 고정해도 거의 그대로다. 투과성은 곁가지이고 체질(sieving)이 병이다. 압수용체반사를 끄면 삼출액은 줄고 중증도는 두 배가 된다 — 혈관수축이 Pc를 낮춰 누출을 막는 대신 관류를 희생하기 때문이다.

5. 일차 vs 이차 — 같은 바이러스, 같은 숙주, 역가 하나 차이

일차 (naive) 이차 (1:55) 비
최고 바이러스혈증 (log₁₀) 7.56 7.86 1.04
최고 NS1 (ng/mL) 432 643 1.49
최고 중화 IgG (역가) 182 620 3.40
최고 TNF-α (pg/mL) 27.7 181 6.55
최고 chymase (ng/mL) 7.8 15.5 2.00
글리코칼릭스 최저 0.70 0.24 0.35
최저 σ 0.81 0.62 0.76
Hct 상승 % 13.2 21.7 1.65
혈장 소실 % 20.0 30.6 1.53
최저 총단백 (g/dL) 6.77 5.21 0.77
최저 맥압 (mmHg) 24.6 10.8 0.44
삼출액 (mL) 480 1825 3.80
최저 혈소판 (×10⁹/L) 77 32 0.42
최고 AST (U/L) 135 556 4.12
최고 젖산 (mmol/L) 1.03 4.35 4.23
WHO 경고징후 수 2 6 3.00

최고 바이러스혈증 차이는 0.3 log에 불과하다 — 두 경우 모두 같은 표적세포 풀을 소진하기 때문이다. 차이는 바이러스 부하가 아니라 면역병리에서 온다. (다만 질병 0.5일째 이차 감염의 바이러스혈증은 일차의 약 70배다 — Duyen 2011과 일치.)

6. 수액 용량-반응은 내부 최적점을 갖는다

× WHO 사다리 정주량 mL 쇼크 시간 삼출액 mL 젖산 중증도
0 0 66.0 1825 4.35 0.372
0.25 1671 47.5 2031 2.50 0.289
0.50 3342 34.5 2188 1.63 0.254
0.75 5014 24.0 2293 1.14 0.249
1.00 6685 15.0 2359 1.09 0.249
1.50 10028 4.5 2456 1.09 0.256
2.00 13370 4.5 2561 1.09 0.269
3.00 20055 4.5 2737 1.09 0.297

곡선이 U자인 이유는 crystalloid가 Pc를 올리고 동시에 Πp를 희석하며, 두 항이 모두 J를 증가시키기 때문이다. 최적점(0.75×, 약 5.0 L)이 WHO 사다리 부근에 떨어진다는 것은 실제 환자에서 조정된 프로토콜에 대한 독립적인 확인이다.

소생 효율은 3배 무너진다: σ = 0.97에서는 혈장 1 mL를 남기는 데 crystalloid 5.5 mL면 되지만, 누출 최저점에서는 16.2 mL, 3× 사다리에서는 29.7 mL가 든다.

7. 항바이러스제의 창은 환자가 병원에 오기 전에 닫힌다

투여 시작 (열 발생 후) NS1 노출적분 (% 무치료) 쇼크 시간 이득 %
0 h 6.2 0.0 25.0
12 h 30.5 0.0 20.6
24 h 83.6 7.0 6.2
36 h 98.5 14.0 1.4
48 h 99.9 15.0 0.2
≥ 60 h 100.0 15.0 0.0

24시간이면 NS1 노출적분의 84 %가 이미 지출된 뒤다. balapiravir는 발열 후 72시간 이내, celgosivir는 48시간 이내 등록했고 둘 다 음성이었다. 모델은 그 실패를 약효가 아니라 적분의 산술로 설명한다.

코르티코스테로이드도 같은 절벽을 갖는다. 발열 시점 투여는 중증도를 0.249 → 0.195로 낮추지만 바이러스 제거를 늦춰 NS1 노출적분을 15.6k → 21.1k로 올린다. 72시간 투여의 가치는 5 %다 — Tam 2012는 72시간 이내 등록해서 아무것도 찾지 못했다.

8. 예방적 혈소판 수혈은 혈소판 수만 올리고 지혈은 올리지 않는다

지혈을 네 가지 요건의 곱으로 적었다 — 혈소판 수 × 피브리노겐 × 혈관벽 × 관류. 곱이므로 가장 나쁜 항이 답을 정한다.

무치료 3 pool 수혈
혈소판 최저 (×10⁹/L) 32 44 (+12)
출혈 지수 0.490 0.444
중증도 0.249 0.237

최저점에서 가장 나쁜 항은 혈관벽이고, 혈소판은 혈관벽이 아니다. AAPT (Lye 2017, Lancet 389:1611) 도 같은 결론에 도달했다 — 모델은 시험에 맞춘 것이 아니라 구조적 이유로 동의한다.

9. 콜로이드의 이득은 σ에 비례한다

누출 정도 최저 σ crystalloid 중증도 colloid 중증도 차이
중등도 0.656 0.195 0.179 −0.016
중증 0.616 0.249 0.222 −0.027
심각 0.594 0.292 0.262 −0.030

콜로이드가 더하는 교질삼투압 항은 Starling 식에서 σ가 곱해진 채로 들어간다. Wills 2005 (NEJM 353:877) 은 512명 소아에서 전체적 차이는 없고 맥압이 가장 좁은 층에서만 콜로이드 이득을 발견했다. 모델은 그 패턴을 지시받지 않고 재현한다.

10. 감염 전 역가 → 결과 (모델의 출력, 입력이 아님)

모든 숙주에게 같은 모기 접종량을 주고 항체 역가만 바꿨다 (이 스윕만은 접종 시점부터 실행한다 — 보호된 숙주는 애초에 감염되지 않을 자유가 있어야 하기 때문이다).

역가 E 최고 V (log₁₀) Hct+% 최저 맥압 최저 혈소판 중증도
naive 1.00 7.58 14.3 23.6 79 0.002
1:20 11.81 7.83 22.2 9.9 32 0.399
1:55 12.83 7.84 22.2 10.0 32 0.394
1:160 10.31 7.60 21.9 10.6 34 0.376
1:320 4.85 6.94 19.9 13.8 40 0.287
1:640 1.21 5.44 13.3 23.3 72 0.072
1:1280 0.23 4.33 0.3 37.1 250 0.000
≥1:2560 ≤0.04 1.70 0.3 37.1 250 0.000

이 한 곡선에서 세 가지가 따라 나온다: DHF가 두 번째 감염의 병인 이유, 영아 뎅기의 연령 분포, 그리고 백신은 새로운 기전이 아니라 역가를 설정하는 장치일 뿐이므로 접종 전 혈청상태 검사가 산술적으로 강제된다는 것 (Sridhar 2018; WHO 2018 position paper).


18개 시나리오

# 시나리오 Hct+% 최저 PP 쇼크 h 최저 PLT 삼출액 mL 젖산 AST 중증도
S01 일차 감염 (naive) 13.2 24.6 0.0 77 480 1.03 135 0.001
S02 이차 감염, 무치료 21.7 10.8 66.0 32 1825 4.35 556 0.372
S03 이차 + WHO 수액 17.0 17.3 15.0 32 2359 1.09 184 0.249
S04 과소 소생 (50 %) 17.7 16.6 34.5 32 2188 1.63 258 0.254
S05 과다 소생 (200 %) 17.0 17.3 4.5 32 2561 1.09 176 0.269
S06 콜로이드 구조요법 17.0 17.3 4.5 32 2306 1.09 176 0.222
S07 알부민 구조요법 17.0 17.3 18.5 32 2132 1.09 187 0.226
S08 예방적 혈소판 수혈 17.0 17.3 15.0 44 2359 1.09 184 0.237
S09 스테로이드 (내원 시점) 17.0 17.3 7.5 35 2346 1.09 176 0.223
S09b 스테로이드 (발열 시점) 13.1 22.2 0.0 35 2320 1.04 193 0.195
S10 항바이러스제 48 h 17.0 17.3 15.0 32 2359 1.09 184 0.249
S11 항바이러스제 내원 시점 17.0 17.3 15.0 33 2359 1.09 184 0.249
S12 백신 접종 혈청음성자 21.7 10.8 66.0 32 1825 4.37 558 0.373
S13 백신 접종 혈청양성자 6.3 31.0 0.0 130 566 1.00 25 0.001
S14 삼차 감염 (고역가) 6.4 31.0 0.0 129 581 1.00 25 0.001
S15 고용량 파라세타몰 17.0 17.3 15.0 32 2361 1.09 184 0.249
S16 항-NS1 단클론항체 15.1 19.6 1.0 38 2348 1.05 170 0.212
S17 조기 경구 수분보충 13.1 22.3 0.0 32 2533 1.05 170 0.251
S18 내원 8시간 지연 19.9 13.4 27.0 32 2366 2.24 269 0.286

S12 = S02: CYD-TDV를 맞은 혈청음성자는 자연 이차 감염과 구별되지 않는다. 백신이 새로운 기전을 만드는 것이 아니라 역가를 증강 구간에 놓기 때문이다. 같은 백신이 S13에서는 역가를 1:696 위로 밀어 올려 보호한다.

내원 시점(t = 48 h)은 손으로 고른 시각이 아니다. 무치료 이차 감염 경과에서 모델 자신이 WHO 경고징후 3개를 처음 만족하는 순간이다.


모델 구조

45개 ODE, 17개 기능 블록:

블록 상태변수
바이러스학 표적세포 · eclipse · 생산성 감염세포 · 바이러스혈증 · NS1
항체 기존 이형 IgG · 신생 중화 IgG · 형질모세포 · 항체분비세포
세포면역 활성 CD8 T세포
매개체 I형 IFN · TNF-α · IL-10 · VEGF-A · 비만세포 chymase
내피 글리코칼릭스 · 수리전도도 배수
체액 (전신) 혈장량 · 간질량 · 혈장단백 · 간질단백
체액 (장막) 흉수·복수량
혈액학 적혈구량 · 혈소판 · 거핵구 용량 · 항혈소판항체 · 피브리노겐 · 백혈구
간 생존 간세포분율 · AST · ALT
체온 시상하부 PGE₂ · 심부체온
순환 SVR 배수 · 심박수 · 젖산
약물 콜로이드 · 항바이러스제 depot/혈장 · 파라세타몰 · 메틸프레드니솔론
적분 누적 수액 in/out · NS1 노출 · 면역복합체 노출

자유롭지 않은 파라미터들. Guyton의 교과서 값 (Pc 17.3, Pi −3.0, Πp 27.4, Πi 8.0 mmHg, 기저 림프류 140 mL/h)을 넣으면 두 여과계수는 선택의 대상이 아니다: calibrate()가 "감염되지 않은 숙주는 정지해 있어야 한다"는 조건에서 Kf = 91.77, Kfs = 13.89 mL/h/mmHg를 유도한다.


실행

library(mrgsolve); library(dplyr); library(ggplot2)
mod <- mread("denv_mrgsolve_model.R")

# 이차 감염, 무치료
out <- mod |> param(ABH0 = 55) |> mrgsim(end = 336, delta = 0.5)
plot(out, LOG10V + NS1 + SIGMA + Hct + PP + EFFUS + PLT + TEMP ~ time/24)

# 대시보드
shiny::runApp("denv_shiny_app.R")
# 독립 검증 재실행 (numpy + scipy 필요)
python3 denv_reference_model.py

이 모델이 하지 않는 것

  • 혈청형을 구분하지 않는다. DENV-1~4는 복제 적합도와 교차반응 구조가 다르지만 모델은 스칼라 역가 하나와 FCROSS 하나만 갖는다. 어떤 혈청형 순서가 가장 나쁜지는 말할 수 없다.
  • 잠복기를 다루지 않는다. t = 0은 발열 시점이다. 모든 시나리오가 같은 바이러스혈증에서 출발하므로 항체 상태만이 유일한 차이다. 역가 스윕만 접종 시점부터 실행한다.
  • 연령을 다루지 않는다. 소아는 같은 매개체 부하에서 성인보다 많이 누출한다 (Gamble 2000). 이 모델은 70 kg 성인 기준이다.
  • 누출의 공간적 이질성을 다루지 않는다. 흉막강과 복강을 단일 구획과 단일 유순도로 묶었다.
  • 응고 캐스케이드가 없다. 피브리노겐은 상태변수 하나이며 트롬빈, protein C 축, 섬유소용해가 없다.

가장 노출된 예측

σ가 0.97로 고정되면 중증도가 0.372 → 0.091로 떨어진다는 것은 이 모델에서 가장 강한 단일 주장이다. 사람에서 반사계수를 직접 측정할 방법이 없으므로, syndecan-1과 hyaluronan 탈락 지표를 σ의 대리로 쓴 것에 전적으로 의존한다. Suwarto 2017이 그 대리를 뒷받침하지만 정량적 사상(mapping)은 이 모델의 것이며 독립 검증을 받지 않았다.


⚠️ 면책

교육·연구 목적의 정성적·반정량적 QSP 모델입니다. 공개 문헌과 임상시험 데이터로 구성했으나 독립적으로 검증·인증되지 않았으며 실제 임상 의사결정, 처방, 또는 규제 제출에 사용해서는 안 됩니다.