Recent Posts
Stats & AI tech blog - '일단 시도함'
[R] Loop function for Univariable Logistic Regression 본문
독립 변수를 바꿔가며 단변량 로지스틱 회귀 모형을 반복해서 만들어야할 때 사용하는 코드이다.
개인 라이브러리의 함수로 저장해놓고 쓰기 편리하다.
모델에 사용할 종속 변수와 모든 독립 변수를 포함하는 데이터 프레임과 종속 변수명을 인자로 넣어주면 아래와 같은 결과를 출력한다.
> uni_logistic_tb(df, 'Group')
y label OR (CI 95%) p.value
2 Group Age 1.025 (1.001-1.050) 0.045
4 Group Gender1 1.156 (0.613-2.142) 0.649
6 Group BSA 0.227 (0.053-0.939) 0.043
8 Group Smoking1 1.454 (0.874-2.412) 0.147
10 Group HTN1 1.706 (0.997-2.988) 0.056
12 Group DM1 1.017 (0.634-1.633) 0.945
14 Group CKD1 3.147 (1.677-6.028) 0.000
16 Group CVA1 0.978 (0.510-1.831) 0.946
18 Group PAOD1 1.738 (0.580-5.210) 0.314
20 Group Dyslipidemia1 0.865 (0.496-1.487) 0.605
22 Group Arrhythmia1 2.625 (0.733-10.467) 0.142
24 Group PrePCI1 1.250 (0.676-2.282) 0.470
26 Group EF401 1.797 (0.966-3.343) 0.063
28 Group vessel31 1.246 (0.718-2.206) 0.440
30 Group LM1 1.375 (0.781-2.403) 0.265
- R 코드
#' Univariable Logisitc Regression Loop Function
#'
#' @param data A data frame containing the data.
#' @param dependent A string specifying the dependent variable.
#' @return A data frame containing results of univariable logistic regression.
#' @export
uni_logistic_tb <- function(data, y){
independent.list = colnames(data)[!grepl(y, colnames(data))] # 종속변수를 제외한 변수명 리스트
uni_logi_tb = data.frame() # 빈 데이터프레임 정의
# 반복문
for(var in independent.list){
# 로지스틱 모델 구축
formula <- as.formula(paste('data$', y, '~', var))
model <- glm(formula = formula, data=data, family='binomial')
# OR, CI, P-value 추출하여 uni_logi_tb에 넣기
summary <- coef(summary(model))
ci <- confint(model, level=0.95)
label <- rownames(summary)
OR <- sprintf("%.3f", exp(summary[,"Estimate"][-1]))
Lower <- sprintf("%.3f", exp(ci[2]))
Upper <- sprintf("%.3f", exp(ci[4]))
p.value <- sprintf("%.3f", summary[,'Pr(>|z|)'][-1])
logi_tb <- cbind(y, label, OR, Lower, Upper, p.value)
uni_logi_tb <- rbind(uni_logi_tb, logi_tb)
}
# Intercept 부분은 출력에서 제외
uni_logi_tb <- uni_logi_tb[uni_logi_tb$label != '(Intercept)',]
# OR (CI 95%) 형태로 변수 정의
uni_logi_tb <- uni_logi_tb %>% add_column('OR (CI 95%)' = paste0(uni_logi_tb$OR, ' (', uni_logi_tb$Lower, '-', uni_logi_tb$Upper,')'))
# 필요한 컬럼만 선택하여 결과 테이블 만들기
result <- uni_logi_tb[,c(1,2,7,6)]
result
}
'Programming > R' 카테고리의 다른 글
[R] PSM, Propensity Score Matching (성향점수매칭) (1) | 2024.11.12 |
---|---|
[R] IPTW, Inverse Probability of Treatment Weighting (역확률가중치) (2) | 2024.11.09 |
[R] R에서 변수 동적 처리 (0) | 2024.07.12 |
[R] R에서 라이브러리 (패키지) 만들기 (0) | 2024.07.09 |
[R] Caret Package로 모델 학습 및 튜닝하기 (0) | 2024.05.29 |