저번 생존분석 때 lung.csv 데이터를 다시 활용해서 logistic regression을 돌려보고자 합니다.
데이터 인용은 저번에 보신대로 (https://medium.com/the-researchers-guide/survival-analysis-in-python-km-estimate-cox-ph-and-aft-model-5533843c5d5d )에 다음과 같이 나와있습니다.
Data Source: Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. North Central Cancer Treatment Group. Journal of Clinical Oncology. 12(3):601–7, 1994.
여기서는 time(생존시간)을 사용하지 않고 status(1=censored, 2=event('deat'))에서 1을 뺀 상태로 해보겠습니다. 성별도 (male=1, female=2)에서 1을 빼고 female이란 이름을 붙였습니다. ph.ecog는 의사가 판단한 점수로 0이 정상이고 1은 증상 있으나 보행가능, 2는 하루 50% 미만을 침상에서 보냄, 3은 하루 50%이상 침상에 있지만, 누워있지는 않음, 4 온종일 누워있음.
ph.karno는 의사가 평가한 Karnofsky 점수로 0이 가장 나쁘고 100이 좋습니다. pat.karno는 환자 스스로 평가한 Karnofsky 점수입니다. meal.cal은 식사에서 섭취한 칼로리, wt.loss는 체중감소를 의미합니다.
데이터를 불러오겠습니다.
뒤에서 설명변수를 넣을 때 "."있으면 파이썬에서 잘못 인식하고 오류가 날 수 있어서 "_"로 바꾸고, status도 0,1, 성별도 1을 빼서 0(남자), 1(여자)로 하고 female이란 이름을 붙였습니다. "데이터셋".dropna()는 결측값이 있는 행을 삭제합니다. 이 경우 meal.cal에 결측값이 제일 많은 관계로 설명변수에서 제외시켰습니다.
statsmodels.formula.api를 불러오면 그 안에 있는 .logit(formula=, data=) 함수가 R과 비슷한 식으로 모형을 설정합니다.
결과는 .fit()에 있는 결과를 print()로 출력합니다.
import statsmodels.formula.api as smf
form = 'status ~ age + female +wt_loss + ph_ecog + ph_karno'
logit_model = smf.logit(formula = form, data=data1)
result = logit_model.fit()
print(result.summary() )
결과변수 status의 0,1이 생존/사망을 나타내므로 계수 값이 양수일수록 안좋은 영향을 나타냅니다. p값 0.05미만 기준으로 유의한 변수는 여성, ph_ecog(침상에 누워있는 상태)인데 여성이 상대적으로 생존 가능성이 높고 침상에서 생활하지 않을수록 사망위험이 작은 것으로 해석해볼 수 있겠습니다.
오즈비는 추정된 계수에 numpy의 함수 np.exp()를 가지고 변환합니다.
sklearn에서도 로지스틱 회귀분석이 가능합니다.
linear_model.LogisticRegression().fit(X, y)와 같이 지정해주면 됩니다. sklearn에서는 statmodels와 달리 종속변수나 독립변수에 NA가 하나라도 있으면 실행이 되지 않습니다.
추정된 결과의 계수 값은 같습니다.
첫댓글 오~ 생각보다 간단하네요^^