1 정의
두 약물 (\(S\) standard, \(T\) test) 의 dose-response 곡선의 형태에 따라 분류:
Parallel Line Assay: 두 곡선이 평행 (같은 기울기, 다른 절편). 가정: 두 약물이 같은 작용 메커니즘. \[ Y_S = \alpha_S + \beta \log d_S, \quad Y_T = \alpha_T + \beta \log d_T \]
Slope Ratio Assay: 두 곡선이 공통 절편 (같은 baseline, 다른 기울기). 가정: dose 가 0 일 때 응답이 같음. \[ Y_S = \alpha + \beta_S d_S, \quad Y_T = \alpha + \beta_T d_T \] (선형 dose, 비-로그)
상대 강도 \(\rho\): - PLA: \(\log \rho = (\alpha_T - \alpha_S) / \beta\) - SRA: \(\rho = \beta_T / \beta_S\)
2 Parallel Line Assay 의 통계 모형
2.1 가정
- 로그 dose 의 선형성: \(E[Y | \log d] = \alpha + \beta \log d\).
- 두 약물의 평행: 같은 \(\beta\).
- 응답의 정규성·등분산성.
이 가정은 두 약물이 동일 receptor 에 같은 affinity 로 작용할 때 성립. 약리학적 의미가 있다.
2.2 시각화
Y │ 검정 약물(T)
│ /
│ / 표준 약물(S)
│ / /
│ / /
│ / /
└───────────────── log dose
← ρ →
두 평행선의 수평 거리 가 \(\log \rho\). 같은 \(Y\) 값을 내는 표준의 dose 와 검정의 dose 의 비율.
2.3 상대 강도 추정량
두 약물 모두 같은 \(\beta\) 를 가지므로 합쳐서 추정:
\[ \hat\beta = \frac{\sum_{S,T} (\log d - \overline{\log d})(Y - \bar Y)}{\sum_{S,T} (\log d - \overline{\log d})^2} \]
각 약물의 절편: \[ \hat\alpha_S = \bar Y_S - \hat\beta \, \overline{\log d_S}, \quad \hat\alpha_T = \bar Y_T - \hat\beta \, \overline{\log d_T} \]
상대 강도: \[ \log \hat\rho = \frac{\hat\alpha_T - \hat\alpha_S}{\hat\beta} \quad \text{또는 동치로} \quad \overline{\log d_S} - \overline{\log d_T} + (\bar Y_T - \bar Y_S)/\hat\beta \]
두 평행 회귀선에서 같은 응답 \(Y_0\) 을 내는 dose: - \(S\): \(\log d_S = (Y_0 - \hat\alpha_S) / \hat\beta\) - \(T\): \(\log d_T = (Y_0 - \hat\alpha_T) / \hat\beta\)
두 dose 의 차이 (수평 거리): \[ \log d_S - \log d_T = (\hat\alpha_T - \hat\alpha_S) / \hat\beta = \log \hat\rho \]
즉 \(\hat\rho = d_S / d_T\) — 같은 효과를 내는 dose 의 비율. 기울기가 가파를수록 (\(\hat\beta\) 크면) 작은 절편 차이도 큰 dose 차이로 환산되어 상대 강도가 명확해진다.
2.4 Fieller’s Theorem 의 신뢰구간
\(\log \hat\rho\) 는 두 추정량의 비. 비율의 신뢰구간은 normal 분포가 아니므로 일반 t-CI 부적합. Fieller (1944) 의 절차:
\[ g = \frac{t_{\alpha/2}^2 \, \hat\sigma_\beta^2}{\hat\beta^2} \]
(g = “significance correction”; g < 1 일 때 유한 CI 가능, g ≥ 1 이면 무한 CI.)
\[ \log \rho_{\text{lower}}, \log \rho_{\text{upper}} = \log \hat\rho \pm \frac{t_{\alpha/2}}{(1 - g) \hat\beta} \sqrt{\hat\sigma_{\hat\Delta}^2 (1 - g) + g \, \hat\sigma_\beta^2 (\log \hat\rho)^2} \]
여기서 \(\hat\Delta = \hat\alpha_T - \hat\alpha_S\), \(\hat\sigma_{\hat\Delta}^2\) 는 그 분산.
복잡 — Python scipy.optimize 로 root-finding 또는 R relaimpo, drc 패키지 자동.
2.5 평행성 검정
가정 검정: 두 회귀선의 기울기가 정말 같은가?
귀무가설: \(\beta_S = \beta_T\).
\(F\) 검정: \[ F = \frac{\text{SS due to slope difference}}{\text{MS error}} \]
자유도 \((1, n_S + n_T - 4)\).
\(p > 0.05\) 면 평행 가정 채택. \(p < 0.05\) 면 slope ratio assay 또는 비교 부적합.
작은 표본 (예: 각 약물 5 dose × 3 replicate = 15 관측) 에서 평행성 검정은 검정력 약. 비유의가 “평행 OK” 보장 안 됨. 시각적 점검 (산점도 + 회귀선) 함께 권장.
기울기 추정량의 신뢰구간이 겹치는지도 확인. 매우 다른 기울기면 PLA 부적합.
3 Slope Ratio Assay (SRA)
3.1 가정
- dose 의 선형성 (로그 변환 X): \(E[Y | d] = \alpha + \beta d\).
- 두 약물 같은 절편 (\(\alpha\)): dose 0 에서 같은 baseline.
- 상대 강도 = \(\beta_T / \beta_S\).
이 가정은 dose 0 에서 응답이 일관 한 자연스러운 baseline 이 있을 때. 예: dose 0 에서 박테리아 zone 직경 0 (자명).
3.2 추정
두 회귀선: \[ Y_S = \alpha + \beta_S d_S, \quad Y_T = \alpha + \beta_T d_T \]
\(\alpha\) 를 공통으로 추정 (combined regression): \[ Y = \alpha + \beta_S d_S + \beta_T d_T + \varepsilon \]
(dose 변수가 두 약물에서 0 또는 양수로 작동.)
상대 강도: \[ \hat\rho = \hat\beta_T / \hat\beta_S \]
3.3 Fieller’s CI
비율이므로 동일하게 Fieller’s theorem 적용.
3.4 시각화
Y │ 검정 약물 (T) — 가파른 기울기 β_T
│ /
│ /
│ / 표준 약물 (S) — 완만한 기울기 β_S
│ / /
│ //
│//
└──────────── dose
α (공통 절편)
두 약물이 dose 0 에서 같이 시작하지만 기울기가 다름 → 효능 차이.
4 PLA vs SRA 의 선택
| 측면 | PLA | SRA |
|---|---|---|
| dose 변환 | log | linear (또는 log) |
| 가정 | 같은 기울기 | 같은 절편 |
| 약리학적 의미 | 같은 메커니즘 | 같은 baseline |
| 응용 | 약물 비교 (대부분) | 항생제, 비타민 |
| 분석 | 표준 회귀 | 통합 회귀 |
PLA 가 일반적. 두 약물이 같은 receptor 에 작용하면 자연스러움.
SRA 는 더 강한 가정 (같은 절편). dose 0 에서 응답이 정확히 같다는 것은 baseline 의 정확한 측정이 가능할 때만.
실무: PLA 우선 시도, 평행성 위반 시 SRA 검토. 둘 다 부적합하면 nonparametric 또는 비교 자체 재검토.
5 Incomplete Block Design 의 Bio-assay 적용
큰 dose 범위 (예: 6 수준) 에서 한 동물 그룹에 모든 dose 를 주기 어려울 때, BIB design 활용.
각 동물 (블록) 에 일부 dose 만 (예: 3 개) 투여. BIB 의 균형 조건 활용.
5.1 사례 — 비타민 D 검정
6 dose (10, 20, 40, 80, 160, 320 IU) × 7 마리 라트 (블록), 각 라트 3 dose.
BIB \((v=6, b=7, r=3.5, k=3, \lambda)\) — 정확한 BIB 가능 여부 점검.
분석: BIB analysis (G-MON5-3) + dose 의 회귀.
6 가설 데이터 — 인슐린 검정
표준 인슐린 (\(S\)) 4 dose: 0.5, 1, 2, 4 IU. 검정 인슐린 (\(T\)) 4 dose: 0.6, 1.2, 2.4, 4.8 IU. 각 dose 에 8 마리 라트, 응답 = 혈당 강하 (mg/dL).
가상 결과:
| 약물 | dose | \(\log_2 d\) | \(\bar Y\) |
|---|---|---|---|
| \(S\) | 0.5 | -1 | 15 |
| \(S\) | 1 | 0 | 25 |
| \(S\) | 2 | 1 | 35 |
| \(S\) | 4 | 2 | 45 |
| \(T\) | 0.6 | -0.737 | 18 |
| \(T\) | 1.2 | 0.263 | 28 |
| \(T\) | 2.4 | 1.263 | 38 |
| \(T\) | 4.8 | 2.263 | 48 |
PLA fit: - \(\hat\beta = 10\) (per \(\log_2 d\) unit). - \(\hat\alpha_S = 25\) (at \(\log_2 d = 0\)). - \(\hat\alpha_T = 25.37\) (interpolated at \(\log_2 d = 0\)). - \(\log_2 \hat\rho = (\hat\alpha_T - \hat\alpha_S) / \hat\beta = 0.37 / 10 = 0.037\).
→ \(\hat\rho = 2^{0.037} = 1.026\). 검정 인슐린이 표준보다 2.6% 강함.
해석: 검정 인슐린 1 IU = 표준 1.026 IU. 거의 동일 강도.
7 Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from scipy import stats, optimize
np.random.seed(2026)
# 인슐린 검정 — Parallel Line Assay
n_per = 8
doses_S = [0.5, 1, 2, 4]
doses_T = [0.6, 1.2, 2.4, 4.8]
true_beta = 10
true_alpha_S = 25
# 검정 인슐린이 표준보다 1.026 배 강함 → log_2 ρ = 0.037
true_alpha_T = true_alpha_S + true_beta * 0.037
records = []
for d in doses_S:
log_d = np.log2(d)
mu = true_alpha_S + true_beta * log_d
for _ in range(n_per):
records.append({"drug": "S", "log_d": log_d, "Y": np.random.normal(mu, 3)})
for d in doses_T:
log_d = np.log2(d)
mu = true_alpha_T + true_beta * log_d
for _ in range(n_per):
records.append({"drug": "T", "log_d": log_d, "Y": np.random.normal(mu, 3)})
data = pd.DataFrame(records)
# Step 1: 평행성 검정 — 두 회귀의 기울기가 같은가?
model_full = sm.OLS(data["Y"], sm.add_constant(
pd.concat([data[["drug", "log_d"]],
pd.get_dummies(data["drug"], drop_first=True) * data[["log_d"]].values],
axis=1).rename(columns={"log_d": "log_d_diff"})
)).fit()
# 더 단순한 방법: 명시적 모형
data["drug_T"] = (data["drug"] == "T").astype(int)
data["interaction"] = data["drug_T"] * data["log_d"]
# 평행 모형 (interaction 없음)
model_parallel = sm.OLS(data["Y"],
sm.add_constant(data[["drug_T", "log_d"]])).fit()
# 비평행 모형 (interaction 포함)
model_full = sm.OLS(data["Y"],
sm.add_constant(data[["drug_T", "log_d", "interaction"]])).fit()
# F-test for interaction (slope difference)
F_par = ((model_parallel.ssr - model_full.ssr) / 1) / model_full.mse_resid
p_par = 1 - stats.f.cdf(F_par, 1, model_full.df_resid)
print(f"=== Parallelism test ===")
print(f"F = {F_par:.3f}, p = {p_par:.4f}")
print("=> Parallel assumption OK" if p_par > 0.05 else "=> NOT parallel — use SRA or other")
# Step 2: PLA fit
print(f"\n=== Parallel Line Assay ===")
print(model_parallel.summary().tables[1])
beta_hat = model_parallel.params["log_d"]
alpha_S_hat = model_parallel.params["const"] # drug_T = 0 인 표준
alpha_T_hat = alpha_S_hat + model_parallel.params["drug_T"]
log_rho_hat = (alpha_T_hat - alpha_S_hat) / beta_hat
rho_hat = 2**log_rho_hat
print(f"\nbeta_hat = {beta_hat:.3f}")
print(f"alpha_S = {alpha_S_hat:.3f}, alpha_T = {alpha_T_hat:.3f}")
print(f"log_2(rho) = {log_rho_hat:.4f}")
print(f"Relative potency rho = {rho_hat:.4f}")
print(f" Test 약물의 강도가 표준의 {(rho_hat-1)*100:+.2f}% 차이")
# Step 3: Fieller's CI for log_2(rho)
# delta = alpha_T - alpha_S, var(delta), var(beta), cov(delta, beta)
cov = model_parallel.cov_params()
var_delta = cov.loc["drug_T", "drug_T"]
var_beta = cov.loc["log_d", "log_d"]
cov_db = cov.loc["drug_T", "log_d"]
delta_hat = model_parallel.params["drug_T"]
t_crit = stats.t.ppf(0.975, model_parallel.df_resid)
g = (t_crit**2 * var_beta) / beta_hat**2
if g < 1:
# Fieller's CI
discriminant = (var_delta * (1-g) + g * var_beta * log_rho_hat**2)
margin = t_crit / ((1-g) * abs(beta_hat)) * np.sqrt(discriminant)
log_rho_low = (log_rho_hat - g * cov_db / var_beta) - margin
log_rho_high = (log_rho_hat - g * cov_db / var_beta) + margin
print(f"\n95% Fieller CI for log_2(rho): ({log_rho_low:.4f}, {log_rho_high:.4f})")
print(f"95% CI for rho: ({2**log_rho_low:.4f}, {2**log_rho_high:.4f})")
else:
print(f"\ng = {g:.3f} >= 1 — Fieller CI 무한 (검정력 부족)")8 신뢰구간의 width 가 검정 품질을 정의
USP, USP-NF, Ph. Eur. (유럽 약전) 같은 약전 표준은 새 batch 의 강도가 표준의 \(0.95 \sim 1.05\) 범위면 합격. 즉 상대 강도의 신뢰구간이 0.95~1.05 범위 내 에 있으면 합격.
이를 위해서는: - 표본 충분 (n_S, n_T 각각 ≥ 6 dose level × ≥ 5 동물 = 30+). - \(\hat\beta\) 큼 (응답이 dose 에 민감). - 잔차 분산 작음.
설계 단계에서 g < 1 보장하도록 검정력 분석. g 가 작을수록 CI 좁음.
9 가정과 한계
- 로그 dose 의 선형성: 위반 시 비선형 모형 (Hill equation, 4-parameter logistic).
- Equal variance (등분산): 위반 시 가중 회귀.
- 평행 vs 기울기비 가정: 데이터 의존.
- Fieller’s CI 의 g < 1: 표본이 부족하면 CI 무한.
- 외삽 위험: 두 약물의 dose 범위 외부 추정 신뢰 X.
10 응용 — 실무 사례
10.1 인슐린 표준화
USP 의 인슐린 standard 1 IU 는 정확히 정의된 양 (1 IU ≈ 0.0347 mg of recombinant human insulin). 새 batch 는 PLA 로 강도 검정 → label claim 에 표시.
10.2 비타민 D 검정
라트 bone-line test: 비타민 D 부족 라트에 비타민 D 투여, 뼈의 칼슘 침착 측정. 표준 vs 검정 비타민의 상대 강도.
10.3 디지털 매핑 — A/B Test 의 효능 추정
A/B test 가 두 변종의 평균 응답을 비교한다면, 다중 dose 시험은 PLA 의 IT 적용.
가상 사례: 광고 노출 빈도 5 수준 × 두 광고 (A, B). 각 사용자 그룹에 일정 빈도로 노출. 응답 = CTR.
PLA fit: - 광고 A: 노출 빈도가 늘수록 CTR 선형 증가. - 광고 B: 같은 패턴, 다른 절편.
상대 강도 = “광고 B 가 A 보다 몇 배 효과적인가?”
이는 A/B test 의 단일 비교를 multi-level dose 비교로 확장한 형태.
11 관련 주제
선행 지식
후속 주제
다른 카테고리 연결
- Statistics — SLR 예측 — 회귀 예측 분산
- AB Test — 다중 비교 실험 — multi-arm 의 통계 처리
- Causal Inference — 모수적 추정
12 더 읽을 거리
- Finney, D. J. (1978). “Statistical Method in Biological Assay” (3rd ed). Charles Griffin.
- Fieller, E. C. (1944). “A fundamental formula in the statistics of biological assay, and some applications.” Quarterly Journal of Pharmacy and Pharmacology 17: 117-123.
- Govindarajulu, Z. (2001). “Statistical Techniques in Bioassay” (2nd ed). Karger.
- USP General Chapter <111> “Design and Analysis of Biological Assays.”