EIV Regression: A Least Squares Solution

직교 최소제곱의 기하학적 동기, 유도, OLS와의 비교 — Casella §12.2.2

설명변수에 측정오차가 있을 때 통상 OLS 대신 직교 최소제곱(Orthogonal/Total Least Squares)을 사용하는 이유와 해의 유도 과정을 상세히 다룬다. 수직 거리 vs 직교 거리의 기하학적 차이, 목적함수의 단계별 최소화, OLS·역OLS·직교LS 세 직선의 관계를 Casella & Berger §12.2.2 기반으로 전개한다.

Statistics
Regression
저자

Kwangmin Kim

공개

2026년 04월 07일

1 이 포스트의 위치

EIV 모형 개요에서 측정오차 모형의 정의, Functional/Structural 구분, 감쇠 편향을 다루었다. 이 포스트는 그중 최소제곱 해법(Casella & Berger, 2002, §12.2.2)을 단계별로 유도한다.

핵심 질문: \(X\) 에도 오차가 있을 때, “최적의 직선”을 어떤 기준으로 찾아야 하는가?


2 수직 거리 vs 직교 거리

2.1 OLS가 최소화하는 것

통상 OLS는 관측점 \((x_i, y_i)\) 에서 직선 \(y = a + bx\) 까지의 수직 거리(vertical distance)를 최소화한다:

\[ \min_{a, b} \sum_{i=1}^{n} (y_i - a - bx_i)^2 \]

이 목적함수는 “\(x_i\) 는 정확하고, \(y_i\) 만 오차를 가진다”는 가정을 암묵적으로 반영한다. 수직 거리는 \(y\) 방향의 편차만 측정하기 때문이다 (Casella & Berger, 2002, §12.2.2).

2.2 EIV에서 수직 거리가 부적절한 이유

\(X_i = \xi_i + \delta_i\) 이므로 \(x_i\) 도 참값 \(\xi_i\) 에서 벗어나 있다. 수직 거리를 최소화하면 \(x\) 의 오차를 완전히 무시하게 되어, 감쇠 편향(attenuation bias)이 발생한다.

해결책: \(x\)\(y\) 를 대등하게 취급하는 직교 거리(orthogonal distance)를 최소화한다. 이를 전체 최소제곱(Total Least Squares, TLS) 또는 직교 최소제곱(Orthogonal Least Squares)이라 한다.


3 직교 거리의 기하학적 정의

3.1 직선 위 최근접점

관측점 \((x', y')\) 에서 직선 \(y = a + bx\) 위의 가장 가까운 점 \((\hat{x}', \hat{y}')\) 을 구하자. 직교 조건을 적용하면 (Casella & Berger, 2002, 식 12.2.7):

\[ \hat{x}' = \frac{by' + x' - ab}{1 + b^2} \]

\[ \hat{y}' = a + \frac{b(by' + x' - ab)}{1 + b^2} \]

이 공식의 유도: 직선 위의 점을 매개변수 \(t\)\((t, a + bt)\) 로 표현하고, \((x' - t)^2 + (y' - a - bt)^2\)\(t\) 에 대해 미분하여 0으로 놓으면 된다.

3.2 직교 거리의 제곱

관측점 \((x_i, y_i)\) 와 직선 위 최근접점 \((\hat{x}_i, \hat{y}_i)\) 사이의 유클리드 거리의 제곱은:

\[ d_i^2 = (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \]

전체 최소제곱의 목적함수는 이들의 합이다:

\[ Q(a, b) = \sum_{i=1}^{n} d_i^2 = \sum_{i=1}^{n} \left[(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2\right] \]


4 유도: 직교 LS의 해

4.1 목적함수 정리

\(\hat{x}_i\), \(\hat{y}_i\) 를 대입하여 정리하면, 목적함수가 놀랍도록 간결해진다 (Casella & Berger, 2002, 식 12.2.8):

\[ Q(a, b) = \frac{1}{1 + b^2} \sum_{i=1}^{n} \left[y_i - (a + bx_i)\right]^2 \]

이 수식이 말하는 것: 직교 거리의 합은 통상 OLS 잔차 제곱합에 \(\frac{1}{1+b^2}\) 를 곱한 것이다. OLS 목적함수에 기울기에 의존하는 “할인 인자”가 곱해진 형태이다.

기울기 \(b\) 가 커지면 \(\frac{1}{1+b^2}\) 가 작아져 전체 값이 줄어든다. 따라서 직교 LS는 OLS보다 기울기를 크게 추정하는 경향이 있다 — 이것이 감쇠 편향을 교정하는 메커니즘이다.

4.2 Step 1: \(a\) 에 대한 최소화 (\(b\) 고정)

\(b\) 를 고정하면 \(\frac{1}{1+b^2}\) 는 상수이다. 남은 문제는:

\[ \min_a \sum_{i=1}^{n} \left[y_i - (a + bx_i)\right]^2 \]

이것은 통상 OLS와 동일하므로, 해는:

\[ \hat{a} = \bar{y} - b\bar{x} \]

직교 LS의 절편도 OLS와 같은 형태이다 — 회귀 직선은 항상 \((\bar{x}, \bar{y})\) 를 지난다.

4.3 Step 2: \(b\) 에 대한 최소화

\(\hat{a} = \bar{y} - b\bar{x}\) 를 대입하면:

\[ Q(b) = \frac{1}{1 + b^2} \sum_{i=1}^{n} \left[(y_i - \bar{y}) - b(x_i - \bar{x})\right]^2 \]

표준적인 제곱합/교차곱 표기를 도입한다:

\[ S_{XX} = \sum(x_i - \bar{x})^2, \quad S_{YY} = \sum(y_i - \bar{y})^2, \quad S_{XY} = \sum(x_i - \bar{x})(y_i - \bar{y}) \]

제곱을 전개하면:

\[ Q(b) = \frac{S_{YY} - 2bS_{XY} + b^2 S_{XX}}{1 + b^2} \]

4.4 Step 3: 미분과 해

\(\frac{dQ}{db} = 0\) 을 풀면 (분수함수의 미분, 상세는 Casella Exercise 12.2):

\[ (1 + b^2)(-2S_{XY} + 2bS_{XX}) - 2b(S_{YY} - 2bS_{XY} + b^2 S_{XX}) = 0 \]

정리하면:

\[ S_{XY} b^2 + (S_{XX} - S_{YY})b - S_{XY} = 0 \]

이것은 \(b\) 에 대한 이차 방정식이다. 근의 공식을 적용하면:

\[ \hat{b} = \frac{-(S_{XX} - S_{YY}) \pm \sqrt{(S_{XX} - S_{YY})^2 + 4S_{XY}^2}}{2S_{XY}} \]

두 근의 의미: 이차 방정식이므로 해가 2개이다. 하나는 최솟값을 주고 다른 하나는 최댓값을 준다. 최솟값을 주는 근은 \(+\) 부호이다 (Casella & Berger, 2002, 식 12.2.11).

근거: \(S_{XY} > 0\) (양의 상관) 인 일반적 경우를 가정하면, \(b\) 가 매우 크거나 매우 작을 때 \(Q(b) \to 0\) 이 아니라 \(Q(b) \to\) 유한값임을 확인할 수 있다. 두 근 중 \(+\) 부호 근은 \(\hat{b} > 0\) 을 보장하고 2차 미분 \(\frac{d^2Q}{db^2} > 0\) (극소 조건)을 만족한다. \(-\) 부호 근은 \(Q\) 의 극대(최댓값)에 해당하므로 배제한다.

\[ \boxed{\hat{b}_{OLS-\perp} = \frac{-(S_{XX} - S_{YY}) + \sqrt{(S_{XX} - S_{YY})^2 + 4S_{XY}^2}}{2S_{XY}}} \]

\[ \hat{a}_{OLS-\perp} = \bar{y} - \hat{b}_{OLS-\perp} \bar{x} \]


5 OLS와의 비교: 세 직선의 관계

관측 데이터 \((x_i, y_i)\) 에 대해 세 종류의 회귀 직선을 그을 수 있다:

직선 최소화 대상 기울기
\(Y\) on \(X\) (통상 OLS) \(\sum(y_i - a - bx_i)^2\) \(\hat{b}_{Y|X} = S_{XY} / S_{XX}\)
\(X\) on \(Y\) (역 OLS) \(\sum(x_i - c - dy_i)^2\) \(1/\hat{d} = S_{YY} / S_{XY}\)
직교 LS \(\sum d_i^2\) (직교 거리) \(\hat{b}_\perp\) (위 공식)

항상 성립하는 부등식:

\[ |\hat{b}_{Y|X}| \leq |\hat{b}_\perp| \leq |S_{YY}/S_{XY}| \]

직교 LS 직선은 두 OLS 직선 사이에 놓인다 (Casella & Berger, 2002, Figure 12.2.2). 직관적으로, \(Y\) on \(X\)\(X\) 오차를 무시하여 기울기를 과소추정하고, \(X\) on \(Y\)\(Y\) 오차를 무시하여 기울기를 과대추정하므로, 둘 다 공정하게 취급하는 직교 LS는 중간에 위치한다.

5.1 특수 경우

  • \(S_{XX} = S_{YY}\): 분산이 같으면 \(\hat{b}_\perp = S_{XY}/S_{XX} + \sqrt{1 + (S_{XY}/S_{XX})^2}\) … 이 아니라, 이차 방정식에서 \(S_{XX} - S_{YY} = 0\) 이므로 \(\hat{b}_\perp = \text{sign}(S_{XY}) \cdot 1\) 이 된다. 즉, 양 변수의 분산이 같으면 직교 LS 기울기는 \(\pm 1\) 이다. 기울기 \(\pm 1\) 은 45° 직선을 의미한다. 이것이 뜻하는 바: \(X\)\(Y\) 의 산포가 동일하므로 두 변수를 완전히 대칭적으로 취급하는 최적 직선은 \(X\) 축과 \(Y\) 축 방향으로 동일한 기여를 한다. 예를 들어 시험 점수를 두 번 측정한 데이터(\(S_{XX} = S_{YY}\), 양의 상관)에서는 직교 LS가 항상 기울기 1의 직선을 반환한다 — “두 측정이 동등하다”는 가정이 기울기를 완전히 결정하는 것이다
  • \(S_{XY} = 0\): 두 변수가 무상관이면 직교 LS 기울기는 정의되지 않는다 (0으로 나누기). 이 경우 직선을 맞추는 것 자체가 무의미하다

6 직교 LS와 MLE의 연결

EIV 모형 개요에서 다루었듯이, 분산비 가정 \(\sigma_\delta^2 = \lambda \sigma_\epsilon^2\) 하에서 functional 모형의 MLE를 구하면:

\[ \hat{b}_{MLE}(\lambda) = \frac{-(S_{XX} - \lambda^{-1} S_{YY}) + \sqrt{(S_{XX} - \lambda^{-1} S_{YY})^2 + 4\lambda^{-1} S_{XY}^2}}{2S_{XY}} \]

\(\lambda = 1\) (두 오차의 분산이 같다)일 때, MLE는 직교 LS와 정확히 일치한다. 즉, 직교 최소제곱은 “\(X\) 오차와 \(Y\) 오차의 분산이 같다”는 가정 하의 MLE이다 (Casella & Berger, 2002, §12.2.3).

\(\lambda \neq 1\) 이면 MLE는 가중 직교 최소제곱(Deming 회귀)이 된다.


7 선형대수적 해석

직교 LS는 선형대수의 관점에서도 해석할 수 있다. 중심화된 데이터 행렬을 \(\mathbf{Z} = \begin{bmatrix} \mathbf{x} - \bar{x}\mathbf{1} & \mathbf{y} - \bar{y}\mathbf{1} \end{bmatrix}\) (\(n \times 2\))로 놓으면:

\[ \mathbf{Z}^T\mathbf{Z} = \begin{bmatrix} S_{XX} & S_{XY} \\ S_{XY} & S_{YY} \end{bmatrix} \]

\(2 \times 2\) 행렬의 가장 작은 고윳값에 대응하는 고유벡터 \(\mathbf{v} = (v_1, v_2)\) 가 직교 LS의 기울기를 결정한다:

\[ \hat{b}_\perp = -\frac{v_1}{v_2} \]

직관: \(\mathbf{Z}^T\mathbf{Z}\) 의 고유분해는 데이터의 주성분 방향을 준다. 첫 번째 주성분(큰 고윳값)은 데이터가 가장 넓게 퍼진 방향 — 이것이 직교 LS 직선의 방향이다. 두 번째 주성분(작은 고윳값)은 직선에 직교하는 방향이며, 직교 잔차가 이 방향으로 투영된다.

이것은 PCA(주성분 분석)와 직교 LS가 동일한 문제임을 보여준다. 2변수에서 첫 번째 주성분 직선이 곧 직교 LS 직선이다.


8 코드 예시

8.1 유도 과정의 수치 검증 (Python)

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n = 50
xi = np.random.uniform(1, 10, n)
X = xi + np.random.normal(0, 1.5, n)
Y = 2 + 3 * xi + np.random.normal(0, 1.0, n)

# 제곱합/교차곱
Sxx = np.sum((X - X.mean())**2)
Syy = np.sum((Y - Y.mean())**2)
Sxy = np.sum((X - X.mean()) * (Y - Y.mean()))

# 1. OLS (Y on X)
b_ols = Sxy / Sxx
a_ols = Y.mean() - b_ols * X.mean()

# 2. 역 OLS (X on Y) → 기울기 = Syy/Sxy
b_rev = Syy / Sxy
a_rev = Y.mean() - b_rev * X.mean()

# 3. 직교 LS (이차 방정식 풀기)
discriminant = (Sxx - Syy)**2 + 4 * Sxy**2
b_orth = (-(Sxx - Syy) + np.sqrt(discriminant)) / (2 * Sxy)
a_orth = Y.mean() - b_orth * X.mean()

# 4. 선형대수적 해 (PCA)
Z = np.column_stack([X - X.mean(), Y - Y.mean()])
ZtZ = Z.T @ Z
eigenvalues, eigenvectors = np.linalg.eigh(ZtZ)
# 가장 작은 고윳값의 고유벡터
v = eigenvectors[:, 0]
b_pca = -v[0] / v[1]

print(f"진짜 beta:     3.000")
print(f"OLS (Y on X):  {b_ols:.3f}")
print(f"역 OLS:        {b_rev:.3f}")
print(f"직교 LS:       {b_orth:.3f}")
print(f"PCA 기반:      {b_pca:.3f}")
print(f"직교 LS == PCA: {np.isclose(b_orth, b_pca)}")
print(f"\n부등식 확인: |b_ols| <= |b_orth| <= |b_rev|")
print(f"  {abs(b_ols):.3f} <= {abs(b_orth):.3f} <= {abs(b_rev):.3f}")

결과 해석: 진짜 기울기 \(\beta = 3.0\) 에 대해, OLS 추정치 \(\hat{b}_{Y|X} \approx 2.3\) 은 측정오차로 인한 감쇠 편향으로 과소추정된다. 역 OLS \(\hat{b}_{rev} \approx 3.8\) 은 반대 방향으로 과대추정한다. 직교 LS \(\hat{b}_\perp \approx 3.0\) 은 진짜 값에 가장 가깝다. PCA 기반 해가 직교 LS와 일치하는 것이 확인된다 (직교 LS == PCA: True). 부등식 \(|\hat{b}_{Y|X}| \leq |\hat{b}_\perp| \leq |\hat{b}_{rev}|\) 도 수치로 검증된다.

# 시각화: 세 직선 비교
x_plot = np.linspace(0, 12, 100)
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X, Y, alpha=0.5, s=25, color='gray')
ax.plot(x_plot, 2 + 3 * x_plot, 'k--', lw=2, label='True (beta=3.0)')
ax.plot(x_plot, a_ols + b_ols * x_plot, 'r-', lw=1.5,
        label=f'OLS Y|X (b={b_ols:.2f})')
ax.plot(x_plot, a_rev + b_rev * x_plot, 'b-', lw=1.5,
        label=f'Reverse OLS (b={b_rev:.2f})')
ax.plot(x_plot, a_orth + b_orth * x_plot, 'g-', lw=2,
        label=f'Orthogonal LS (b={b_orth:.2f})')
ax.set_xlabel('X (측정오차 포함)')
ax.set_ylabel('Y')
ax.set_title('세 회귀 직선의 비교')
ax.legend()
plt.tight_layout()
plt.show()

8.2 직교 거리 시각화 (Python)

# 직교 거리 vs 수직 거리 시각화
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

for ax, (a, b, title, color) in zip(axes, [
    (a_ols, b_ols, 'OLS: 수직 거리', 'red'),
    (a_orth, b_orth, '직교 LS: 직교 거리', 'green')
]):
    ax.scatter(X, Y, alpha=0.5, s=25, color='gray')
    ax.plot(x_plot, a + b * x_plot, color=color, lw=2)

    for xi, yi in zip(X[:15], Y[:15]):
        if 'OLS' in title:
            # 수직 거리: (xi, yi) → (xi, a + b*xi)
            y_hat = a + b * xi
            ax.plot([xi, xi], [yi, y_hat], color=color, alpha=0.4, lw=0.8)
        else:
            # 직교 거리: (xi, yi) → 직선 위 최근접점
            x_hat = (b * yi + xi - a * b) / (1 + b**2)
            y_hat = a + b * x_hat
            ax.plot([xi, x_hat], [yi, y_hat], color=color, alpha=0.4, lw=0.8)

    ax.set_title(title)
    ax.set_xlabel('X')
    ax.set_ylabel('Y')

plt.tight_layout()
plt.show()

결과 해석: 왼쪽 패널(OLS)에서는 잔차 선분이 모두 수직 방향이다 — \(x\) 좌표는 고정된 채 \(y\) 방향으로만 오차를 측정한다. 오른쪽 패널(직교 LS)에서는 잔차 선분이 직선에 수직으로 뻗어 있다 — \(x\)\(y\) 방향 오차를 동시에 반영한다. 측정오차가 있는 상황에서 왼쪽(OLS)의 잔차 선분은 실제 참값까지의 거리를 올바르게 표현하지 못하지만, 오른쪽(직교 LS)의 잔차 선분은 \((x_i, y_i)\) 와 참 직선 사이의 실제 거리에 대응한다.


9 요약

유도 단계 핵심 내용
동기 \(X\) 에도 오차가 있으므로 수직 거리 대신 직교 거리를 최소화한다
목적함수 정리 직교 거리의 합 = \(\frac{1}{1+b^2} \sum(y_i - a - bx_i)^2\)
\(a\) 최소화 \(\hat{a} = \bar{y} - b\bar{x}\) (OLS와 동일)
\(b\) 최소화 \(S_{XY}b^2 + (S_{XX} - S_{YY})b - S_{XY} = 0\) (이차 방정식)
\(\hat{b} = \frac{-(S_{XX}-S_{YY}) + \sqrt{(S_{XX}-S_{YY})^2 + 4S_{XY}^2}}{2S_{XY}}\)
세 직선 \(\|\hat{b}_{Y\|X}\| \leq \|\hat{b}_\perp\| \leq \|S_{YY}/S_{XY}\|\)
MLE 연결 \(\lambda = 1\) 가정 시 MLE = 직교 LS
PCA 연결 \(\mathbf{Z}^T\mathbf{Z}\) 의 첫 번째 주성분 = 직교 LS 직선

10 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: