Standardized Mean Difference

Effect size 중 하나인 Standardized Mean Difference의 개념을 살펴보고, SMD를 활용해 baseline covariate의 balance 평가를 해보자.

statistics
R
Author
Published

January 23, 2025

Standardized Mean Difference

Background

Randomized controlled trial(RCT)를 시행할 때, control/treatment group의 baseline characteristics이 비슷하게 맞춰주기 위해 subject를 random하게 배정한다. Observational study에서도 RCT와 유사한 causality를 확보하기 위한 방법 중 propensity score analysis가 있다. propensity score가 비슷한 subject끼리는 baseline characteristics도 비슷하다는 특성이 있다. 이 때, 두 군 baseline covariates의 유사성을 어떻게 평가할 수 있을까? 이 때 Standardized Mean Difference(SMD)를 사용하면 유사성을 평가할 수 있다.

SMD는 두 군의 mean차이를 measure하는 Effect size의 일종이다. 보통 의학 논문 연구에서는시 귀무/대립 가설 및 p-value를 표시하여 결과를 보고한다. 통계적 유의성을 검정하는 방식으로 진행되는데, 통계적으로 유의하다 할 지라도 effect가 얼마나 큰 지에 대해서는 말할 수가 없다는 한계가 있다. 이를 해결하기 위해 도입된 개념이 Effect size이다.

Effect size는 세 가지 특징을 살펴보자. 첫째, Effect size는 연구 결과의 해석을 이분법이 아닌 연속 선상에서 할 수 있게 해준다. 기존에 사용되던 p-value는 귀무가설 기각 여부밖에 알려주지 못하지만, effect size는 실제로 얼마나 큰 차이가 있는 지를 구체적으로 보여준다. 둘째, effect size는 p-value와는 달리 표본 수에 의한 영향을 받지 않는다. p-value를 이용한 검정의 경우 표본 수가 커질 때, power가 증가한다. 그 말은 통계적으로 유의하지 않음에도 불구하고, 단지 표본 수가 많다는 이유 만으로 유의하다는 결과를 얻을 수 있다는 뜻이다. 이에 비해 effect size는 표본 수의 영향을 받지 않는다. 셋째, 효과크기는 다양한 형태의 결과들을 비교 가능한 공통의 단위로 변화 시켜줌으로써 다른 통계적 방법에 의해 시행된 연구 결과들을 비교할 수 있게 해준다. 이 특성은 메타분석 시 자주 이용된다.

이제 SMD의 수식에 대해 살펴보자. 참고로 통상적으로 SMD는 0.2 - 0.5일 경우 small, 0.5 - 0.8일 경우 medium, 0.8을 넘을 때 large라고 한다.

Standardized Mean Difference

SMD는 크게 SMD for continuous or categorical baseline variables 두 가지가 있고, formula는 다음과 같다.

  1. Continuous baseline variable

    d=X1X2s12+s222

X1, X2은 각 group의 baseline variable의 sample mean, s1,s2은 각 group의 sample variance를 의미한다. variable이 치우쳐 있다면(skewed), d를 rank statistics을 이용하여 modify하여 사용하면 된다.

  1. Categorical baseline variable

    1) Binary categorical variable

    d=P^1P^2P^1(1P^1)+P^2(1P^2)2

    P1^,P2^는 control/treatment group의 binary baseline variable의 proportion(mean)을 의미한다.

    2) Categorical variable with K levels

    Table 1처럼 baseline variable이 2개 초과의 level을 가지는 categorical variable의 SMD에 대해 살펴보자.

T=(P^12,P^13,...,P^1K) C=(P^22,P^23,...,P^2K)

이 때, P^JK= Pr(category k|treatment group j), $ j $ and k{2,3,...,K}

Standardized difference는 다음과 같이 정의된다.

d=(TC)S1(TC)

S는 (k - 1)X(k - 1) covariance이며, 다음과 같다.

S=[Skl]={[P^1k(1P^1k)+P^2k(1P^2k)]2,k=l[P^1kP^1l+P^2kP^2l]2,kl

지금까지 SMD를 구하는 과정을 살펴보았다. RCT시 subject의 group 배정 후 혹은 propensity score analysis시 baseline covariates의 balance를 확인할 때, SMD를 이용한다. SMD가 0.1미만이면 작은 차이로 간주하고, 대부분의 변수에서 SMD 0.1미만이면서, 모두 0.2 미만이면 balance가 잘 맞는 것으로 평가한다.

Confidence interval for standardized difference

Hedges and Olkin (1985)에서 SMD에 대한 confidence interval 공식을 내놓았는데 식은 다음과 같다.

d±1.96×σ[d]

σ[d]=n1+n2n1×n2+d22(n1+n2)

Example

예제 데이터와 tableone package를 이용해 SMD를 구하는 과정을 살펴보자. tableone package에 대한 자세한 사용법이 궁금한다면 이 포스트를 참고하길 바란다.

데이터를 불러오는 과정이다.

Using libcurl 8.3.0 with Schannel
library(magrittr)
library(tableone)

# Load file
url <- "https://raw.githubusercontent.com/jinseob2kim/lecture-snuhlab/master/data/example_g1e.csv"
dt <- fread(url,header=T)

head(dt)
   EXMD_BZ_YYYY RN_INDI HME_YYYYMM Q_PHX_DX_STK Q_PHX_DX_HTDZ Q_PHX_DX_HTN
1:         2009  562083     200909            0             0            1
2:         2009  334536     200911            0             0            0
3:         2009  911867     200903            0             0            0
4:         2009  183321     200908           NA            NA           NA
5:         2009  942671     200909           NA            NA           NA
6:         2009  979358     200912           NA            NA           NA
   Q_PHX_DX_DM Q_PHX_DX_DLD Q_PHX_DX_PTB Q_HBV_AG Q_SMK_YN Q_DRK_FRQ_V09N HGHT
1:           0            0           NA        3        1              0  144
2:           0            0           NA        2        1              0  162
3:           0            0           NA        3        1              0  163
4:          NA           NA           NA        3        1              0  152
5:          NA           NA           NA        3        1              0  159
6:          NA           NA           NA        2        1              0  157
   WGHT WSTC  BMI VA_LT VA_RT BP_SYS BP_DIA URN_PROT  HGB FBS TOT_CHOL  TG HDL
1:   61   90 29.4   0.7   0.8    120     80        1 12.6 117      264 128  60
2:   51   63 19.4   0.8   1.0    120     80        1 13.8  96      169  92  70
3:   65   82 24.5   0.7   0.6    130     80        1 15.0 118      216 132  55
4:   51   70 22.1   0.8   0.9    101     62        1 13.1  90      199 100  65
5:   50   73 19.8   0.7   0.8    132     78        1 13.0  92      162  58  40
6:   55   73 22.3   1.5   1.5    110     70        1 11.9 100      192 109  53
   LDL CRTN SGOT SGPT GGT GFR
1: 179  0.9   25   20  25  59
2:  80  0.9   18   15  28  74
3: 134  0.8   26   30  30  79
4: 114  0.9   18   14  11  61
5: 111  0.9   24   23  15  49
6: 117  0.7   15   12  14  83

tableone object를 생성한 뒤 print function을 이용해 결과물을 출력할 수 있다. 이때 smd = TRUE로 처리해주면 smd값이 같이 출력된다.

myVars <- c("HGHT", "WGHT", "BMI", "HDL", "LDL", "TG", "SGPT", 
            "Q_PHX_DX_STK", "Q_PHX_DX_HTDZ", "Q_HBV_AG", "Q_SMK_YN")
# Categorical variables
catVars <- c("Q_PHX_DX_STK", "Q_PHX_DX_HTDZ", "Q_HBV_AG", "Q_SMK_YN")
t1 <- CreateTableOne(vars = myVars, factorVars = catVars, data = dt)
t1
                       
                        Overall        
  n                       1644         
  HGHT (mean (SD))      164.55 (9.19)  
  WGHT (mean (SD))       65.10 (12.53) 
  BMI (mean (SD))        23.92 (3.38)  
  HDL (mean (SD))        55.90 (19.47) 
  LDL (mean (SD))       118.69 (201.99)
  TG (mean (SD))        134.90 (104.75)
  SGPT (mean (SD))       25.98 (27.18) 
  Q_PHX_DX_STK = 1 (%)      12 ( 1.1)  
  Q_PHX_DX_HTDZ = 1 (%)     26 ( 2.4)  
  Q_HBV_AG (%)                         
     1                      77 ( 4.7)  
     2                    1102 (67.1)  
     3                     463 (28.2)  
  Q_SMK_YN (%)                         
     1                     995 (60.6)  
     2                     256 (15.6)  
     3                     391 (23.8)  
t2 <- CreateTableOne(data = dt,
                     vars = myVars,
                     strata = "Q_SMK_YN",
                     factorVars = catVars,
                     includeNA = F)
print(t2, smd = T)
                       Stratified by Q_SMK_YN
                        1               2               3               p     
  n                        995             256             391                
  HGHT (mean (SD))      160.67 (8.34)   168.83 (6.45)   171.61 (7.09)   <0.001
  WGHT (mean (SD))       61.17 (11.08)   70.09 (10.72)   71.76 (13.07)  <0.001
  BMI (mean (SD))        23.63 (3.39)    24.52 (2.93)    24.27 (3.54)   <0.001
  HDL (mean (SD))        57.83 (14.08)   53.91 (36.73)   52.37 (13.54)  <0.001
  LDL (mean (SD))       112.26 (32.81)  147.52 (505.27) 116.34 (56.89)   0.046
  TG (mean (SD))        114.05 (76.97)  162.89 (126.51) 169.24 (133.28) <0.001
  SGPT (mean (SD))       23.33 (28.42)   28.61 (20.62)   31.00 (26.96)  <0.001
  Q_PHX_DX_STK = 1 (%)      11 (  1.8)       1 (  0.5)       0 (  0.0)   0.051
  Q_PHX_DX_HTDZ = 1 (%)     18 (  2.9)       5 (  2.6)       3 (  1.1)   0.287
  Q_HBV_AG (%)                                                           0.193
     1                      40 (  4.0)      19 (  7.5)      17 (  4.3)        
     2                     679 ( 68.3)     164 ( 64.3)     259 ( 66.2)        
     3                     275 ( 27.7)      72 ( 28.2)     115 ( 29.4)        
  Q_SMK_YN (%)                                                          <0.001
     1                     995 (100.0)       0 (  0.0)       0 (  0.0)        
     2                       0 (  0.0)     256 (100.0)       0 (  0.0)        
     3                       0 (  0.0)       0 (  0.0)     391 (100.0)        
                       Stratified by Q_SMK_YN
                        test SMD   
  n                                
  HGHT (mean (SD))            0.972
  WGHT (mean (SD))            0.611
  BMI (mean (SD))             0.181
  HDL (mean (SD))             0.197
  LDL (mean (SD))             0.091
  TG (mean (SD))              0.341
  SGPT (mean (SD))            0.196
  Q_PHX_DX_STK = 1 (%)        0.137
  Q_PHX_DX_HTDZ = 1 (%)       0.084
  Q_HBV_AG (%)                0.109
     1                             
     2                             
     3                             
  Q_SMK_YN (%)                  NaN
     1                             
     2                             
     3                             

Q_HBV_AG, Q_SMK_YN등의 3개의 level을 가지는 categorical variable도 하나의 SMD를 출력해줌을 알 수 있다. 참고로 tableone package에서는 strata가 3개 이상일 때도 하나의 SMD를 출력해준다. 이는 n개의 strata에 대해 pairwise로 (n2)개의의 SMD를 구한 뒤, 절댓값을 취하고, 평균을 낸 값이다.

Reference

  1. Yang, D. and Dalton, JE. (2012). A unified approach to measuring the effect size between two groups using SAS. SAS Global Forum 2012, Paper 335-2012.
  2. Hedges LV, Olkin I. (1985). Statistical Methods for Meta-Analysis. Academic Press: San Diego, CA .
  3. 남상건.(2015). 효과크기의 이해. Hanyang Medical Reviews. Paper 40-43
  4. 이유진(2022). tableone 패키지 소개. 차라투 블로그

Reuse

Citation

BibTeX citation:
@online{lee2025,
  author = {Lee, Donghyung},
  title = {Standardized {Mean} {Difference}},
  date = {2025-01-23},
  url = {https://blog.zarathu.com/posts/2025-01-23-Standardized Mean Difference},
  langid = {en}
}
For attribution, please cite this work as:
Lee, Donghyung. 2025. “Standardized Mean Difference.” January 23, 2025. https://blog.zarathu.com/posts/2025-01-23-Standardized Mean Difference.