f_
frhyme.code
•python-libs•โฑ ์•ฝ 26๋ถ„ ์†Œ์š”

Fitting Statistical Models to Data with Python - WEEK 1 - Part 1

WEEK 1 - OVERVIEW & CONSIDERATIONS FOR STATISTICAL MODELING

  • ์ด ์ฝ”์Šค์—์„œ๋Š” ์ฃผ๋กœ statsmodels๋ผ๋Š” ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฃผ๋กœ ํ™œ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ™œ์šฉํ•ด ์ด์ „์— ๋ฐฐ์šด ๊ฐ„๋‹จํ•œ ํ†ต๊ณ„์  ๊ธฐ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ์ด์•ผ, ์›Œ๋‚™ ๋‰ด๋Ÿด ๋„ท ๊ธฐ๋ฐ˜์˜ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐ ๋ณ€์ˆ˜์˜ ํ•ด์„ ์ธก๋ฉด์ด๋‚˜, ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๋ถ„ํฌ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋ดค์„ ๋•Œ, ์„ ํ˜• ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ๊ธฐ๋ณธ ์ค‘์˜ ๊ธฐ๋ณธ์ด์ฃ . ํŠนํžˆ, ๋น„๊ต์  ์ผ๊ด€์ ์ธ ๋ฐ์ดํ„ฐ์—์„œ ์ˆ˜์ง‘๋˜๋Š”, โ€œ๋จธ์‹ ๋Ÿฌ๋‹ ์šฉ ๋ฐ์ดํ„ฐโ€๋“ค์„ ์ œ์™ธํ•˜๊ณ , ๋งŒ์•ฝ ์„ค๋ฌธ์กฐ์‚ฌ ๋“ฑ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค๋ฉด, ๊ทธ ๋ฐ์ดํ„ฐ๋“ค์€ ๋ณดํ†ต ๋‹ค์–‘ํ•œ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๊ณ , ์‚ฌ๋žŒ, ํ˜น์€ ์‚ฌ๋žŒ์ด ์†ํ•œ ์ง‘๋‹จ์— ๋”ฐ๋ผ์„œ ๋‹ค์–‘ํ•œ ๋ถ„ํฌ์™€ ๋ถ„์‚ฐ์„ ๊ฐ€์ง€์ฃ . ์ฆ‰, ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ž์ฒด์— ๋‚ด์žฌ๋œ ํŠน์„ฑ์„ ์ธ์ง€ํ•˜๊ณ , ๊ทธ๋กœ๋ถ€ํ„ฐ ๋ณ€์ˆ˜์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•œ๋‹ค, ๋ผ๊ณ  ๋ณด๋ฉด ํ†ต๊ณ„์  ๋ชจ๋ธ๋ง์€ ์ข€ ๋” ์ง€์ ์ธ ํ™œ๋™์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก , ๋”ฅ๋Ÿฌ๋‹์ด ์Œ“์•„์˜จ ๋งŽ์€ ์•„๋ฆ„๋‹ค์›€์ด ์žˆ๊ณ , ํŠนํžˆ language model์—์„œ์˜ ๋›ฐ์–ด๋‚œ ํ™œ์•ฝ์€ ๋ฌด์‹œํ•˜๊ธฐ ์–ด๋ ต๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ฐ€๋”์€ ๊ทธ๊ฒŒ ๋ชจ๋‘ ๋…ธ๊ฐ€๋‹ค ์ฒ˜๋Ÿผ ๋ณด์ผ ๋•Œ๋„ ์žˆ๊ธด ํ•˜๋‹ˆ๊นŒ์š”.
  • ํ•œ์ฐธ ๋”ฅ๋Ÿฌ๋‹์„ ๋ฐฐ์šธ ๋•Œ๋Š”, ๊ฐ€๋”, ๋ญ ์ด๋Ÿฐ ๋…ธ๊ฐ€๋‹ค๊ฐ€ ๋‹ค ์žˆ๋‚˜, ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์ธ ํ†ต๊ณ„์  ๊ธฐ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋‹ˆ, ์•ฝ๊ฐ„ ๋˜ ์ด์ชฝ ๋ฝ•์„ ๋งž์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ํ—ˆํ—ˆํ—ˆํ—ˆํ—ˆ.
  • ์•„๋ฌดํŠผ ๋ณธ๊ฐ•์˜์—์„œ๋Š” ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • descriptive statiscs: mean, variance ๋“ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ.
    • confidence interval: ๋ชจ์ง‘๋‹จ์ด ์–ด๋–ค ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฅด๊ณ , ํ‘œ๋ณธ ์ง‘๋‹จ์„ ๋ฝ‘์•„์„œ, ๋ชจ์ง‘๋‹จ์„ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ, ์ด ์ง€ํ‘œ๊ฐ€ ๊ฐ€์ง€๋Š” ๋ถ„ํฌ๋ฅผ ํ† ๋Œ€๋กœ ์•„๋งˆ๋„ ์–ด๋–ค ๊ตฌ๊ฐ„ ๋‚ด์— 95%๋“ฑ์˜ ํ™•๋ฅ ๋กœ ์žˆ์„ ๊ฒƒ์ด๋‹ค, ๋ฅผ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ
    • hypothesis testing: null hypothesis๋ฅผ ๊ฐ€์ •ํ•˜๊ณ (์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋งˆ ์ด๋Ÿฐ ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅผ ๊ฒƒ์ด๋‹ค๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ ) ๊ทธ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ํ‘œ๋ณธ์„ ํ†ตํ•ด ์ถ”์ •ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ด ๊ฐ€์ •์— ๋”ฐ๋ผ์„œ ์ถฉ๋ถ„ํžˆ ์ƒ์„ฑ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ธ์ง€, ์•„๋‹Œ์ง€๋ฅผ ์ถ”์ • p-value๋ฅผ ํ†ตํ•ด ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋˜ํ•œ, ์ด๋ฏธ ๋จธ์‹ ๋Ÿฌ๋‹์— ์ต์ˆ™ํ•˜์‹  ๋ถ„๋“ค์—๊ฒŒ๋Š” ์‰ฝ๊ฒŒ ์ดํ•ด๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ์ €, ๋ชจ๋ธ์„ ์„ ํ˜•๋ฐฉ์ •์‹์œผ๋กœ ๊ณ ์ •ํ–ˆ์„ ๋ฟ์ด์ง€, X, Y๋ฅผ ๊ฐ๊ฐ ๋„ฃ์–ด์„œ fittingํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋จธ์‹ ๋Ÿฌ๋‹์—์„œ๋Š” ๊ทธ์ €, โ€™๋ฌด์Šจ ์ง“์„ ํ•˜๋“ , ๊ฒฐ๊ณผ๋งŒ ์ž˜ ๋งž์œผ๋ฉด ๋œ๋‹คโ€™์— ๊ฐ€๊น๊ฒŒ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ๋Š” ํ†ต๊ณ„์ ์ธ ์„ค๋ช…๋ ฅ์„ ์ข€ ๋” ๊ฐ•์กฐํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜์žˆ๊ฒ ๋„ค์š”. ์‚ฌ์‹ค, ๊ทธ๋ž˜์„œ ์„ ํ˜•๋ฐฉ์ •์‹์„ ๊ณ ์ •ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ . ์‚ฌ์‹ค์ƒ ๋‰ด๋Ÿด๋„ท์€ ์„ค๋ช…๋ ฅ์ด ์—†๊ณ , ์„ ํ˜•๋ฐฉ์ •์‹์€ ๊ฐ ๋ณ€์ˆ˜์˜ ์˜ํ–ฅ๋ ฅ์„ ๋น„๊ต์  ์ •ํ™•ํ•˜๊ฒŒ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ค๋ช…๋ ฅ์ด ๋†’๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OLS, GLM, GEE and etc.

  • WEEK 1์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ํ˜• ๋ฐฉ์ •์‹์œผ๋กœ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜์—ฌ, ํ˜„์žฌ์˜ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” Model์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. OLS, GLM, GEE, MIXEDLM ๋ชจ๋‘, statsmodels์˜ ๊ธฐ๋ณธ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ, ๊ฐ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ, ๊ธฐ๋ณธ์ ์ธ ๊ณจ๊ฒฉ๋“ค์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  • ์ผ๋‹จ ์ด ์ฝ”์Šค์—์„œ๋Š” nhanes ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.
import statsmodels.api as sm
import numpy as np
import pandas as pd 

# Read and Process data

# file link  
# https://github.com/kshedden/statswpy-nhanes/blob/master/merged/nhanes_2015_2016.csv
nhanes_df = pd.read_csv("nhanes_2015_2016.csv")
#print(nhanes_df.columns)
# Drop unused columns, drop rows with any missing values.
# ํ•„์š”์—†๋Š” ์นผ๋Ÿผ๋“ค์„ ๋ˆ„๋ฝ์‹œํ‚ค๊ณ , 
vars = ["BPXSY1", "RIDAGEYR", "RIAGENDR", "RIDRETH1", "DMDEDUC2", "BMXBMI", "SMQ020"]
nhanes_df = nhanes_df[vars].dropna()
# text๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฐ’๋“ค์„ 0, 1๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ,
nhanes_df["RIAGENDRx"] = nhanes_df.RIAGENDR.replace({1: "Male", 2: "Female"})
print("== file processing done")
print("== describe")
print(nhanes_df.describe())
print("=="*20)
== file processing done
== describe
            BPXSY1     RIDAGEYR     RIAGENDR     RIDRETH1     DMDEDUC2       BMXBMI       SMQ020
count  5102.000000  5102.000000  5102.000000  5102.000000  5102.000000  5102.000000  5102.000000
mean    125.626813    49.455116     1.517444     3.024108     3.438456    29.506978     1.588789
std      18.486560    17.682020     0.499745     1.283866     1.305679     6.977889     0.569994
min      82.000000    20.000000     1.000000     1.000000     1.000000    14.500000     1.000000
25%     112.500000    34.000000     1.000000     2.000000     3.000000    24.600000     1.000000
50%     124.000000    49.000000     2.000000     3.000000     4.000000    28.500000     2.000000
75%     136.000000    64.000000     2.000000     4.000000     4.000000    33.200000     2.000000
max     236.000000    80.000000     2.000000     5.000000     9.000000    64.600000     9.000000
========================================

Ordinary Least Squares(OLS)

  • OLS๋Š” ์„ ํ˜• ๋ฐฉ์ •์‹์—์„œ ์šฐ๋ฆฌ์˜ target varible, ์ฆ‰ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์„ ๋‘๊ณ  ์žˆ๋Š” ๋ชฉ์  ๋ณ€์ˆ˜๊ฐ€ ์—ฐ์†์ (continuouse)์ผ ๋•Œ, ์•„์ง ์ž˜ ๋ชจ๋ฅด๋Š” parameter๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ์„ ํ˜• ๋ฐฉ์ •์‹ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ•์ด๋ฉฐ, ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ deterministic linear regression์ž…๋‹ˆ๋‹ค. ์ฆ‰, y = ax1 + bx2 + c์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์„ ํ˜• ๋ชจํ˜•์„ ์ •ํ•˜๊ณ , ์ด ๋•Œ a, b, c์™€ ๊ฐ™์€ parameter๋ฅผ ์ถ”์ •ํ•  ๋•Œ, ์ด ๋ชจ๋ธ์„ ํ†ตํ•ด์„œ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋Š” y_estimate์™€ ์‹ค์ œ ๊ฐ’์ธ y_true๊ฐ„์˜ ์ฐจ์ด์˜ ์ œ๊ณฑ ํ•ฉ(redisudal sum of squares)์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋งํ•˜์ฃ .
  • ๋ณธ ์ˆ˜์—…์—์„œ๋Š” statsmodels๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OLS๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์ง€๋งŒ, sklearn์—๋„ ์žˆ๊ณ  tensorflow์—์„œ๋„ ๋™์ผํ•œ ์ง“์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” R ์–ธ์–ด ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” formula๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ํŽธํ•˜์ฃ .
OLS = True
if OLS:
    #################################
    # OLS: 
    #################################
    # X: RIAGENDRx, RIAGENDRx
    # Y: BPXSY1
    # ๋‹ค์Œ๊ณผ ๊ฐ™์ด, Y ~ X1 + X2 ์˜ ํ˜•ํƒœ๋กœ formula๋กœ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ์ฃ . 
    # sklearn์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ฒ˜๋Ÿผ formula์˜ ํ˜•ํƒœ๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. 
    model = sm.OLS.from_formula(
        formula="BPXSY1 ~ RIDAGEYR + RIAGENDRx", 
        data=nhanes_df
    )
    res = model.fit()
    print("== Summary")
    print(res.summary())
    print("== OLS complete")
  • ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค๊ณ„ํ•œ ๋ชจ๋ธ์ด ์–ด๋А ์ •๋„์˜ ์ •ํ™•๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ๊ธฐ๋ณธ์ ์ธ ํ†ต๊ณ„๊ฐ’์„ ํ†ตํ•ด์„œ, ์ด ๋ชจ๋ธ์ด ์–ผ๋งˆ๋‚˜ ์‹ ๋ขฐ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ coeff๊ฐ€ ์–ด๋–ค ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ ๋˜ํ•œ ์–ด๋–ค ๋ถ„ํฌ ์†์— ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
== Summary
                            OLS Regression Results
==============================================================================
Dep. Variable:                 BPXSY1   R-squared:                       0.215
Model:                            OLS   Adj. R-squared:                  0.214
Method:                 Least Squares   F-statistic:                     697.4
Date:                Wed, 15 Jan 2020   Prob (F-statistic):          1.87e-268
Time:                        17:05:54   Log-Likelihood:                -21505.
No. Observations:                5102   AIC:                         4.302e+04
Df Residuals:                    5099   BIC:                         4.304e+04
Df Model:                           2
Covariance Type:            nonrobust
=====================================================================================
                        coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------------
Intercept           100.6305      0.712    141.257      0.000      99.234     102.027
RIAGENDRx[T.Male]     3.2322      0.459      7.040      0.000       2.332       4.132
RIDAGEYR              0.4739      0.013     36.518      0.000       0.448       0.499
==============================================================================
Omnibus:                      706.732   Durbin-Watson:                   2.036
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             1582.730
Skew:                           0.818   Prob(JB):                         0.00
Kurtosis:                       5.184   Cond. No.                         168.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
== OLS complete

Generalized Linear Models(GLM)

  • ์‚ฌ์‹ค GLM์€ ๋ง ๊ทธ๋Œ€๋กœ, ์ผ๋ฐ˜ํ™”๋œ ์„ ํ˜• ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•ด์„๋ฉ๋‹ˆ๋‹ค(flexible generalization of ordinary linear regression). ์—ฌ๊ธฐ์„œ, OLS์™€ ๊ฐ™์€ ๋ชจ๋ธ์—์„œ๋Š” ์ข…์†๋ณ€์ˆ˜๋“ค์ด normal distribution์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋ฐ˜๋ฉด, GLM์—์„œ๋Š” ์ข…์†๋ณ€์ˆ˜(+์ž”์ฐจ์˜ ๋ถ„ํฌ)๊ฐ€ ๋ฐ˜๋“œ์‹œ normal distribution์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, binary classification ๋ฌธ์ œ๋“ค์˜ ๊ฒฝ์šฐ๋Š” ๊ฒฐ๊ณผ๊ฐ’์ด normal distribution์ด ์•„๋‹ˆ์ž–์•„์š”. ์ฆ‰, ์ด๋Ÿฐ ๊ฒƒ์ฒ˜๋Ÿผ linear model์„ ํ†ตํ•ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ(y)๋ฅผ ์‹ค์ œ response variable๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์ด ๋‘˜์„ ์ด์–ด์ฃผ๋Š” ์ผ์ข…์˜ ๋ณ€ํ™˜ํ•จ์ˆ˜๋ฅผ link function์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณธ ์ฝ”์Šค์—์„œ๋Š” ๋ชจ๋“  GLM์„ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๊ณ , binary classification์„ ์œ„ํ•œ, logistic function๋งŒ์„ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.
GLM = True
if GLM==True: 
    # smq: smoker์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ binary variable์ด๋ฉฐ 
    # RIAGENDRx: gender๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค
    nhanes_df["smq"] = nhanes_df.SMQ020.replace({2: 0, 7: np.nan, 9: np.nan})
    model = sm.GLM.from_formula(
        formula="smq ~ RIAGENDRx", 
        family=sm.families.Binomial(), 
        data=nhanes_df
    )
    res = model.fit()
    print("== Summary")
    print(res.summary())
    print("== GLM complete")
== Summary
                 Generalized Linear Model Regression Results
==============================================================================
Dep. Variable:                    smq   No. Observations:                 5094
Model:                            GLM   Df Residuals:                     5092
Model Family:                Binomial   Df Model:                            1
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -3350.6
Date:                Wed, 15 Jan 2020   Deviance:                       6701.2
Time:                        17:31:14   Pearson chi2:                 5.09e+03
No. Iterations:                     4
Covariance Type:            nonrobust
=====================================================================================
                        coef    std err          z      P>|z|      [0.025      0.975]
-------------------------------------------------------------------------------------
Intercept            -0.7547      0.042    -18.071      0.000      -0.837      -0.673
RIAGENDRx[T.Male]     0.8851      0.058     15.227      0.000       0.771       0.999
=====================================================================================
== GLM complete

Generalized Estimated Equations(GEE), ๋ณด์™„ ํ•„์š”!

Background

  • Limitation of GLM) GLM์€ ์˜ค๋ฅ˜(error)๋“ค์ด ๋…๋ฆฝ์ ์ด๋ผ๋Š” ๊ฒƒ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๊ด€์ธกํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์€ ์ด error๋“ค์ด ๋…๋ฆฝ์ ์ด๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์˜ˆ๋กœ, ๋งŒ์•ฝ ์‚ฌ๋žŒ A์˜ ํ˜ˆ๋‹น๋Ÿ‰๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ N1 ๋ฒˆ ๊ด€์ธกํ–ˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ B์˜ ํ˜ˆ๋‹น๋Ÿ‰๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ N2 ๋ฒˆ ๊ด€์ธกํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ฃ . ์ด ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋Š” A์˜ ํ˜ˆ๋‹น๋Ÿ‰ N1๋ฒˆ, B์˜ ํ˜ˆ๋‹น๋Ÿ‰ N2๋ฒˆ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐ์ดํ„ฐ๋“ค์€ ๊ฐ๊ฐ A๋ผ๋Š” ์‚ฌ๋žŒ๊ณผ B๋ผ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊นŠ๊ฒŒ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋…๋ฆฝ์ ์ด๋ผ๊ณ  ๋ณด๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์•ž์„œ ๋งํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ๊ฐœ๊ฐœ์ธ์˜ ์ฐจ์ด๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š์€ ์ƒํƒœ์ธ ๊ฒƒ์ด์ฃ .
  • GLMM) ์ด์ฒ˜๋Ÿผ outcome์ด ๋…๋ฆฝ์ ์ด์ง€ ์•Š์„ ๋•Œ, GLMM(Generalized Linear Mixed Model)์„ ์‚ฌ์šฉํ•ด์„œ ํ”ผํ—˜์ž๋ณ„๋กœ random effect๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•˜์—ฌ, ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ทธ error๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ํ”ผํ—˜์ž์—๊ฒŒ ๋‹ค๋ฅธ ๋ถ„ํฌ๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ํ†ตํ•ด์„œ outcome์˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด์ฃ . ๋”ฐ๋ผ์„œ, covariance structure๋ฅผ ์ถ”์ •ํ•จ์œผ๋กœ์จ variance์˜ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ด ๋ฐฉ๋ฒ•์€ ๋ชจ์ˆ˜์  ๋ฐฉ๋ฒ•(parameteric method)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • Limit of GLMM) GLMM์˜ ๊ฒฝ์šฐ, ์ถ”์ •๋œ covariance structure์— ๋”ฐ๋ผ์„œ ๋ชจ๋ธ์„ fittingํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”, ์ด ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ covariance์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋‚ด์žฌ๋˜์–ด ์žˆ๋Š” ์ธก์ •๋˜์ง€ ์•Š๋Š”, ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋„ ํ•˜์ฃ .
  • GEE) GEE ๋˜ํ•œ, panel, cluster ๋“ฑ ๋ฐ˜๋ณต ์ธก์ •๋œ ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ, Heteroscedasticity๊ฐ€ ๋‚ด์žฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. covariance structure๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” GLMM๊ณผ ๋‹ฌ๋ฆฌ, GEE์˜ parameter tuning์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ผ๊ด€์ ์ž…๋‹ˆ๋‹ค.
  • ๊นŒ์ง€ ์•Œ๊ฒ ๊ณ , ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„๋“ค์ด ์žˆ์–ด์„œ, ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์–ด์ฐŒ ๋ณด๋ฉด, ๊ทธ๋ƒฅ ๋ชจ๋“  ๊ธฐ๋ฒ•์„ ๋‹ค ์‚ฌ์šฉํ•ด์„œ ํ†ต๊ณ„๊ฐ‘์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ ์ ํ•ฉํ•ด ๋ณด์ด๊ธฐ๋„ ํ•ด์š”. ๊ฐ€๋ น, GEE๋Š” ๋‚ด์žฌ๋˜์–ด ์žˆ๋Š”(ํ˜น์€ ์ˆจ๊ฒจ์ ธ ์žˆ๋Š”) ๊ณต๋ถ„์‚ฐ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์„œ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก

GEE) do it.

  • ์•„๋ฌดํŠผ, ๋ณธ ์ฝ”์Šค์—์„œ๋Š” ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ statsmodels๋ฅผ ์ด์šฉํ•˜์—ฌ, GEE๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ์ด์ „์— ๋‚˜์˜จ ๋‹ค๋ฅธ model์˜ summary์™€ ๋‹ค๋ฅธ ์ ์€ Y ~ X์˜ ํ˜•ํƒœ๋กœ formula๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๊ณ , ๋งˆ์น˜, group์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋ณด๋ฉด, ์ด๋Š” ๊ฐ โ€™group์— ๋Œ€ํ•ด์„œ ์ด๋ฅผ ๊ฐ€์žฅ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„ํฌ์˜ ํ˜•ํƒœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹คโ€™์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ  ๋ณด๋‹ˆ, ๊ทธ๋ƒฅ โ€™ํด๋Ÿฌ์Šคํ„ฐ๋งโ€™์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ๋„ ํ•˜๋„ค์š” ํ .
GEE = True
if GEE == True:
    print("== GEE Summary")
    nhanes_df["group"] = 10*nhanes_df.SDMVSTRA + nhanes_df.SDMVPSU
    #print(nhanes_df["group"].head(20))
    model = sm.GEE.from_formula(
        formula="BPXSY1 ~ 1", 
        groups="group", 
        # ์—ฌ๊ธฐ์„œ์™€ ๊ฐ™์ด, cov_struct(๊ณต๋ถ„์‚ฐ๊ตฌ์กฐ)๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์ธ์ง€๋ฅผ ์ •์˜ํ•ด์คŒ. ์ด๋ฅผ ํ†ตํ•ด 
        cov_struct=sm.cov_struct.Exchangeable(), 
        data=nhanes_df
    )
    res = model.fit()
    print(res.cov_struct.summary())
    print(res.summary())
  • No. clusters๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ํŠน์ดํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.
== GEE Summary
The correlation between two observations in the same cluster is 0.030
                               GEE Regression Results
===================================================================================
Dep. Variable:                      BPXSY1   No. Observations:                 5102
Model:                                 GEE   No. clusters:                       30
Method:                        Generalized   Min. cluster size:                 106
                      Estimating Equations   Max. cluster size:                 226
Family:                           Gaussian   Mean cluster size:               170.1
Dependence structure:         Exchangeable   Num. iterations:                     6
Date:                     Thu, 16 Jan 2020   Scale:                         341.838
Covariance type:                    robust   Time:                         16:02:34
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    125.3352      0.615    203.894      0.000     124.130     126.540
==============================================================================
Skew:                          0.9922   Kurtosis:                       1.7588
Centered skew:                 0.9683   Centered kurtosis:              1.6972
==============================================================================

wrap-up

  • ์‚ฌ์‹ค ํ•˜๋‚˜์˜ jupyter notebook์— ๋„ˆ๋ฌด ๋งŽ์€ ๋‚ด์šฉ๋“ค์ด ์žˆ์–ด์„œ, ๋”ฐ๋ผ๊ฐ€๊ธฐ ์ข€ ๋ฒ…์ฐผ๋Š”๋ฐ์š”, ์ฃฝ ์ฝ์–ด๋ณด๋‹ˆ, OLS, GLM์˜ ๊ฒฝ์šฐ๋Š” week2 ์—์„œ ๋ฐฐ์šฐ๊ณ , GEE, MIXEDLM์˜ ๊ฒฝ์šฐ๋Š” week3 ์—์„œ ๋ฐฐ์šด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ›„. ๋‹คํ–‰์ด๋„ค์š”.
  • ๋˜ํ•œ, ์•ž์„œ ๋งํ•œ๊ฒƒ๊ณผ ๊ฐ™์ด, ๊ฐ ๋ชจ๋ธ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์šฐ์›”ํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜๋Š” ์—†์–ด์š”. ํ•„์š”์— ๋”ฐ๋ผ์„œ, ์ด ๋ชจ๋ธ์ด ์ ํ•ฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ์ ํ•ฉํ•  ์ˆ˜๋„ ์žˆ์ฃ .

reference

raw code

import statsmodels.api as sm
import numpy as np
import pandas as pd 

# Read and Process data

# file link  
# https://github.com/kshedden/statswpy-nhanes/blob/master/merged/nhanes_2015_2016.csv
nhanes_df = pd.read_csv("nhanes_2015_2016.csv")
print(nhanes_df.columns)
# Drop unused columns, drop rows with any missing values.
# ํ•„์š”์—†๋Š” ์นผ๋Ÿผ๋“ค์„ ๋ˆ„๋ฝ์‹œํ‚ค๊ณ , 
vars = ["BPXSY1", "RIDAGEYR", "RIAGENDR", "RIDRETH1", "DMDEDUC2", "BMXBMI",
        "SMQ020", "SDMVSTRA", "SDMVPSU"]
nhanes_df = nhanes_df[vars].dropna()
# text๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฐ’๋“ค์„ 0, 1๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ,
nhanes_df["RIAGENDRx"] = nhanes_df.RIAGENDR.replace({1: "Male", 2: "Female"})
print("== file processing done")

df_DESC = False
if df_DESC==True:
    print("== describe")
    print(nhanes_df.describe())
    print("=="*20)


OLS = False
if OLS:
    #################################
    # OLS: 
    #################################
    # X: RIAGENDRx, RIAGENDRx
    # Y: BPXSY1
    # ๋‹ค์Œ๊ณผ ๊ฐ™์ด, Y ~ X1 + X2 ์˜ ํ˜•ํƒœ๋กœ formula๋กœ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ์ฃ . 
    # sklearn์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์ฒ˜๋Ÿผ formula์˜ ํ˜•ํƒœ๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. 
    model = sm.OLS.from_formula(
        formula="BPXSY1 ~ RIDAGEYR + RIAGENDRx", 
        data=nhanes_df
    )
    res = model.fit()
    print("== Summary")
    print(res.summary())
    print("== OLS complete")
    
GLM = False
if GLM==True: 
    nhanes_df["smq"] = nhanes_df.SMQ020.replace({2: 0, 7: np.nan, 9: np.nan})
    model = sm.GLM.from_formula(
        formula="smq ~ RIAGENDRx", 
        family=sm.families.Binomial(), 
        data=nhanes_df
    )
    res = model.fit()
    print("== Summary")
    print(res.summary())
    print("== GLM complete")

GEE = False
if GEE == True:
    print("== GEE Summary")
    nhanes_df["group"] = 10*nhanes_df.SDMVSTRA + nhanes_df.SDMVPSU
    #print(nhanes_df["group"].head(20))
    model = sm.GEE.from_formula(
        formula="BPXSY1 ~ 1", 
        groups="group", 
        cov_struct=sm.cov_struct.Exchangeable(), 
        data=nhanes_df
    )
    res = model.fit()
    print(res.cov_struct.summary())
    print(res.summary())

MM = True
if MM==True:
    print("== GEE Summary")
    nhanes_df["group"] = 10*nhanes_df.SDMVSTRA + nhanes_df.SDMVPSU
    nhanes_df["smq"] = nhanes_df.SMQ020.replace({2: 0, 7: np.nan, 9: np.nan})
    for v in ["BPXSY1", "RIDAGEYR", "BMXBMI", "smq", "SDMVSTRA"]:
        print(f"=== {v}")
        model = sm.GEE.from_formula(
            formula=v + " ~ 1", 
            groups="group",
            cov_struct=sm.cov_struct.Exchangeable(), 
            data=nhanes_df
        )
        result = model.fit()
        print(v, result.cov_struct.summary())

๐Ÿ’กRELATED ARTICLES ยท ํ•จ๊ป˜ ์ฝ์œผ๋ฉด ์ข‹์€ ์—ฐ๊ด€ ํฌ์ŠคํŠธ

๊ธ€ ์ฃผ์†Œ๊ฐ€ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.