logistic_regression:examples_r

This is an old revision of the document!


j <- log10(10)
j
10^j
k <- log2(10)
k
2^k

set.seed(101)
n <- 200
p.cancer <- 0.08
p.mutant <- 0.39

c <- runif(n, 0, 1)
canc <- ifelse(c>=p.cancer, "nocancer", "cancer")
c <- runif(n, 0, 1)
gene <- ifelse(c>=p.mutant, "norm", "mutated")

da <- data.frame(gene, canc)
da
tab <- table(da)
tab

odd.canc.mutated <- 10/119
odd.canc.norm <- 23/198
odd.ratio <- odd.canc.mutated/odd.canc.norm
odd.ratio
log(odd.ratio)

##########
n.mut <- 23+117
n.norm <- 6+210

p.cancer.mut <- 23/(23+117)
p.cancer.norm <- 6/(6+210)
set.seed(101)
c <- runif(n.mut, 0, 1)
canc.mut <- ifelse(c>=p.cancer.mut, "nocancer", "cancer")
c <- runif(n.norm, 0, 1)
canc.norm <- ifelse(c>=p.cancer.norm, "nocancer", "cancer")
table(canc.mut)
table(canc.norm)


load("nsduh2019_adult_sub_rmph.RData")

# Shorter name
nsduh <- nsduh_adult_sub
tab <- table(nsduh$demog_sex, nsduh$mj_lifetime)
tab


odds       <- function(p)      p/(1-p)
odds.ratio <- function(p1, p2) odds(p1)/odds(p2)
# log odds를 구하는 function
logit      <- function(p)      log(p/(1-p))
# probability를 구하는 function 
# p = e^x/(1+e^x)
ilogit     <- function(x)      exp(x)/(1+exp(x))
# exp() is the exponential function

PM.yes <- tab[1,2]/(tab[1,2]+tab[1,1])
PF.yes <- tab[2,2]/(tab[2,2]+tab[2,1])
OM <- odds(PM.yes)
OF <- odds(PF.yes)
OR.mvsf <- odds.ratio(PM.yes, PF.yes)
round(c(PM.yes, PF.yes, OM, OF, OR.mvsf), 5)

library(dplyr)
# female을 reference로 바꾸는 작업 relevel
nsduh <- nsduh %>% 
  mutate(demog_sex = relevel(demog_sex, ref = "Female"))

fit.ex6.2 <- glm(mj_lifetime ~ demog_sex,
                 family = binomial, data = nsduh)
summary(fit.ex6.2)

# library(lessR)
# fit.ex6.2b <- Logit(mj_lifetime ~ demog_sex, data=nsduh)

# 절편 해석 
# demog_sexFemale 일 때, 
exp(-0.13504)/(1 + exp(-0.13504)) # 위의 절편에 대한 p 값 계산 
PF.yes
# p = e^x/1+e^x
summary(fit.ex6.2)$coefficient # coefficient 값들 출력
a <- summary(fit.ex6.2)$coefficient[1,1] # 절편 값 출력
b <- summary(fit.ex6.2)$coefficient[2,1] # 절편 값 출력
a
b
adash <- a + b 
adash

# or 
exp(adash) / (1 + exp(adash))
p <- ilogit(adash) 
p 
# 이 값은 PM.yes 값과 같다
PM.yes

# coefficient 아웃풋을 이용하여 b값은 아래와 같이 얻는다
b <- summary(fit.ex6.2)$coefficient[2,1]
b
exp(1)^b

# 위의 b값에 대한 CI을 구하기 위해서 confint 펑션을 사용한다
confint(fit.ex6.2)
# b값에 대한 것만 알고 싶으므로 
confint(fit.ex6.2)[2, , drop=F]
# 그리고 이 값들의 실제 odds ratio값을 보려면 
exp(confint(fit.ex6.2)[2,])


# install.packages("car")
library(car)
# coefficient probability test
car::Anova(fit.ex6.2, type = 3, test.statistic = "Wald")

########################################
########################################
########################################
# numeric IV
fit.ex6.3 <- glm(mj_lifetime ~ alc_agefirst, 
                 family = binomial, data = nsduh)
summary(fit.ex6.3)
round(summary(fit.ex6.3)$coef, 4)


ilogit(coef(fit.ex6.3)["(Intercept)"])
or <- exp(coef(fit.ex6.3)["alc_agefirst"])
1-or

# 0.9952 = prob of starting marijuana 
# when the age is zero (intercept이므로)

# age = 0 에서 추정하는 것은 이상함 
summary(nsduh$alc_agefirst)

# 위의 아웃풋에서 Mean값이 약 17이므로 17을 
# 기준으로 하여 다시 보면

nsduh <- nsduh %>% 
  mutate(calc_agefirst = alc_agefirst - 17)
fit.ex6.3.centered <- glm(mj_lifetime ~ calc_agefirst,
                          family = binomial, data = nsduh)
summary(fit.ex6.3.centered)
# 우선 나이가 17살일 때 (x=0)
# 절편 값인 0.5207이 logit 값이 된다. 
# 이 때, prob 를 구하면 아래와 같다
p <- ilogit(coef(fit.ex6.3.centered)["(Intercept)"]) 
p
# 아니면 
a <- fit.ex6.3.centered$coefficients["(Intercept)"]
exp(a)/(1+exp(a))

# 독립변인인 나이에 대한 해석
# b coefficient 
# 17살일 때를 기준으로 한살씩 증가할 때마다의 
# 마리화나 경험/비경험의 Odds ratio는  -0.2835
# 이를 수치화하면 (odds ratio는 exp(b)이다)
exp(coef(fit.ex6.3.centered)["calc_agefirst"])

# 이는 17이후에 한살씩 알콜처음 경험을 늦추면 
# 마리화나 경험율 대 미경험 odds ratio가 
# 0.247 낮아진다고 할 수 있다 (0.7531 증가는)
# 1-0.7531로 보는 것

# 그리고 이에 대한 CI를 보면 아래와 같고
confint(fit.ex6.3.centered)[2, , drop = F]
# 이를 승비로 (odds ratio) 보면 
exp(confint(fit.ex6.3.centered)[2, , drop = F])

#################################
#################################
# 1년이 아니라 3년일 경우
fit.ex6.3.centered
coef(fit.ex6.3.centered)["calc_agefirst"]
coef(fit.ex6.3.centered)["calc_agefirst"]*3
exp(coef(fit.ex6.3.centered)["calc_agefirst"]*3)

# CI 의 경우 아래와 같고
confint(fit.ex6.3.centered)[2,]*3
# 이에 해당하는 값은 
exp(confint(fit.ex6.3.centered)[2,]*3)


#################################
#################################
## Multiple regression
#################################
fit.ex6.3.adj <- glm(mj_lifetime ~ alc_agefirst + 
                       demog_age_cat6 + demog_sex +
                       demog_income, 
                     family = binomial, data = nsduh)
# Regression coefficient table
round(summary(fit.ex6.3.adj)$coef, 4)
coef.values <- coef(fit.ex6.3.adj)
data.frame(coef.values)

logit.values <- exp(coef(fit.ex6.3.adj))
data.frame(logit.values)

confint(fit.ex6.3.adj)
exp(confint(fit.ex6.3.adj))
confint.logit.values <- exp(confint(fit.ex6.3.adj))

# logit.values 를 Adjusted Odds Ratio로 하고 출력
cbind("AdjOR" = logit.values, confint.logit.values)
# 절편은 coefficient 해석과 (odds ratio) 관계 없으므로 생략 
cbind("AdjOR" = logit.values, confint.logit.values)[-1,]
# 소수점 3으로 제약
round(cbind("AdjOR" = logit.values, 
            confint.logit.values)[-1,],3)

# OR은 coefficient 값을 이야기하는 것을 다시 확인

# 또한 wald significant test
# P-values
car::Anova(fit.ex6.3.adj, type = 3, test.statistic = "Wald")

logistic_regression/examples_r.1733708566.txt.gz · Last modified: 2024/12/09 10:42 by hkimscil

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki