<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog |</title><link>https://chaeniverse.github.io/blog/</link><atom:link href="https://chaeniverse.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><description>Blog</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 26 Aug 2025 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Blog</title><link>https://chaeniverse.github.io/blog/</link></image><item><title>Causal Inference: PSM, IPTW, CCW, Target Trial Emulation</title><link>https://chaeniverse.github.io/blog/causal-inference/</link><pubDate>Tue, 26 Aug 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/causal-inference/</guid><description>&lt;h2 id="왜-인과추론이-필요한가"&gt;왜 인과추론이 필요한가&lt;/h2&gt;
&lt;p&gt;후향적 연구 (registry data, 건강보험·심평원 청구 데이터 등) 는 RCT처럼 미리 정의된 조건으로 데이터를 수집한 게 아니다. &lt;strong&gt;bias가 존재할 수밖에 없다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;예) 새로운 약 효과를 보기 위해 두 그룹 (약 먹은 vs 안 먹은) 비교.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;임상시험&lt;/strong&gt;: randomization으로 baseline 통제 → 순수한 약 효과 (causal effect).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;후향적 연구&lt;/strong&gt;: 이미 모인 데이터 → 두 그룹의 baseline이 다를 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ &lt;strong&gt;요는, 후향적 연구를 통계 기법으로 최대한 임상시험처럼 셋팅하는 것.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="카운터팩추얼-프레임"&gt;카운터팩추얼 프레임&lt;/h2&gt;
&lt;p&gt;각 개인에게 두 개의 잠재적 결과가 있다고 가정:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Y^{a=1}$ : &amp;ldquo;&lt;strong&gt;약을 먹었다면&lt;/strong&gt;&amp;rdquo; 의 결과&lt;/li&gt;
&lt;li&gt;$Y^{a=0}$ : &amp;ldquo;&lt;strong&gt;약을 먹지 않았다면&lt;/strong&gt;&amp;rdquo; 의 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;진짜 인과효과는 $E[Y^{a=1}] - E[Y^{a=0}]$ — &lt;strong&gt;평행세계의 약 먹은 나 vs. 평행세계의 약 안 먹은 나&lt;/strong&gt; 의 차이.&lt;/p&gt;
&lt;p&gt;문제: 한 사람에게 한쪽만 관측됨. 그래서&lt;/p&gt;
$$E[Y^{a=1}] = E[Y \mid A=1] \quad \text{(?)}$$&lt;p&gt;&lt;strong&gt;이 등식이 성립하려면 가정이 필요하다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="조건부-독립-strongly-ignorable-assignment"&gt;조건부 독립 (Strongly Ignorable Assignment)&lt;/h3&gt;
$$Y^a \perp A \mid X$$
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;모든 confounder $X$ 가 주어졌을 때, 잠재적 결과 $Y^a$ 와 treatment 배정 $A$ 가 독립&lt;/strong&gt;이라는 가정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이게 성립하면&lt;/p&gt;
$$E[Y^{a=1}] = E[Y \mid A=1, X = x_0] \cdot \text{(for any specific } x_0\text{)}$$&lt;p&gt;그리고 marginalization으로&lt;/p&gt;
$$E[Y^{a=1}] = \sum_x E[Y \mid A=1, X=x]\, P(X=x)$$&lt;p&gt;즉, &lt;strong&gt;공변량 $X$ 가 충분히 주어지면 인과효과를 추정할 수 있다.&lt;/strong&gt; 이 marginalization을 통계 기법으로 풀어내는 게 &lt;strong&gt;PS / IPTW&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="ate-vs-att--무엇을-추정할-것인가"&gt;ATE vs ATT — 무엇을 추정할 것인가&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;추정량&lt;/th&gt;
&lt;th&gt;정의&lt;/th&gt;
&lt;th&gt;누가 쓰나&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ATE&lt;/strong&gt; (Average Treatment Effect)&lt;/td&gt;
&lt;td&gt;$E[Y^{a=1}] - E[Y^{a=0}]$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IPTW&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ATT&lt;/strong&gt; (Average Treatment effect on the Treated)&lt;/td&gt;
&lt;td&gt;$E[Y^{a=1} - Y^{a=0} \mid A=1]$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PSM (matching)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;매칭은 treated 군에 untreated 자료를 짝지어 가져오므로, &lt;strong&gt;treated 군에 한정된 효과&lt;/strong&gt;만 정확히 본다 → ATT.&lt;/p&gt;
&lt;p&gt;ATT의 해석은 까다롭다 — 일반적으로 &lt;strong&gt;정책 평가&lt;/strong&gt;처럼 &amp;ldquo;정책 시행군 전체에 대한 효과&amp;quot;를 보고 싶을 때 사용된다 (정책 시행 후엔 모두가 시행군이라 ATT가 자연스러움).&lt;/p&gt;
&lt;p&gt;IPTW는 전체 모집단에 대한 효과 (ATE) 를 직접 추정 → &lt;strong&gt;인과효과로 해석하기 가장 쉽다&lt;/strong&gt;. 최근 임상연구의 흐름은 매칭보다 &lt;strong&gt;IPTW로 점점 이동&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="기존-회귀adjusted-vs-인과추론"&gt;기존 회귀(Adjusted) vs 인과추론&lt;/h2&gt;
&lt;p&gt;회귀모형에 그냥 공변량을 다 넣어 보정하는 흔한 방법:&lt;/p&gt;
$$\text{lm}(y \sim a + x)$$&lt;p&gt;이때 회귀 계수는&lt;/p&gt;
$$E[Y \mid A=1, X] - E[Y \mid A=0, X]$$&lt;p&gt;이고, 보고 표기는 &lt;strong&gt;Adjusted risk ratio / Adjusted HR&lt;/strong&gt; 등.&lt;/p&gt;
&lt;p&gt;문제점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공변량 $X$ 가 &lt;strong&gt;conditioning 된 상태에서의 효과&lt;/strong&gt; — &amp;ldquo;성별·연령이 고정된 채 약 변수만 1 증가했을 때 효과&amp;rdquo; 라는 의미.&lt;/li&gt;
&lt;li&gt;진짜 약효 (marginal causal effect) 와 해석이 다름.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;용어 구분:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conditional model&lt;/strong&gt; — 공변량을 모형 안에 넣어 보정 (회귀의 표준)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marginal model&lt;/strong&gt; — weight를 주어 보정 (IPTW + univariate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 임상 논문 읽을 때 conditional/marginal HR 구분이 중요.&lt;/p&gt;
&lt;h2 id="crude-vs-causal"&gt;Crude vs Causal&lt;/h2&gt;
&lt;p&gt;매칭 후 단순 비교:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matched_df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ 매칭으로 균형이 맞춰졌으니 결과는 단순 crude HR이 아니라 &lt;strong&gt;causal HR&lt;/strong&gt; 로 부를 수 있다.&lt;/p&gt;
&lt;p&gt;매칭 안 한 raw 비교는 &lt;strong&gt;crude HR&lt;/strong&gt;. 이 둘을 구분해서 보고하는 게 좋다.&lt;/p&gt;
&lt;h2 id="propensity-score-matching-psm"&gt;Propensity Score Matching (PSM)&lt;/h2&gt;
&lt;p&gt;공변량이 비슷한 사람끼리 두 그룹 간 짝지어 분석.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;propensity score&lt;/strong&gt; $P(A=1 \mid X)$ 를 logistic regression으로 추정.&lt;/li&gt;
&lt;li&gt;점수가 비슷한 treated/untreated 짝을 매칭.&lt;/li&gt;
&lt;li&gt;모든 case가 1:1로 맞춰진 후엔 단순 비교 (&lt;code&gt;coxph(Y ~ A)&lt;/code&gt;) 가 곧 인과 효과 추정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$n$ 수가 줄어든다 (짝 안 맞는 케이스 제거).&lt;/li&gt;
&lt;li&gt;매칭 결과 자체가 진짜 causal effect인지 약간 애매할 수 있음 (causal risk difference).&lt;/li&gt;
&lt;li&gt;treated 기준이라 ATT 추정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;임상 국룰&lt;/strong&gt;: greedy matching (1:1 nearest matching) + caliper.&lt;/p&gt;
&lt;h2 id="iptw-inverse-probability-of-treatment-weighting"&gt;IPTW (Inverse Probability of Treatment Weighting)&lt;/h2&gt;
&lt;p&gt;매칭의 반대. 짝짓는 대신 &lt;strong&gt;weight를 주어&lt;/strong&gt; balance를 맞춘다.&lt;/p&gt;
&lt;p&gt;직관: 남자 3명, 여자 6명 → 남자에 weight 2를 주면 6:6. 이 weight 2 가 곧 $1/P(A=1 \mid X)$.&lt;/p&gt;
$$w_i = \frac{1}{P(A_i=1 \mid X_i)}$$&lt;p&gt;이 weight를 분석에 넣으면 &lt;strong&gt;단변량 회귀로도 인과효과&lt;/strong&gt;를 얻는다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;장점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$n$ 수 유지.&lt;/li&gt;
&lt;li&gt;ATE 직접 추정.&lt;/li&gt;
&lt;li&gt;인과효과 해석이 가장 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="weight의-직관"&gt;Weight의 직관&lt;/h3&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;ID 1번이 weight 2로 들어갔다 = 그 사람을 &lt;strong&gt;2명으로 복제&lt;/strong&gt;했다고 생각하면 됨.&lt;/p&gt;
&lt;p&gt;실제로 표본 수가 늘어나는 게 아니라 cox 점수에 weight를 곱하는 형태로 처리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;소수점 weight도 같은 직관.&lt;/p&gt;
&lt;h2 id="r-구현-흐름"&gt;R 구현 흐름&lt;/h2&gt;
&lt;p&gt;PSM도 IPTW도 출발점은 같다 — propensity score 추정:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;comorbidities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;binomial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;logit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;이 확률값으로 짝지으면 → &lt;strong&gt;PSM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이 확률의 역수를 weight로 쓰면 → &lt;strong&gt;IPTW&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stabilized-weight--truncation-실무-국룰"&gt;Stabilized Weight + Truncation (실무 국룰)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;stabilized 넣고 weight truncation까지 하는 건 국룰이다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="왜-stabilized"&gt;왜 stabilized?&lt;/h3&gt;
&lt;p&gt;극단적인 표본 비대칭에서 weight가 폭발한다. 예: 남자 3명, 여자 30만명 → 남자 weight가 십만 단위. &lt;code&gt;glm&lt;/code&gt;이 안 돌아가고, 운 나쁘게 그 3명 중에 사건이 몰리면 분석이 왜곡된다.&lt;/p&gt;
&lt;p&gt;해결: &lt;strong&gt;분자에 marginal probability&lt;/strong&gt; 를 곱해 weight를 안정화.&lt;/p&gt;
$$w_i^{\text{stab}} = \frac{P(A_i=a)}{P(A_i=a \mid X_i)}$$&lt;ul&gt;
&lt;li&gt;결과에 영향을 주지 않으면서 분산을 안정화.&lt;/li&gt;
&lt;li&gt;weight의 평균이 1 → &lt;strong&gt;표본 수가 유지된다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="왜-truncation"&gt;왜 truncation?&lt;/h3&gt;
&lt;p&gt;stabilized 후에도 극단적으로 큰 weight 케이스가 남는다. 다변량 공변량에서 특정 조합이 매우 드문 경우 (예: 20대 + 특정 질환 + 특정 약 동반).&lt;/p&gt;
&lt;p&gt;해결: &lt;strong&gt;99% percentile (또는 1% 양쪽 자르기)&lt;/strong&gt; 위 weight를 cap.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;weight 4의 99% percentile, 100%가 32라고 하면 → 32 같은 outlier를 4로 바꾼다. 99% 이상은 다 4 4 4 …&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;논문 인용은 &lt;strong&gt;Peter Austin&lt;/strong&gt; 의 stabilization / truncation 원논문이 보통.&lt;/p&gt;
&lt;p&gt;R에선 보통 함수로 묶음 (&lt;code&gt;get_sw(formula, data, trunc_cut = 0.01)&lt;/code&gt; 같은 형태).&lt;/p&gt;
&lt;h2 id="cbps-covariate-balancing-propensity-score"&gt;CBPS (Covariate Balancing Propensity Score)&lt;/h2&gt;
&lt;p&gt;기본 IPTW로 balance가 안 맞을 때, balance를 명시적으로 maximize하도록 PS를 추정하는 변종 (GMM 기반).&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;실무 의견: &amp;ldquo;&lt;strong&gt;거의 안 쓴다.&lt;/strong&gt;&amp;rdquo; JAMA 등 임상 저널 게재 사례가 적고, reviewer 설득이 까다롭다. 정책학에서는 종종 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;대신 우리는 &lt;strong&gt;interaction term을 하나씩 넣어가며&lt;/strong&gt; balance를 맞춘다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 기본&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# balance 안 맞으면&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1^2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;연속형 변수 제곱항, 변수 간 interaction을 시도해 SMD가 떨어질 때까지 조정.&lt;/p&gt;
&lt;h2 id="balance-check"&gt;Balance Check&lt;/h2&gt;
&lt;p&gt;매칭/가중 결과가 잘 맞았는지 확인하는 진단:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SMD (Standardized Mean Difference)&lt;/strong&gt; $&lt; 0.1$ — 균형 OK&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Love plot&lt;/strong&gt; — 변수별 SMD를 시각화 (matching/weighting 전·후 비교)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="robust-sandwich-estimator-매칭가중의-짝꿍"&gt;Robust Sandwich Estimator (매칭/가중의 짝꿍)&lt;/h2&gt;
&lt;p&gt;PSM, IPTW를 적용하면 신뢰구간이 인위적으로 줄어들어 &lt;strong&gt;p-value가 유의하게 잘못 나올 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;원래 분산 공식은 어떤 역행렬 가정에 기반함.&lt;/li&gt;
&lt;li&gt;weight를 쓰면 그 가정이 깨지므로 &lt;strong&gt;분산이 과소추정&lt;/strong&gt;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;해결: &lt;strong&gt;robust sandwich estimator&lt;/strong&gt; — 분산 식이 $I S I$ 모양 (한 항이 더 추가). 이름의 유래는 그 모양.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;매칭/가중 ↔ Robust estimator&lt;/strong&gt; 짝꿍처럼 기억.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;추가 분석에서 robust estimator로 바꿨다가 결과가 뒤집히는 사례가 있어 반드시 같이 써야 함.&lt;/p&gt;
&lt;h2 id="hr-vs-risk-difference-ratio"&gt;HR vs Risk Difference Ratio&lt;/h2&gt;
&lt;p&gt;전통적으로 생존분석은 hazard ratio (HR) 만 보고했지만, 최근 trend는 &lt;strong&gt;HR + risk difference / risk ratio&lt;/strong&gt; 를 같이 보는 것.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HR은 proportional hazard 가정에 의존 → 가정 위배 시 해석 위험.&lt;/li&gt;
&lt;li&gt;Risk Ratio는 cumulative incidence curve의 각 시점에서의 risk를 비교 → 가정 더 자유로움.&lt;/li&gt;
&lt;li&gt;Time-specific hazard는 시간에 따라 위험이 변하지만, proportional hazard ratio는 그 평균 한 값으로 보고 → &lt;strong&gt;해석 모호&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="immortal-time-bias"&gt;Immortal Time Bias&lt;/h2&gt;
&lt;p&gt;치료군 vs 비치료군 비교 시 &lt;strong&gt;index date를 어떻게 잡느냐&lt;/strong&gt; 가 핵심.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;치료군의 index date = 치료 시점 → 그 시점까지 사망하지 않은 사람만 치료군에 들어감.&lt;/li&gt;
&lt;li&gt;비치료군은 그런 비대칭이 없음.&lt;/li&gt;
&lt;li&gt;결과적으로 치료군에 &amp;ldquo;사망하지 않을 운명&amp;rdquo; 의 시간(immortal time)이 부여됨 → bias.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전통적 보정: &lt;strong&gt;landmark analysis&lt;/strong&gt; (landmark 이전 사망자 제외).&lt;/p&gt;
&lt;p&gt;문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전체 모집단이 아니라 &amp;ldquo;landmark까지 살아남은 사람&amp;rdquo; 만의 효과 → &lt;strong&gt;selection bias&lt;/strong&gt;, 해석 어려움.&lt;/li&gt;
&lt;li&gt;Time-varying Cox 등 보조 도구가 필요해짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clone-censor-weighting-ccw"&gt;Clone Censor Weighting (CCW)&lt;/h2&gt;
&lt;p&gt;최신 흐름. 한 사람을 &lt;strong&gt;양쪽 그룹에 복제&lt;/strong&gt;해 immortal time bias를 원천 제거한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A라는 사람이 90일째 treatment 받았다고 하자 → 그 사람은 90일까지 안 죽었다.&lt;/li&gt;
&lt;li&gt;Control 군에도 똑같은 가상의 사람을 0~90일까지 만든다.&lt;/li&gt;
&lt;li&gt;두 쪽이 동일한 0~90일을 가지므로 immortal time이 상쇄됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;장점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Landmark 없이 immortal time bias 해결.&lt;/li&gt;
&lt;li&gt;같은 사람을 만들기 때문에 covariate balance도 자동 해결.&lt;/li&gt;
&lt;li&gt;매칭/IPTW 없이도 분석 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;단점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloning된 자료 만드는 과정이 복잡 (경우의 수 많음).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CCW를 쓰면 IPCW (Inverse Probability of Censoring Weighting)&lt;/strong&gt; 가 필수 짝꿍.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="인과추론-방법-계층-trend"&gt;인과추론 방법 계층 (Trend)&lt;/h2&gt;
&lt;p&gt;분석의 중요도에 따라 방법이 점진적으로 강해진다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;가벼운 분석 매칭 (PSM)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IPTW
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;중요한 분석 CCW + IPCW
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Target Trial Emulation (전체 framework)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ 중요한 분석에서는 &amp;ldquo;&lt;strong&gt;우리는 모든 bias를 제거했다&lt;/strong&gt;&amp;rdquo; 라고 method에 기술할 수 있을 정도까지 간다.&lt;/p&gt;
&lt;h2 id="target-trial-emulation-tte"&gt;Target Trial Emulation (TTE)&lt;/h2&gt;
&lt;p&gt;상위 framework. 임상시험 protocol처럼 &lt;strong&gt;연구 설계 시 조작적 정의를 엄격하게 명시&lt;/strong&gt;하는 일련의 과정을 정형화. PRISMA가 메타분석 reporting을 정형화한 것처럼, TTE는 후향적 인과추론의 reporting/설계 standard.&lt;/p&gt;
&lt;p&gt;명시 항목:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eligibility criteria&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treatment strategies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignment procedure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outcome / Follow-up&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Causal contrast&lt;/strong&gt; (intention-to-treat / per-protocol)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Statistical analysis&lt;/strong&gt; plan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ TTE는 잘 구조화된 retrospective data 분석을 위한 framework. 위에서 다룬 PSM/IPTW/CCW를 &lt;strong&gt;어떻게 조합해 protocol을 설계할지&lt;/strong&gt;를 다룬다.&lt;/p&gt;
&lt;h2 id="요약"&gt;요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;인과추론의 출발점: &lt;strong&gt;카운터팩추얼 프레임 + 조건부 독립 가정&lt;/strong&gt; ($Y^a \perp A \mid X$)&lt;/li&gt;
&lt;li&gt;$X$ 를 통계 기법으로 처리하는 핵심 도구: &lt;strong&gt;PSM (ATT)&lt;/strong&gt; 과 &lt;strong&gt;IPTW (ATE)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IPTW는 &lt;strong&gt;stabilized + truncation&lt;/strong&gt; 가 실무 국룰&lt;/li&gt;
&lt;li&gt;매칭/가중 후엔 &lt;strong&gt;robust sandwich estimator&lt;/strong&gt; 필수 짝꿍&lt;/li&gt;
&lt;li&gt;모형 안에 공변량 → conditional, weight로 보정 → marginal&lt;/li&gt;
&lt;li&gt;Balance 진단: SMD &amp;lt; 0.1, love plot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immortal time bias&lt;/strong&gt; 는 landmark가 전통 해법, 최근엔 &lt;strong&gt;CCW (+ IPCW)&lt;/strong&gt; 가 부상&lt;/li&gt;
&lt;li&gt;전체를 framework로 정형화한 게 &lt;strong&gt;Target Trial Emulation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;임상 trend: HR 단독 → HR + Risk Difference / Risk Ratio&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Survival Analysis: Exposure Period, Immortal Time Bias, Fine-and-Gray</title><link>https://chaeniverse.github.io/blog/survival-analysis/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/survival-analysis/</guid><description>&lt;h2 id="ggsurvfit-survfit2-잠깐"&gt;ggsurvfit (&lt;code&gt;survfit2&lt;/code&gt;) 잠깐&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;survfit2()&lt;/code&gt; 는 survival curve를 깔끔하게 그려주는 함수로 &lt;strong&gt;&lt;code&gt;ggsurvfit&lt;/code&gt;&lt;/strong&gt; 패키지에 있다. base R &lt;code&gt;survfit()&lt;/code&gt; 결과를 ggplot 스타일로 변환.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ggsurvfit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;survfit2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;ggsurvfit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;add_confidence_interval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;add_risktable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="wash-out-기간"&gt;Wash-out 기간&lt;/h2&gt;
&lt;p&gt;중재/약물 연구에서 &lt;strong&gt;이전 치료의 잔여 효과가 몸에서 사라지도록 두는 기간&lt;/strong&gt;. 이 동안 참가자는 어떤 치료도 받지 않는다.&lt;/p&gt;
&lt;p&gt;예) 약물 A 효과 평가 후 같은 참가자에게 약물 B를 투여하기 전, A의 잔여 효과가 완전히 사라질 때까지 기다린다 → B 효과를 정확히 측정 가능.&lt;/p&gt;
&lt;h2 id="index-date를-어디로-잡을-것인가--exposure-period-문제"&gt;Index Date를 어디로 잡을 것인가 — Exposure Period 문제&lt;/h2&gt;
&lt;p&gt;후향적 약물 연구의 핵심 질문 중 하나: &lt;strong&gt;약 복용 시점을 index date로 잡을지, 진단일로 잡을지.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;팽이 비유: 팽이 던진 순간부터는 가만 둬야 한다. 그 이후에 행위(약 처방)를 추가하면 그게 time-varying cox이고, 결과 활용이 어려워서 잘 안 쓴다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="index-date--진단일로-잡으면"&gt;Index date = 진단일로 잡으면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;좋은 점: control 군의 index를 잡기 쉽다.&lt;/li&gt;
&lt;li&gt;문제: 복용군이 약을 &lt;strong&gt;언제&lt;/strong&gt; 먹었는지 모를 때 immortal time bias.
&lt;ul&gt;
&lt;li&gt;약을 1년 뒤에 먹은 사람 = &amp;ldquo;1년 동안 죽지 않았다&amp;rdquo; 는 정보가 미래에서 새는 셈.&lt;/li&gt;
&lt;li&gt;control 군은 그런 보장이 없다 → &lt;strong&gt;항상 약 먹은 사람이 더 오래 산다 (효과 좋음)&lt;/strong&gt; 로 잘못 나옴.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="index-date--약-복용일로-잡으면"&gt;Index date = 약 복용일로 잡으면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;control 군의 index를 잡을 수 없다 (약을 안 먹었으니까).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="가장-흔한-해결-landmark--exposure-period"&gt;가장 흔한 해결: Landmark + Exposure Period&lt;/h3&gt;
&lt;p&gt;진단일부터 일정 기간 (예: 1년, 2년) 을 &lt;strong&gt;exposure period&lt;/strong&gt; 로 정의:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;진단 시점부터 진단 + N년까지를 exposure 정의 구간&lt;/strong&gt; 으로 둔다.&lt;/li&gt;
&lt;li&gt;그 안에 약을 먹었으면 treatment, 아니면 control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분석 시작은 진단 + N년 시점부터&lt;/strong&gt; (이게 새 index date).&lt;/li&gt;
&lt;li&gt;분석엔 N년 이전 데이터는 버림.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;효과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treatment 군과 control 군이 &lt;strong&gt;같은 시점부터 추적 시작&lt;/strong&gt; → immortal time이 양쪽에 동일하게 작용해 상쇄.&lt;/li&gt;
&lt;li&gt;미래 정보 누설 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N년 사이에 사망한 사람은 분석에서 제거 → 표본 수 감소.&lt;/li&gt;
&lt;li&gt;N이 너무 길면 표본이 많이 빠진다.&lt;/li&gt;
&lt;li&gt;결과는 &amp;ldquo;진단 후 N년까지 살아남은 사람들&amp;rdquo; 에 한정된 효과.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="실무-팁"&gt;실무 팁&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;랜드마크 1년 vs 2년 vs 3년&lt;/strong&gt; 으로 표본 수와 결과를 비교해보고 합리적인 기간을 고른다.&lt;/li&gt;
&lt;li&gt;가능하면 &lt;strong&gt;진단 전에 먹은 것만&lt;/strong&gt; 분석하는 게 가장 깔끔 (statin 연구처럼).&lt;/li&gt;
&lt;li&gt;&amp;ldquo;약을 끊는 시점&amp;rdquo; 같이 &lt;strong&gt;미래 정보를 봐야 하는 분석&lt;/strong&gt;은 본질적으로 어렵다. 그래도 landmark로 어느 정도 우회 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="treatment-군-정의의-시점성"&gt;Treatment 군 정의의 시점성&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;팽이를 만드는 거랑 팽이를 치는 거랑 차이가 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;treatment 군 / control 군을 정할 때는 &lt;strong&gt;현재 기준&lt;/strong&gt; 으로 해야 한다.&lt;/li&gt;
&lt;li&gt;그냥 raw data로 &amp;ldquo;이 사람이 치료받은 사람이고 저 사람은 아니다&amp;rdquo; 라고 하면 사실상 &lt;strong&gt;미래를 본 거&lt;/strong&gt; (그 사람이 약을 먹은 게 미래라).&lt;/li&gt;
&lt;li&gt;그래서 landmark를 걸면 그 시점까지의 정보로 그룹을 정의 — &amp;ldquo;현재 기준&amp;rdquo; 이 됨 → 사기 X.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="competing-risk-regression-실무-코드"&gt;Competing Risk Regression (실무 코드)&lt;/h2&gt;
&lt;h3 id="cause-specific-hazard-model"&gt;Cause-Specific Hazard Model&lt;/h3&gt;
&lt;p&gt;특정 사망 (e.g., cancer death) 의 위험만 본다. 다른 event는 censoring 처리.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="bp"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# status == 1 만 event, 그 외(예: 사망)는 censor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fine-and-gray-sub-distribution-model"&gt;Fine-and-Gray Sub-Distribution Model&lt;/h3&gt;
&lt;p&gt;다른 event 발생 시 그 사람을 &lt;strong&gt;risk set에서 빼지 않고 무한대로 둔다.&lt;/strong&gt; Cumulative incidence와 1:1 대응.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmprsk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# crprep으로 weighted long-format data 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# (또는 직접 crr 사용)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fit.crr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;crr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ftime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;d.age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;cod2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cov1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;covs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;failcode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cencode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fit.crr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="두-모델-어떻게-다른가"&gt;두 모델 어떻게 다른가&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cause-specific&lt;/strong&gt; — 특정 원인 사망의 hazard rate를 추정. 다른 event는 censor 처리. 인과적 해석에 가깝지만, cumulative incidence plot과 직접 매칭되지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fine-and-Gray&lt;/strong&gt; — sub-distribution hazard. &lt;strong&gt;Cumulative incidence plot과 1:1 대응&lt;/strong&gt; → HR과 CI plot을 같이 보여주기 좋다. 임상에서 더 많이 쓰임.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;임상에서 cuminc plot과 HR을 함께 보여주려면 &lt;strong&gt;Fine-and-Gray&lt;/strong&gt; 가 자연스럽다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="fine-and-gray가-cuminc와-일치하는-이유-간단-설명"&gt;Fine-and-Gray가 cuminc와 일치하는 이유 (간단 설명)&lt;/h2&gt;
&lt;p&gt;Fine-and-Gray model의 핵심은 &lt;strong&gt;다른 event가 일어난 사람도 끝까지 본다&lt;/strong&gt;는 것 — 사망 시점에서 끊지 않고 연구 종료일까지 추적한다고 본다.&lt;/p&gt;
&lt;p&gt;다만 &amp;ldquo;언제까지 볼지&amp;rdquo; 가 애매하므로 &lt;strong&gt;시간이 멀어질수록 weight를 작게&lt;/strong&gt; 준다. 이렇게 &lt;strong&gt;stabilized censoring weight&lt;/strong&gt;를 곱한 long-format 데이터를 만들면, &lt;code&gt;survfit + ggsurvplot&lt;/code&gt; 로 그린 cumulative incidence plot이 &lt;code&gt;cmprsk::cuminc&lt;/code&gt; / &lt;code&gt;prodlim::Hist&lt;/code&gt; 결과와 정확히 일치한다.&lt;/p&gt;
&lt;p&gt;→ Geskus 가 증명한 결과. R에서는 &lt;code&gt;cmprsk::crprep()&lt;/code&gt; 함수가 이 long-format 데이터를 만들어준다.&lt;/p&gt;
&lt;h2 id="matching-with-matchit"&gt;Matching with &lt;code&gt;MatchIt&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MatchIt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m.out&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;matchit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;comorbidities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;nearest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;caliper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m.data&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;match.data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m.out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m.data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;method = &amp;quot;full&amp;quot;&lt;/code&gt; 을 주면 optimal full matching이 자동으로 적용됨.&lt;/p&gt;
&lt;h3 id="greedy-vs-full-matching"&gt;Greedy vs Full Matching&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Greedy (nearest, 1:1)&lt;/strong&gt; — 임상 국룰. 거리 가까운 짝부터 차례로 매칭. caliper로 정밀도 제어. 표본 손실 있음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full&lt;/strong&gt; — &lt;code&gt;optmatch&lt;/code&gt; 패키지 기반. 모든 케이스를 활용해 더 효율적이지만 해석/보고가 까다롭다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Index date 결정이 곧 immortal time bias 처리의 핵심.&lt;/strong&gt; Exposure period + landmark가 가장 흔한 실무 해법이고, competing risk가 있을 땐 Fine-and-Gray가 cumulative incidence plot과 1:1 대응해 가장 자주 쓰인다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="관련"&gt;관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;
&lt;/em&gt; (Austin, Statistics in Medicine)&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>머신러닝 분류 과제 수행 단계</title><link>https://chaeniverse.github.io/blog/ml-classification-workflow/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/ml-classification-workflow/</guid><description>&lt;p&gt;분류(classification) 머신러닝 프로젝트를 처음부터 끝까지 끌고 가본 경험을 정리한 워크플로 가이드. &lt;strong&gt;전처리 → 변수 선택 → 모델링 → 평가&lt;/strong&gt; 순서.&lt;/p&gt;
&lt;h2 id="전처리-단계"&gt;전처리 단계&lt;/h2&gt;
&lt;h3 id="1차-변수-탐색"&gt;1차 변수 탐색&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;범주형&lt;/strong&gt;: 2x2 table과 odds ratio로 변수 영향력 점검. odds ratio가 10 이상이거나 지나치게 낮으면 sensitivity/specificity 분포가 극단적으로 왜곡되므로 별도 검토.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연속형&lt;/strong&gt;: 기초 통계량 (mean, sd 등) 과 histogram으로 영향력 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2차-변수-탐색-결측--다중공선성"&gt;2차 변수 탐색 (결측 + 다중공선성)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;결측치 처리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;결측률 &lt;strong&gt;40% 이상&lt;/strong&gt; 이면 변수의 설명력 부족으로 판단해 제거.&lt;/li&gt;
&lt;li&gt;나머지는 imputation:
&lt;ul&gt;
&lt;li&gt;연속형 → &lt;strong&gt;median&lt;/strong&gt; (mean보다 극단값 영향 덜 받음)&lt;/li&gt;
&lt;li&gt;범주형 → &lt;strong&gt;mode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Train set 통계량을 test set에도 동일 적용 (leakage 방지).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;다중공선성 (VIF)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Imputation 후 연속형 변수 간 VIF 산출.&lt;/li&gt;
&lt;li&gt;VIF $\ge 10$ 인 변수는 한 번에 한 개씩 제거하며 추이 관찰. cutoff는 주관적이지만 10 초과면 제거 권장.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="범주형-변수-변환"&gt;범주형 변수 변환&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;One-hot encoding은 다중공선성 우려가 있으므로, 한 카테고리를 reference로 두는 &lt;strong&gt;dummy encoding&lt;/strong&gt; 사용.&lt;/li&gt;
&lt;li&gt;Reference 카테고리는 모든 컬럼에서 0인 행 → 최종 컬럼 수 = 카테고리 수 - 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="정규화--표준화"&gt;정규화 / 표준화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;연속형 변수 scale 차이가 크면 모델 설명력에 영향 → MinMaxScaler 또는 Standardization 적용.&lt;/li&gt;
&lt;li&gt;표준화 통계량 (mean, sd) 역시 &lt;strong&gt;train 기준으로 test에 동일 적용&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="변수-선택"&gt;변수 선택&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Feature가 많을수록 설명력은 ↑ but overfitting 위험 ↑.&lt;/li&gt;
&lt;li&gt;Hyperparameter 최적화 전에 변수 선택을 거친다.&lt;/li&gt;
&lt;li&gt;방법: &lt;strong&gt;RFE (Recursive Feature Elimination)&lt;/strong&gt; with &lt;strong&gt;5-fold stratified CV&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;평가 기준: &lt;strong&gt;AUROC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;RFE-CV 결과 그래프로 최적 feature 수 (예: 5개) 결정.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="모델링-단계"&gt;모델링 단계&lt;/h2&gt;
&lt;h3 id="데이터-분할"&gt;데이터 분할&lt;/h3&gt;
&lt;p&gt;전체 데이터를 &lt;strong&gt;3:1 stratified split&lt;/strong&gt; (train/test).&lt;/p&gt;
&lt;h3 id="하이퍼파라미터-탐색"&gt;하이퍼파라미터 탐색&lt;/h3&gt;
&lt;p&gt;Train 안에서 &lt;strong&gt;10-fold stratified CV&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;10-fold CV로 train/val 분할&lt;/li&gt;
&lt;li&gt;Train set 표준화 → 그 통계량으로 val set 표준화&lt;/li&gt;
&lt;li&gt;각 fold에서 성능 metric 계산 → 평균&lt;/li&gt;
&lt;li&gt;평균이 가장 높은 hyperparameter 조합 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;탐색 알고리즘: &lt;strong&gt;Bayesian optimization&lt;/strong&gt; (grid / random search보다 효율적).&lt;/p&gt;
&lt;h3 id="최종-학습--평가"&gt;최종 학습 + 평가&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;전체 train data 표준화&lt;/li&gt;
&lt;li&gt;위에서 찾은 best hyperparameter로 모델 fitting → 모델 $a$&lt;/li&gt;
&lt;li&gt;Train 통계량으로 test data 표준화 → 모델 $a$ 에 넣고 성능 metric 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="robustness--50회-반복"&gt;Robustness — 50회 반복&lt;/h3&gt;
&lt;p&gt;위 과정 (split → tuning → fit → test) 을 &lt;strong&gt;50번 반복&lt;/strong&gt;하고 metric의 평균을 최종 성능으로 보고. → subject selection bias를 줄이고 robustness 확보.&lt;/p&gt;
&lt;h2 id="모델-후보"&gt;모델 후보&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost&lt;/li&gt;
&lt;li&gt;Random Forest&lt;/li&gt;
&lt;li&gt;Support Vector Machine (SVM)&lt;/li&gt;
&lt;li&gt;Logistic Regression&lt;/li&gt;
&lt;li&gt;Multi-Layer Perceptron (MLP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="평가-지표"&gt;평가 지표&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Precision&lt;/li&gt;
&lt;li&gt;Recall (Sensitivity)&lt;/li&gt;
&lt;li&gt;F1-score&lt;/li&gt;
&lt;li&gt;AUC-ROC&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;p&gt;이 워크플로를 적용한 실제 프로젝트는
참고.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Logistic Regression</title><link>https://chaeniverse.github.io/blog/logistic-regression/</link><pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/logistic-regression/</guid><description>&lt;h2 id="logistic-regression-vs-linear-regression"&gt;Logistic Regression vs Linear Regression&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linear regression — &lt;strong&gt;닫힌 해 (closed-form solution)&lt;/strong&gt; 가 존재 (정규방정식)&lt;/li&gt;
&lt;li&gt;Logistic regression — 닫힌 해 없음. &lt;strong&gt;최적화 기법&lt;/strong&gt; 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;좋은 logistic regression 모델은 정답 클래스에는 높은 확률을, 오답 클래스에는 낮은 확률을 부여한다.&lt;/p&gt;
&lt;h2 id="likelihood-function"&gt;Likelihood Function&lt;/h2&gt;
&lt;p&gt;모델 성능을 &lt;strong&gt;likelihood&lt;/strong&gt; — &amp;ldquo;각 데이터 포인트가 정답 클래스로 분류될 확률을 모두 곱한 것&amp;rdquo; — 로 측정한다.&lt;/p&gt;
&lt;p&gt;문제: 확률값을 계속 곱하면 값이 0에 가까워져 수치적으로 불안정. → 로그를 취해 &lt;strong&gt;log-likelihood&lt;/strong&gt; 사용.&lt;/p&gt;
&lt;h2 id="maximum-likelihood-estimation-mle"&gt;Maximum Likelihood Estimation (MLE)&lt;/h2&gt;
$$\arg\max_\theta \mathcal{L}(\theta) \;=\; \arg\max_\theta \log \mathcal{L}(\theta) \;=\; \arg\min_\theta \big(-\log \mathcal{L}(\theta)\big)$$&lt;p&gt;데이터셋 likelihood를 최대화하는 계수 $\theta$ 를 찾는 것이 MLE. 실전에서는 보통 &lt;strong&gt;negative log-likelihood (NLL) 최소화&lt;/strong&gt; 형태로 푼다.&lt;/p&gt;
&lt;h2 id="gradient-descent"&gt;Gradient Descent&lt;/h2&gt;
&lt;p&gt;Logistic regression에는 닫힌 해가 없으므로 &lt;strong&gt;gradient descent&lt;/strong&gt; 로 반복 개선:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;가중치 $\theta$ 를 무작위로 초기화&lt;/li&gt;
&lt;li&gt;NLL의 gradient (1차 도함수) 계산&lt;/li&gt;
&lt;li&gt;Gradient의 반대 방향으로 step size $\alpha$ (learning rate) 만큼 이동&lt;/li&gt;
&lt;li&gt;수렴할 때까지 반복&lt;/li&gt;
&lt;/ol&gt;
$$\theta^{(t+1)} = \theta^{(t)} - \alpha \cdot \nabla_\theta \big(-\log \mathcal{L}(\theta^{(t)})\big)$$&lt;h2 id="예측-및-분류"&gt;예측 및 분류&lt;/h2&gt;
&lt;p&gt;학습된 계수로 새 데이터의 확률을 계산할 때 &lt;strong&gt;sigmoid 함수&lt;/strong&gt; 사용 — S자 곡선:&lt;/p&gt;
$$\sigma(z) = \frac{1}{1 + e^{-z}}, \qquad z = \theta^\top x$$&lt;p&gt;기본 cutoff threshold (보통 0.5) 를 적용해 확률을 이진 분류로 변환:&lt;/p&gt;
$$\hat{y} = \begin{cases} 1 &amp; \text{if } \sigma(\theta^\top x) \ge 0.5 \\ 0 &amp; \text{otherwise} \end{cases}$$&lt;p&gt;threshold는 도메인에 따라 (예: 의료에서 false negative 비용이 클 때) 0.3, 0.7 등으로 조절 가능.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>MLP (Multi-Layer Perceptron)</title><link>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</guid><description>&lt;h2 id="perceptron의-한계"&gt;Perceptron의 한계&lt;/h2&gt;
&lt;p&gt;단일 perceptron은 두 클래스를 분리하는 hyperplane을 만드는 &lt;strong&gt;선형 모델&lt;/strong&gt;. 변수 관계가 비선형이면 잡아내지 못한다 — 곡선 패턴이 더 적합한 복잡한 관계를 선형 회귀가 잡을 수 없는 것과 같은 한계.&lt;/p&gt;
&lt;h2 id="mlp-도입"&gt;MLP 도입&lt;/h2&gt;
&lt;p&gt;핵심 원리: &lt;strong&gt;여러 선을 결합해 복잡한 문제를 작은 부분 문제들로 분해&lt;/strong&gt;한다. 서로 다른 영역을 식별하는 여러 perceptron을 만들고 그 출력을 조합 → 비선형 결정 경계 형성.&lt;/p&gt;
&lt;p&gt;여러 hidden layer를 쌓으면 모델 복잡도가 증가하고 — 이게 바로 &lt;strong&gt;딥러닝 아키텍처의 시작&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="decision-boundary-비교"&gt;Decision Boundary 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;결정 경계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logistic regression&lt;/td&gt;
&lt;td&gt;선 1개, 임의 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision tree&lt;/td&gt;
&lt;td&gt;축에 수직인 여러 선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MLP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;선 개수와 방향 모두 자유롭게 조정 가능&lt;/strong&gt; (hidden layer / node 수로 복잡도 제어)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="기본-구조"&gt;기본 구조&lt;/h2&gt;
&lt;p&gt;각 input은 모든 hidden node에 서로 다른 가중치로 연결됨. Hidden node가 정보를 처리해 output node에서 집계.&lt;/p&gt;
&lt;p&gt;분류의 경우 output node 수 = 클래스 수. &lt;strong&gt;One-hot encoding&lt;/strong&gt; + &lt;strong&gt;softmax&lt;/strong&gt; 로 확률 분포 출력:&lt;/p&gt;
$$y_j = \frac{e^{z_j}}{\sum_{k=1}^{c} e^{z_k}}$$&lt;h2 id="hidden-node의-역할"&gt;Hidden Node의 역할&lt;/h2&gt;
&lt;p&gt;Hidden node 수 = &lt;strong&gt;네트워크의 복잡도&lt;/strong&gt;. 노드가 많을수록 더 정교한 결정 경계가 가능.&lt;/p&gt;
&lt;h2 id="xor-문제-다시-보기"&gt;XOR 문제 다시 보기&lt;/h2&gt;
&lt;p&gt;선형 분리가 불가능한 데이터를 hidden node를 통해 &lt;strong&gt;분리 가능한 공간으로 변환&lt;/strong&gt;한다. 중간 단계에서 선형 분리들을 만들고 결합하면, 원래는 분리 불가능했던 데이터셋도 분류 가능해진다.&lt;/p&gt;
&lt;h2 id="error-back-propagation"&gt;Error Back-Propagation&lt;/h2&gt;
&lt;p&gt;Gradient descent + backpropagation으로 가중치 업데이트.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output → Hidden 가중치&lt;/strong&gt;: 실제값과 예측값의 차이 × hidden node 값에 비례해 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input → Hidden 가중치&lt;/strong&gt;: 오차 크기와 input 값에 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="학습-종료--기타"&gt;학습 종료 / 기타&lt;/h2&gt;
&lt;p&gt;학습은 다음 조건에서 종료:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가중치 변화가 미미함&lt;/li&gt;
&lt;li&gt;Validation 오차가 임계값 아래로 떨어짐&lt;/li&gt;
&lt;li&gt;미리 정한 epoch 수 도달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overfitting 방지를 위한 메커니즘들이 존재 (dropout, regularization, early stopping 등).&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>XGBoost</title><link>https://chaeniverse.github.io/blog/xgboost/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/xgboost/</guid><description>&lt;h2 id="발전-흐름"&gt;발전 흐름&lt;/h2&gt;
&lt;p&gt;단일 decision tree → bagging / Random Forest → Gradient Boosting → &lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XGBoost는 gradient boosting machine의 &lt;strong&gt;성능, 확장성, 속도&lt;/strong&gt; 를 최적화한 구현. 핵심은 &lt;strong&gt;정확한 계산 대신 빠른 근사 해&lt;/strong&gt;를 도입했다는 점.&lt;/p&gt;
&lt;h2 id="split-finding-algorithm"&gt;Split Finding Algorithm&lt;/h2&gt;
&lt;p&gt;Decision tree가 분기점을 찾을 때 가장 큰 비용은 &amp;ldquo;어느 변수의 어느 값에서 split할지&amp;rdquo; 결정하는 것.&lt;/p&gt;
&lt;h3 id="exact-greedy"&gt;Exact Greedy&lt;/h3&gt;
&lt;p&gt;모든 가능한 split 후보를 다 시험. 정렬을 포함해 $O(n \log n)$ 의 복잡도. 데이터가 크면 매우 느리다.&lt;/p&gt;
&lt;h3 id="approximation-방식"&gt;Approximation 방식&lt;/h3&gt;
&lt;p&gt;XGBoost는 변수 값들을 &lt;strong&gt;percentile 기반 bucket&lt;/strong&gt; 으로 나눈 뒤, 각 bucket 안에서만 후보 split을 탐색한다. 예시에서 39개 후보를 30개로 줄이면서 동시에 &lt;strong&gt;bucket 단위로 멀티스레드 병렬화&lt;/strong&gt; 가능.&lt;/p&gt;
&lt;p&gt;두 가지 변종:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global variant&lt;/strong&gt; — tree depth 전반에 걸쳐 동일한 bucket 구조를 유지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local variant&lt;/strong&gt; — 노드마다 일정한 bucket 개수를 유지 (depth가 깊어질수록 더 세밀)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;성능 비교: 근사 알고리즘은 exact 방식과 &lt;strong&gt;거의 동등한 정확도&lt;/strong&gt;를 훨씬 짧은 계산 시간으로 달성.&lt;/p&gt;
&lt;h2 id="sparsity-aware-split-finding"&gt;Sparsity-Aware Split Finding&lt;/h2&gt;
&lt;p&gt;결측값 처리에 특화. 학습 시 결측값을 split의 &lt;strong&gt;왼쪽 / 오른쪽으로 보내는 두 옵션을 모두 시험&lt;/strong&gt;해보고, split 성능이 더 좋은 방향을 그 노드의 default direction으로 학습한다.&lt;/p&gt;
&lt;p&gt;→ 결측 패턴이 있는 데이터에서 별도의 imputation 없이도 우수한 성능.&lt;/p&gt;
&lt;h2 id="system-design"&gt;System Design&lt;/h2&gt;
&lt;p&gt;데이터를 &lt;strong&gt;column-wise&lt;/strong&gt; 포맷으로 저장하고 사전에 정렬해 둔다. tree 학습 중 같은 정렬을 반복할 필요 없음 → 메모리 오버헤드 감소, 속도 향상.&lt;/p&gt;
&lt;p&gt;또한 cache-aware access, out-of-core computation, sparse-aware computation 등 시스템 레벨 최적화가 결합되어, 대규모 데이터에서도 실용적인 학습 시간을 보장한다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>SVM (Support Vector Machine)</title><link>https://chaeniverse.github.io/blog/svm-part-1/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/svm-part-1/</guid><description>&lt;h2 id="svm-개요"&gt;SVM 개요&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SVM (Support Vector Machine)&lt;/strong&gt; 은 이진 분류 알고리즘이다. 본 글에서 다루는 original SVM은 본질적으로 &lt;strong&gt;선형 모델&lt;/strong&gt;이다 (이후 kernel trick으로 비선형 확장 가능).&lt;/p&gt;
&lt;h2 id="linear-classifier의-목적"&gt;Linear Classifier의 목적&lt;/h2&gt;
&lt;p&gt;SVM은 이진 분류에서 라벨을 $\{-1, +1\}$ 로 표기한다. 목표는 분류기 집합 $H$ 안에서 일반화 오차 $R_D(h)$ 가 작은 가설 $h: X \to \{-1, +1\}$ 을 찾는 것.&lt;/p&gt;
&lt;p&gt;입력 공간 $X$ 에서 각 학습 데이터의 실제 라벨 ($+1$, $-1$) 을 정확히 분류하는 최적 분류기를 찾는다 — 결국 일반화 오차 $R_D(h)$ 를 최소화하는 문제.&lt;/p&gt;
&lt;p&gt;SVM은 고차원 공간에서도 선형 분류를 수행한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D → &lt;strong&gt;선(line)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;3D → &lt;strong&gt;평면(plane)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;일반 $d$ 차원 → $(d-1)$ 차원의 &lt;strong&gt;초평면(hyperplane)&lt;/strong&gt; 으로 두 클래스 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;선형 분류기는 다음 형태:&lt;/p&gt;
$$H = \{\, x \mapsto \mathrm{sign}(w \cdot x + b) \;:\; w \in \mathbb{R}^d,\; b \in \mathbb{R} \,\}$$&lt;p&gt;$w \cdot x + b$ 의 부호로 라벨을 결정 (음수 → $-1$, 양수 → $+1$). 여기서 $w, b$ 가 학습 대상.&lt;/p&gt;
&lt;h2 id="local-optimum-global-optimum"&gt;Local Optimum? Global Optimum!&lt;/h2&gt;
&lt;p&gt;학습 데이터를 정확히 분류하는 hyperplane은 무수히 많다. SVM은 그 중 &lt;strong&gt;두 클래스 사이의 마진(margin)이 가장 넓은&lt;/strong&gt; hyperplane을 고른다.&lt;/p&gt;
&lt;h3 id="마진-너비-도출"&gt;마진 너비 도출&lt;/h3&gt;
&lt;p&gt;분류 경계 위의 점 $x_0$ 에서 $w^\top x_0 + b = 0$. 여기서 $w$ 는 hyperplane의 법선 벡터.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;+1 plane&amp;rdquo; 위의 점 $x_1$ 은 법선 방향으로 거리만큼 이동한 점이므로&lt;/p&gt;
$$x_1 = x_0 + p\, w$$&lt;p&gt;$x_1$ 이 plus plane 위에 있다는 조건 $w^\top x + b = 1$ 에 대입:&lt;/p&gt;
$$w^\top x_0 + p\, w^\top w + b = 1$$&lt;p&gt;$w^\top x_0 + b = 0$ 이므로&lt;/p&gt;
$$p\, w^\top w = 1 \quad\Longrightarrow\quad |p| = \frac{1}{\|w\|^2}$$&lt;p&gt;→ 한쪽 마진은 $\dfrac{1}{\|w\|^2}$, &lt;strong&gt;양쪽 합 마진은 $\dfrac{2}{\|w\|^2}$.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(보다 일반적으로 plus와 minus plane 거리를 $\|w\|$ 로 정규화하면 마진은 $\dfrac{2}{\|w\|}$. 위 도출은 $w^\top x + b = \pm 1$ 형태로 정규화한 경우의 결과)&lt;/p&gt;
&lt;h2 id="마진과-vc-차원의-관계"&gt;마진과 VC 차원의 관계&lt;/h2&gt;
&lt;p&gt;마진 $\Delta$ 를 가지는 분리 초평면의 VC 차원은 다음 상한을 가진다.&lt;/p&gt;
$$h \;\le\; \min\!\left(\left\lceil \frac{R^2}{\Delta^2}\right\rceil,\; D\right) + 1$$&lt;ul&gt;
&lt;li&gt;$D$ : 입력 공간의 차원&lt;/li&gt;
&lt;li&gt;$R$ : 모든 입력 벡터를 포함하는 가장 작은 구의 반지름&lt;/li&gt;
&lt;li&gt;$\Delta$ : 마진&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 변하는 건 $\Delta$ 뿐. &lt;strong&gt;마진이 클수록 $R^2/\Delta^2$ 가 작아져 VC 차원이 $D$ 보다 더 낮아질 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VC 차원이 작아지면 일반화 위험 상한 (capacity term) 도 작아진다:&lt;/p&gt;
$$R[f] \;\le\; R_{\text{emp}}[f] + \sqrt{\frac{h(\ln(2n/h)+1) + \ln(\delta/4)}{n}}$$&lt;p&gt;→ &lt;strong&gt;마진을 최대화 = VC 차원 ↓ = capacity ↓ = 기대 위험 ↓.&lt;/strong&gt; SVM이 마진을 최대화하는 이론적 근거.&lt;/p&gt;
&lt;h2 id="svm-case-i-linear--hard-margin"&gt;SVM Case I: Linear &amp;amp; Hard Margin&lt;/h2&gt;
&lt;p&gt;데이터가 선형 분리 가능하고 예외(오분류)를 허용하지 않는 경우 (hard margin).&lt;/p&gt;
&lt;h3 id="primal-problem"&gt;Primal Problem&lt;/h3&gt;
$$\min_{w, b} \;\frac{1}{2}\|w\|^2$$$$\text{s.t.} \quad y_i(w^\top x_i + b) \;\ge\; 1 \quad \forall i$$&lt;p&gt;마진 $\dfrac{2}{\|w\|^2}$ 을 최대화 ↔ $\dfrac{1}{2}\|w\|^2$ 을 최소화. 제약은&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 $+1$: $w^\top x_i + b \ge 1$&lt;/li&gt;
&lt;li&gt;클래스 $-1$: $w^\top x_i + b \le -1$&lt;/li&gt;
&lt;li&gt;둘을 합쳐서 $y_i(w^\top x_i + b) \ge 1$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lagrangian--dual"&gt;Lagrangian → Dual&lt;/h3&gt;
&lt;p&gt;라그랑주 승수 $\alpha_i \ge 0$ 을 도입:&lt;/p&gt;
$$L_P = \frac{1}{2}\|w\|^2 - \sum_{i} \alpha_i \big( y_i(w^\top x_i + b) - 1 \big)$$&lt;p&gt;KKT 조건:&lt;/p&gt;
$$\frac{\partial L_P}{\partial w} = 0 \quad\Longrightarrow\quad w = \sum_i \alpha_i y_i x_i$$$$\frac{\partial L_P}{\partial b} = 0 \quad\Longrightarrow\quad \sum_i \alpha_i y_i = 0$$&lt;p&gt;이를 $L_P$ 에 다시 대입하면 &lt;strong&gt;$\alpha$ 만의 함수&lt;/strong&gt;인 dual 문제가 나온다 (convex). 해를 $\alpha^\star$ 라 하자.&lt;/p&gt;
&lt;h3 id="새-입력-분류"&gt;새 입력 분류&lt;/h3&gt;
$$f(x_{\text{new}}) = \mathrm{sign}\!\left(\sum_i \alpha_i^\star y_i \, x_i^\top x_{\text{new}} + b\right)$$&lt;h3 id="support-vectors"&gt;Support Vectors&lt;/h3&gt;
&lt;p&gt;KKT의 complementary slackness에 의해 대부분의 데이터에서 $\alpha_i = 0$ 이 되고, &lt;strong&gt;마진 경계 위에 정확히 놓인 데이터들에 대해서만 $\alpha_i &gt; 0$.&lt;/strong&gt; 이들이 &lt;strong&gt;support vector&lt;/strong&gt; — 모델 $w$ 를 결정짓는 핵심 데이터들.&lt;/p&gt;
&lt;p&gt;데이터셋 안쪽 깊은 점들은 분류기 결정에 영향을 주지 않고, 마진 위 소수 점만이 모델을 정의한다는 게 SVM의 본질.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Random Forest</title><link>https://chaeniverse.github.io/blog/random-forest/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/random-forest/</guid><description>&lt;h2 id="random-forest"&gt;Random Forest&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Random Forest&lt;/strong&gt; 는 bagging의 특수한 형태로, base learner로 &lt;strong&gt;decision tree&lt;/strong&gt; 를 쓴다. 두 가지 메커니즘으로 앙상블의 다양성을 확보한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bagging (bootstrap sampling)&lt;/strong&gt; — 각 tree는 원본 데이터에서 복원 추출한 bootstrap 샘플로 학습&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Random variable selection&lt;/strong&gt; — tree의 각 분기점에서, 전체 $p$ 개 변수 중 무작위로 $m$ 개만 후보로 두고 그 중 최선의 변수로 분기&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Bootstrap size $t$ 의 무작위 샘플 생성&lt;/li&gt;
&lt;li&gt;분기 시 원본 $p$ 개 변수에서 $m$ 개의 변수만 무작위로 선택해 후보로 두고 분기&lt;/li&gt;
&lt;li&gt;다수의 decision tree를 학습한 뒤 결과를 결합 (분류는 majority vote, 회귀는 평균)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="핵심-통찰"&gt;핵심 통찰&lt;/h2&gt;
&lt;p&gt;변수 제약 때문에 &lt;strong&gt;개별 tree의 성능은 떨어진다.&lt;/strong&gt; 하지만 tree들 간 &lt;strong&gt;상관(correlation)이 줄어들어&lt;/strong&gt; 평균/투표로 결합하면 전체 앙상블의 성능은 더 좋아진다. &amp;ldquo;약한 학습기들을 다양하게 조합해 강한 학습기를 만든다&amp;quot;의 정수.&lt;/p&gt;
&lt;h2 id="일반화-오차-generalization-error"&gt;일반화 오차 (Generalization Error)&lt;/h2&gt;
&lt;p&gt;Random Forest의 일반화 오차에는 다음과 같은 상한이 알려져 있다.&lt;/p&gt;
$$\text{Generalization Error} \;\le\; \frac{\bar{\rho}\,(1 - s^2)}{s^2}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{\rho}$ : tree들 간 결과의 평균 &lt;strong&gt;상관(correlation)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$s^2$ : 개별 tree의 &lt;strong&gt;정확도&lt;/strong&gt; (strength)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 좋은 일반화는 &lt;strong&gt;개별 모델 성능($s$)이 높으면서 모델 간 상관($\bar{\rho}$)이 낮을 때&lt;/strong&gt; 얻어진다. 이게 RF가 변수 무작위 선택을 추가하는 이유 — 약간의 개별 정확도 손해를 보더라도 상관을 크게 떨어뜨려서 전체 bound를 줄이는 거래.&lt;/p&gt;
&lt;h2 id="변수-중요도-variable-importance"&gt;변수 중요도 (Variable Importance)&lt;/h2&gt;
&lt;p&gt;Random Forest는 &lt;strong&gt;Out-of-Bag (OOB)&lt;/strong&gt; 데이터를 활용해 변수 중요도를 계산할 수 있다 (별도의 validation set 없이도 가능).&lt;/p&gt;
&lt;h3 id="절차"&gt;절차&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;각 tree에 대해, 그 tree 학습에 쓰이지 않은 OOB 샘플로 예측 오차를 측정.&lt;/li&gt;
&lt;li&gt;변수 $x_i$ 의 값을 &lt;strong&gt;무작위로 permute&lt;/strong&gt; 한 OOB 샘플로 다시 예측 오차 측정.&lt;/li&gt;
&lt;li&gt;두 오차의 차이를 모아 평균과 분산을 구한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="중요도-지표"&gt;중요도 지표&lt;/h3&gt;
$$v_i \;=\; \frac{\bar{d}_i}{s_i}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{d}_i$ : OOB 오차 차이의 평균 (permute 후 - permute 전)&lt;/li&gt;
&lt;li&gt;$s_i^2$ : 그 차이의 분산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;직관적으로, &lt;strong&gt;분기 시 자주 쓰이는 중요한 변수&lt;/strong&gt;일수록 permute하면 모델이 크게 망가져 오차 차이가 커진다 → $\bar{d}_i$ 가 크다 → $v_i$ 가 크다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Acceptance-Rejection Algorithm</title><link>https://chaeniverse.github.io/blog/acceptance-rejection/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/acceptance-rejection/</guid><description>&lt;h2 id="acceptance-rejection-algorithm"&gt;Acceptance-Rejection Algorithm&lt;/h2&gt;
&lt;p&gt;이전에는 A-R 알고리즘을 &amp;ldquo;균등분포를 씌우고 곡선 안쪽 점은 accept, 바깥은 reject&amp;rdquo; 정도로만 두루뭉술하게 알고 있었다. 이 글에서는 그 디테일한 로직을 단계별로 정리한다.&lt;/p&gt;
&lt;h2 id="셋업"&gt;셋업&lt;/h2&gt;
&lt;p&gt;지지구간 $[0,1]$ 위에 정의된 (그러나 직접 적분이 까다로운) 분포 $f(x)$ 에서 샘플을 뽑고 싶다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Target distribution f(x) on [0,1]"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_a3410b39f6f1eea5.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_4c0bab44b5a23d68.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp"
width="760"
height="613"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;h3 id="step-1-x-축-샘플링"&gt;Step 1. x-축 샘플링&lt;/h3&gt;
&lt;p&gt;먼저 $x$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0,1)$ 에서 추출해 고정점으로 둔다.&lt;/p&gt;
&lt;h3 id="step-2-y-축-샘플링"&gt;Step 2. y-축 샘플링&lt;/h3&gt;
&lt;p&gt;각 $x$ 고정점에 대해, $y$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0, a)$ 에서 추출한다. 여기서 $a$ 는 $f(x)$ 의 최댓값 (또는 그 이상). 즉, 곡선 $f(x)$ 를 충분히 덮는 가로 $1 \times$ 세로 $a$ 직사각형 안에 점들을 흩뿌리는 것.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampling along the y-axis at a fixed x"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_e2effc87f567206d.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a60948387b633bc4.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp"
width="760"
height="695"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-accept--reject"&gt;Step 3. Accept / Reject&lt;/h3&gt;
&lt;p&gt;각 $(x, y)$ 점에 대해&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$y \le f(x)$ → &lt;strong&gt;accept&lt;/strong&gt; (곡선 안쪽 점)&lt;/li&gt;
&lt;li&gt;$y &gt; f(x)$ → &lt;strong&gt;reject&lt;/strong&gt; (곡선 바깥 점)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-4-모든-x에-대해-반복"&gt;Step 4. 모든 x에 대해 반복&lt;/h3&gt;
&lt;p&gt;위 과정을 모든 $x$-축 data point에 대해 반복한다. accept된 $(x, y)$ 점들의 &lt;strong&gt;$x$-좌표만 모아서&lt;/strong&gt; 히스토그램으로 그리면 다음과 같다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Histogram of accepted x-coordinates approximates f(x)"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_2bc8c1739cc87115.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_894a7a1bc842417f.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp"
width="760"
height="684"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;→ &lt;strong&gt;원래 $f(x)$ 의 분포에 잘 근사&lt;/strong&gt;된다.&lt;/p&gt;
&lt;h2 id="표본-통계량"&gt;표본 통계량&lt;/h2&gt;
&lt;p&gt;이 accepted data point들의 $x$-좌표 평균을 구하면 $f(x)$ 의 표본 평균을 추정할 수 있다 (분산도 마찬가지).&lt;/p&gt;
&lt;h2 id="왜-동작하나-직관"&gt;왜 동작하나 (직관)&lt;/h2&gt;
&lt;p&gt;곡선 $f(x)$ 아래 면적은 정확히 1 (확률밀도이므로). 직사각형 $[0,1] \times [0,a]$ 에 균등하게 점을 뿌리면, &lt;strong&gt;곡선 아래 영역에 떨어지는 비율&lt;/strong&gt;은 $\frac{1}{a}$. 그리고 이 영역 안의 점들은 &lt;strong&gt;곡선 아래에서 균등 분포&lt;/strong&gt;를 따른다.&lt;/p&gt;
&lt;p&gt;이때 $x$-좌표만 보면, 그 한계분포(marginal)가 정확히 $f(x)$ 가 된다.&lt;/p&gt;
&lt;p&gt;수식으로:&lt;/p&gt;
$$P(X \le x \mid \text{accepted}) = \frac{\int_0^x f(t)\,dt}{\int_0^1 f(t)\,dt} = \int_0^x f(t)\,dt = F(x)$$&lt;p&gt;→ accepted $X$ 의 CDF가 $F$ 이므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="일반화"&gt;일반화&lt;/h2&gt;
&lt;p&gt;지지구간이 $[0,1]$ 이 아니거나 $f$ 의 상한이 명확하지 않을 때는 임의의 proposal $g(x)$ 와 상수 $M$ 을 잡아 $f(x) \le M \cdot g(x)$ 를 만족시킨다. 그리고&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$X \sim g$ 에서 후보를 뽑고,&lt;/li&gt;
&lt;li&gt;$U \sim \mathrm{Unif}(0,1)$ 을 뽑아,&lt;/li&gt;
&lt;li&gt;$U \le \dfrac{f(X)}{M \cdot g(X)}$ 이면 accept, 아니면 reject.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이때 accept된 $X$ 가 정확히 $f(x)$ 분포를 따른다. 위에서 다룬 케이스는 $g(x) = 1$ (균등 분포), $M = a$ 인 특수 경우에 해당한다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>MCMC (Metropolis-Hastings)</title><link>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</guid><description>&lt;h2 id="markov-chain-monte-carlo"&gt;Markov Chain Monte Carlo&lt;/h2&gt;
&lt;p&gt;간단히 말하면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Markov chain&lt;/strong&gt; 은 그 전에 몇 번 시행했든 간에 &lt;strong&gt;바로 이전 시행에 대해서만&lt;/strong&gt; 영향을 받는다는 거고,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monte Carlo&lt;/strong&gt; 는 이상한 pdf의 분포를 구하기 어려울 때, 해당하는 pdf의 $x$ 를 많이 sampling해서 근사화시켜 표본 평균과 표본 분산을 구하는 과정을 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="동기"&gt;동기&lt;/h2&gt;
&lt;p&gt;가령, $f(x)$ 라는 분포의 기댓값, 분산을 알고 싶다고 하자.&lt;/p&gt;
&lt;p&gt;이때 이 분포의 모양이 특이하면 (봉우리가 여러 개 있는 등), 적분하기 상당히 까다로울 것이다. 이럴 때 정규분포를 따르는 $h(x)$ 를 하나 씌워서 여기서 data point를 무작위로 뽑아 근사시켜 표본 평균·표본 분산을 구하는 식으로 기댓값과 분산을 유추할 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Target distribution f(x) is multimodal; proposal h(x) is normal"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_f0640173b2f7c82f.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1c783460b75b48e2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp"
width="760"
height="275"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림에서 파란색이 우리가 알고 싶은 복잡한 분포 $f(x)$ (두 봉우리), 빨간색이 우리가 sampling에 쓸 proposal 분포 $h(x)$ (정규분포).&lt;/p&gt;
&lt;h2 id="알고리즘--acceptance-rejection-반복"&gt;알고리즘 — Acceptance-Rejection 반복&lt;/h2&gt;
&lt;h3 id="step-1-reject--첫-시도가-실패하는-경우"&gt;Step 1. Reject — 첫 시도가 실패하는 경우&lt;/h3&gt;
&lt;p&gt;정규분포를 따르는 $h(x)$ 에서 한 data point를 뽑았는데 우연히 이 위치가 뽑혔다고 가정하자.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;lt; h(x): reject"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_24dd43d88b20fccd.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_82d2c0555e086f6.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp"
width="760"
height="251"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이때 $f(x) &lt; h(x)$ (&amp;ldquo;하트가 음수&amp;rdquo;) 이면 해당 data point는 &lt;strong&gt;reject&lt;/strong&gt; 하고, 같은 정규분포에서 data를 다시 추출한다.&lt;/p&gt;
&lt;h3 id="step-2-accept"&gt;Step 2. Accept&lt;/h3&gt;
&lt;p&gt;새로 추출한 data point에서 $f(x) &gt; h(x)$ 이므로 &lt;strong&gt;accept&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;gt; h(x): accept"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_e7a0f5fc326b7264.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_eaf74a7241167b2e.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp"
width="760"
height="267"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-proposal-이동"&gt;Step 3. Proposal 이동&lt;/h3&gt;
&lt;p&gt;Accept하면 해당 data point를 중심으로 정규분포 $h(x)$ 를 다시 가정한다 (현재 위치로 proposal을 옮긴다).&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Move h(x) to the accepted point"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_97207ce6cd76a957.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_a2437b4e8a3581cf.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp"
width="760"
height="223"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-4-반복--random-walk"&gt;Step 4. 반복 — Random Walk&lt;/h3&gt;
&lt;p&gt;새로 가정한 정규분포에서 위와 같이 data point를 다시 무작위로 뽑는다.&lt;/p&gt;
&lt;p&gt;그런데 $f(x) &gt; h(x)$ 이면 해당 data를 accept하고 다시 그 지점으로 이동해 새 정규분포를 가정한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Walk along the chain, accumulating accepted points"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_604ec4fc25bc7e49.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_99a80589654ba2e9.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp"
width="760"
height="215"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-5-다른-봉우리로-이동"&gt;Step 5. 다른 봉우리로 이동&lt;/h3&gt;
&lt;p&gt;이런 식으로 acceptance-rejection을 반복하면서 accept된 data point들을 차곡차곡 모아 놓는다. 그러다 보면, 처음에 있던 오른쪽 봉우리뿐 아니라 &lt;strong&gt;왼쪽 봉우리에서도 data point가 추출&lt;/strong&gt;될 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Chain crosses to the other mode of f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_c2454a80e4a86f3b.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_3c1b9ac206db94c2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp"
width="760"
height="201"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-6-양쪽-봉우리-모두-탐험"&gt;Step 6. 양쪽 봉우리 모두 탐험&lt;/h3&gt;
&lt;p&gt;왼쪽 봉우리에서도 같은 acceptance-rejection을 반복한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Both modes get sampled over time"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_92f60f7f4363119.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_d5679dab51ef6ca3.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp"
width="760"
height="213"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="결과"&gt;결과&lt;/h2&gt;
&lt;p&gt;이런 식으로 알고리즘을 충분히 반복한 후 추출된 data point들의 히스토그램을 그리면 다음과 같은 모양을 띈다 — &lt;strong&gt;원래 $f(x)$ 의 분포와 흡사&lt;/strong&gt;하다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Histogram of accepted samples approximates f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_798fda3cd4801473.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_2f2c110255f9341b.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp"
width="760"
height="314"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 data point들의 평균을 구하면 $f(x)$ 의 표본 평균과 표본 분산을 얻을 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="보충-정확한-metropolis-hastings-채택-확률"&gt;보충: 정확한 Metropolis-Hastings 채택 확률&lt;/h2&gt;
&lt;p&gt;위 설명은 직관 중심이다. 실제 Metropolis-Hastings 알고리즘에서 &lt;strong&gt;새 점 $x'$ 을 채택할 확률&lt;/strong&gt;은 다음과 같다.&lt;/p&gt;
$$\alpha(x' \mid x) \;=\; \min\!\left\{1,\; \frac{f(x')\, q(x \mid x')}{f(x)\, q(x' \mid x)}\right\}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$f(\cdot)$ : 목표 분포 (target)&lt;/li&gt;
&lt;li&gt;$q(x' \mid x)$ : 현재 위치 $x$ 에서 다음 후보 $x'$ 을 제안하는 proposal density&lt;/li&gt;
&lt;li&gt;proposal이 대칭이면 ($q(x'\mid x) = q(x \mid x')$, 예: 평균이 현재 점에 있는 정규분포) &lt;strong&gt;Metropolis&lt;/strong&gt; 알고리즘이 되어 비율이 $f(x')/f(x)$ 로 단순해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &amp;ldquo;$f$ 가 큰 곳으로 이동하면 무조건 accept, $f$ 가 작은 곳으로 이동하면 비율만큼의 확률로 accept&amp;rdquo;. 위 직관 설명의 &amp;ldquo;f &amp;gt; h → accept, f &amp;lt; h → reject&amp;quot;는 이 채택 확률의 단순한 시각적 비유로 보면 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Diffusion Models: DDPM 수식 유도와 응용 (DDIM, LDM)</title><link>https://chaeniverse.github.io/blog/diffusion-models-ddpm-derivation/</link><pubDate>Tue, 28 May 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/diffusion-models-ddpm-derivation/</guid><description>&lt;h2 id="concept"&gt;Concept&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Diffusion model의 생물학적 원리.&lt;/strong&gt; 분자 구조가 퍼져 나가는 모습에서 착안. 예) 물에 잉크가 퍼지는 과정, 공기 중에 연기가 퍼지는 과정.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;수학적 원리.&lt;/strong&gt; 분자의 다음 위치는 &lt;strong&gt;gaussian distribution&lt;/strong&gt; 에 의해 결정된다.&lt;/p&gt;
&lt;h2 id="forward--reverse-process"&gt;Forward / Reverse Process&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Forward process&lt;/strong&gt; — 앞선 이미지에 gaussian distribution을 연속적으로 곱해 noise를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reverse process&lt;/strong&gt; — 같은 가우시안 분포를 곱해 denoising 상태로 복원한다. 학습을 위한 loss term을 구하는 과정에서 $p$ 와 $q$ 의 평균·분산을 알아야 한다.&lt;/p&gt;
&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$p$ : 우리가 구하고 싶은, 이미 정해진 정답 pdf&lt;/li&gt;
&lt;li&gt;$q$ : 우리가 학습을 통해 구해야 하는 pdf&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="사전-지식"&gt;사전 지식&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KL divergence&lt;/strong&gt; — 두 확률 분포의 차이를 계산. 거리 개념은 아님 (asymmetric).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markov chain&lt;/strong&gt; — 현재 상태는 바로 이전 상태의 영향만 받는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bayes&amp;rsquo; theorem&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ELBO (Evidence Lower Bound)&lt;/strong&gt; — VAE에서 출발한 개념. MLE를 푸는 한 방식.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vae에서-elbo"&gt;VAE에서 ELBO&lt;/h2&gt;
&lt;p&gt;VAE에서는 latent $z$ 가 주어졌을 때 관측 $x$ 의 분포 $p(x \mid z)$ 를 모델링한다. $p(x)$ 자체는 직접 구하기 어렵고, $q(z \mid x)$ 라는 추정 분포로 우회한다.&lt;/p&gt;
&lt;p&gt;KL divergence 정의로부터&lt;/p&gt;
$$D_{\mathrm{KL}}(q(z\mid x) \,\|\, p(z\mid x)) = \int q(z\mid x) \log\frac{q(z\mid x)}{p(z\mid x)}\,dz \ge 0$$&lt;p&gt;이를 풀어서 $\log p(x)$ 만 남기고 정리하면&lt;/p&gt;
$$\log p(x) = D_{\mathrm{KL}}(q(z\mid x)\,\|\,p(z\mid x)) - \mathbb{E}_{q(z\mid x)}[\log q(z\mid x)] + \mathbb{E}_{q(z\mid x)}[\log p(x, z)]$$&lt;ul&gt;
&lt;li&gt;$\log p(x)$ 는 &lt;strong&gt;fixed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;첫 항 $D_{\mathrm{KL}} \ge 0$ 이고, &lt;strong&gt;이걸 minimize 해야&lt;/strong&gt; $q$ 가 $p$ 에 가까워진다&lt;/li&gt;
&lt;li&gt;그러면 나머지 두 항 (&lt;strong&gt;ELBO&lt;/strong&gt;) 은 자연스럽게 maximize 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ELBO 부분을 정리하면&lt;/p&gt;
$$\mathrm{ELBO} = \mathbb{E}_{q(z\mid x)}\!\left[\log\frac{p(x, z)}{q(z\mid x)}\right]$$&lt;p&gt;→ 이걸 maximize하는 게 VAE 학습의 핵심.&lt;/p&gt;
&lt;h2 id="vae--ddpm-연결"&gt;VAE → DDPM 연결&lt;/h2&gt;
&lt;p&gt;DDPM에서는 latent $z$ 자리에 &lt;strong&gt;여러 시점의 noisy state&lt;/strong&gt; $x_1, x_2, \dots, x_T$ 가 들어간다 ($x_0$ 는 원본 이미지).&lt;/p&gt;
&lt;p&gt;ELBO에 음수를 붙여 minimize 문제로 바꾸면&lt;/p&gt;
$$\mathcal{L} = -\mathbb{E}_{q(x_{1:T} \mid x_0)}\!\left[\log\frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\right]$$&lt;p&gt;이게 DDPM loss의 출발점.&lt;/p&gt;
&lt;h2 id="ddpm-loss-수식-유도"&gt;DDPM Loss 수식 유도&lt;/h2&gt;
&lt;p&gt;Markov chain 가정 하에서 joint 분포가 chain rule로 분해된다:&lt;/p&gt;
$$p_\theta(x_{0:T}) = p(x_T)\prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t)$$$$q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1})$$&lt;p&gt;대입 후 로그 전개:&lt;/p&gt;
$$\mathcal{L} = \mathbb{E}_q\!\left[-\log p(x_T) + \sum_{t=1}^{T} \log\frac{q(x_t \mid x_{t-1})}{p_\theta(x_{t-1} \mid x_t)}\right]$$&lt;p&gt;Bayes&amp;rsquo; theorem과 markov 성질로 $q(x_t \mid x_{t-1}) = q(x_t \mid x_{t-1}, x_0)$ 가 성립하고, 이를 활용해 $q(x_{t-1} \mid x_t, x_0)$ 형태로 변환:&lt;/p&gt;
$$q(x_t \mid x_{t-1}, x_0) = \frac{q(x_{t-1} \mid x_t, x_0)\, q(x_t \mid x_0)}{q(x_{t-1} \mid x_0)}$$&lt;p&gt;이 변환을 적용하면 telescoping이 일어나며 최종적으로 다음의 KL 형태로 정리된다.&lt;/p&gt;
$$\mathcal{L} = \mathbb{E}_q\!\left[\underbrace{D_{\mathrm{KL}}(q(x_T \mid x_0)\,\|\,p(x_T))}_{L_T} + \sum_{t=2}^{T} \underbrace{D_{\mathrm{KL}}(q(x_{t-1} \mid x_t, x_0)\,\|\,p_\theta(x_{t-1} \mid x_t))}_{L_{t-1}} \;-\; \underbrace{\log p_\theta(x_0 \mid x_1)}_{L_0}\right]$$&lt;h3 id="학습할-항만-남기기"&gt;학습할 항만 남기기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$L_T$ — forward process에서만 쓰이고 학습할 파라미터 없음 → &lt;strong&gt;무시&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$L_0$ — 영향이 미미해서 &lt;strong&gt;무시&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;결국 &lt;strong&gt;$L_{t-1}$&lt;/strong&gt; 만 minimize 하면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="의-평균분산"&gt;$q(x_{t-1} \mid x_t, x_0)$ 의 평균·분산&lt;/h3&gt;
&lt;p&gt;Forward process: $q(x_t \mid x_{t-1}) = \mathcal{N}(x_t;\, \sqrt{1-\beta_t}\, x_{t-1},\, \beta_t I)$.&lt;/p&gt;
&lt;p&gt;$\alpha_t = 1 - \beta_t$, $\bar\alpha_t = \prod_{s=1}^{t}\alpha_s$ 라 정의하면 reparameterization trick으로&lt;/p&gt;
$$q(x_t \mid x_0) = \mathcal{N}(x_t;\, \sqrt{\bar\alpha_t}\,x_0,\, (1-\bar\alpha_t) I)$$&lt;p&gt;Bayes&amp;rsquo; theorem과 가우시안 곱 정리로&lt;/p&gt;
$$q(x_{t-1} \mid x_t, x_0) = \mathcal{N}\big(x_{t-1};\, \tilde\mu_t(x_t, x_0),\, \tilde\beta_t I\big)$$&lt;p&gt;여기서&lt;/p&gt;
$$\tilde\mu_t(x_t, x_0) = \frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}\,x_0 + \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\,x_t$$$$\tilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t$$&lt;p&gt;$x_0 = \dfrac{1}{\sqrt{\bar\alpha_t}}\big(x_t - \sqrt{1-\bar\alpha_t}\,\epsilon\big)$ 로 다시 정리하면&lt;/p&gt;
$$\tilde\mu_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon\right)$$&lt;h3 id="의-정의"&gt;$p_\theta(x_{t-1} \mid x_t)$ 의 정의&lt;/h3&gt;
&lt;p&gt;가우시안 분포로 가정하고, 평균을 다음처럼 &lt;strong&gt;네트워크 출력 $\epsilon_\theta$&lt;/strong&gt; 의 형태로 둔다:&lt;/p&gt;
$$p_\theta(x_{t-1} \mid x_t) = \mathcal{N}\!\big(x_{t-1};\, \mu_\theta(x_t, t),\, \sigma_t^2 I\big)$$$$\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t, t)\right)$$&lt;p&gt;→ 두 평균의 차이만 학습하면 되고, 이는 곧 &lt;strong&gt;$\epsilon$ vs $\epsilon_\theta$&lt;/strong&gt; 의 차이를 학습하는 것이 된다.&lt;/p&gt;
&lt;h3 id="가우시안-kl--평균-차이의-l2"&gt;가우시안 KL → 평균 차이의 L2&lt;/h3&gt;
&lt;p&gt;분산이 같은 두 가우시안의 KL은 평균 제곱 차로 환원되므로&lt;/p&gt;
$$L_{t-1} = \mathbb{E}_{x_0,\epsilon}\!\left[\frac{\beta_t^2}{2\sigma_t^2\,\alpha_t(1-\bar\alpha_t)} \,\big\|\epsilon - \epsilon_\theta\big(\sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon,\; t\big)\big\|^2\right]$$&lt;h3 id="단순화된-최종-loss"&gt;단순화된 최종 loss&lt;/h3&gt;
&lt;p&gt;DDPM 논문에서는 weight term을 제거한 단순화된 loss를 사용한다:&lt;/p&gt;
$$\mathcal{L}_{\text{simple}}(\theta) = \mathbb{E}_{t,\,x_0,\,\epsilon}\!\left[\,\big\|\epsilon - \epsilon_\theta\big(\sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon,\; t\big)\big\|^2\,\right], \qquad \epsilon \sim \mathcal{N}(0, I)$$&lt;p&gt;→ 결국 &lt;strong&gt;U-Net (또는 다른 구조)이 noise $\epsilon$ 을 예측하도록 학습&lt;/strong&gt;시키는 단순한 MSE 회귀 문제로 귀결.&lt;/p&gt;
&lt;h2 id="학습샘플링-알고리즘-요약"&gt;학습·샘플링 알고리즘 요약&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Training&lt;/strong&gt;: $x_0$ 와 $t \sim \mathrm{Unif}(\{1, \dots, T\})$, $\epsilon \sim \mathcal{N}(0, I)$ 을 뽑아 $\mathcal{L}_{\text{simple}}$ 의 SGD로 $\epsilon_\theta$ 를 학습.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sampling&lt;/strong&gt;: $x_T \sim \mathcal{N}(0, I)$ 부터 시작, $t = T, T-1, \dots, 1$ 까지 reverse step으로&lt;/p&gt;
$$x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t, t)\right) + \sigma_t z, \quad z \sim \mathcal{N}(0, I)$$&lt;h2 id="ddim-denoising-diffusion-implicit-models"&gt;DDIM (Denoising Diffusion Implicit Models)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Song et al. (2021)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DDPM은 markov chain을 연속적으로 곱해 process가 이루어져 &lt;strong&gt;샘플링이 느리다&lt;/strong&gt; ($T$ 보통 1000).&lt;/p&gt;
&lt;p&gt;이를 단축하기 위해 &lt;strong&gt;non-markovian&lt;/strong&gt; 개념을 도입. Forward process에서 $x_t$ 분포를 구할 때 $x_{t-1}$ 와 $x_0$ 만으로도 정의 가능 → markov 성질을 가정할 필요 없음. Sampling step을 대폭 줄여도 품질이 유지된다.&lt;/p&gt;
&lt;p&gt;가우시안이 아니어도 적용 가능 (이상치가 많은 분포라면 t분포·코시분포 활용 검토 가능).&lt;/p&gt;
&lt;h2 id="diffusion-gan"&gt;Diffusion-GAN&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Wang et al. (2023)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Diffusion model에 GAN의 discriminator를 도입. Generator + Discriminator 구조로,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real noise (forward process로 만든 noisy image) 와 fake noise (학습한 모델이 만든 noisy image) 사이의 차이를 discriminator가 판별&lt;/li&gt;
&lt;li&gt;둘의 차이를 minimize하도록 generator를 학습&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="latent-diffusion-model-ldm"&gt;Latent Diffusion Model (LDM)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Rombach et al. (2022) — &lt;em&gt;High-Resolution Image Synthesis with Latent Diffusion Models&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기존 diffusion model은 픽셀 공간에서 직접 작동해 &lt;strong&gt;계산량이 많다&lt;/strong&gt;. LDM은 이를 줄이기 위해 &lt;strong&gt;차원 축소된 latent space&lt;/strong&gt;에서 diffusion을 수행한다.&lt;/p&gt;
&lt;h3 id="pixel-space-vs-latent-space"&gt;Pixel space vs Latent space&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pixel space&lt;/strong&gt;: 차원 축소되지 않은 고차원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latent space&lt;/strong&gt;: 차원 축소된 저차원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이미지의 resolution은 두 측면으로 분해할 수 있다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semantic&lt;/strong&gt; — 사물의 형체만 알아볼 정도의 해상도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perceptual&lt;/strong&gt; — 더 디테일한 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;차원 축소 시 perceptual 정보를 덜어내고 semantic resolution을 보존한다. 이 latent에서 diffusion을 수행한 뒤 decoder로 perceptual 정보를 복원.&lt;/p&gt;
&lt;h3 id="구조"&gt;구조&lt;/h3&gt;
&lt;p&gt;VAE의 autoencoder 개념이 결합된 구조:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$\varepsilon$ (encoder)&lt;/strong&gt;: pixel → latent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\mathcal{D}$ (decoder)&lt;/strong&gt;: latent → pixel&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diffusion&lt;/strong&gt; 은 latent space에서 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;내부적으로는 &lt;strong&gt;U-Net + attention-based transformer&lt;/strong&gt; 모듈을 결합. Conditioning ($y$ — 텍스트, 클래스 라벨, semantic map 등) 은 cross-attention으로 주입한다.&lt;/p&gt;
&lt;h3 id="손실-함수"&gt;손실 함수&lt;/h3&gt;
$$\mathcal{L}_{\mathrm{LDM}} = \mathbb{E}_{z_0,\, y,\, \epsilon,\, t}\!\left[\,\big\|\epsilon - \epsilon_\theta(z_t,\, t,\, y)\big\|_2^2\,\right]$$&lt;p&gt;→ 픽셀 공간 DDPM의 단순화된 loss와 형태는 같고, &lt;strong&gt;변수만 latent $z$ 와 condition $y$&lt;/strong&gt; 로 바뀐 형태.&lt;/p&gt;
&lt;h3 id="왜-좋은가"&gt;왜 좋은가&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;차원 축소된 공간에서 diffusion → &lt;strong&gt;계산 비용 ↓&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Latent space는 likelihood 기반 생성 모델에 더 적합&lt;/li&gt;
&lt;li&gt;Semantic 수준에서만 학습되므로 데이터 효율성도 ↑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="정리"&gt;정리&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;DDPM의 loss는 결국 VAE의 ELBO를 markov chain으로 펼친 형태이며, 가우시안 KL이 평균 차의 L2로 환원되어 결국 &amp;ldquo;noise 예측&amp;rdquo; 회귀 문제가 된다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DDIM은 sampling 가속화, Diffusion-GAN은 GAN과의 결합, LDM은 latent space 활용으로 계산 효율을 끌어올린 후속 작업들.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ho et al., &lt;em&gt;Denoising Diffusion Probabilistic Models&lt;/em&gt;, NeurIPS 2020&lt;/li&gt;
&lt;li&gt;Song et al., &lt;em&gt;Denoising Diffusion Implicit Models&lt;/em&gt;, ICLR 2021&lt;/li&gt;
&lt;li&gt;Rombach et al., &lt;em&gt;High-Resolution Image Synthesis with Latent Diffusion Models&lt;/em&gt;, CVPR 2022&lt;/li&gt;
&lt;li&gt;Wang et al., &lt;em&gt;Diffusion-GAN: Training GANs with Diffusion&lt;/em&gt;, 2023&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Competing Risk Analysis</title><link>https://chaeniverse.github.io/blog/competing-risk-analysis/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/competing-risk-analysis/</guid><description>&lt;h2 id="competing-risk란"&gt;Competing Risk란&lt;/h2&gt;
&lt;p&gt;생존분석에서 &lt;strong&gt;관심 event 외에 다른 event가 있어 두 event가 서로의 발생 확률에 영향을 주는&lt;/strong&gt; 상황. 그래서 한 event가 다른 event의 변동을 일으킨다 → &amp;ldquo;경쟁 위험&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="직관-예시"&gt;직관 예시&lt;/h3&gt;
&lt;p&gt;술이 위암(A)의 원인이라고 하자. 술 먹는 사람은 위암 위험이 ↑.&lt;/p&gt;
&lt;p&gt;근데 술이 간암(A&amp;rsquo;)의 원인도 된다면? → 술 먹은 사람 중 어떤 이는 간암이 먼저 생기고, 어떤 이는 위암이 생긴다.&lt;/p&gt;
&lt;p&gt;간암 생긴 사람은 &lt;strong&gt;사망이라는 event가 먼저 발생&lt;/strong&gt; → 그 사람의 위암은 더 이상 관찰되지 않는다. 결과적으로 위암은 작게 측정되는 (감소하는) 방향으로 작동한다.&lt;/p&gt;
&lt;p&gt;이렇게 하나의 원인에 대해 다른 event가 경쟁적으로 작동해, &lt;strong&gt;A&amp;rsquo;(간암) event 때문에 A(위암) event가 변동되는&lt;/strong&gt; 게 competing risk이다.&lt;/p&gt;
&lt;h3 id="mgus--mm-코호트-예시"&gt;MGUS / MM 코호트 예시&lt;/h3&gt;
&lt;p&gt;MGUS 코호트에서 outcome이 (MM 발생, 사망, censored) 라고 하자.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관심 event: MM 발생 (event = 1)&lt;/li&gt;
&lt;li&gt;Competing risk: 사망 (사망으로 인해 MM outcome으로 갈 확률이 줄어드는 거니까)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="두-가지-처리-방법"&gt;두 가지 처리 방법&lt;/h2&gt;
&lt;h3 id="cause-specific-model"&gt;Cause-Specific Model&lt;/h3&gt;
&lt;p&gt;다른 event를 &lt;strong&gt;censored&lt;/strong&gt; 로 처리하고 관심 event에 대해 standard Cox 회귀를 적용. 진정한 인과적 효과 (cause-specific hazard) 를 본다.&lt;/p&gt;
&lt;h3 id="fine-gray-sub-distribution-model"&gt;Fine-Gray Sub-Distribution Model&lt;/h3&gt;
&lt;p&gt;다른 event 발생 시 &lt;strong&gt;추적 기간을 연구 종료일까지로 두고&lt;/strong&gt; sub-distribution hazard를 모델링. → &lt;strong&gt;Cumulative incidence plot (CIF)&lt;/strong&gt; 와 1:1 대응.&lt;/p&gt;
&lt;h2 id="어느-걸-쓰나"&gt;어느 걸 쓰나&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인과적 효과&lt;/strong&gt;를 보고 싶다 → cause-specific model이 더 적합&lt;/li&gt;
&lt;li&gt;그러나 &lt;strong&gt;실무에서는 Fine-Gray가 압도적으로 많이 쓰인다&lt;/strong&gt; — cumulative incidence plot과 직관적으로 매칭되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;
&lt;/em&gt; (Austin, Statistics in Medicine)&lt;/li&gt;
&lt;li&gt;출처:
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MCMC (Gibbs Sampling)</title><link>https://chaeniverse.github.io/blog/mcmc-gibbs-sampling/</link><pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mcmc-gibbs-sampling/</guid><description>&lt;h2 id="bayes-theorem-기초"&gt;Bayes&amp;rsquo; Theorem 기초&lt;/h2&gt;
$$P(a|b) = \frac{P(a \cap b)}{P(b)}$$$$P(b|a) = \frac{P(a \cap b)}{P(a)}$$$$P(a \cap b) = P(a)P(b|a)$$$$P(a|b) = \frac{P(a)P(b|a)}{P(b)} \quad (\text{where } P(b) \text{ is constant})$$$$P(a|b) \propto P(a)P(b|a) \quad (\text{using } \pi \text{ instead of } P)$$$$\pi(a|b) \propto \pi(a)\pi(b|a) \quad (\text{*이 식 알아두면 유용하다})$$&lt;h2 id="when-to-use-gibbs-sampling"&gt;When to Use Gibbs Sampling&lt;/h2&gt;
&lt;p&gt;그럼 이 Gibbs sampling이라는 게 언제 사용하는 건지 알아보자.&lt;/p&gt;
$$y_i|\mu,\sigma^2 \sim N(\mu,\sigma^2), \quad i=1,\dots,n$$&lt;p&gt;위의 분포에서 $\mu, \sigma^2$ 는 unknown parameter이고,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;frequentist 관점에서는 $\mu, \sigma^2$ 를 MLE로 고정시킨다.&lt;/li&gt;
&lt;li&gt;반면 베이지안들은 이 unknown parameter에 분포를 걸어놓고 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이때 사용하는 게 Gibbs sampling이다.&lt;/p&gt;
&lt;h2 id="posterior-distribution"&gt;Posterior Distribution&lt;/h2&gt;
&lt;p&gt;이 unknown parameter의 분포를 구하기 위해서는 다음과 같은 과정이 필요하다.&lt;/p&gt;
$$y_i|\mu,\sigma^2 \sim N(\mu,\sigma^2), \quad i=1,\dots,n$$$$P(\mu,\sigma^2|y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu,\sigma^2)$$$$P(\mu,\sigma^2|y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)P(\sigma^2) \quad (\mu \perp \sigma^2)$$$$\propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu) \quad (P(\sigma^2) \text{ known이므로 constant 취급})$$&lt;p&gt;이때 $P(\mu,\sigma^2|y_1,\dots,y_n)$ 는 posterior, $P(y_1,\dots,y_n|\mu,\sigma^2)$ 는 likelihood, $P(\mu)$ 는 prior 가 된다.&lt;/p&gt;
&lt;p&gt;여기서 보통 $P(\mu) \sim N(\mu_0, \sigma^2_0)$, $P(\sigma^2) \sim IG(a,b)$ 로 둔다. $\mu_0, \sigma^2_0, a, b$ 는 hyperparameter이고 내가 정하는 것이므로 prior라고 한다.&lt;/p&gt;
&lt;h2 id="의-조건부-분포-유도"&gt;$\mu$ 의 조건부 분포 유도&lt;/h2&gt;
$$P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)$$$$= \left(\frac{1}{\sqrt{2\pi\sigma^2}}\right)^n\prod_{i=1}^{n}\exp\left(-\frac{1}{2\sigma^2}(y_i-\mu)^2\right) \times \frac{1}{\sqrt{2\pi\sigma^2_0}}\exp\left(-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$&lt;p&gt;여기서 $\mu$ 만 변수이므로, $\mu$ 에 대한 거 아니면 모두 날아간다.&lt;/p&gt;
$$= \exp\left(-\frac{1}{2\sigma^2}\sum (y_i-\mu)^2-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$$$= \exp\left(-\frac{1}{2\sigma^2}\left(\sum y^2_i-2n\bar{y}\mu+n\mu^2\right)-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$$$= \exp\left(-\frac{1}{2}\left(\frac{\sum y_i^2-2n\bar{y}\mu+n\mu^2}{\sigma^2}+\frac{\mu^2-2\mu\mu_0+\mu^2_0}{\sigma_0^2}\right)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{\sigma^2_0n\mu^2+\sigma^2\mu^2-2\sigma^2_0n\bar{y}\mu-2\sigma^2\mu_0\mu}{\sigma^2\sigma^2_0}\right)$$&lt;p&gt;(이걸 $N(\circ,\square)$ 꼴로 만들어야 한다.)&lt;/p&gt;
$$= \exp\left(-\frac{1}{2}\cdot\frac{1}{\sigma^2\sigma^2_0}(\sigma^2_0n\mu^2+\sigma^2\mu^2-2(\sigma^2_0n\bar{y}+\sigma^2\mu_0)\mu)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{1}{\sigma^2\sigma^2_0}((\sigma^2_0n+\sigma^2)\mu^2-2(\sigma^2_0n\bar{y}+\sigma^2\mu_0)\mu)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{\sigma^2_0n+\sigma^2}{\sigma^2\sigma^2_0}\left(\mu^2-2\left(\frac{\sigma^2_0n\bar{y}+\sigma^2\mu_0}{\sigma^2_0n+\sigma^2}\right)\mu\right)\right)$$&lt;p&gt;따라서&lt;/p&gt;
$$\mathbf{E}(\mu|\sigma^2,\vec{y}) = \frac{\sigma^2_0n\bar{y}+\sigma^2\mu_0}{\sigma^2_0n+\sigma^2} = \frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}$$$$\mathrm{Var}(\mu|\sigma^2,\vec{y}) = \frac{\sigma^2\sigma^2_0}{\sigma^2_0n+\sigma^2} = \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}$$&lt;p&gt;따라서&lt;/p&gt;
$$\pi(\mu|\sigma^2,y) \sim N\left(\frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}},\ \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}\right)$$&lt;h2 id="의-조건부-분포-유도-1"&gt;$\sigma^2$ 의 조건부 분포 유도&lt;/h2&gt;
&lt;p&gt;마찬가지로, $\sigma^2$ 에 대한 posterior를 계산한다.&lt;/p&gt;
$$P(\sigma^2|\mu,y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)P(\sigma^2) \quad (\mu \perp \sigma^2)$$$$\propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\sigma^2) \quad (P(\mu) \text{ known} \to \text{상수 취급})$$&lt;p&gt;$P(\sigma^2) \sim IG(a,b)$ 이므로 다음과 같이 쓸 수 있다.&lt;/p&gt;
$$P(y_1,\dots,y_n|\mu,\sigma^2)P(\sigma^2) = \left(\frac{1}{\sqrt{2\pi\sigma^2}}\right)^n\prod_{i=1}^{n}\exp\left(-\frac{1}{2\sigma^2}(y_i-\mu)^2\right) \times (\sigma^2)^{-(a+1)}\exp\left(-\frac{b}{\sigma^2}\right)$$&lt;p&gt;(여기서 $\sigma^2$ 만 변수이므로, $\sigma^2$ 에 대한 거 아니면 모두 날아간다.)&lt;/p&gt;
$$= (2\pi\sigma^2)^{-\frac{n}{2}}\cdot (\sigma^2)^{-(a+1)}\cdot\exp\left(-\frac{1}{2\sigma^2}\sum(y_i-\mu)^2-\frac{b}{\sigma^2}\right)$$$$= (2\pi)^{-\frac{n}{2}}\cdot(\sigma^2)^{-\frac{n}{2}}\cdot(\sigma^2)^{-(a+1)}\cdot\exp\left(-\frac{1}{\sigma^2}\left(\frac{\sum(y_i-\mu)^2}{2}+b\right)\right)$$&lt;p&gt;(이걸 $IG(\circ,\square)$ 꼴로 만든다.)&lt;/p&gt;
$$= (\sigma^2)^{-(a+\frac{n}{2}+1)}\cdot\exp\left(-\frac{\dfrac{\sum(y_i-\mu)^2}{2}+b}{\sigma^2}\right)$$&lt;p&gt;따라서&lt;/p&gt;
$$\pi(\sigma^2|\mu,\vec{y}) \sim IG\left(a+\frac{n}{2},\ b+\frac{\sum(y_i-\mu)^2}{2}\right)$$&lt;h2 id="사후-분포-정리"&gt;사후 분포 정리&lt;/h2&gt;
&lt;p&gt;이런 식으로 $\mu, \sigma^2$ 에 대한 posterior를 구하면 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
$$\pi(\mu|\sigma^2,\vec{y})\sim N\left(\frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}},\ \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}\right)$$&lt;p&gt;($\sigma^2$ 은 모르니까 처음에는 1을 넣어준다.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
$$\pi(\sigma^2|\mu,\vec{y})\sim IG\left(a+\frac{n}{2},\ b+\frac{\sum(y_i-\mu)^2}{2}\right)$$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;여기서 $\mu_0, \sigma^2_0, a, b$ 는 hyperparameter다.&lt;/p&gt;
&lt;h2 id="gibbs-sampling-알고리즘"&gt;Gibbs Sampling 알고리즘&lt;/h2&gt;
&lt;p&gt;이제 1에서 $\mu$ 하나 뽑는다 ($\to \mu^{(1)}$ 추출).&lt;/p&gt;
&lt;p&gt;그리고 나서, 2에 $\mu^{(1)}$ 을 넣어 $\sigma^2$ 을 뽑는다 ($\to \sigma^{2(1)}$).&lt;/p&gt;
&lt;p&gt;그 다음에, 1에 $\sigma^{2(1)}$ 을 넣어 $\mu^{(2)}$ 를 뽑는다.&lt;/p&gt;
&lt;p&gt;다시 2에 $\mu^{(2)}$ 를 넣고 $\sigma^{2(2)}$ 을 뽑는다.&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;이런 식으로 총 2만 번 sampling한다.&lt;/p&gt;
&lt;p&gt;초기값의 영향을 받을 수 있기 때문에 그 중 앞의 만 개는 버리고, 뒤의 만 개를 갖고 근사화된 분포를 구한다. 그러면 원래 joint distribution과 비슷한 분포를 얻게 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Newton-Raphson Method &amp; Gradient Method</title><link>https://chaeniverse.github.io/blog/newton-raphson-gradient/</link><pubDate>Fri, 27 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/newton-raphson-gradient/</guid><description>&lt;p&gt;곡선의 접선을 그리고, 그 접선이 알려주는 방향으로 한 걸음씩 옮겨가며 해 (또는 극점) 에 가까워지는 두 가지 반복적인 방법을 정리한다. 같은 예제 $y = x^2$ 로 비교한다.&lt;/p&gt;
&lt;h2 id="newton-raphson-method"&gt;Newton-Raphson Method&lt;/h2&gt;
&lt;p&gt;방정식 $f(x) = 0$ 의 해를 구하는 방법. 현재 위치 $x_n$ 에서 곡선의 &lt;strong&gt;접선&lt;/strong&gt;을 그리고, 그 접선이 $x$ 축과 만나는 점을 다음 위치 $x_{n+1}$ 로 삼는다.&lt;/p&gt;
&lt;p&gt;접선의 식:&lt;/p&gt;
$$y = f(x_n) + f'(x_n)(x - x_n)$$&lt;p&gt;이 직선이 $y=0$ 이 되는 $x$ 를 풀면&lt;/p&gt;
$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$&lt;h3 id="예제"&gt;예제: $y = x^2$&lt;/h3&gt;
&lt;p&gt;$f(x) = x^2$, $f'(x) = 2x$ 이므로&lt;/p&gt;
$$x_{n+1} = x_n - \frac{x_n^2}{2x_n} = x_n - \frac{x_n}{2} = \frac{x_n}{2}$$&lt;p&gt;$x_0 = 8$ 부터 시작하면 $x_1 = 4, x_2 = 2, x_3 = 1, \dots$ 매 step마다 절반으로 줄어들며 해 $x^* = 0$ 에 접근한다. (그림에서 $x_0 \to x_1 \to x_2 \to \dots \to x^*$)&lt;/p&gt;
&lt;h2 id="gradient-method"&gt;Gradient Method&lt;/h2&gt;
&lt;p&gt;함수 $f(x)$ 의 &lt;strong&gt;극점(보통 최솟값)&lt;/strong&gt; 을 찾는 방법. 현재 위치 $x_n$ 에서 그래디언트(도함수)의 반대 방향으로 step size $\alpha$ 만큼 이동한다.&lt;/p&gt;
$$x_{n+1} = x_n - \alpha \cdot f'(x_n)$$&lt;p&gt;여기서 $\alpha$ 는 한 번에 너무 크게 이동하는 것을 방지하기 위한 &lt;strong&gt;하이퍼파라미터&lt;/strong&gt; (learning rate / step size). 이 $\alpha$ 를 어떻게 적응적으로 조절하느냐가 &lt;strong&gt;AdaGrad, Adam&lt;/strong&gt; 같은 옵티마이저 변종의 핵심.&lt;/p&gt;
&lt;h3 id="예제-1"&gt;예제: $y = x^2$&lt;/h3&gt;
&lt;p&gt;$f'(x) = 2x$, $\alpha = 0.1$ 이라고 하자. $x^{(1)} = 5$ 부터 시작하면&lt;/p&gt;
$$x^{(2)} = 5 - 0.1 \cdot 2 \cdot 5 = 5 - 1 = 4$$$$x^{(3)} = 4 - 0.1 \cdot 2 \cdot 4 = 4 - 0.8 = 3.2$$$$\vdots$$&lt;p&gt;일반화하면&lt;/p&gt;
$$x^{(i+1)} = x^{(i)} - \alpha \cdot f'(x^{(i)})$$&lt;p&gt;매 step마다 $x$ 가 $0.8$ 배씩 (= $1 - 2\alpha$) 줄어들며 $x^* = 0$ 에 접근한다.&lt;/p&gt;
&lt;h2 id="두-방법-비교"&gt;두 방법 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Newton-Raphson&lt;/th&gt;
&lt;th&gt;Gradient Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;$f(x) = 0$ (해 찾기)&lt;/td&gt;
&lt;td&gt;$\min f(x)$ (극점 찾기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업데이트&lt;/td&gt;
&lt;td&gt;$x_{n+1} = x_n - f(x_n)/f'(x_n)$&lt;/td&gt;
&lt;td&gt;$x_{n+1} = x_n - \alpha \cdot f'(x_n)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;step size&lt;/td&gt;
&lt;td&gt;자동 (도함수 비)&lt;/td&gt;
&lt;td&gt;수동 (하이퍼파라미터 $\alpha$)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;필요 정보&lt;/td&gt;
&lt;td&gt;$f, f'$&lt;/td&gt;
&lt;td&gt;$f'$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수렴 속도&lt;/td&gt;
&lt;td&gt;보통 빠름 (이차 수렴)&lt;/td&gt;
&lt;td&gt;$\alpha$에 의존 (보통 일차)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;참고: 최적화 맥락에서 Newton&amp;rsquo;s method (&amp;ldquo;Newton&amp;rsquo;s optimization&amp;rdquo;) 는 $f'(x) = 0$ 의 해를 Newton-Raphson으로 찾는 것이라 $x_{n+1} = x_n - f'(x_n)/f''(x_n)$ 형태가 된다. 이때는 2차 도함수 $f''$ 가 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Importance Sampling</title><link>https://chaeniverse.github.io/blog/importance-sampling/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/importance-sampling/</guid><description>&lt;h2 id="monte-carlo"&gt;Monte Carlo&lt;/h2&gt;
&lt;p&gt;기댓값을 계산하는 방법. $X \sim f(x)$ 일 때 $g(X)$ 의 기댓값은 다음 세 가지 형태로 동치다.&lt;/p&gt;
$$\underbrace{E[g(X)]}_{\text{①}} \;=\; \underbrace{\int g(x) f(x)\,dx}_{\text{②}} \;\approx\; \underbrace{\frac{1}{n}\sum_{i=1}^{n} g(x_i)}_{\text{③}}$$&lt;p&gt;①, ②는 정의상 같고, ③은 $f$ 에서 뽑은 샘플 $\{x_i\}$ 의 평균으로 ②를 근사한 것 (대수의 법칙).&lt;/p&gt;
&lt;h3 id="예제-1-단순-mc"&gt;예제 1: 단순 MC&lt;/h3&gt;
&lt;p&gt;$g(x) = e^{-2x}$, $X \sim \mathrm{Unif}(0,1)$ 일 때 $E[g(X)]$ 을 구하라.&lt;/p&gt;
&lt;p&gt;이때 $f(x) = 1$ (Unif(0,1) 의 밀도)이므로&lt;/p&gt;
$$E[g(X)] = \int_0^1 e^{-2x}\,dx \;\approx\; \frac{1}{N}\sum_{i=1}^{N} e^{-2 x_i}, \qquad x_i \sim \mathrm{Unif}(0,1)$$&lt;p&gt;균등 분포에서 $N$ 개를 뽑아 $g$ 에 넣고 평균을 내면 끝.&lt;/p&gt;
&lt;h2 id="importance-sampling"&gt;Importance Sampling&lt;/h2&gt;
&lt;p&gt;문제는 다음 두 경우다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$f(x)$ 에서 샘플링이 어렵다.&lt;/strong&gt; 닫힌 형태로 sampling이 안 되는 분포.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$g(x) \cdot f(x)$ 가 $f$ 의 꼬리/희소 영역에 몰려 있다.&lt;/strong&gt; $f$ 에서 뽑은 대부분의 샘플이 $g \cdot f$ 가 큰 영역을 못 맞춰서 분산이 매우 커진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이럴 때는 다른 분포 $\phi(x)$ (&amp;ldquo;proposal&amp;rdquo; 또는 &amp;ldquo;importance distribution&amp;rdquo;)에서 샘플을 뽑고 가중치로 보정한다. 핵심 항등식:&lt;/p&gt;
$$E_f[g(X)] = \int g(x) f(x)\,dx = \int g(x) \cdot \frac{f(x)}{\phi(x)} \cdot \phi(x)\,dx = E_\phi\!\left[g(X) \cdot \frac{f(X)}{\phi(X)}\right]$$&lt;p&gt;→ $\phi$ 에서 샘플 $\{x_i\}$ 을 뽑고&lt;/p&gt;
$$E_f[g(X)] \;\approx\; \frac{1}{N}\sum_{i=1}^{N} g(x_i) \cdot \underbrace{\frac{f(x_i)}{\phi(x_i)}}_{\text{weight}}$$&lt;p&gt;여기서 $f(x)/\phi(x)$ 가 &lt;strong&gt;importance weight&lt;/strong&gt;. (이 가중치 때문에 &amp;ldquo;importance&amp;rdquo; sampling이라는 이름이 붙은 것)&lt;/p&gt;
&lt;h2 id="예제-2"&gt;예제 2: $\int (x-1)(x-2)\,dx$&lt;/h2&gt;
&lt;p&gt;이 식은 따로 정해진 $f(x)$ 가 없다 (단순 적분). $\phi(x) \sim \mathrm{Exp}(1)$, 즉 $\phi(x) = e^{-x}$ ($x&gt;0$) 를 proposal로 쓰자.&lt;/p&gt;
$$\int (x-1)(x-2)\,dx = \int \underbrace{\frac{(x-1)(x-2)}{e^{-x}}}_{\text{new } g(x)} \cdot \underbrace{e^{-x}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim \mathrm{Exp}(1)$ 에서 $N$ 개를 뽑아 새 $g$ 에 넣고 평균:&lt;/p&gt;
$$\widehat{E[g(X)]} = \frac{1}{N}\sum_{i=1}^{N} \frac{(x_i-1)(x_i-2)}{e^{-x_i}}, \qquad x_i \sim \mathrm{Exp}(1)$$&lt;h2 id="예제-3--with--proposal"&gt;예제 3: $\int e^{-|x|}\,dx$ with $N(0,1)$ proposal&lt;/h2&gt;
&lt;p&gt;$\phi(x) \sim N(0,1)$, 즉 $\phi(x) = \dfrac{1}{\sqrt{2\pi}} e^{-x^2/2}$ 를 쓰자.&lt;/p&gt;
$$\int e^{-|x|}\,dx = \int \underbrace{\frac{e^{-|x|}}{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}}_{\text{new } g(x)} \cdot \underbrace{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim N(0,1)$ 에서 $N$ 개 sampling 후 새 $g$ 에 넣어 평균을 구하면 된다.&lt;/p&gt;
&lt;h2 id="왜--을-proposal로-골랐나"&gt;왜 $N(0,1)$ 을 proposal로 골랐나&lt;/h2&gt;
&lt;p&gt;원래의 $g(x) = e^{-|x|}$ 는 0 근처에 봉우리가 있는 양옆 대칭 함수다. $\phi(x) \sim N(0,1)$ 도 비슷한 모양 — 0 근처에 봉우리, 양쪽으로 빠르게 감소.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;proposal $\phi(x)$ 를 $|g(x) f(x)|$ 와 모양이 비슷하게 잡으면 분산이 작아져 효율이 좋다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;만약 $\phi$ 가 $|g \cdot f|$ 가 큰 영역을 거의 안 덮으면, 거의 모든 샘플의 weight $f(x)/\phi(x)$ 가 0 근처가 되고, 가끔 한 샘플의 weight가 매우 커져서 추정량의 분산이 폭발한다.&lt;/p&gt;
&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;샘플링은 $\phi$ 에서, 평균은 weight $f/\phi$ 로 보정.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Proposal $\phi$ 의 모양을 신경써서 고를수록 추정량의 분산이 작아진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>가능도비 검정 (Likelihood Ratio Test)</title><link>https://chaeniverse.github.io/blog/likelihood-ratio-test/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/likelihood-ratio-test/</guid><description>&lt;h2 id="lr-검정-likelihood-ratio-test"&gt;LR 검정 (Likelihood Ratio Test)&lt;/h2&gt;
&lt;p&gt;간단히 말하면, &lt;strong&gt;자료가 귀무가설보다 대립가설의 영역에서 나왔을 가능성&lt;/strong&gt;을 비교하는 검정이다.&lt;/p&gt;
&lt;p&gt;검정 통계량은&lt;/p&gt;
$$\lambda \;=\; \frac{L(\hat{\Omega}_0)}{L(\hat{\Omega})} \;=\; \frac{\displaystyle \max_{\theta \in \Omega_0} L(\theta)}{\displaystyle \max_{\theta \in \Omega} L(\theta)}$$&lt;p&gt;즉 &lt;strong&gt;(H₀ 하에서 가능도함수의 max) ÷ (전체 모수공간에서 가능도함수의 max)&lt;/strong&gt; 이다.&lt;/p&gt;
&lt;p&gt;분자가 분모의 일부이므로 항상 $0 &lt; \lambda \le 1$ 이고, 이를 다시 쓰면&lt;/p&gt;
$$\lambda \;=\; \frac{L(\hat{\Omega}_0)}{\max\{L(\hat{\Omega}_0),\, L(\hat{\Omega}_1)\}} \;=\; \frac{1}{\max\Big\{1,\; \dfrac{L(\hat{\Omega}_1)}{L(\hat{\Omega}_0)}\Big\}}$$&lt;h2 id="기각역의-의미"&gt;기각역의 의미&lt;/h2&gt;
&lt;p&gt;LRT의 기각역은 $\lambda \le \lambda_0$ 형태인데, 위 식을 뒤집으면 결국&lt;/p&gt;
$$\frac{L(\hat{\Omega}_1)}{L(\hat{\Omega}_0)} \;\ge\; c$$&lt;p&gt;인 영역이다. 이 영역에서는 자료가 H₀ 보다 H₁ 에서 나왔을 가능성이 더 높다는 뜻이므로, &lt;strong&gt;H₀를 기각하는 게 타당하다&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="예제-정규모형의-평균-검정"&gt;예제: 정규모형의 평균 검정&lt;/h2&gt;
&lt;p&gt;$X_1, \dots, X_n \sim N(\mu, \sigma^2)$ 일 때,&lt;/p&gt;
$$H_0:\ \mu = 0,\ \sigma^2 &gt; 0 \quad \text{vs.} \quad H_1:\ \mu \neq 0,\ \sigma^2 &gt; 0$$&lt;p&gt;에 대한 크기 $\alpha$ 의 LRT를 유도해보자.&lt;/p&gt;
&lt;h3 id="1-mle-계산"&gt;1) MLE 계산&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;전체 모수공간&lt;/strong&gt; $\Omega$ 에서 MLE는&lt;/p&gt;
$$\hat{\mu} = \bar{x}, \qquad \hat{\sigma}^2 = \frac{1}{n}\sum_{i=1}^n (x_i - \bar{x})^2$$&lt;p&gt;따라서&lt;/p&gt;
$$L(\hat{\Omega}) = (2\pi\hat{\sigma}^2)^{-n/2} \exp(-n/2)$$&lt;p&gt;&lt;strong&gt;Under $H_0$&lt;/strong&gt; 에서는 $\mu = 0$ 으로 강제되므로&lt;/p&gt;
$$\hat{\mu}_0 = 0, \qquad \hat{\sigma}^2_0 = \frac{1}{n}\sum_{i=1}^n x_i^2$$&lt;p&gt;따라서&lt;/p&gt;
$$L(\hat{\Omega}_0) = (2\pi\hat{\sigma}^2_0)^{-n/2} \exp(-n/2)$$&lt;h3 id="2--단순화"&gt;2) $\lambda$ 단순화&lt;/h3&gt;
$$\lambda = \frac{L(\hat{\Omega}_0)}{L(\hat{\Omega})}
= \frac{(2\pi\hat{\sigma}^2_0)^{-n/2}\,\exp(-n/2)}{(2\pi\hat{\sigma}^2)^{-n/2}\,\exp(-n/2)}
= \left(\frac{\hat{\sigma}^2_0}{\hat{\sigma}^2}\right)^{-n/2}$$&lt;p&gt;기각 조건 $\lambda \le \lambda_0$ ($0 &lt; \lambda_0 &lt; 1$)는&lt;/p&gt;
$$\left(\frac{\hat{\sigma}^2_0}{\hat{\sigma}^2}\right)^{-n/2} \le \lambda_0
\quad\Longleftrightarrow\quad \frac{\hat{\sigma}^2_0}{\hat{\sigma}^2} \ge k$$&lt;h3 id="3--와--의-관계"&gt;3) $\hat{\sigma}^2_0$ 와 $\hat{\sigma}^2$ 의 관계&lt;/h3&gt;
&lt;p&gt;$\sum x_i^2 = \sum (x_i - \bar{x})^2 + n\bar{x}^2$ 항등식을 쓰면&lt;/p&gt;
$$n\hat{\sigma}^2_0 = \sum x_i^2 = \sum(x_i - \bar{x})^2 + n\bar{x}^2 = n\hat{\sigma}^2 + n\bar{x}^2$$&lt;p&gt;따라서&lt;/p&gt;
$$\hat{\sigma}^2_0 = \hat{\sigma}^2 + \bar{x}^2$$&lt;h3 id="4-t-통계량-형태로-변환"&gt;4) t-통계량 형태로 변환&lt;/h3&gt;
&lt;p&gt;$\hat{\sigma}^2_0 / \hat{\sigma}^2 \ge k$ 에 대입하면&lt;/p&gt;
$$\frac{\hat{\sigma}^2 + \bar{x}^2}{\hat{\sigma}^2} = 1 + \frac{\bar{x}^2}{\hat{\sigma}^2} \;\ge\; k
\quad\Longleftrightarrow\quad \frac{\bar{x}^2}{\hat{\sigma}^2} \;\ge\; k - 1
\quad\Longleftrightarrow\quad \frac{|\bar{x}|}{\hat{\sigma}} \;\ge\; k_2$$&lt;p&gt;이제 표본분산 $s^2 = \dfrac{1}{n-1}\sum (x_i - \bar{x})^2$ 와의 관계를 쓰면&lt;/p&gt;
$$n\hat{\sigma}^2 = (n-1)s^2 \quad\Longrightarrow\quad \hat{\sigma} = s\sqrt{\frac{n-1}{n}}$$&lt;p&gt;이를 대입해 정리하면 결국&lt;/p&gt;
$$\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \;\ge\; c$$&lt;p&gt;즉 t-통계량의 절댓값이 어떤 임계값 $c$ 이상인 영역이 기각역이다.&lt;/p&gt;
&lt;h3 id="5-크기--조건으로--결정"&gt;5) 크기 $\alpha$ 조건으로 $c$ 결정&lt;/h3&gt;
$$\alpha = \max_{\Omega_0} P\!\left(\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge c\right)
= P\!\left(\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge c \;\Big|\; \mu = 0\right)
= P\big(|t| \ge c\big), \quad t \sim t(n-1)$$&lt;p&gt;이로부터&lt;/p&gt;
$$c = t_{\alpha/2}(n-1)$$&lt;h3 id="6-결론"&gt;6) 결론&lt;/h3&gt;
&lt;p&gt;크기 $\alpha$ LRT의 검정 기각역은&lt;/p&gt;
$$C = \left\{(x_1, \dots, x_n) \;\Big|\; \left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge t_{\alpha/2}(n-1)\right\}$$&lt;p&gt;→ 익숙한 &lt;strong&gt;단일표본 양측 t-검정&lt;/strong&gt;과 정확히 같다. 즉 정규모형 평균에 대한 LRT는 t-검정으로 자연스럽게 환원된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Inverse Sampling</title><link>https://chaeniverse.github.io/blog/inverse-sampling/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/inverse-sampling/</guid><description>&lt;h2 id="inverse-sampling"&gt;Inverse Sampling&lt;/h2&gt;
&lt;p&gt;분포 $f(x)$ 에서 직접 샘플링하기 어려울 때 쓰는 기법. CDF의 역함수 $F^{-1}$ 과 균등 분포만 있으면 어떤 분포든 (이론적으로는) 뽑을 수 있다.&lt;/p&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;$f(x)$ 의 CDF $F(x) = \displaystyle\int_{-\infty}^{x} f(t)\,dt$ 를 구한다.&lt;/li&gt;
&lt;li&gt;$F$ 의 역함수 $F^{-1}$ 을 구한다.&lt;/li&gt;
&lt;li&gt;균등 분포에서 $u \sim \mathrm{Unif}(0,1)$ 을 뽑는다.&lt;/li&gt;
&lt;li&gt;$x = F^{-1}(u)$ 로 변환하면 $x \sim f(x)$ 이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;샘플링한 $u$ 들을 $F^{-1}$ 에 넣은 후 히스토그램으로 그리면 $f(x)$ 의 분포에 근사한다.&lt;/p&gt;
&lt;h2 id="왜-동작하나-간단-증명"&gt;왜 동작하나 (간단 증명)&lt;/h2&gt;
&lt;p&gt;$U \sim \mathrm{Unif}(0,1)$ 이라 하자. $X = F^{-1}(U)$ 의 CDF를 계산하면&lt;/p&gt;
$$P(X \le x) = P(F^{-1}(U) \le x) = P(U \le F(x)) = F(x)$$&lt;p&gt;마지막 등호는 $U$ 가 $[0,1]$ 균등 분포이기 때문 ($P(U \le t) = t$). 즉 $X$ 의 CDF가 $F$ 와 같으므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="기하학적-직관"&gt;기하학적 직관&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 한쪽으로 치우친 분포라고 하자 (예: $0$ 근처에 mass가 몰린 감소하는 밀도).&lt;/li&gt;
&lt;li&gt;$F^{-1}$ 은 $u$-축의 균등한 구간을 $x$-축의 &lt;strong&gt;불균등한 구간&lt;/strong&gt;으로 매핑한다.
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 큰 영역 → $F$ 가 가파르게 증가 → $F^{-1}$ 은 완만 → 좁은 $x$ 구간이 넓은 $u$ 구간에 대응&lt;/li&gt;
&lt;li&gt;$f(x)$ 가 작은 영역 → $F$ 가 느리게 증가 → $F^{-1}$ 은 가파름 → 넓은 $x$ 구간이 좁은 $u$ 구간에 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 균등 분포 $u$ 를 뽑아 $F^{-1}$ 에 넣으면, &lt;strong&gt;밀도가 높은 $x$ 영역에는 많은 샘플이, 낮은 영역에는 적은 샘플이&lt;/strong&gt; 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예: $u$ 를 10개 뽑아 $F^{-1}$ 에 넣으면, 결과 히스토그램이 원본 $f(x)$ 와 닮아간다.&lt;/p&gt;
&lt;h2 id="한계"&gt;한계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$F^{-1}$ 을 닫힌 형태로 구할 수 있어야 깔끔하게 쓸 수 있다 (지수, 균등, 로지스틱 등).&lt;/li&gt;
&lt;li&gt;닫힌 형태 $F^{-1}$ 이 없거나 다변량으로 확장하기 어려울 때는 &lt;strong&gt;Rejection sampling&lt;/strong&gt;, &lt;strong&gt;MCMC&lt;/strong&gt; (Gibbs, Metropolis-Hastings) 등 다른 기법을 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Permutation Test</title><link>https://chaeniverse.github.io/blog/permutation-test/</link><pubDate>Thu, 03 Nov 2022 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/permutation-test/</guid><description>&lt;h2 id="permutation-test"&gt;Permutation Test&lt;/h2&gt;
&lt;p&gt;Permutation test는 &lt;strong&gt;비모수(nonparametric) 가설 검정&lt;/strong&gt; 방법이다. 표본 크기가 작거나 데이터가 정규분포를 따르지 않을 때 사용한다. 특히 표본 수가 제한적인 genomic 데이터 분석 등에서 유용하다.&lt;/p&gt;
&lt;h2 id="핵심-아이디어"&gt;핵심 아이디어&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;가정.&lt;/strong&gt; 두 표본이 &lt;strong&gt;같은 모집단 분포&lt;/strong&gt;에서 왔다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;논리.&lt;/strong&gt; 만약 이 가정이 맞다면, 데이터를 무작위로 섞어도 분포는 같아야 한다. 즉, 라벨(어느 그룹 소속인지)은 사실상 의미가 없다.&lt;/p&gt;
&lt;p&gt;→ 그래서 &lt;strong&gt;라벨을 섞어서 검정 통계량을 다시 계산&lt;/strong&gt;해도, 원래 관측한 값과 비슷한 분포가 나와야 한다. 이 분포로부터 멀리 떨어져 있다면 가정이 틀렸다고(=두 그룹이 다른 분포에서 왔다고) 결론낼 수 있다.&lt;/p&gt;
&lt;h2 id="절차"&gt;절차&lt;/h2&gt;
&lt;p&gt;두 그룹의 평균 차 (test statistic) 가 $T_{\text{obs}} = 9.33$ 으로 관측되었다고 하자. 표본이 작고 비정규라 모수 검정은 못 쓰는 상황이다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;두 그룹 데이터를 합친 뒤 &lt;strong&gt;무작위로 섞는다 (약 1,000회 반복)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;각 permutation마다 평균 차 $T^{(b)}$ 를 계산한다 ($b = 1, \dots, B$).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\{T^{(b)}\}$ 의 히스토그램을 그린다 — 이게 귀무가설 하의 경험적 분포다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;관측값보다 더 극단적인 permutation 개수를 센다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;p-value 계산:&lt;/p&gt;
$$p = \frac{\#\{b : T^{(b)} \ge T_{\text{obs}}\}}{B}$$&lt;p&gt;(단측 검정의 경우. 양측이면 절댓값 기준으로 비교)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="해석"&gt;해석&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관측값 $T_{\text{obs}}$ 가 permutation 분포의 &lt;strong&gt;꼬리 끝&lt;/strong&gt;에 있으면 → 두 그룹이 다른 분포에서 왔다는 강력한 증거.&lt;/li&gt;
&lt;li&gt;관측값이 분포의 &lt;strong&gt;중앙 근처&lt;/strong&gt;에 있으면 → 두 그룹이 같은 모집단에서 왔다고 봐도 무방.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;더 작은지&amp;quot;를 검정하는 단측 검정이라면 부등호 방향만 뒤집어 카운트.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="왜-좋은가"&gt;왜 좋은가&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;모수 가정 (정규성, 등분산 등) 없이 동작한다.&lt;/li&gt;
&lt;li&gt;표본 수가 작아서 점근 이론을 못 쓰는 상황에서도 유효하다.&lt;/li&gt;
&lt;li&gt;검정 통계량을 자유롭게 정의할 수 있다 (평균 차, 중앙값 차, 상관 계수 등 무엇이든).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;대신 계산량이 크다 — $B$ 를 충분히 크게 해야 p-value의 정밀도이 나온다 (예: $B=1{,}000$ 이면 p-value 정밀도은 0.001).&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;p&gt;참고:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Rao–Blackwell Theorem</title><link>https://chaeniverse.github.io/blog/rao-blackwell-theorem/</link><pubDate>Mon, 31 Oct 2022 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/rao-blackwell-theorem/</guid><description>&lt;h2 id="raoblackwell-theorem"&gt;Rao–Blackwell Theorem&lt;/h2&gt;
&lt;p&gt;$g(\theta)$ 를 모수의 함수, 그리고&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$S$ : sufficient statistic&lt;/li&gt;
&lt;li&gt;$T$ : $g(\theta)$ 의 unbiased estimator (u.e.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;라 하자. 이때&lt;/p&gt;
$$f(S) \;=\; E(T(X) \mid S) \;=\; E(T \mid S)$$&lt;p&gt;는 $g(\theta)$ 에 의존하지 않는 &lt;strong&gt;통계량&lt;/strong&gt;이며, $f(S)$ 도 역시 $g(\theta)$ 의 비편향추정량이다.&lt;/p&gt;
&lt;p&gt;(여기서 $f(S)$ 의 정의가 $\theta$ 에 의존하지 않는다 — $S$ 가 sufficient이기 때문에 $T \mid S$ 의 분포가 $\theta$ 와 무관해서, 조건부 기댓값도 $\theta$ 와 무관하다.)&lt;/p&gt;
&lt;p&gt;또한 모든 $\theta$ 에 대하여 다음이 성립한다.&lt;/p&gt;
$$\mathrm{Var}(f(S)) \;\le\; \mathrm{Var}(T(X)) \tag{1}$$&lt;p&gt;따라서 $f(S)$ 는 &lt;strong&gt;MVUE 가 될 후보&lt;/strong&gt;가 된다.&lt;/p&gt;
&lt;p&gt;이제 (1)을 증명하자.&lt;/p&gt;
&lt;h2 id="증명"&gt;증명&lt;/h2&gt;
&lt;p&gt;먼저 $f(S)$ 가 비편향임을 확인:&lt;/p&gt;
$$E(f(S)) = E\big(E(T(X) \mid S)\big) = E(T(X)) = g(\theta) \quad \text{(이중기댓값 정리)}$$&lt;p&gt;이제 $\mathrm{Var}(T(X))$ 를 전개한다. $E(f(S)) = g(\theta)$ 이고 $E(T(X)) = g(\theta)$ 이므로&lt;/p&gt;
$$\mathrm{Var}(T(X)) = E\big[T(X) - E(f(S))\big]^2$$&lt;p&gt;$T(X)$ 와 $E(f(S))$ 사이에 $f(S)$ 를 더하고 빼서 분리한다 ($+f(S) - f(S)$):&lt;/p&gt;
$$= E\big[(T(X) - f(S)) + (f(S) - E(f(S)))\big]^2$$&lt;p&gt;제곱을 전개하면&lt;/p&gt;
$$= \underbrace{E\big[T(X) - f(S)\big]^2}_{\text{(I)}} \;+\; 2\underbrace{E\big[(T(X) - f(S))(f(S) - E(f(S)))\big]}_{(\star)} \;+\; \underbrace{E\big[f(S) - E(f(S))\big]^2}_{=\,\mathrm{Var}(f(S))}$$&lt;h3 id="핵심-교차항"&gt;핵심: 교차항 $(\star) = 0$&lt;/h3&gt;
$$(\star) = E\big[(T(X) - f(S))(f(S) - E(f(S)))\big]
= E\Big[\,E\big[(T(X) - f(S))(f(S) - E(f(S))) \,\big|\, S\big]\,\Big]$$&lt;p&gt;조건부 안에서 $f(S)$ 와 $E(f(S))$ 는 $S$ 에 대해 상수처럼 다룰 수 있으므로 (전자는 $S$ 의 함수, 후자는 그냥 상수)&lt;/p&gt;
$$= E\Big[\,(f(S) - E(f(S))) \cdot E\big[T(X) - f(S) \,\big|\, S\big]\,\Big]$$&lt;p&gt;내부 조건부 기댓값을 분리하면&lt;/p&gt;
$$E\big[T(X) - f(S) \,\big|\, S\big] = E(T(X) \mid S) - E(f(S) \mid S) = f(S) - f(S) = 0$$&lt;p&gt;(첫 항은 $f(S)$ 의 정의 자체이고, 둘째 항은 $f(S)$ 가 $S$ 의 함수라 $E(f(S) \mid S) = f(S)$.)&lt;/p&gt;
&lt;p&gt;따라서 $(\star) = 0$.&lt;/p&gt;
&lt;h3 id="결론"&gt;결론&lt;/h3&gt;
$$\mathrm{Var}(T(X)) = E[T(X) - f(S)]^2 + \mathrm{Var}(f(S)) \;\ge\; \mathrm{Var}(f(S))$$&lt;p&gt;$E[T(X) - f(S)]^2 \ge 0$ 이므로&lt;/p&gt;
$$\mathrm{Var}(f(S)) \le \mathrm{Var}(T(X)) \qquad \blacksquare$$&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;충분통계량으로 조건부 기댓값을 취하면, 비편향성을 유지하면서 분산이 감소한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 때문에 MVUE를 찾을 때는 어떤 비편향추정량을 가지고 시작하든 sufficient statistic으로 Rao–Blackwell화 (Rao–Blackwellize)하는 것이 유리하다. 단, 이렇게 얻은 $f(S)$ 가 &lt;strong&gt;유일한 MVUE&lt;/strong&gt;라고 결론지으려면 $S$ 의 &lt;strong&gt;완비성 (completeness)&lt;/strong&gt; 이 추가로 필요하며, 이것이 Lehmann–Scheffé 정리로 이어진다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>