비선형 회귀
IT 위키
더 많은 작업
- Nonlinear Regression; 비선형 회귀 분석
- 반응변수와 설명변수의 관계를 모수에 대해 선형이 아닌 함수로 나타내고, 그 모수를 반복 계산으로 추정하는 회귀 분석
포화(점근선)에 다가가는 성장, 효소 반응 속도, 약물 농도의 감소처럼 과학·공학 현상에는 직선이나 단순한 곡선으로는 표현하기 어려운 관계가 많다. 비선형 회귀는 이론에서 나온 함수 모양을 그대로 써서 모수에 물리적 의미(최대 속도, 포화 수준, 성장률 등)를 줄 수 있다. 다만 선형 회귀와 달리 닫힌 해가 없어 반복 계산이 필요하고, 초깃값에 따라 결과가 달라질 수 있다.
"선형"은 x가 아니라 모수에 대해 선형이라는 뜻이다.
- 다항 회귀 는 x에 대해서는 곡선이지만 모수 β에 대해 선형이므로 선형 모형이다. x, x2을 각각 설명변수로 두고 일반 최소제곱법(OLS)으로 한 번에 추정한다.
- 본질적 비선형 모형은 어떤 변환으로도 모수에 대해 선형으로 만들 수 없거나, 오차 구조를 그대로 두고는 선형화할 수 없는 모형이다.
| 모형 | 식 | 모수의 의미 | 선형화 |
|---|---|---|---|
| 지수 성장·감소 | θ1: 초기값, θ2: 성장(감소)률 | 로그: | |
| 로지스틱 성장 | K: 포화 수준, r: 성장률, x0: 변곡점 | K를 알면 로짓 변환으로 가능 | |
| 미카엘리스-멘텐 | Vmax: 최대 반응 속도, Km: 속도가 절반일 때의 농도 | 역수(Lineweaver-Burk): | |
| 거듭제곱 | θ2: 탄력성 | 양변 로그 |
- 변환으로 선형화하면 OLS로 쉽게 풀리지만, 오차도 함께 변환되어 등분산·정규성 가정이 깨지고 추정값이 치우칠 수 있다. 특히 역수 변환은 작은 값의 오차를 크게 부풀린다. 선형화 추정값은 비선형 최소제곱의 초깃값으로 쓰는 것이 좋다.
- S(β)에 국소 최솟값이 여럿 있거나 평평한 구간이 있으면, 초깃값에 따라 엉뚱한 해로 가거나 수렴하지 않는다.
- 초깃값은 그래프와 모수의 의미에서 정한다. 예: 포화 수준 K는 y의 최댓값 근처, 변곡점 x0는 y가 K/2쯤 되는 x, Vmax는 v의 최댓값 근처.
- 선형화 모형의 OLS 추정값, 격자 탐색, R의 자기 시작(self-starting) 모형(
SSlogis,SSmicmen)을 쓰면 초깃값을 자동으로 얻을 수 있다.
| 방법 | 모수에 대해 | 추정 | 장점 | 단점 |
|---|---|---|---|---|
| 다항 회귀 | 선형 | OLS(닫힌 해) | 계산이 쉽고 초깃값이 필요 없다 | 차수가 높으면 양 끝에서 진동하고 외삽이 위험하다. 모수의 의미가 약하다 |
| 변환 후 선형 회귀 | 선형(변환 척도) | OLS | 간단하다 | 오차 구조가 왜곡되어 추정이 치우칠 수 있다 |
| 비선형 최소제곱 | 비선형 | 반복 계산(가우스-뉴턴 등) | 이론 모형을 그대로 쓰고 모수 해석이 쉽다 | 초깃값 필요, 수렴 실패 가능, 추론이 근사적이다 |
| 스플라인·GAM | 기저함수에 대해 선형 | 벌점 최소제곱 등 | 함수 모양을 미리 정하지 않아도 된다 | 모수 해석이 어렵다 |
- 함수 모양을 모를 때는 구간별 다항식을 매끄럽게 이은 스플라인이나, 변수별 평활 함수를 더한 일반화 가법 모형(GAM, R
mgcv::gam())을 쓴다.
# 다항 회귀는 lm으로 추정 (선형 모형)
fit_poly <- lm(y ~ x + I(x^2), data = df) # 또는 lm(y ~ poly(x, 2))
# 미카엘리스-멘텐: 초깃값을 직접 주는 nls
fit_mm <- nls(v ~ Vmax * S / (Km + S), data = enz,
start = list(Vmax = 200, Km = 0.1)) # 기본 알고리즘: 가우스-뉴턴
summary(fit_mm)
# 자기 시작 모형: 초깃값 자동 계산
fit_mm2 <- nls(v ~ SSmicmen(S, Vm, K), data = enz)
fit_logi <- nls(y ~ SSlogis(t, Asym, xmid, scal), data = growth)
library(mgcv)
fit_gam <- gam(y ~ s(x), data = df) # 스플라인 기반 GAM
import warnings
import numpy as np
from scipy.optimize import curve_fit, OptimizeWarning
# 1) 미카엘리스-멘텐: v = Vmax * S / (Km + S) (가상의 효소 반응 자료)
rng = np.random.default_rng(11)
S = np.repeat([0.02, 0.06, 0.11, 0.22, 0.56, 1.10], 2)
v = 200 * S / (0.08 + S) + rng.normal(0, 8, S.size)
def mm(S, Vmax, Km):
return Vmax * S / (Km + S)
popt, pcov = curve_fit(mm, S, v, p0=[max(v), np.median(S)])
se = np.sqrt(np.diag(pcov))
print(f"NLS: Vmax={popt[0]:.2f} (SE {se[0]:.2f}), Km={popt[1]:.4f} (SE {se[1]:.4f})")
# 선형화(Lineweaver-Burk): 1/v = 1/Vmax + (Km/Vmax)(1/S)
b1, b0 = np.polyfit(1 / S, 1 / v, 1)
print(f"Lineweaver-Burk: Vmax={1 / b0:.2f}, Km={b1 / b0:.4f}")
# 2) 로지스틱 성장: y = K / (1 + exp(-r (t - t0))) 와 초깃값 문제
t = np.arange(0, 20)
y = 500 / (1 + np.exp(-0.6 * (t - 10))) + rng.normal(0, 10, t.size)
def logistic(t, K, r, t0):
return K / (1 + np.exp(-r * (t - t0)))
for label, p0 in [("기본값(1,1,1)", None), ("자료 기반", [max(y), 0.5, np.median(t)])]:
with warnings.catch_warnings():
warnings.simplefilter("ignore", OptimizeWarning)
try:
p, _ = curve_fit(logistic, t, y, p0=p0, maxfev=2000)
sse = np.sum((y - logistic(t, *p)) ** 2)
print(f"{label}: K={p[0]:.1f}, r={p[1]:.3f}, t0={p[2]:.2f}, SSE={sse:.0f}")
except RuntimeError as e:
print(f"{label}: 실패 - {e}")
실행 결과:
NLS: Vmax=200.38 (SE 5.59), Km=0.0783 (SE 0.0081)
Lineweaver-Burk: Vmax=187.90, Km=0.0642
기본값(1,1,1): K=234.5, r=-113.990, t0=108.52, SSE=808766
자료 기반: K=499.2, r=0.575, t0=10.12, SSE=891
- 자료는 Vmax = 200, Km = 0.08로 만들었다. 비선형 최소제곱 추정값(200.38, 0.0783)은 참값에 가깝고 표준오차도 함께 얻는다.
- 역수로 선형화한 Lineweaver-Burk 추정값(187.90, 0.0642)은 참값에서 더 멀다. 농도가 낮은 점의 작은 v에서 생긴 오차가 1/v로 크게 부풀려졌기 때문이다.
- 로지스틱 모형을 curve_fit의 기본 초깃값(모두 1)으로 적합하면 r이 음수, t0가 108처럼 의미 없는 해에 멈추고 SSE가 매우 크다. y의 최댓값과 t의 중앙값으로 초깃값을 주면 K = 499.2, r = 0.575, t0 = 10.12로 참값(500, 0.6, 10)을 잘 찾는다.
- 비선형 회귀 결과는 반드시 적합 곡선을 그려 보고, 잔차 그림으로 등분산·패턴 여부를 확인한다. 비선형 모형에서는 선형 회귀의 결정 계수를 그대로 해석하기 어려우므로 잔차 제곱합, 잔차 표준오차, 정보 기준 등으로 비교한다.
- 다항 회귀는 x에 대해 곡선이어도 모수에 대해 선형이므로 선형 회귀(OLS)로 추정한다는 점을 구분한다.
- 비선형 최소제곱은 닫힌 해가 없어 가우스-뉴턴 같은 반복 계산을 쓰며, 초깃값 선택이 중요하다.
- 로그·역수 변환으로 선형화할 수 있는 모형도 있지만 오차 구조가 바뀌어 추정이 치우칠 수 있다.
- 실기 출제 방향의 "상관·회귀(비선형)" 항목에 해당하며, R
nls()나 Pythoncurve_fit으로 적합한 뒤 모수의 의미를 해석하는 흐름을 익혀 둔다.