Stats & AI tech blog - '일단 시도함'

[R] Loop function for Univariable Logistic Regression 본문

Programming/R

[R] Loop function for Univariable Logistic Regression

justdoit ok? 2024. 11. 8. 10:02

독립 변수를 바꿔가며 단변량 로지스틱 회귀 모형을 반복해서 만들어야할 때 사용하는 코드이다.

개인 라이브러리의 함수로 저장해놓고 쓰기 편리하다.

 

모델에 사용할 종속 변수와 모든 독립 변수를 포함하는 데이터 프레임 종속 변수명을 인자로 넣어주면 아래와 같은 결과를 출력한다.

> 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

}