R code

# log cacluation
# j = 1
j <- log10(10)
j
# 10^j = (10)
10^j
k <- log2(10)
k
2^k

set.seed(101)


##########
# see youtube 
# https://youtu.be/8nm0G-1uJzA
n.mut <- 23+117
n.norm <- 6+210
p.cancer.mut <- 23/(23+117)
p.cancer.norm <- 6/(6+210)

set.seed(1011)
c <- runif(n.mut, 0, 1)
# 0 = not cancer, 1 = cancer among mutant gene
mutant <- ifelse(c>=p.cancer.mut, 0, 1)

c <- runif(n.norm, 0, 1)
# 0 = not cancer, 1 = cancer among normal gene
normal <- ifelse(c>=p.cancer.norm, 0, 1)

# 0 = mutant; 1 = normal
gene <- c(rep(0, length(mutant)), rep(1, length(normal)))
# 0 = not cancer; 1 = cancer
cancer <- c(mutant, normal)

df <- as.data.frame(cbind(gene, cancer))
df
df$gene <- factor(df$gene, levels = c(0,1), labels = c("mutant", "norm"))
df$cancer <- factor(df$cancer, levels = c(0,1), labels = c("nocancer", "cancer"))
df
tab <- table(df)
tab
tab[1,2]
tab[1,1]

# p.c.m = p.cancer.mut the above
p.cancer.mutant <- tab[1,2]/(tab[1,1]+tab[1,2])
p.nocancer.mutant <- tab[1,1]/(tab[1,1]+tab[1,2])
p.cancer.mutant
1-p.cancer.mutant
p.nocancer.mutant

p.cancer.norm <-  tab[2,2]/(tab[2,1]+tab[2,2])
p.nocancer.norm <- 1-p.cancer.norm
p.cancer.norm
p.nocancer.norm

odds(p.cancer.mutant)
odds(p.cancer.norm)
odds.ratio(p.cancer.mutant, p.cancer.norm)


###########################################

load("nsduh2019_adult_sub_rmph.RData")

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

# create functions for odd calculation
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 
# log(p/(1-p)) = x
# p/(1-p) = e^x
# p = e^x * (1-p)
# p = e^x - e^x*p
# p + p*e^x = e^x
# p*(1+e^x) = e^x
# p = e^x / (1 +e^x)
# 따라서 아래는 p를 구하는 평션
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)
# outputs
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"))

# generalized linear modeling (glm) for logistic regression
# note: IV가 종류측정 변인
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)

# 절편 해석 
# log(p) = a + b * demog_sex 에서x
# demog_sexFemale 일 때, b = 0 이므로
# log(p) = a = -0.13504
a = -0.13504
p.femal.yes <- exp(a)/(1 + exp(a)) # 위의 절편에 대한 p 값 계산 
p.femal.yes 
PF.yes

# x = 1일 때, log(x) = a + b
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))
ilogit(adash) 
# 위 값은 PM.yes 값과 같다
PM.yes

# 한편 위에서의 b, coefficient 값은 b 인데
# see http://commres.net/wiki/logistic_regression#odds_ratio_in_logistic
# 아래는 odds ratio 의 값이 된다. (위의 위키문서 읽을 것)
# 즉, x가 한 unit 증가할 때의 odds값의 ratio를 말한다.
exp(b)
# [1] 1.444613
# X변인의 한 unit이 증가함은 female에서 male이 되는 것
# 그 때의 odds ratio는 exp(b), 1.444613 
# female에 비해서 male의 me가 약 1.45배 정도 된다는 것것


# 위의 b값에 대한 CI을 구하기 위해서 confint 펑션을 사용한다
confint(fit.ex6.2)
# b값에 대한 것만 알고 싶으므로 
confint(fit.ex6.2)[2, , drop=F]
# 그리고 이 값들의 실제 odds ratio값을 보려면 
exp(confint(fit.ex6.2)[2,])
# 위는 female에서 male이 될면, 즉, 0 -> 1 이 될때의 
# 마리화나 경험의 (me) odds ratio는 CI 범위는 
# 1.126 ~ 1.855 즉, 13% 에서 18% 정도 증가한다는 뜻이다

# 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")

output

> # log cacluation
> # j = 1
> j <- log10(10)
> j
[1] 1
> # 10^j = (10)
> 10^j
[1] 10
> k <- log2(10)
> k
[1] 3.321928
> 2^k
[1] 10
> 
> odds       <- function(p)      p/(1-p)
> odds.ratio <- function(p1, p2) odds(p1)/odds(p2)
> logit      <- function(p)      log(p/(1-p))
> ilogit     <- function(x)      exp(x)/(1+exp(x))
> # exp() is the exponential function
> 
> ##########
> # see youtube 
> # https://youtu.be/8nm0G-1uJzA
> n.mut <- 23+117
> n.norm <- 6+210
> p.cancer.mut <- 23/(23+117)
> p.cancer.norm <- 6/(6+210)
> 
> set.seed(1011)
> c <- runif(n.mut, 0, 1)
> # 0 = not cancer, 1 = cancer among mutant gene
> mutant <- ifelse(c>=p.cancer.mut, 0, 1)
> 
> c <- runif(n.norm, 0, 1)
> # 0 = not cancer, 1 = cancer among normal gene
> normal <- ifelse(c>=p.cancer.norm, 0, 1)
> 
> # 0 = mutant; 1 = normal
> gene <- c(rep(0, length(mutant)), rep(1, length(normal)))
> # 0 = not cancer; 1 = cancer
> cancer <- c(mutant, normal)
> 
> df <- as.data.frame(cbind(gene, cancer))
> head(df)
  gene cancer
1    0      0
2    0      1
3    0      0
4    0      0
5    0      0
6    0      0
> df$gene <- factor(df$gene, levels = c(0,1), labels = c("mutant", "norm"))
> df$cancer <- factor(df$cancer, levels = c(0,1), labels = c("nocancer", "cancer"))
> head(df)
    gene   cancer
1 mutant nocancer
2 mutant   cancer
3 mutant nocancer
4 mutant nocancer
5 mutant nocancer
6 mutant nocancer
> tab <- table(df)
> tab
        cancer
gene     nocancer cancer
  mutant      121     19
  norm        210      6
> tab[1,2]
[1] 19
> tab[1,1]
[1] 121
> 
> # p.c.m = p.cancer.mut the above
> p.cancer.mutant <- tab[1,2]/(tab[1,1]+tab[1,2])
> p.nocancer.mutant <- tab[1,1]/(tab[1,1]+tab[1,2])
> p.cancer.mutant
[1] 0.1357143
> 1-p.cancer.mutant
[1] 0.8642857
> p.nocancer.mutant
[1] 0.8642857
> 
> p.cancer.norm <-  tab[2,2]/(tab[2,1]+tab[2,2])
> p.nocancer.norm <- 1-p.cancer.norm
> p.cancer.norm
[1] 0.02777778
> p.nocancer.norm
[1] 0.9722222
> 
> odds(p.cancer.mutant)
[1] 0.1570248
> odds(p.cancer.norm)
[1] 0.02857143
> odds.ratio(p.cancer.mutant, p.cancer.norm)
[1] 5.495868
> 
> 
> ###########################################
> 
> load("nsduh2019_adult_sub_rmph.RData")
> 
> # Shorter name
> nsduh <- nsduh_adult_sub
> tab <- table(nsduh$demog_sex, nsduh$mj_lifetime)
> tab
        
          No Yes
  Male   206 260
  Female 285 249
> table(nsduh$demog_sex)

  Male Female 
   466    534 
> table(nsduh$mj_lifetime)

 No Yes 
491 509 
> 
> # create functions for odd calculation
> 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 
> # log(p/(1-p)) = x
> # p/(1-p) = e^x
> # p = e^x * (1-p)
> # p = e^x - e^x*p
> # p + p*e^x = e^x
> # p*(1+e^x) = e^x
> # p = e^x / (1 +e^x)
> # 따라서 아래는 p를 구하는 평션
> 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)
> # outputs
> round(c(PM.yes, PF.yes, OM, OF, OR.mvsf), 5)
[1] 0.55794 0.46629 1.26214 0.87368 1.44461
> 
> 
> library(dplyr)

다음의 패키지를 부착합니다: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

> # female을 reference로 바꾸는 작업 relevel
> nsduh <- nsduh %>% 
+   mutate(demog_sex = relevel(demog_sex, ref = "Female"))
> 
> # generalized linear modeling (glm) for logistic regression
> # note: IV가 종류측정 변인
> fit.ex6.2 <- glm(mj_lifetime ~ demog_sex,
+                  family = binomial, data = nsduh)
> summary(fit.ex6.2)

Call:
glm(formula = mj_lifetime ~ demog_sex, family = binomial, data = nsduh)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)   
(Intercept)   -0.13504    0.08675  -1.557  0.11954   
demog_sexMale  0.36784    0.12738   2.888  0.00388 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1386.0  on 999  degrees of freedom
Residual deviance: 1377.6  on 998  degrees of freedom
AIC: 1381.6

Number of Fisher Scoring iterations: 3

> 
> # 아래는 다른 펑션으로 아웃풋이 다름름
> # library(lessR)
> # fit.ex6.2b <- Logit(mj_lifetime ~ demog_sex, data=nsduh)
> 
> # 절편 해석 
> # log(p) = a + b * demog_sex 에서x
> # demog_sexFemale 일 때, b = 0 이므로
> # log(p) = a = -0.13504
> a = -0.13504
> p.femal.yes <- exp(a)/(1 + exp(a)) # 위의 절편에 대한 p 값 계산 
> p.femal.yes 
[1] 0.4662912
> PF.yes
[1] 0.4662921
> 
> # x = 1일 때, log(x) = a + b
> summary(fit.ex6.2)$coefficient # coefficient 값들 출력
                Estimate Std. Error   z value    Pr(>|z|)
(Intercept)   -0.1350363 0.08674572 -1.556691 0.119543858
demog_sexMale  0.3678417 0.12737811  2.887794 0.003879538
> a <- summary(fit.ex6.2)$coefficient[1,1] # 절편 값 출력
> b <- summary(fit.ex6.2)$coefficient[2,1] # 절편 값 출력
> a
[1] -0.1350363
> b
[1] 0.3678417
> adash <- a + b 
> adash
[1] 0.2328055
> 
> # or 
> exp(adash) / (1 + exp(adash))
[1] 0.5579399
> ilogit(adash) 
[1] 0.5579399
> # 위 값은 PM.yes 값과 같다
> PM.yes
[1] 0.5579399
> 
> # 한편 위에서의 b, coefficient 값은 b 인데
> # see http://commres.net/wiki/logistic_regression#odds_ratio_in_logistic
> # 아래는 odds ratio 의 값이 된다. (위의 위키문서 읽을 것)
> # 즉, x가 한 unit 증가할 때의 odds값의 ratio를 말한다.
> exp(b)
[1] 1.444613
> # [1] 1.444613
> # X변인의 한 unit이 증가함은 female에서 male이 되는 것
> # 그 때의 odds ratio는 exp(b), 1.444613 
> # female에 비해서 male의 me가 약 1.45배 정도 된다는 것것
> 
> 
> # 위의 b값에 대한 CI을 구하기 위해서 confint 펑션을 사용한다
> confint(fit.ex6.2)
프로파일링이 완료되길 기다리는 중입니다...
                   2.5 %     97.5 %
(Intercept)   -0.3054835 0.03475989
demog_sexMale  0.1185985 0.61808060
> # b값에 대한 것만 알고 싶으므로 
> confint(fit.ex6.2)[2, , drop=F]
프로파일링이 완료되길 기다리는 중입니다...
                  2.5 %    97.5 %
demog_sexMale 0.1185985 0.6180806
> # 그리고 이 값들의 실제 odds ratio값을 보려면 
> exp(confint(fit.ex6.2)[2,])
프로파일링이 완료되길 기다리는 중입니다...
   2.5 %   97.5 % 
1.125918 1.855363 
> # 위는 female에서 male이 될면, 즉, 0 -> 1 이 될때의 
> # 마리화나 경험의 (me) odds ratio는 CI 범위는 
> # 1.126 ~ 1.855 즉, 13% 에서 18% 정도 증가한다는 뜻이다다
> 
> # install.packages("car")
> library(car)
필요한 패키지를 로딩중입니다: carData

다음의 패키지를 부착합니다: ‘car’

The following object is masked _by_ ‘.GlobalEnv’:

    logit

The following object is masked from ‘package:dplyr’:

    recode

> # coefficient probability test
> car::Anova(fit.ex6.2, type = 3, test.statistic = "Wald")
Analysis of Deviance Table (Type III tests)

Response: mj_lifetime
            Df  Chisq Pr(>Chisq)   
(Intercept)  1 2.4233    0.11954   
demog_sex    1 8.3394    0.00388 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> 
> ########################################
> ########################################
> ########################################
> # numeric IV
> fit.ex6.3 <- glm(mj_lifetime ~ alc_agefirst, 
+                  family = binomial, data = nsduh)
> summary(fit.ex6.3)

Call:
glm(formula = mj_lifetime ~ alc_agefirst, family = binomial, 
    data = nsduh)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)    5.3407     0.4747   11.25   <2e-16 ***
alc_agefirst  -0.2835     0.0267  -10.62   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1141.45  on 842  degrees of freedom
Residual deviance:  968.44  on 841  degrees of freedom
  (결측으로 인하여 157개의 관측치가 삭제되었습니다.)
AIC: 972.44

Number of Fisher Scoring iterations: 5

> round(summary(fit.ex6.3)$coef, 4)
             Estimate Std. Error  z value Pr(>|z|)
(Intercept)    5.3407     0.4747  11.2510        0
alc_agefirst  -0.2835     0.0267 -10.6181        0
> 
> 
> ilogit(coef(fit.ex6.3)["(Intercept)"])
(Intercept) 
  0.9952302 
> or <- exp(coef(fit.ex6.3)["alc_agefirst"])
> 1-or
alc_agefirst 
   0.2468802 
> 
> # 0.9952 = prob of starting marijuana 
> # when the age is zero (intercept이므로)
> 
> # age = 0 에서 추정하는 것은 이상함 
> summary(nsduh$alc_agefirst)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   3.00   15.00   17.00   17.49   19.00   45.00     157 
> 
> # 위의 아웃풋에서 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)

Call:
glm(formula = mj_lifetime ~ calc_agefirst, family = binomial, 
    data = nsduh)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)    0.52065    0.07898   6.592 4.34e-11 ***
calc_agefirst -0.28353    0.02670 -10.618  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1141.45  on 842  degrees of freedom
Residual deviance:  968.44  on 841  degrees of freedom
  (결측으로 인하여 157개의 관측치가 삭제되었습니다.)
AIC: 972.44

Number of Fisher Scoring iterations: 5

> # 우선 나이가 17살일 때 (x=0)
> # 절편 값인 0.5207이 logit 값이 된다. 
> # 이 때, prob 를 구하면 아래와 같다
> p <- ilogit(coef(fit.ex6.3.centered)["(Intercept)"]) 
> p
(Intercept) 
  0.6273001 
> # 아니면 
> a <- fit.ex6.3.centered$coefficients["(Intercept)"]
> exp(a)/(1+exp(a))
(Intercept) 
  0.6273001 
> 
> # 독립변인인 나이에 대한 해석
> # b coefficient 
> # 17살일 때를 기준으로 한살씩 증가할 때마다의 
> # 마리화나 경험/비경험의 Odds ratio는  -0.2835
> # 이를 수치화하면 (odds ratio는 exp(b)이다)
> exp(coef(fit.ex6.3.centered)["calc_agefirst"])
calc_agefirst 
    0.7531198 
> 
> # 이는 17이후에 한살씩 알콜처음 경험을 늦추면 
> # 마리화나 경험율 대 미경험 odds ratio가 
> # 0.247 낮아진다고 할 수 있다 (0.7531 증가는)
> # 1-0.7531로 보는 것
> 
> # 그리고 이에 대한 CI를 보면 아래와 같고
> confint(fit.ex6.3.centered)[2, , drop = F]
프로파일링이 완료되길 기다리는 중입니다...
                   2.5 %    97.5 %
calc_agefirst -0.3375819 -0.232863
> # 이를 승비로 (odds ratio) 보면 
> exp(confint(fit.ex6.3.centered)[2, , drop = F])
프로파일링이 완료되길 기다리는 중입니다...
                  2.5 %    97.5 %
calc_agefirst 0.7134935 0.7922621
> 
> #################################
> #################################
> # 1년이 아니라 3년일 경우
> fit.ex6.3.centered

Call:  glm(formula = mj_lifetime ~ calc_agefirst, family = binomial, 
    data = nsduh)

Coefficients:
  (Intercept)  calc_agefirst  
       0.5207        -0.2835  

Degrees of Freedom: 842 Total (i.e. Null);  841 Residual
  (결측으로 인하여 157개의 관측치가 삭제되었습니다.)
Null Deviance:	    1141 
Residual Deviance: 968.4 	AIC: 972.4
> coef(fit.ex6.3.centered)["calc_agefirst"]
calc_agefirst 
    -0.283531 
> coef(fit.ex6.3.centered)["calc_agefirst"]*3
calc_agefirst 
    -0.850593 
> exp(coef(fit.ex6.3.centered)["calc_agefirst"]*3)
calc_agefirst 
    0.4271616 
> 
> # CI 의 경우 아래와 같고
> confint(fit.ex6.3.centered)[2,]*3
프로파일링이 완료되길 기다리는 중입니다...
    2.5 %    97.5 % 
-1.012746 -0.698589 
> # 이에 해당하는 값은 
> exp(confint(fit.ex6.3.centered)[2,]*3)
프로파일링이 완료되길 기다리는 중입니다...
    2.5 %    97.5 % 
0.3632203 0.4972865 
> 
> 
> #################################
> #################################
> ## 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)
                              Estimate Std. Error z value
(Intercept)                     6.2542     0.5914 10.5759
alc_agefirst                   -0.2754     0.0276 -9.9922
demog_age_cat626-34            -0.2962     0.3286 -0.9012
demog_age_cat635-49            -0.8043     0.2966 -2.7120
demog_age_cat650-64            -0.6899     0.2985 -2.3109
demog_age_cat665+              -1.2748     0.3043 -4.1893
demog_sexMale                  -0.0609     0.1618 -0.3763
demog_income$20,000 - $49,999  -0.5309     0.2664 -1.9927
demog_income$50,000 - $74,999  -0.0793     0.3049 -0.2601
demog_income$75,000 or more    -0.3612     0.2532 -1.4264
                              Pr(>|z|)
(Intercept)                     0.0000
alc_agefirst                    0.0000
demog_age_cat626-34             0.3675
demog_age_cat635-49             0.0067
demog_age_cat650-64             0.0208
demog_age_cat665+               0.0000
demog_sexMale                   0.7067
demog_income$20,000 - $49,999   0.0463
demog_income$50,000 - $74,999   0.7948
demog_income$75,000 or more     0.1538
> coef.values <- coef(fit.ex6.3.adj)
> data.frame(coef.values)
                              coef.values
(Intercept)                    6.25417324
alc_agefirst                  -0.27541454
demog_age_cat626-34           -0.29618703
demog_age_cat635-49           -0.80427437
demog_age_cat650-64           -0.68990572
demog_age_cat665+             -1.27475385
demog_sexMale                 -0.06088993
demog_income$20,000 - $49,999 -0.53087558
demog_income$50,000 - $74,999 -0.07930897
demog_income$75,000 or more   -0.36119745
> 
> logit.values <- exp(coef(fit.ex6.3.adj))
> data.frame(logit.values)
                              logit.values
(Intercept)                    520.1791313
alc_agefirst                     0.7592573
demog_age_cat626-34              0.7436483
demog_age_cat635-49              0.4474125
demog_age_cat650-64              0.5016234
demog_age_cat665+                0.2794998
demog_sexMale                    0.9409268
demog_income$20,000 - $49,999    0.5880898
demog_income$50,000 - $74,999    0.9237545
demog_income$75,000 or more      0.6968414
> 
> confint(fit.ex6.3.adj)
프로파일링이 완료되길 기다리는 중입니다...
                                   2.5 %      97.5 %
(Intercept)                    5.1309585  7.45103372
alc_agefirst                  -0.3312435 -0.22314999
demog_age_cat626-34           -0.9490643  0.34307731
demog_age_cat635-49           -1.4002915 -0.23429671
demog_age_cat650-64           -1.2893673 -0.11559836
demog_age_cat665+             -1.8854986 -0.68944515
demog_sexMale                 -0.3790935  0.25566208
demog_income$20,000 - $49,999 -1.0591496 -0.01305382
demog_income$50,000 - $74,999 -0.6785210  0.51882750
demog_income$75,000 or more   -0.8643471  0.13016735
> exp(confint(fit.ex6.3.adj))
프로파일링이 완료되길 기다리는 중입니다...
                                    2.5 %       97.5 %
(Intercept)                   169.1792047 1721.6419228
alc_agefirst                    0.7180303    0.7999949
demog_age_cat626-34             0.3871031    1.4092777
demog_age_cat635-49             0.2465251    0.7911270
demog_age_cat650-64             0.2754450    0.8908329
demog_age_cat665+               0.1517534    0.5018544
demog_sexMale                   0.6844816    1.2913163
demog_income$20,000 - $49,999   0.3467506    0.9870310
demog_income$50,000 - $74,999   0.5073668    1.6800566
demog_income$75,000 or more     0.4213265    1.1390190
> confint.logit.values <- exp(confint(fit.ex6.3.adj))
프로파일링이 완료되길 기다리는 중입니다...
> 
> # logit.values 를 Adjusted Odds Ratio로 하고 출력
> cbind("AdjOR" = logit.values, confint.logit.values)
                                    AdjOR       2.5 %
(Intercept)                   520.1791313 169.1792047
alc_agefirst                    0.7592573   0.7180303
demog_age_cat626-34             0.7436483   0.3871031
demog_age_cat635-49             0.4474125   0.2465251
demog_age_cat650-64             0.5016234   0.2754450
demog_age_cat665+               0.2794998   0.1517534
demog_sexMale                   0.9409268   0.6844816
demog_income$20,000 - $49,999   0.5880898   0.3467506
demog_income$50,000 - $74,999   0.9237545   0.5073668
demog_income$75,000 or more     0.6968414   0.4213265
                                    97.5 %
(Intercept)                   1721.6419228
alc_agefirst                     0.7999949
demog_age_cat626-34              1.4092777
demog_age_cat635-49              0.7911270
demog_age_cat650-64              0.8908329
demog_age_cat665+                0.5018544
demog_sexMale                    1.2913163
demog_income$20,000 - $49,999    0.9870310
demog_income$50,000 - $74,999    1.6800566
demog_income$75,000 or more      1.1390190
> # 절편은 coefficient 해석과 (odds ratio) 관계 없으므로 생략 
> cbind("AdjOR" = logit.values, confint.logit.values)[-1,]
                                  AdjOR     2.5 %    97.5 %
alc_agefirst                  0.7592573 0.7180303 0.7999949
demog_age_cat626-34           0.7436483 0.3871031 1.4092777
demog_age_cat635-49           0.4474125 0.2465251 0.7911270
demog_age_cat650-64           0.5016234 0.2754450 0.8908329
demog_age_cat665+             0.2794998 0.1517534 0.5018544
demog_sexMale                 0.9409268 0.6844816 1.2913163
demog_income$20,000 - $49,999 0.5880898 0.3467506 0.9870310
demog_income$50,000 - $74,999 0.9237545 0.5073668 1.6800566
demog_income$75,000 or more   0.6968414 0.4213265 1.1390190
> # 소수점 3으로 제약
> round(cbind("AdjOR" = logit.values, 
+             confint.logit.values)[-1,],3)
                              AdjOR 2.5 % 97.5 %
alc_agefirst                  0.759 0.718  0.800
demog_age_cat626-34           0.744 0.387  1.409
demog_age_cat635-49           0.447 0.247  0.791
demog_age_cat650-64           0.502 0.275  0.891
demog_age_cat665+             0.279 0.152  0.502
demog_sexMale                 0.941 0.684  1.291
demog_income$20,000 - $49,999 0.588 0.347  0.987
demog_income$50,000 - $74,999 0.924 0.507  1.680
demog_income$75,000 or more   0.697 0.421  1.139
> 
> # OR은 coefficient 값을 이야기하는 것을 다시 확인
> 
> # 또한 wald significant test
> # P-values
> car::Anova(fit.ex6.3.adj, type = 3, test.statistic = "Wald")
Analysis of Deviance Table (Type III tests)

Response: mj_lifetime
               Df    Chisq Pr(>Chisq)    
(Intercept)     1 111.8504  < 2.2e-16 ***
alc_agefirst    1  99.8435  < 2.2e-16 ***
demog_age_cat6  4  23.0107   0.000126 ***
demog_sex       1   0.1416   0.706685    
demog_income    3   5.4449   0.141974    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
경고메시지(들): 
1: printHypothesis(L, rhs, names(b))에서:
  one or more coefficients in the hypothesis include
     arithmetic operators in their names;
  the printed representation of the hypothesis will be omitted
2: printHypothesis(L, rhs, names(b))에서:
  one or more coefficients in the hypothesis include
     arithmetic operators in their names;
  the printed representation of the hypothesis will be omitted
>