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())
GitHub์์ ์ด ๊ธ์ ๋งํฌ๋ค์ด ์๋ณธ ๋ณด๊ธฐ & ์์ ์ ์src/content/posts/2020-01-21-fitting_stat_model_week_1_part1
๐ ์ฐ๊ด ์ง์ ํ๋ธ:๐ python-libs ์นดํ
๊ณ ๋ฆฌ๐ Python ์ปค๋ฆฌํ๋ผ#python#python-libs#coursera
๐กRELATED ARTICLES ยท ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ ์ฐ๊ด ํฌ์คํธ
python-libs
Fitting Statistical Models to Data with Python - WEEK 1 - Part 2
์ฝ์ด๋ณด๊ธฐ→
python-libs
Fitting Statistical Models to Data with Python - WEEK 2 - Part 1
์ฝ์ด๋ณด๊ธฐ→
python-libs
Fitting Statistical Models to Data with Python - WEEK 2 - Part 2
์ฝ์ด๋ณด๊ธฐ→
python-libs
Inferential Statistical Analysis with Python - WEEK 2
์ฝ์ด๋ณด๊ธฐ→