13 Regression model
คือ การสร้างสมการถดถอยของความสัมพันธ์ระหว่าง 2 ตัวแปรขึ้นไป โดยประกอบไปด้วย
ตัวแปรต้น (Independent variable, \(x\)) คือ ตัวแปรที่เป็นต้นเหตุ
ตัวแปรตาม (Dependent variable, \(y\)) คือ ตัวแปรที่เป็นปลายเหตุ ซึ่งเป็นผลมาจากการเปลี่ยนแปลงของตัวแปรต้น
ความสัมพันธ์ของตัวแปรต้นและตัวแปรตามจะเขียนในรูปแบบ \(f(x) \sim x\)
13.1 Linear regression
13.1.1 Model summary
คือ การสร้างความสัมพันธ์ของตัวแปรแบบเชิงเส้น ใช้กับข้อมูลแบบต่อเนื่อง (Continuous data)
\[ h_{\theta}(x) = \theta_{0} + \theta_{1}x_{1} + \theta_{2}x_{2} + \ … \ + \theta_{n}x_{n} + \epsilon \]
data("Diabetes", package = "heplots")
ggplot(Diabetes, aes(x = glufast, y = sspg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
theme_bw()
13.1.2 Model performance
ในการวัดความแม่นยำของ Linear regression นั้นประกอบด้วยสามองค์ประกอบ
##
## Call:
## lm(formula = sspg ~ glufast, data = Diabetes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -197.030 -59.050 -0.371 68.950 142.060
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.4534 13.3348 2.959 0.00362 **
## glufast 1.1866 0.0969 12.247 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 74.33 on 143 degrees of freedom
## Multiple R-squared: 0.5119, Adjusted R-squared: 0.5085
## F-statistic: 150 on 1 and 143 DF, p-value: < 2.2e-16
\[ \text{Total variation} = \text{Explained variation} + \text{Unexplained variation/Error} \]
\[ \text{Total sum of squares} \ (TSS) = \text{Sum of squares regression} \ (SSR) + \text{Sum of squares error} \ (SSE) \]
\[ \sum^{n}_{i=1}(y_{i}-\bar{y}_{i})^{2} = \sum^{n}_{i=1}(\hat{y}_{i}-\bar{y}_{i})^{2} + \sum^{n}_{i=1}(y_{i}-\hat{y}_{i})^{2} \]
\(TSS\) = Total variation = ค่าความผันผวนระหว่างข้อมูลกับค่าเฉลี่ยของข้อมูล
\(SSR\) = Explained variation = ค่าความผันผวนระหว่างค่าเฉลี่ยของข้อมูลกับเส้น Regression
\(SSE\) = Error = ค่าความผันผวนระหว่างข้อมูลกับเส้น Regression
##
## Call:
## lm(formula = sspg ~ glufast, data = Diabetes)
##
## Residuals:
## Min 1Q Median 3Q Max
## -197.030 -59.050 -0.371 68.950 142.060
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.4534 13.3348 2.959 0.00362 **
## glufast 1.1866 0.0969 12.247 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 74.33 on 143 degrees of freedom
## Multiple R-squared: 0.5119, Adjusted R-squared: 0.5085
## F-statistic: 150 on 1 and 143 DF, p-value: < 2.2e-16
-
Estimate คือ ค่าสัมประสิทธิ์ของตัวแปรที่มีผลต่อสมการนั้นๆ โดย
(Intercept)
คือ จุดตัดแกนของ Dependent variable เมื่อไม่คิดผลกระทบจากตัวแปรอื่น และ ในส่วนglufast
คือ ค่าที่เพิ่มขึ้น เมื่อglufast
เพิ่มขึ้น 1 หน่วย ซึ่งเขียนเป็นสมการได้ว่า
\[ f(x) = 39.4354 \ + 1.1866\times(\text{glufast}) + \epsilon \]
\(R^{2}\) คือ อัตราส่วนระหว่าง Explained variation กับ Total variation = \(\frac{SSR}{TSS} = 1-\frac{SSE}{TSS}\) ซึ่งจะบ่งบอกความสามารถของเส้นถดถอย ในการอธิบายข้อมูล (Goodness of fit)
-
\(F\)-test คือการเปรียบเทียบความสามารถของเส้นถดถอย ว่าสามารถอธิบายข้อมูลได้ดีกว่า \(H_{0}\) อย่างมีนัยสำคัญหรือไม่ ภายใต้สมมติฐาน
\(H_{0}\): \(f(x) = \theta_{0} + c\) หรือ สามารถอธิบายข้อมูลได้โดยใช้แค่ค่าเฉลี่ย
\(H_{a}\): \(f(x) = \theta_{0} + x_{1}\theta_{1} + … + \epsilon\)
ซึ่งเป็นการเทียบอัตราส่วน Explained กับ Unexplained variation เช่นเดียวกับ ANOVA
\[F =\frac{MSR}{MSE} = \frac{TSS-SSE}{SSE}/\frac{DF_{TSS}-DF_{SSE}}{DF_{SSE}}\]
\(t\)-test คือการเปรียบเทียบเส้น Regression เมื่อมีตัวแปรนั้น ว่าอธิบายได้ดีกว่าเมื่อไม่มีตัวแปรนั้นหรือไม่
\(H_{0}\): \(\theta = 0\)
\(H_{a}\): \(\theta \neq 0\)
จะเห็นว่าสมการนั้นเหมือน One-sample t-test แต่เขียนในรูปแบบ Regression
\[ t = \frac{\theta_{H_{a}}-\theta_{H_0}}{SE(\theta)} = \frac{\theta-0}{SE(\theta)} \]
\[ SE(\theta) = \sqrt{\frac{1}{n-2} \times {\sum_{i=1}^{n}\frac{(y_{i} - \hat{y_{i}})^2}{(x_{i} - \bar{x})^2}}} \]
13.1.3 Prediction
ข้อดีของสมการถอดถอย คือ สามารถใช้ในการทำนายข้อมูลตัวแปรตามชุดใหม่ได้ จากผลลัพธ์ขั้นต้นในคอลัมน์ coef
พบว่าทุกๆ glufast
ที่เพิ่มขึ้น 1.186 หน่วย ส่งผลให้ sspg
เพิ่มขึ้น 1 หน่วย
โดยสมการนี้จะอยู่ใน diabetes_fit
new_sspg <- data.frame(glufast = 1:400)
new_sspg <- new_sspg |>
mutate(predicted_sspg = predict(diabetes_fit, newdata = new_sspg))
ggplot(new_sspg, aes(x = glufast, y = predicted_sspg)) +
geom_point(size = 0.3) + theme_bw()
13.2 Logistic regression
13.2.1 Model summary
คือ สมการถดถอยซึ่งมีคุณสมบัติในการจำแนกตัวแปรแบบสองตัวแปร (Binary classification) ซึ่งเขียนอยู่ในรูปของ ค่าลอการิธึมของอัตราส่วนความเสี่ยง (Log odds)
\[ log(\frac{h(x)}{1-h(x)}) = \theta_{0} + x_{1}\theta_{1} + x_{2}\theta_{2} + \ ... \ + x_{n}\theta_{n} + \epsilon = z \]
\[ \frac{h(x)}{1-h(x)} = e^{z} \]
\[ h(x) = \frac{e^{z}}{1+e^{z}} \]
\[ h(x) = \frac{1}{1+e^{-(\theta_{0} + x_{1}\theta_{1} + x_{2}\theta_{2} + \ ... \ + x_{n}\theta_{n} + \epsilon)}} \]
ความพิเศษของสมการนี้คือ ขอบเขตของ \(h(x)\) จะอยู่ระหว่าง (0, 1) เสมอ ซึ่งส่งผลให้สามารถคำนวณกลับไปทำนายอัตราการเกิดเหตุการณ์จากอัตราส่วนความเสี่ยงได้
log_df <- data.frame(x = -20:20) |>
mutate(y = 1/(1+exp(-(0 + 0.75*x))))
ggplot(log_df, aes(x = x, y = y)) + geom_line() + theme_bw() +
labs(y = "h(x)")
ต่อไปเราจะทำนายว่า glufast
เพื่อให้ตัวแปรเป็น binary เราจะรวม Overt_Diabetic
และ Chemical_Diabetic
เป็นกลุ่มเดียวกัน
Diabetes_mixed <- Diabetes |>
mutate(group = case_match(group,
"Normal" ~ 0,
"Chemical_Diabetic" ~ 1,
"Overt_Diabetic" ~ 1))
ggplot(Diabetes_mixed, aes(x = glufast, y = group)) +
geom_point() +
geom_smooth(method = "glm", method.args = list(family = "binomial"),
se = FALSE) +
theme_bw()
13.2.2 Model performance
##
## Call:
## glm(formula = group ~ glufast, family = "binomial", data = Diabetes_mixed)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -11.76109 2.42017 -4.860 1.18e-06 ***
## glufast 0.11583 0.02492 4.649 3.34e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 200.67 on 144 degrees of freedom
## Residual deviance: 121.94 on 143 degrees of freedom
## AIC: 125.94
##
## Number of Fisher Scoring iterations: 8
Estimate ในที่นี้คือ \(log(\frac{h(x)}{1-h(x)})\) โดยที่ \(\frac{h(x)}{1-h(x)}\) คือ Odd ratio ของการเกิดเหตุการณ์
-
Likelihood คือ ค่าของตวามเป็นไปได้ที่จะเกิดเหตุการณ์นั้นๆ
\[ \prod_{i=1}^{n}p_{i}^{y_{i}}(1-p_{i}^{y_{i}}) \]โดย \(y_{i}\) คือ ค่าของความเป็นไปได้ของการเกิดเหตุการณ์ตาม Binomial distribution ซึ่งในที่นี่คือ
group
= 0 และgroup
= 1 ซึ่งการคำนวณนั้นจะนิยมใช้ค่า log มากกว่าเพื่อความสะดวกในการคำนวณ\[ LL = log(\prod_{i=1}^{n}p_{i}^{y_{i}}(1-p_{i}^{1-y_{i}})) = \sum_{i=1}^{n}log(p_{i}^{y_{i}}(1-p_{i}^{1-y_{i}})) \]
Null deviance คือ \(2(LL(\text{Saturated model}) - LL(\text{Null model}))\)
Residual deviance คือ \(2(LL(\text{Saturated model}) - LL(\text{Fitted model}))\)
Akaike information criterion (AIC) คือ ค่าการประมาณความผิดพลาดของสมการ \(2(\text{Parameters}- LL(\text{Fitted model}))\) มักใช้ในการเปรียบเทียบกับสมการตัวแปรชนิดอื่น เพื่อเทียบคุณภาพของแบบจำลองที่มีตัวแปรต่างกัน
Pseudo \(R^{2}\) สามารถคำนวณได้จาก \(1 - \frac{D_{Fitted}}{D_{Null}}\)
ค่าที่เกี่ยวข้องกับ Deviance นั้น ยิ่งน้อยยิ่งดี เนื่องหมายความว่ามี Deviation ต่ำ
logit_performance <- Diabetes_mixed |> select(glufast, group) |>
mutate(predicted_prob = predict(logit_fit, newdata = Diabetes_mixed,
type = "response")) |>
mutate(binomial_response =
(predicted_prob^group)*(1-predicted_prob)^(1-group)) |>
mutate(saturated_response = 1) |>
mutate(null_response = 0.5)
logit_likelihood <- logit_performance |>
summarize(across(contains("response"), ~sum(log(.x))))
logit_likelihood
## Null deviance
nd <- with(logit_likelihood, 2*(saturated_response - null_response))
nd
## [1] 201.0127
## Residual deviance
rd <- with(logit_likelihood, 2*(saturated_response - binomial_response))
rd
## [1] 121.944
## AIC
aic <- 2*(2-logit_likelihood$binomial_response)
aic
## [1] 125.944
จากข้อมูลนี้ สามารถคำนวณ Likelihood ratio statistics ได้
\[ L = -2log(\frac{LL_{Fitted}}{LL_{Null}}) =D_{Null} - D_{Fitted} \]
ซึ่งค่า \(L\) นั้นจะมีลักษณะการกระจายตัวเป็นแบบเดียวกับ Chi-square
L <- nd - rd
L
## [1] 79.06869
pchisq(L, df = 144-143, lower.tail = FALSE)
## [1] 5.998755e-19
library(lmtest) # Use package
null_fit <- glm(group ~ 1, data = Diabetes_mixed, family = "binomial")
lrtest(logit_fit, null_fit)
13.2.3 Prediction and classification
ในส่วนของ Prediction นั้น ใช้ฟังก์ชันลักษณะเดียวกันกับ Linear regression โดยให้ Argument type = response
ซึ่งจะทำนายโอกาสที่ผู้ป่วยรายนั้นจะเป็นเบาหวาน
new_group <- data.frame(glufast = 1:200)
new_group <- new_group |>
mutate(predicted_response = predict(logit_fit,
newdata = new_group, type = "response"))
ggplot(new_group, aes(x = glufast, y = predicted_response)) +
geom_point() +
geom_hline(yintercept = 0.5, col = "blue", linewidth =0.5) +
theme_bw()
หลังจากที่ได้โอกาสของคนที่จะเป็นเบาหวานแล้ว ท่านสามารถสร้างเส้นขอบเขตการตัดสินใจ (Decision boundary) ว่าโอกาสที่เท่าไร ถึงจะให้เป็นเบาหวาน สังเกตเส้น ที่ predicted_response = 0.5
หมายความว่า ค่าโอกาสที่ \(>\) 0.5 จะจัดกลุ่มให้เป็นเบาหวาน และค่าโอกาสที่ \(\leq\) 0.5 จะจัดอยู่ในกลุ่มไม่เป็นเบาหวาน
13.2.4 Receiver Operating Characteristic (ROC) curve
ในการจัดกลุ่มนั้น ที่ Decision boundary ต่างกัน ย่อมส่งผลต่อความแม่นยำของการจำแนกที่ต่างกัน ท่านสามารถประเมินความแม่นยำที่ขอบเขตต่างๆ ได้ด้วย ROC ซึ่งคือการสร้างกราฟของ Sensitivity (True positive) และ 1 - Specificity (False positive)
ROC <- map(seq(0,1,0.01), \(x) {
df <- logit_performance |>
mutate(predicted_group = ifelse(predicted_prob >= x, 1, 0))
sensitivity <- sum(df$group == 1 & df$predicted_group == 1)/sum(df$group == 1)
specificity <- sum(df$group == 0 & df$predicted_group == 0)/sum(df$group == 0)
return(data.frame(cutoff_prob = x, sens = sensitivity, spec = specificity) )
}) |>
list_rbind() |>
filter(!(sens > 0 & spec == 1))
ROC
สังเกตว่า ที่ Cut-off สูงขึ้นเรื่อยๆ นั้น Sensitivity นั้นจะต่ำลง ในขณะที่ Specificity นั้นจะสูงขึ้น (1 - Specificity ต่ำลง) เมื่อนำมาสร้างกราฟจะได้ ROC curve
ggplot(ROC, aes(x = 1-spec , y = sens)) + geom_point(size = 1) +
geom_line() +
geom_abline(intercept = 0, slope = 1, col = "darkred", linetype = "dashed") +
scale_y_continuous(breaks = seq(0,1,0.1), limits = c(0,1)) +
labs(x = "1 - Specificity", y = "Sensitivity") +
coord_equal() +
theme_bw()
โดยตัวประสิทธิภาพโดยรวมของ ROC นั้นคำนวณจากพื้นที่ใต้กราฟ (Area under curve: AUC)
group <- logit_performance$group
probs <- logit_performance$predicted_prob
combinations <- expand_grid(pos = probs[group == 1],
neg = probs[group == 0])
auc <- mean(with(combinations, pos>neg))
auc
## [1] 0.859077
Credit: https://stats.stackexchange.com/a/146136/322844
13.3 Poisson, quassipoisson, and negative binomial regression
13.3.1 Poisson regression
Poisson regression คือ สมการถดถอยที่ใช้ในการทำนายความถี่ หรือค่าเฉลี่ยของการเกิดเหตุการณ์นั้นๆ มักใช้กับข้อมูลที่ไม่ต่อเนื่อง (Discrete value) พิจารณาข้อมูลแบบ Poisson distribution
\[ f(k) = P(X = k) = \frac{\lambda^{k}}{k!}e^{-\lambda} \]
จะพบว่ามีตัวแปรที่สามารถทำนายได้เมื่อมีข้อมูลอีกชนิดหนึ่ง คือ ค่าเฉลี่ยการเกิดเหตุการณ์ \((\lambda)\) และ จำนวนเหตุการณ์ที่เกิด \((k)\) จึงออกมาเป็นสมการถดถอยได้สองรูปแบบ
- สำหรับ \(\lambda\)
\[ \lambda = e^{\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n}} \]
\[ ln(\lambda) = \theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n} \]
- สำหรับ \(k\) เราจำเป็นต้องเปลี่ยน \(\lambda\) ให้อยู่ในรูป \(k/t\) และย้ายไปเป็นตัวแปรควบคุมเวลา (Offset) ซึ่งจะมี Regression coefficient = 1 เสมอ
\[ \lambda = \frac{k}{t} = e^{\theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n}} \]
\[ ln(k) - \ln(t) = \theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n} \]
\[ ln(k) = \theta_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+…+\theta_{n}x_{n} + \ln(t) \rightarrow \text{offset} \]
ซึ่งสมการนี้เป็นสมการพื้นฐานของการนับจำนวนใดๆ ดังเช่นตัวอย่างนี้ คือความสัมพันธ์ของตัวแปรต่างๆ กับอัตราการตายในโรคมะเร็งปากมดลูก
cervix_mort <- read.csv("Resource/cervix_mort.csv") |> # aggregrated data for demonstration
mutate(histo_major = fct_relevel(histo_major, "Squamous cell carcinoma",
"Adenocarcinoma",
"Adenosquamous carcinoma",
"Others"))
glm(dead ~ age_group + histo_major + stage, family = "poisson", data = cervix_mort) |> summary()
##
## Call:
## glm(formula = dead ~ age_group + histo_major + stage, family = "poisson",
## data = cervix_mort)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 7.172968 0.031870 225.07 <2e-16 ***
## age_group -0.748325 0.010905 -68.62 <2e-16 ***
## histo_majorAdenocarcinoma -1.413401 0.025945 -54.48 <2e-16 ***
## histo_majorAdenosquamous carcinoma -2.850308 0.049905 -57.12 <2e-16 ***
## histo_majorOthers -1.731075 0.029393 -58.89 <2e-16 ***
## stage 0.209258 0.008536 24.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 25897.8 on 59 degrees of freedom
## Residual deviance: 9499.4 on 54 degrees of freedom
## AIC: 9832.1
##
## Number of Fisher Scoring iterations: 5
ggplot(cervix_mort, aes (x = age_group, y = dead)) +
geom_jitter() +
geom_smooth(method = "glm",
method.args = list(family = "poisson"), se = FALSE) +
scale_x_continuous(breaks = 1:4) +
theme_bw()
สังเกตว่ายิ่งอายุเยอะ อัตราการตายยิ่งน้อยลงอย่างมีนัยสำคัญ ซึ่งไม่น่าจะเป็นไปได้ ทั้งนี้ เพราะยังไม่ได้ปรับระยะเวลาติดตาม โดยการใส่ Offset เป็น person-month
เข้าไปคำนวณด้วย
pois_fit <- glm(dead ~ age_group + histo_major + stage +
offset(log(person_month)),
family = "poisson", data = cervix_mort)
summary(pois_fit)
##
## Call:
## glm(formula = dead ~ age_group + histo_major + stage + offset(log(person_month)),
## family = "poisson", data = cervix_mort)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.138354 0.035957 -198.523 < 2e-16 ***
## age_group 0.037519 0.014553 2.578 0.00994 **
## histo_majorAdenocarcinoma -0.076841 0.025947 -2.961 0.00306 **
## histo_majorAdenosquamous carcinoma -0.001698 0.049964 -0.034 0.97289
## histo_majorOthers 0.408249 0.029643 13.772 < 2e-16 ***
## stage 0.918984 0.007915 116.101 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 15452.8 on 59 degrees of freedom
## Residual deviance: 2386.7 on 54 degrees of freedom
## AIC: 2719.4
##
## Number of Fisher Scoring iterations: 5
จะพบว่าหลังจากปรับตามระยะเวลาติดตาม กลุ่มอายุที่เพิ่มขึ้นจะส่งผลให้การตายเพิ่มขึ้นอย่างมีนัยสำคัญ
new_data <- expand_grid(age_group = 1:4,
histo_major = unique(cervix_mort$histo_major),
stage = 1:4,
person_month = 1200)
new_data <- new_data |>
mutate(predicted_dead = predict(pois_fit, newdata = new_data, type = "response"))
ggplot(new_data, aes (x = age_group, y = predicted_dead, col = histo_major)) +
geom_line() +
facet_wrap(~stage)+
scale_y_continuous(breaks = seq(0,60,10)) +
theme_bw()
อย่างไรก็ตาม พิจารณาดูแล้วอัตราการตายไม่ได้เพิ่มขึ้นมากตามกลุ่มอายุ ซึ่งอาจจะเป็นผลบวกลวง เมื่อกลับมาพิจารณาแล้ว Poisson regression มีสมมติฐานที่สำคัญตาม Poisson distribution คือ
- ต้องเป็นจำนวนนับ
- การกระจายตัวของข้อมูล = Dispersion parameter (\(\phi\)) = Variance/Mean = 1
13.3.2 Quasipoisson regression
เมื่อตรวจสอบจากผลลัพธ์ของสมการถอดถอย โดยพิจารณาจาก \(\text{Residuals/Deviance}\) แล้วพบว่า \(\phi > 1\) ซึ่งหมายความว่าข้อมูลตั้งต้นนั้นมีการกระจายตัวของข้อมูลสูงเกินไป (Overdispersed) จึงไม่เป็นไปตามสมมติฐานของ Poisson ณ จุดนี้จึงจำเป็นต้องใช้ ส่วนขยายสมการของ Poisson regression เรียกว่า Quasipoisson regression ซึ่งจะทำการปรับความแปรปรวน ตามการเพิ่มขึ้นของความแปรปรวนต่อค่าเฉลี่ย
\[ V = \phi\mu_{i} \] \[ \phi = \frac{\chi^{2}}{\text{DF}} = \frac{1}{n-k}{\sum_{i=1}^{n}\frac{(Y_{i}-\hat{\mu_{i}})^{2}}{\hat{\mu_{i}}}} \]
quasipois_fit <- glm(dead ~ age_group + histo_major + stage +
offset(log(person_month)),
family = "quasipoisson", data = cervix_mort)
summary(quasipois_fit)
##
## Call:
## glm(formula = dead ~ age_group + histo_major + stage + offset(log(person_month)),
## family = "quasipoisson", data = cervix_mort)
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.138354 0.256738 -27.804 <2e-16 ***
## age_group 0.037519 0.103913 0.361 0.719
## histo_majorAdenocarcinoma -0.076841 0.185263 -0.415 0.680
## histo_majorAdenosquamous carcinoma -0.001698 0.356744 -0.005 0.996
## histo_majorOthers 0.408249 0.211657 1.929 0.059 .
## stage 0.918984 0.056517 16.260 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for quasipoisson family taken to be 50.98103)
##
## Null deviance: 15452.8 on 59 degrees of freedom
## Residual deviance: 2386.7 on 54 degrees of freedom
## AIC: NA
##
## Number of Fisher Scoring iterations: 5
จะเห็นว่าหลังจากปรับ Dispersion parameter แล้ว age_group
ไม่ได้ส่งผลให้การตายเพิ่มขึ้นอย่างมีนัยสำคัญแต่อย่างใด
13.3.3 Negative binomial regression
ปัญหาของ Quasipoisson คือ อาจจะไม่มี Parameter ที่ต้องการ เช่น AIC
เป็นต้น ซึ่งสามารถใช้อีกหนึ่งสมการถดถอยที่นิยมใช้คือ Negative binomial regression จาก Package MASS
ซึ่งปรับตามอัตราส่วนความแปรปรวนเช่นกัน
\[ V = u_{i}(1+\frac{u_{i}}{\phi}) \]
nb_fit <- MASS::glm.nb(dead ~
age_group + histo_major + stage +
offset(log(person_month)),
data = cervix_mort)
summary(nb_fit)
##
## Call:
## MASS::glm.nb(formula = dead ~ age_group + histo_major + stage +
## offset(log(person_month)), data = cervix_mort, init.theta = 1.720086921,
## link = log)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.74220 0.37648 -17.908 <2e-16 ***
## age_group 0.13619 0.09497 1.434 0.152
## histo_majorAdenocarcinoma -0.11835 0.28789 -0.411 0.681
## histo_majorAdenosquamous carcinoma -0.09216 0.30632 -0.301 0.764
## histo_majorOthers 0.16574 0.28407 0.583 0.560
## stage 0.82974 0.08937 9.285 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(1.7201) family taken to be 1)
##
## Null deviance: 144.871 on 59 degrees of freedom
## Residual deviance: 69.168 on 54 degrees of freedom
## AIC: 598.94
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 1.720
## Std. Err.: 0.339
##
## 2 x log-likelihood: -584.937
ผลลัพธ์ที่ได้จะใกล้เคียงกันกับสมการถดถอย Quasipoisson ทั้งสองสมการนี้จะนิยมใช้ในการตั้งสมการถดถอยในจำนวนนับจากงานทดลอง High-throughput เช่น RNA-sequencing เนื่องจากข้อมูลประเภทนี้มักมีเป็นข้อมูลจำนวนนับที่มีการกระจายตัวสูงมาก (\(\phi > 1\))