2025-07-22
Tôi xin cam đoan nghiên cứu với đề tài “Phân Tích Các Yếu Tố Ảnh
Hưởng Đến Bệnh Hen Suyễn” do tôi thực hiện là kết quả của quá trình học
tập và nghiên cứu độc lập, nghiêm túc của bản thân dưới sự hướng dẫn của
Thầy Th.S Trần Mạnh Tường.
Nội dung báo cáo được trình bày một cách trung thực, khách quan,
chính xác và đầy đủ, đảm bảo tính khoa học và thực tiễn. Mọi số liệu đều
được lấy từ các báo cáo công khai, tài liệu tham khảo và thông tin trích
dẫn có nguồn gốc rõ ràng, đáng tin cậy. Bài nghiên cứu không vi phạm đạo
đức học tập và quy định của nhà trường.
Tôi xin chịu hoàn toàn trách nhiệm về sự cam đoan này.
Em xin bày tỏ lòng biết ơn và lòng kính trọng đến Trường Đại học
Tài chính Marketing vì đã giới thiệu môn học Phân Tích Dữ Liệu Định Tính
vào chương trình giảng dạy. Đặc biệt, em xin gửi lời cảm ơn sâu sắc và
lòng tôn trọng đến Thầy Trần Mạnh Tường vì sự hướng dẫn tận tâm và sự
chia sẽ kiến thức quý báu trong suốt khoảng thời gian giảng dạy. Dưới sự
hướng dẫn của thầy, em đã có cơ hội tiếp xúc với một môn học thú vị,
tiếp thu được kiến thức mới và các kỹ năng cần thiết trong suốt quá
trình học tập và viết tiểu luận. Mặc dù còn nhiều thiếu sót trong quá
trình thực hiện, nhưng mong thầy sẽ chăm chước và bỏ qua.
Em xin chân thành cảm ơn!
Bộ dữ liệu được sử dụng trong phân tích này là “Synthetic Asthma”
được lấy từ trang Kaggle. Dữ liệu bao gồm 10.000 quan sát với 10 biến
cung cấp các thông tin về tình trạng lối sống, môi trường sống và một số
đặc điểm khác của nhóm người được khảo sát ở các khu vực khác
nhau.
Dữ liệu bao gồm 9 biến định tính chỉ ID, giới tính, tình trạng hút
thuốc, lịch sử gia đình, dị ứng, mức độ ô nhiễm không khí, mức độ hoạt
động thể chất, không gian làm việc, tình trạng bệnh hen suyễn và 1 biến
định lượng là chỉ số BMI của người khảo sát.
data <- read_excel("D:/RStudio/TL/data/Synthetic_Asthma1.xlsx")
library(DT)
datatable(data,
options = list(pageLength = 10, scrollX = TRUE, autoWidth = TRUE),
class = 'cell-border stripe',
rownames = FALSE)bdt <- c("Giới tính", "Lịch sử gia đình", "Dị ứng", "Mức độ ô nhiễm không khí", "Mức độ hoạt động thể chất", "Tình trạng hút thuốc", "Không gian làm việc", "Bệnh hen suyễn")
data[bdt] <- lapply(data[bdt], as.factor)
library(knitr)
library(kableExtra)
# Tạo dữ liệu
bien <- c("Giới tính", "Lịch sử gia đình", "Dị ứng",
"Mức độ ô nhiễm không khí", "Mức độ hoạt động thể chất",
"Tình trạng hút thuốc", "Không gian làm việc")
so_nhan <- c(2, 2, 2, 3, 3, 2, 2)
ds_nhan <- c(
"Nam, Nữ",
"Có, Không",
"Có, Không",
"Cao, Thấp, Trung bình",
"Có vận động, Không vận động, Vận động nhiều",
"Có hút thuốc, Không hút thuốc",
"Ngoài trời, Trong nhà"
)
y_nghia <- c(
"Giới tính của đối tượng",
"Tiền sử gia đình mắc hen",
"Tiền sử dị ứng của đối tượng",
"Mức độ tiếp xúc ô nhiễm không khí",
"Mức độ hoạt động thể chất của đối tượng",
"Tình trạng hút thuốc hiện tại",
"Môi trường làm việc của đối tượng"
)
# Gộp bảng
bang_bien <- data.frame(
"Biến" = bien,
"Số nhãn" = so_nhan,
"Danh sách nhãn" = ds_nhan,
"Ý nghĩa biến" = y_nghia,
check.names = FALSE
)
colnames(bang_bien) <- c("Biến", "Số nhãn", "Danh sách nhãn", "Ý nghĩa biến")
kable(bang_bien,
caption = "<center><b>**Bảng: Danh sách các biến định tính và ý nghĩa**</b></center>",
align = "lcll",
booktabs = TRUE) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
position = "center") %>%
column_spec(1, bold = FALSE) %>%
column_spec(2:4, bold = FALSE) %>%
row_spec(0, bold = TRUE) %>%
column_spec(4, width = "7cm") %>%
scroll_box(height = "450px")| Biến | Số nhãn | Danh sách nhãn | Ý nghĩa biến |
|---|---|---|---|
| Giới tính | 2 | Nam, Nữ | Giới tính của đối tượng |
| Lịch sử gia đình | 2 | Có, Không | Tiền sử gia đình mắc hen |
| Dị ứng | 2 | Có, Không | Tiền sử dị ứng của đối tượng |
| Mức độ ô nhiễm không khí | 3 | Cao, Thấp, Trung bình | Mức độ tiếp xúc ô nhiễm không khí |
| Mức độ hoạt động thể chất | 3 | Có vận động, Không vận động, Vận động nhiều | Mức độ hoạt động thể chất của đối tượng |
| Tình trạng hút thuốc | 2 | Có hút thuốc, Không hút thuốc | Tình trạng hút thuốc hiện tại |
| Không gian làm việc | 2 | Ngoài trời, Trong nhà | Môi trường làm việc của đối tượng |
Bệnh hen suyễn là một trong những bệnh lý mạn tính đường hô hấp phổ biến, ảnh hưởng đến hàng triệu người trên toàn thế giới. Hen suyễn không chỉ làm giảm chất lượng cuộc sống mà còn làm tăng gánh nặng chi phí y tế cho cá nhân, gia đình và xã hội. Tại Việt Nam, cùng với quá trình đô thị hóa nhanh, tình trạng ô nhiễm không khí ngày càng nghiêm trọng, tỷ lệ mắc hen suyễn có xu hướng gia tăng, đặc biệt tại các thành phố lớn. Ngoài ra, sự thay đổi trong lối sống, mức độ hoạt động thể chất thấp và tỷ lệ hút thuốc lá cao cũng được xem là những yếu tố nguy cơ làm gia tăng tỷ lệ mắc hen suyễn trong cộng đồng. Trong bối cảnh đó, việc xác định và lượng hóa các yếu tố ảnh hưởng đến khả năng mắc hen suyễn là cần thiết, giúp các cơ quan y tế, cộng đồng và người dân chủ động phòng ngừa, kiểm soát bệnh hiệu quả hơn.
Nghiên cứu này nhằm xác định các yếu tố ảnh hưởng đến khả năng mắc bệnh hen suyễn trong cộng đồng thông qua việc phân tích mối quan hệ giữa tình trạng mắc hen suyễn và các yếu tố nhân khẩu học, hành vi lối sống, cũng như yếu tố môi trường. Cụ thể, nghiên cứu sẽ đánh giá mức độ ảnh hưởng của các yếu tố như độ tuổi, giới tính, lịch sử gia đình, mức độ ô nhiễm không khí, mức độ hoạt động thể chất, tình trạng hút thuốc và chỉ số BMI đến khả năng mắc hen suyễn. Ngoài việc phát hiện các yếu tố nguy cơ, nghiên cứu còn mong muốn xác định các yếu tố bảo vệ để từ đó đề xuất các khuyến nghị cụ thể phục vụ phòng ngừa và kiểm soát bệnh hen suyễn trong cộng đồng.
Nghiên cứu thực hiện thống kê mô tả để phân tích tỷ lệ mắc hen suyễn theo từng nhóm biến độc lập, từ đó nhận diện các nhóm nguy cơ cao. Tính toán các chỉ số thống kê nhằm lượng hóa mức độ ảnh hưởng. Song song sử dụng các mô hình hồi quy nhị phân ước lượng, xác định Odds Ratio (OR) cho từng biến để tính xác suất mắc hen suyễn dựa trên các yếu tố liên quan và kiểm tra tính nhất quán của kết quả. Sau cùng là đánh giá mức độ phù hợp của mô hình được thực hiện thông qua các chỉ số, biện pháp toàn diện khác đảm bảo mô hình có độ phù hợp cao, phù hợp cho các ứng dụng dự báo trong thực tế.
Kết quả nghiên cứu mang lại giá trị thực tiễn cao, hỗ trợ nhận diện các yếu tố nguy cơ và yếu tố bảo vệ liên quan đến bệnh hen suyễn trong cộng đồng. Từ đó hỗ trợ cơ quan y tế xây dựng các chương trình phòng ngừa, phát hiện sớm, quản lý và can thiệp phù hợp nhằm giảm tỷ lệ mắc bệnh hen suyễn, đặc biệt tại các khu vực đô thị có mức độ ô nhiễm không khí cao. Nghiên cứu cũng cung cấp bằng chứng khoa học về tác động của lối sống như hoạt động thể chất và hút thuốc lá đến nguy cơ mắc hen suyễn, khuyến khích cộng đồng thay đổi hành vi sức khỏe. Về mặt học thuật, nghiên cứu góp phần củng cố kỹ năng ứng dụng phương pháp hồi quy logistic và probit vào phân tích dữ liệu y tế, phục vụ cho đào tạo, nghiên cứu và các dự án đánh giá rủi ro sức khỏe trong cộng đồng. Ngoài ra, kết quả phân tích định lượng cũng đóng vai trò làm nền tảng cho các nghiên cứu sâu hơn trong tương lai về các cơ chế sinh học và yếu tố hành vi liên quan đến các bệnh lý hô hấp.
Các chỉ số thống kê được thực hiện dựa trên bảng ngẫu nhiên 2x2 thể hiện mối liên hệ giữa một yếu tố phơi nhiễm và kết quả thành công được minh họa như sau:
| Thành công | Thất bại | Tổng hàng | |
|---|---|---|---|
| Có | a | b | a + b |
| Không | c | d | c + d |
| Tổng cột | a + c | b + d | a + b + c + d |
Nguy cơ tương đối là tỷ số của rủi ro ở nhóm phơi nhiễm so với nguy cơ ở nhóm không phơi nhiễm. Cho biết những người phơi nhiễm có nguy cơ xảy ra kết cục cao gấp bao nhiêu lần so với những người không phơi nhiễm. Đây là một thước đo tác động tương đối (relative effect).
\[ RR = \frac{R_E}{R_{NE}} = \frac{a / (a + b)}{c / (c + d)} \]
RR = 1: Phơi nhiễm không ảnh hưởng đến nguy cơ..
RR < 1: Phơi nhiễm làm giảm nguy cơ.
RR > 1: Phơi nhiễm làm tăng nguy cơ.
Vì phân phối của RR bị lệch nên khoảng tin cậy của nó phải được tính trên thang logarit.
\[ \ln(RR) \] 2. Tính sai số chuẩn của log(RR)
\[ SE(\ln(RR)) = \sqrt{\frac{1 - R_E}{a} + \frac{1 - R_{NE}}{c}} = \sqrt{\frac{b}{a(a + b)} + \frac{d}{c(c + d)}} \] 3. Tính khoảng tin cậy 95% trên thang log
\[ \ln(RR) \pm 1.96 \times SE(\ln(RR)) \] 4. Đổi về thang đo ban đầu (RR)
\[ CI = e^{\ln(RR) \pm 1.96 \times SE(\ln(RR))} \] Diễn giải CI: Nếu khoảng tin cậy chứa số 1, kết quả không có ý nghĩa thống kê.
Tỷ số chênh (Odds) là tỷ lệ giữa xác suất xảy ra một biến cố và xác suất không xảy ra biến cố đó.
Nếu Odds < 1 → Sự kiện xảy ra kém khả năng hơn không xảy ra.
Nếu Odds = 1 → Cân bằng giữa xảy ra và không xảy ra.
Nếu Odds > 1 → Sự kiện xảy ra nhiều khả năng hơn.
\[Odds = \frac{P}{1-P}\]
OR là tỷ số của odds xảy ra kết cục ở nhóm phơi nhiễm so với odds xảy ra kết cục ở nhóm không phơi nhiễm. Nhằm so sánh tỷ số chênh của việc có kết cục giữa hai nhóm.
\[ Odds_E = \frac{a / (a + b)}{b / (a + b)} = \frac{a}{b} \]
\[ Odds_{NE} = \frac{c}{d} \]
\[ OR = \frac{Odds_E}{Odds_{NE}} = \frac{a / b}{c / d} = \frac{a \times d}{b \times c} \]
OR > 1: Tỷ số chênh của kết cục cao hơn ở nhóm phơi nhiễm.
OR < 1: Tỷ số chênh của kết cục thấp hơn ở nhóm phơi nhiễm.
OR = 1: Không có mối liên hệ.
Đặc biệt:
Nếu OR = 2, có thể hiểu rằng nhóm phơi nhiễm có nguy cơ xảy ra kết cục cao gấp 2 lần so với nhóm không phơi nhiễm.
OR xấp xỉ RR khi kết quả là hiếm trong quần thể nghiên cứu. Dựa trên công thức toán học của OR và RR có thể được diễn giải cho sự khác biệt này là cốt lõi nằm ở mẫu số của các tỷ lệ bên trong: RR dùng a+b (tổng số người phơi nhiễm) và c+d (tổng số người không phơi nhiễm), trong khi OR chỉ dùng b (số người phơi nhiễm không có kết cục) và d (số người không phơi nhiễm không có kết cục).
OR có những đặc tính toán học, đặc biệt trong Hồi quy Logistic (Logistic Regression). Hồi quy logistic là một trong những mô hình thống kê mạnh mẽ và phổ biến nhất để phân tích các kết cục dạng nhị phân (có/không, bệnh/khỏe, đậu/rớt) và đầu ra trực tiếp của mô hình hồi quy logistic chính là log của Odds Ratio (log-odds).
Tương tự như RR, tỷ số này cũng được tính trên thang logarit.
Tính log(OR):
\[ \ln(OR) \]
Sai số chuẩn của log(OR):
\[ SE(\ln(OR)) = \sqrt{ \frac{1}{a} +
\frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]
Khoảng tin cậy 95% trên thang log:
\[ \ln(OR) \pm 1.96 \times SE(\ln(OR))
\]
Đổi về thang đo ban đầu:
\[ CI = e^{\ln(OR) \pm 1.96 \times
SE(\ln(OR))} \]
Mô hình hồi quy Logistic là mô hình hồi quy nhị phân phổ biến nhất. Thuộc họ GLM (Generalized Linear Model) với hai đặc điểm chính:
Thành phần ngẫu nhiên: Biến phản hồi \(Y\) tuân theo phân phối Bernoulli (hoặc Binomial).
Hàm liên kết: Sử dụng hàm liên kết logit, \(g(\pi) = \log \left( \dfrac{\pi}{1 - \pi} \right)\).
Mô hình giả định rằng logit của xác suất thành công \(\left( \pi = P(Y = 1 \mid X) \right)\) là một hàm tuyến tính của các biến độc lập:
\[ \text{logit}(\pi) = \log\left(\dfrac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]
Hàm nghịch đảo của logit, gọi là hàm logistic, cho phép tính toán xác suất:
\[ \pi = \dfrac{\exp(\beta_0 + \cdots + \beta_k X_k)}{1 + \exp(\beta_0 + \cdots + \beta_k X_k)} \]
Hàm này luôn tạo ra giá trị \(\pi\) trong khoảng (0, 1) và có dạng hình chữ S.
Dựa trên hàm phân phối tích lũy (CDF) của phân phối chuẩn
tắc,
\[
g(\pi) = \Phi^{-1}(\pi)
\] Trong đó, \(\Phi^{-1}\) là
hàm nghịch đảo của phân phối chuẩn tắc chuẩn (standard normal).
Mô hình Probit có nền tảng lý thuyết về biến tiềm ẩn (latent variable) và thường cho kết quả rất tương đồng với Logit.
Dựa trên hàm phân phối tích lũy (CDF) của phân phối chuẩn
tắc,
\[
g(\pi) = \Phi^{-1}(\pi)
\] Trong đó, \(\Phi^{-1}\) là
hàm nghịch đảo của phân phối chuẩn tắc chuẩn (standard normal).
Mô hình Probit có nền tảng lý thuyết về biến tiềm ẩn (latent variable) và thường cho kết quả rất tương đồng với Logit.
Akaike (1974) đề xuất tiêu chuẩn AIC là kỹ thuật dùng để lựa chọn mô hình. AIC dựa trên nền tảng lý thuyết thông tin và là một tiêu chí mà tìm kiếm một mô hình trong đó có một phù hợp với vài thông số chính xác. Mô hình này được chọn bằng cách giảm thiểu khoảng cách Kullback–Leibler giữa mô hình và độ chính xác.
Tiêu chuẩn AIC được xác định bằng công thức sau:
\[ AIC = e^{2k/n} \sum \frac{u_i^2}{n} = e^{2k/n} \frac{RSS}{n} \]
Trong đó:
Ngoài ra còn có thể biểu diễn dưới dạng:
\[ LnAIC = \frac{2k}{n} + \ln \left( \frac{RSS}{n} \right) \]
Với \(LnAIC\) là log theo cơ số tự nhiên của AIC.
Căn cứ vào tiêu chuẩn thông tin Akaike AIC khi so sánh hai hay
nhiều mô hình,
mô hình có AIC thấp hơn sẽ được lựa chọn.
Brier Score nhằm đánh giá độ chính xác của các dự đoán xác suất bằng cách tính trung bình bình phương của sai số dự đoán xác suất. Giá trị Brier càng thấp hiệu suất của mô hình càng cao.
\[ BS = \frac{1}{n} \sum_{i=1}^{n} (p_i - o_i)^2 \]
Trong đó: - \(p_i\) là xác suất dự đoán sự kiện xảy ra, - \(o_i\) bằng 1 nếu sự kiện xảy ra và bằng 0 nếu không xảy ra.
Ma trận nhầm lẫn là phương pháp đo lường mức độ chính xác và sai sót của mô hình phân loại. Hay là bảng tóm tắt kết quả phân loại giữa giá trị thực tế và giá trị dự đoán sau khi đã chuyển xác suất thành nhị phân theo ngưỡng, thường là 0.5.
Nó có dạng như sau:
| Thực tế = 1 | Thực tế = 0 | |
|---|---|---|
| Dự đoán = 1 | TP (True Positive) | FP (False Positive) |
| Dự đoán = 0 | FN (False Negative) | TN (True Negative) |
Với mỗi lớp phân loại, ma trận nhầm lẫn có 4 chỉ số sau:
True Positive (Dự đoán đúng) : Dự đoán lớp positive là positive.
False Positive (Dự đoán giả) : Dự đoán lớp negative là positive.
False Negative (Phủ định giả) : Dự đoán lớp positive là negative.
True Negative (Phủ định thực) : Dự đoán lớp negative là negative
Các chỉ tiêu đánh giá từ ma trận nhầm lẫn
\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
Là tỷ lệ tổng số dự đoán đúng trên toàn bộ quan sát.
\[ \text{Recall} = \frac{TP}{TP + FN} \]
Cho biết mô hình bắt đúng bao nhiêu trong số các trường hợp thực sự dương tính (có bệnh).
\[ \text{Recall} = \frac{TP}{TP + FN} \]
Cho biết mô hình bắt đúng bao nhiêu trong số các trường hợp thực sự âm tính (không bệnh).
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Là xác suất để một dự đoán dương tính là chính xác.
\[ \text{F1-score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]
Là trung bình điều hòa giữa Precision và Recall, dùng khi cần cân bằng cả hai chỉ tiêu.
Dựa trên vấn đề cần phân tích:
Biến mục tiêu: Bệnh hen suyễn.
Các biến giải thích bao gồm: Giới tính,
Nhóm tuổi, Tình trạng hút thuốc,
Lịch sử gia đình, Dị ứng,
Mức độ ô nhiễm không khí,
Mức độ hoạt động thể chất,
Không gian làm việc, Chỉ số BMI.
Biến (Bệnh hen suyễn) ghi nhận số lượng người mắc
bệnh và không mắc bệnh dựa trên nhiều yếu tố trong mẫu thu thập.
Lập bảng tần số cho biến (Bệnh hen suyễn) nhằm có cái
nhìn tổng quan về sự phấn bố số lượng người mắc bệnh và người không mắc
bệnh. Đồng thời, biểu đồ tần suất hỗ trợ trực quan hóa tỷ lệ này rõ ràng
hơn.
table_hs <- table(data$"Bệnh hen suyễn")
kable(
as.data.frame(table_hs),
col.names = c("Bệnh hen suyễn", "Số lượng"),
caption = "<center>**Bảng: Số lượng người mắc bệnh hen suyễn**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Bệnh hen suyễn | Số lượng |
|---|---|
| Có | 2546 |
| Không | 7454 |
hs <- round(table(data$"Bệnh hen suyễn")/sum(nrow(data))*100 ,1)
label <- paste(hs, "%")
pie(hs, main ="BIỂU ĐỒ TẦN SUẤT NGƯỜI MẮC BỆNH HEN SUYỄN", col = brewer.pal(2, "Set2")
, radius =1, border = NA)
legend("topright",legend = label, fill = brewer.pal(2, "Set2"), title = "Bệnh hen suyễn", cex = 0.8)Nhận xét
Qua bảng và biểu đồ trên, có thể thấy tỷ lệ người mắc bệnh hen suyễn trong bộ dữ liệu chiếm 2546 người (25,5%) và có 7454 người (74,5%) không mắc bệnh. Điều này cho thấy đa số người tham gia nghiên cứu không mắc hen suyễn, tuy nhiên tỷ lệ mắc bệnh vẫn chiếm gần một phần tư, là cơ sở quan trọng để phân tích các yếu tố nguy cơ liên quan đến bệnh hen suyễn trong các phân tích tiếp theo.
n <- nrow(data)
n_tm <- sum(data$"Bệnh hen suyễn" == "Có")
x_tm <- n_tm / n
z <- qnorm(0.975)
se_tm <- sqrt(x_tm * (1 - x_tm) / n)
lower_tm <- x_tm - z * se_tm
upper_tm <- x_tm + z * se_tm
cat("Khoảng tin cậy 95% cho tỷ lệ mắc bệnh hen suyễn là:", round(lower_tm, 4), "-", round(upper_tm, 4), "\n")## Khoảng tin cậy 95% cho tỷ lệ mắc bệnh hen suyễn là: 0.2461 - 0.2631
Với mức tin cậy 95%, khoảng ước lượng thu được cho biết tỷ lệ người mắc bệnh tiểu đường trong quần thể là từ 24.61% đến 26.31%.
Theo đó, tác giả thực hiện kiểm định giả thuyết cho rằng tỷ lệ người mắc bệnh hen suyễn là dưới 20%, ta có:
Bài toán kiểm định:
\(H_0\): Tỷ lệ người mắc bệnh hen suyễn \(< 0.2\)
\(H_1\): Tỷ lệ người mắc bệnh hen suyễn \(\geq 0.2\)
##
## 1-sample proportions test with continuity correction
##
## data: n_tm out of n, null probability 0.2
## X-squared = 185.98, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.2474519 1.0000000
## sample estimates:
## p
## 0.2546
Kết quả cho thấy:
Với độ tin cậy 95%, p < 2.2e-16 < 0.05. Bác bỏ giả thuyết \(H_0\), tức có thể nói rằng tỷ lệ người mắc bệnh hen suyễn không thể dưới 20%. Điều này khớp với khoảng ước lượng tỷ lệ mắc bệnh trong quần thể.
Giới tính Biến (Giới tính) ghi nhận số lượng mắc bệnh và không
mắc bệnh giữa nam và nữ nhằm xem xét giới tính liệu có phải là một yếu
tố liên quan đến bệnh hen suyễn.
table_1 <- table(data$"Giới tính")
kable(
as.data.frame(table_1),
col.names = c("Giới tính", "Số lượng"),
caption = "<center>**Bảng: Số lượng người khảo sát theo giới tính**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Giới tính | Số lượng |
|---|---|
| Nam | 4751 |
| Nữ | 5249 |
gt <- round(table(data$"Giới tính")/sum(nrow(data))*100 ,1)
label <- paste(gt, "%")
pie(gt, main ="BIỂU ĐỒ PHÂN BỔ SỐ LƯỢNG NGƯỜI KHẢO SÁT THEO GIỚI TÍNH", col = brewer.pal(2, "Set2")
, radius =1, border = NA)
legend("topright",legend = label, fill = brewer.pal(2, "Set2"), title = "Giới tính", cex = 0.8)Nhận xét
Qua bảng và biểu đồ trên, tỷ lệ người có giới tính nam trong bộ dữ liệu chiếm 4751 người (47.5%) và có 5249 người có giới tính nữ (52.5%) . Điều này cho thấy lượng người tham gia khảo sát không co sự chênh lệch quá lớn giữa nam và nữ.
Tình trạng hút thuốc
(Tình trạng hút thuốc) là yếu tố nguy cơ quan trọng
gây hen suyễn và làm nặng tình trạng bệnh, phản ánh số lượng người chưa
sử dụng thuốc lá và nhóm người đã và đang sử dụng thường xuyên.
table_3 <- table(data$"Tình trạng hút thuốc")
kable(
as.data.frame(table_3),
col.names = c("Tình trạng hút thuốc", "Số lượng"),
caption = "<center>**Bảng: Số lượng người khảo sát theo tình trạng hút thuốc**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Tình trạng hút thuốc | Số lượng |
|---|---|
| Có hút thuốc | 3104 |
| Không hút thuốc | 6896 |
tm <- round(table(data$"Tình trạng hút thuốc")/sum(nrow(data))*100 ,1)
labels <- paste0(tm, "%")
pie(tm,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT PHÂN BỔ THEO TÌNH TRẠNG HÚT THUỐC", col = brewer.pal(2, "Set2")
, radius =1, border = NA)
legend("topright",legend = names(tm), fill = brewer.pal(2, "Set2"), title = "Tình trạng hút thuốc", cex = 0.8)Nhận xét
Qua bảng và biểu đồ trên, số lượng người hút thuốc chiếm 31%% và phần lớn là người không hút thuốc chiếm 69%.
Lịch sử gia đình Biến Lịch sử gia đình ghi nhận số lượng người mà
trong gia đình đã từng có người thân mắc hen suyễn. Yếu tố tiền sử gia
đình mắc hen hoặc dị ứng này làm tăng nguy cơ mắc hen suyễn do yếu tố di
truyền khá cao.
table_4 <- table(data$"Lịch sử gia đình")
kable(
as.data.frame(table_4),
col.names = c("Lịch sử gia đình", "Số lượng"),
caption = "<center>**Bảng tần số: Tiền sử gia đình có người mắc bệnh **</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Lịch sử gia đình | Số lượng |
|---|---|
| Có | 3081 |
| Không | 6919 |
hn <- round(table(data$"Lịch sử gia đình")/sum(nrow(data))*100 ,1)
labels <- paste0(hn, "%")
pie(hn,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT TIỀN SỬ GIA ĐÌNH CÓ NGƯỜI MẮC BỆNH", col = brewer.pal(2, "Set2")
, radius =1, border = NA)
legend("topright",legend = names(hn), fill = brewer.pal(2, "Set2"), title = "Lịch sử gia đình", cex = 0.8)Nhận xét
Bảng và biểu đồ trực quan cho thấy số lượng người khảo sát có người thân đã từng mắc hen suyễn cũng chiếm một số lượng khá lớn, tương đương đến 30,8% trong bộ dữ liệu.
Dị ứng Dị ứng là yếu tố khởi phát hoặc đồng mắc với hen suyễn. Đây thường
là các nguy cơ hàng đầu gây mắc bệnh và ảnh hưởng nghiêm trọng đến hệ hô
hấp của phần lớn người. Biến (Dị ứng) ghi nhận “có” cho
nhiều trường hợp dị ứng khác nhau có ảnh hưởng đến hen suyễn.
table_5 <- table(data$"Dị ứng")
kable(
as.data.frame(table_5),
col.names = c("Dị ứng", "Số lượng"),
caption = "<center>**Bảng tần số: Dị ứng **</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Dị ứng | Số lượng |
|---|---|
| Có | 4003 |
| Không | 5997 |
cv <- round(table(data$"Dị ứng")/sum(nrow(data))*100 ,1)
labels <- paste0(cv, "%")
pie(cv,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT THEO CÁC YẾU TỐ DỊ ỨNG", col = brewer.pal(5, "Set2")
, radius =1, border = NA)
legend("topright",legend = names(cv), fill = brewer.pal(5, "Set2"), title = "Dị ứng", cex = 0.8)Nhận xét
Bảng tần số và biểu đồ trực quan cho thấy tình trạng người có dị ứng với ít nhất một yếu tố nào đó chiếm đến 40% (4003 người) trong nhóm người khảo sát.
Không gian làm việc Không gian làm việc phản ánh bầu không khí mà người lao động tiếp xúc thường xuyên, tùy vào môi trường có bụi bẩn và nhiều độc tố gây ảnh hưởng đến mức độ bệnh và nguy cơ mắc phải do tiếp xúc lâu ngày.
table_8 <- table(data$"Không gian làm việc")
kable(
as.data.frame(table_8),
col.names = c("Không gian làm việc", "Số lượng"),
caption = "<center>**Bảng tần số: Không gian làm việc**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Không gian làm việc | Số lượng |
|---|---|
| Ngoài trời | 3042 |
| Trong nhà | 6958 |
kg <- round(table(data$"Không gian làm việc")/sum(nrow(data))*100 ,1)
labels <- paste0(kg, "%")
pie(kg,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT THEO KHÔNG GIAN LÀM VIỆC", col = brewer.pal(2, "Set2")
, radius =1, border = NA)
legend("topright",legend = names(kg), fill = brewer.pal(2, "Set2"), title = "Không gian làm việc", cex = 0.8)Nhận xét
Không gian làm việc trong nhà chiếm phần lớn với 6958 người (69.6%), cho thấy đây là môi trường làm việc chủ yếu trong mẫu khảo sát. Việc làm việc trong nhà có thể liên quan đến nghề nghiệp văn phòng, giáo dục, dịch vụ… nơi có điều kiện kiểm soát môi trường tốt hơn ít bụi, ít dị ứng.
Ngoài trời gồm 3042 người (30.4%), phản ánh tỷ lệ đáng kể người làm việc trong môi trường mở, có thể là lao động phổ thông, xây dựng, hoặc làm nông… Những người này có thể có nguy cơ cao hơn với các tác nhân kích ứng như bụi, phấn hoa hoặc khí ô nhiễm.
Mức độ ô nhiễm không khí
(Mức độ ô nhiễm không khí) là yếu tố cho thấy môi
trường ô nhiễm làm tăng nguy cơ mắc hen suyễn và các cơn kịch phát hen.
Tại mỗi mức độ khác nhau, số lượng người mắc hen là khác nhau.
table_6 <- table(data$"Mức độ ô nhiễm không khí")
kable(
as.data.frame(table_6),
col.names = c("Mức độ ô nhiễm không khí", "Số lượng"),
caption = "<center>**Bảng tần số: Mức độ ô nhiễm không khí**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Mức độ ô nhiễm không khí | Số lượng |
|---|---|
| Cao | 1931 |
| Thấp | 2974 |
| Trung bình | 5095 |
nct <- round(table(data$"Mức độ ô nhiễm không khí")/sum(nrow(data))*100 ,1)
labels <- paste0(nct, "%")
pie(nct,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT THEO MỨC ĐỘ Ô NHIỄM KHÔNG KHÍ", col = brewer.pal(3, "Set1")
, radius =1, border = NA)
legend("topright",legend = names(nct), fill = brewer.pal(3, "Set1"), title = "Mức độ ô nhiễm", cex = 0.8)Nhận xét
Bảng tần số và biểu đồ trực quan cho thấy mức độ ô nghiễm không khí tại thành phố đang sinh sống của từng người khảo sát, ô nhiễm không khí ở mức trung bình chiếm 50.9%, mức ô nhiễm cao chiếm 19.3% và mức thấp chiếm 29.7%.
Mức độ hoạt động thể chất
Tại mỗi mức độ hoạt động thể chất có thể là các yếu tố nâng cao sức khỏe, cải thiện chức năng của phổi, giảm thiếu số lần hen tái phát. Tuy nhiên khi quá sức, điều này cũng làm ảnh hưởng đến tình trạng tái phát bệnh. Biến này cung cấp số liệu thu thập tại 3 mức vận động khác nhau.
table_7 <- table(data$"Mức độ hoạt động thể chất")
kable(
as.data.frame(table_7),
col.names = c("Mức độ hoạt động thể chất", "Số lượng"),
caption = "<center>**Bảng tần số: Mức độ hoạt động thể chất**</center>"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Mức độ hoạt động thể chất | Số lượng |
|---|---|
| Có vận động | 2434 |
| Không vận động | 5025 |
| Vận động nhiều | 2541 |
tc <- round(table(data$"Mức độ hoạt động thể chất")/sum(nrow(data))*100 ,1)
labels <- paste0(tc, "%")
pie(tc,labels = labels, main ="BIỂU ĐỒ TẦN SUẤT THEO MỨC ĐỘ HOẠT ĐỘNG THỂ CHẤT", col = brewer.pal(2, "Set1")
, radius =1, border = NA)
legend("topright",legend = names(tc), fill = brewer.pal(2, "Set1"), title = "Mức đọ hoạt động", cex = 0.8)Nhận xét
Bảng tần số và biểu đồ trực quan cho thấy lượng người có hoạt động nhiều và hoạt động vừa phải chênh lệch không lớn ở mức 25.4% và 24.3%. Nhóm người không vận động chiếm đến 50.2%.
Chỉ số BMI Chỉ số BMI phản ánh chỉ số khối cơ thể, BMI càng cao thể hiện tình trạng thừa cân, béo phì. Điều này phản ánh nguy cơ mắc hen do viêm mạn tính, giảm chức năng hoạt động của phổi và thể hiện một lối sống thiếu hoạt động thể chất.
bmi <- summary(data$"Chỉ số BMI")
library(knitr)
bmi_df <- data.frame("Thống kê" = names(bmi), "Giá trị" = as.numeric(bmi), check.names = FALSE)
colnames(bmi_df) <- c("Thống kê", "Giá trị")
kable(
bmi_df,
caption = "<center><b>Bảng thống kê chỉ số BMI</b></center>",
align = "cc"
) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Thống kê | Giá trị |
|---|---|
| Min. | 16.00000 |
| 1st Qu. | 21.85025 |
| Median | 24.10692 |
| Mean | 23.97830 |
| 3rd Qu. | 26.15845 |
| Max. | 33.46421 |
hist(data$"Chỉ số BMI",
main = "Biểu đồ Histogram Chỉ số BMI",
breaks = 10,
xlab = "Chỉ số BMI",
col = "skyblue",
border = "white",
freq = TRUE,
)Nhận xét
Theo bảng thống kê, BMI trung bình là 25, điều này cho thấy phần lớn người khảo sát đang ở mức khối lượng cơ thể bình thường. Nhóm BMI từ 22 đến 24 cũng chiếm tỷ lệ cao, tương ứng với khoảng 2000 người. Trong khi đó, những người có BMI từ 28 trở lên hoặc dưới 20 chiếm tỷ lệ rất nhỏ, cho thấy tình trạng thừa cân hay thiếu cân là không phổ biến trong tập dữ liệu này. Phản ánh một cơ cấu sức khỏe tương đối ổn định và đồng đều.
Giới tính và
Bệnh hen suyễn Lập bảng tần số và biểu đồ tần suất cho hai biến
(Giới tính) và (Bệnh hen suyễn) nhằm thấy rõ
sự phân bố của bệnh hen theo từng giới tính.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Giới tính" <- factor(data$"Giới tính", levels = c("Nam", "Nữ"))
cb1 <- table(data$"Giới tính", data$"Bệnh hen suyễn")
ppb1 <- addmargins(cb1)
kable(ppb1,
caption = "<center>**Bảng Tần số chéo: (`Giới tính`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Nam | 1207 | 3544 | 4751 |
| Nữ | 1339 | 3910 | 5249 |
| Sum | 2546 | 7454 | 10000 |
data_percent1 <- data %>%
filter(!is.na(`Giới tính`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Giới tính`, `Bệnh hen suyễn`) %>%
group_by(`Giới tính`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent1, aes(x = `Giới tính`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo giới tính",
x = "Giới tính",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Nhìn chung, tỷ lệ mắc bệnh hen suyễn không có sự chênh lệch lớn trong mẫu dữ liệu, dao động ở mức 25.5%. Điều này cho thấy giới tính có vẻ không phải là một yếu tố thật sự ảnh hưởng đến bệnh hen.
Tác giả thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ
giữa hai biến (Giới tính) và (Bệnh hen suyễn)
có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Giới tính) và (Bệnh hen suyễn) độc
lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Giới tính) và (Bệnh hen suyễn) có mối
liên hệ với nhau.
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: cb1
## X-squared = 0.009359, df = 1, p-value = 0.9229
Với mức ý nghĩa 5%, p - value = 0.9229 > 0.05. Chấp nhận giả
thuyết \(H_0\). Tức không có mối liên
hệ giữa hai biến (Giới tính) và
(Bệnh hen suyễn). Dựa vào kiểm định trên, tác giả sẽ loại
bỏ biến giới tính khỏi mô hình hồi quy.
Tình trạng hút thuốc và
Bệnh hen suyễn Lập bảng tần số cho hai biến (Tình trạng hút thuốc)
và (Bệnh hen suyễn) nhằm xem xét sự phân bổ nguy cơ mắc
bệnh hen suyễn dựa trên thói quen hút thuốc của một số người khảo
sát.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Tình trạng hút thuốc" <- factor(data$"Tình trạng hút thuốc", levels = c("Có hút thuốc", "Không hút thuốc"))
cb3 <- table(data$"Tình trạng hút thuốc", data$"Bệnh hen suyễn")
ppb3 <- addmargins(cb3)
kable(ppb3,
caption = "<center>**Bảng Tần số chéo: (`Tình trạng hút thuốc`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Có hút thuốc | 1119 | 1985 | 3104 |
| Không hút thuốc | 1427 | 5469 | 6896 |
| Sum | 2546 | 7454 | 10000 |
data_percent3 <- data %>%
filter(!is.na(`Tình trạng hút thuốc`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Tình trạng hút thuốc`, `Bệnh hen suyễn`) %>%
group_by(`Tình trạng hút thuốc`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent3, aes(x = `Tình trạng hút thuốc`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo tình trạng hút thuốc",
x = "Tình trạng hút thuốc",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Nhìn chung, tỷ lệ mắc bệnh hen suyễn ở nhóm có hút thuốc (36.1%) cao hơn so với nhóm không hút thuốc (20.7%). Đồng thời, tỷ lệ không mắc bệnh ở nhóm không hút thuốc cao hơn đáng kể (79.3%), điều này cho thấy tình trạng sử dụng thuốc lá có thể là một yếu tố tăng nguy cơ mắc bệnh hen suyễn.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Tình trạng hút thuốc) và
(Bệnh hen suyễn) có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Tình trạng hút thuốc) và (Bệnh hen suyễn)
độc lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Tình trạng hút thuốc) và (Bệnh hen suyễn)
có mối liên hệ với nhau.
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: cb3
## X-squared = 265.2, df = 1, p-value < 2.2e-16
Với mức ý nghĩa 5%, p - value < 2.2e-16 < 0.05. Bác bỏ giả
thuyết \(H_0\). Tức có mối liên hệ giữa
hai biến (Tình trạng hút thuốc) và
(Bệnh hen suyễn).
Nhằm đo lường mức độ liên quan giữa hai biến
(Tình trạng hút thuốc) và (Bệnh hen suyễn),
tác giả thực hiện tính toán tỷ lệ tương đối và khoảng tin cậy 95%.
a <- 1119
b <- 1985
c <- 1427
d <- 5469
p1_3 <- a / (a + b)
p0_3 <- c / (c + d)
RR3 <- p1_3 / p0_3
SE_logRR3 <- sqrt( (b / (a * (a + b))) + (d / (c * (c + d))) )
logRR3 <- log(RR3)
z <- 1.96
lower_log3 <- logRR3 - z * SE_logRR3
upper_log3 <- logRR3 + z * SE_logRR3
lower_RR3 <- exp(lower_log3)
upper_RR3 <- exp(upper_log3)
library(knitr)
ktc_rr3 <- data.frame(
c("Relative risk", "lwr.ci", "upr.ci"),
c(round(RR3, 3), round(lower_RR3, 3), round(upper_RR3, 3))
)
kable(ktc_rr3,
col.names = NULL,
align = "lc",
caption = "<center>**Bảng ước lượng Relative risk và KTC 95%**</center>\n") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Relative risk | 1.742 |
| lwr.ci | 1.631 |
| upr.ci | 1.861 |
Nhận xét:
Kết quả RR = 1.742 cho biết rằng tỷ lệ người hút thuốc có nguy cơ mắc bệnh hen suyễn cao hon khoảng 1.7 lần so với người không hút thuốc.
Kết quả với CL 95%: 1.631 - 1.861, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê. Mức tăng rủi ro có thể dao động từ 1.631 đến 1.861 lần.
Odds3_1 <- round((1119/1985) ,4)
Odds3_2 <- round((1427/5469) ,4)
OR_3 <- round(Odds3_1/Odds3_2)
ktc_3 <- OddsRatio(cb3,conf.level = .95)
kable(ktc_3,
caption = "<center>**Bảng ước lượng Odds Ratio và KTC 95%**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| x | |
|---|---|
| odds ratio | 2.160496 |
| lwr.ci | 1.967432 |
| upr.ci | 2.372505 |
Nhận xét:
Kết quả OR = 2.16 cho biết rằng odds mắc bệnh hen suyễn ở người hút thuốc cao hơn khoảng 2 lần so với những người không sử dụng thuốc lá.
Kết quả với CL 95%: 1.967432 - 2.372505, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê. Nhìn chung, odds mắc bệnh hen suyễn của nhóm người sử dụng thuốc lá khá cao so với nhóm người không sử dụng, mức dao động từ 1.967 đến 2.375 lần.
Lịch sử gia đình và
Bệnh hen suyễn Lập bảng tần số và biểu đồ tần suất cho hai biến
(Lịch sử gia đình) và (Bệnh hen suyễn) nhằm
xem xét sự phân bổ nguy cơ mắc bệnh hen suyễn của mỗi cá nhân dựa trên
tiền sử người thân trong gia đình đã từng mắc bệnh.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Lịch sử gia đình" <- factor(data$"Lịch sử gia đình", levels = c("Có", "Không"))
cb4 <- table(data$"Lịch sử gia đình", data$"Bệnh hen suyễn")
ppb4 <- addmargins(cb4)
kable(ppb4,
caption = "<center>**Bảng Tần số chéo: (`Lịch sử gia đình`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Có | 972 | 2109 | 3081 |
| Không | 1574 | 5345 | 6919 |
| Sum | 2546 | 7454 | 10000 |
data_percent4 <- data %>%
filter(!is.na(`Lịch sử gia đình`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Lịch sử gia đình`, `Bệnh hen suyễn`) %>%
group_by(`Lịch sử gia đình`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent4, aes(x = `Lịch sử gia đình`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo tiền sử gia đình",
x = "Lịch sử gia đình",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Nhận xét
Nhìn chung, tỷ lệ mắc bệnh hen suyễn ở người có tiền sử người thân mắc bệnh trước đó chiếm đến 31.5%, cùng với đó tỷ lệ ở nhóm người không có tiền sử gia đình mắc bệnh chỉ chiểm 22.7%. Điều này phản ánh phần nào yếu tố trên có ảnh hưởng đến nguy cơ mắc bệnh hen khá cao.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Lịch sử gia đình) và (Bệnh hen suyễn) có
ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Lịch sử gia đình) và (Bệnh hen suyễn)
độc lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Lịch sử gia đình) và (Bệnh hen suyễn)
có mối liên hệ với nhau.
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: cb4
## X-squared = 86.509, df = 1, p-value < 2.2e-16
Với mức ý nghĩa 5%, p - value < 2.2e-16 < 0.05. Bác bỏ giả
thuyết \(H_0\). Tức có mối liên hệ giữa
hai biến (Lịch sử gia đình) và
(Bệnh hen suyễn).
Nhằm đo lường mức độ liên quan giữa hai biến
(Lịch sử gia đình) và (Bệnh hen suyễn), tác
giả thực hiện tính toán tỷ lệ tương đối và khoảng tin cậy 95%.
a1 <- 972
b1 <- 2109
c1 <- 1574
d1 <- 5345
p1_4 <- a1 / (a1 + b1)
p0_4 <- c1 / (c1 + d1)
RR4 <- p1_4 / p0_4
SE_logRR4 <- sqrt( (b1 / (a1 * (a1 + b1))) + (d1 / (c1 * (c1 + d1))) )
logRR4 <- log(RR4)
z <- 1.96
lower_log4 <- logRR4 - z * SE_logRR4
upper_log4 <- logRR4 + z * SE_logRR4
lower_RR4 <- exp(lower_log4)
upper_RR4 <- exp(upper_log4)
library(knitr)
ktc_rr4 <- data.frame(
c("Relative risk", "lwr.ci", "upr.ci"),
c(round(RR4, 3), round(lower_RR4, 3), round(upper_RR4, 3))
)
kable(ktc_rr4,
col.names = NULL,
align = "lc",
caption = "<center>**Bảng ước lượng Relative risk và KTC 95%**</center>\n") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Relative risk | 1.387 |
| lwr.ci | 1.296 |
| upr.ci | 1.484 |
Nhận xét:
Kết quả RR = 1.387 cho biết rằng tỷ lệ người có người thân đã từng mắc hen suyễn có nguy cơ mắc bệnh cao gấp 1.4 lần so với người khác.
Kết quả với CL 95%: 1.296 - 1.484, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê. Mức tăng rủi ro có thể dao động từ 1.296 đến 1.484 lần.
Odds4_1 <- round((972/2109) ,4)
Odds4_2 <- round((1574/5345) ,4)
OR_4 <- round(Odds3_1/Odds3_2)
ktc_4 <- OddsRatio(cb4,conf.level = .95)
kable(ktc_4,
caption = "<center>**Bảng ước lượng Odds Ratio và KTC 95%**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| x | |
|---|---|
| odds ratio | 1.565066 |
| lwr.ci | 1.423921 |
| upr.ci | 1.720202 |
Nhận xét:
Kết quả OR = 1.565 cho biết rằng odds mắc bệnh hen suyễn ở người có người thân mắc bệnh cao hơn khoảng 1.6 lần so với những người còn lại.
Kết quả với CL 95%: 1.423921 - 1.720202, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê.
Tóm lại, khả năng mắc bênh hen suyễn của nhóm người có yếu tố tiền sử gia đình cũng khá cao so với nhóm người khác, mức dao động từ 1.424 đến 1.720 lần. Điều này tương đối khớp với thực tế vì đây là bệnh có yếu tố di truyền, mức độ tùy vào việc cả cha hoặc mẹ đều mắc hen suyễn.
Dị ứng và
Bệnh hen suyễn Lập bảng tần số và biểu đồ tần suất cho hai biến
(Dị ứng) và (Bệnh hen suyễn) nhằm xem xét sự
phân bổ nguy cơ mắc bệnh hen suyễn của mỗi cá nhân dựa trên việc có ít
nhất một dị ứng với các yếu tố liên quan.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Dị ứng" <- factor(data$"Dị ứng")
cb5 <- table(data$"Dị ứng", data$"Bệnh hen suyễn")
ppb5 <- addmargins(cb5)
kable(ppb5,
caption = "<center>**Bảng Tần suất chéo: (`Dị ứng`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Có | 1265 | 2738 | 4003 |
| Không | 1281 | 4716 | 5997 |
| Sum | 2546 | 7454 | 10000 |
data_percent5 <- data %>%
filter(!is.na(`Dị ứng`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Dị ứng`, `Bệnh hen suyễn`) %>%
group_by(`Dị ứng`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent5, aes(x = `Dị ứng`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo dị ứng",
x = "Dị ứng",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Nhìn chung, tỷ lệ mắc bệnh hen suyễn ở nhóm có dị ứng chiếm đến 31.6%, ngược lại tỷ lệ hen suyễn ở nhóm người không dị ứng chỉ chiếm 21.4%. Tỷ lệ này phản ánh yếu tố dị ứng có thể là một trong các yếu tố có nguy cơ mắc hen suyễn hàng đầu.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Tình trạng hút thuốc) và
(Bệnh hen suyễn) có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Dị ứng) và (Bệnh hen suyễn) độc
lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Dị ứng) và (Bệnh hen suyễn) có mối
liên hệ với nhau.
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: cb5
## X-squared = 132.12, df = 1, p-value < 2.2e-16
Với mức ý nghĩa 5%, p - value < 2.2e-16 < 0.05. Bác bỏ giả
thuyết \(H_0\). Tức có mối liên hệ giữa
hai biến (Dị ứng) và (Bệnh hen suyễn).
Nhằm đo lường mức độ liên quan giữa hai biến
(Lịch sử gia đình) và (Bệnh hen suyễn), tác
giả thực hiện tính toán tỷ lệ tương đối và khoảng tin cậy 95%.
a3 <- 1265
b3 <- 2738
c3 <- 1281
d3 <- 4716
p1_5 <- a3 / (a3 + b3)
p0_5 <- c3 / (c3 + d3)
RR5 <- p1_5 / p0_5
SE_logRR5 <- sqrt( (b3 / (a3 * (a3 + b3))) + (d3 / (c3 * (c3 + d3))) )
logRR5 <- log(RR5)
z <- 1.96
lower_log5 <- logRR5 - z * SE_logRR5
upper_log5 <- logRR5 + z * SE_logRR5
lower_RR5 <- exp(lower_log5)
upper_RR5 <- exp(upper_log5)
library(knitr)
ktc_rr5 <- data.frame(
c("Relative risk", "lwr.ci", "upr.ci"),
c(round(RR5, 3), round(lower_RR5, 3), round(upper_RR5, 3))
)
kable(ktc_rr5,
col.names = NULL,
align = "lc",
caption = "<center>**Bảng ước lượng Relative risk và KTC 95%**</center>\n") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Relative risk | 1.479 |
| lwr.ci | 1.384 |
| upr.ci | 1.581 |
Nhận xét:
Kết quả RR = 1.479 cho biết rằng tỷ lệ người bị dị ứng có nguy cơ mắc bệnh cao gấp 1.5 lần so với nhóm người không có dị ứng .
Kết quả với CL 95%: 1.384 - 1.581, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê. Mức tăng rủi ro có thể dao động từ 4.351 đến 5.794 lần.
Odds5_1 <- round((1265/2738) ,4)
Odds5_2 <- round((1281/4716) ,4)
OR_5 <- round(Odds5_1/Odds5_2)
ktc_5 <- OddsRatio(cb5,conf.level = .95)
kable(ktc_5,
caption = "<center>**Bảng ước lượng Odds Ratio và KTC 95%**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| x | |
|---|---|
| odds ratio | 1.700912 |
| lwr.ci | 1.553201 |
| upr.ci | 1.862670 |
Nhận xét:
Kết quả OR = 1.71 cho biết rằng odds mắc bệnh hen suyễn ở người có dị ứng cao hơn khoảng gần 1.8 lần so với những người không mắc dị ứng.
Kết quả với CL 95%: 1.553201 - 1.862670, khoảng tin cậy không chứa giá trị 1 nên kết quả có ý nghĩa thống kê.
Không gian làm việc và
Bệnh hen suyễn Lập bảng tần số và biểu đồ tần suất cho hai biến
Không gian làm việc và Bệnh hen suyễn nhằm xem
xét sự phân bổ nguy cơ mắc bệnh hen suyễn của mỗi cá nhân dựa theo không
gian làm việc mỗi ngày.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Không gian làm việc" <- factor(data$"Không gian làm việc", levels = c("Ngoài trời", "Trong nhà"))
cb8 <- table(data$"Không gian làm việc", data$"Bệnh hen suyễn")
ppb8 <- addmargins(cb8)
kable(ppb8,
caption = "<center>**Bảng Tần suất chéo: (`Không gian làm việc`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Ngoài trời | 749 | 2293 | 3042 |
| Trong nhà | 1797 | 5161 | 6958 |
| Sum | 2546 | 7454 | 10000 |
data_percent8 <- data %>%
filter(!is.na(`Không gian làm việc`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Không gian làm việc`, `Bệnh hen suyễn`) %>%
group_by(`Không gian làm việc`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent8, aes(x = `Không gian làm việc`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo không gian làm việc",
x = "Không gian làm việc",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Nhìn chung, tỷ lệ mắc bệnh hen suyễn giữa những người làm việc trong nhà và làm việc ngoài trời của dữ liệu mẫu không có sự chênh lệch, xấp xỉ ở mức ~25%.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Không gian làm việc) và (Bệnh hen suyễn)
có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Không gian làm việc) và (Bệnh hen suyễn)
độc lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Không gian làm việc) và (Bệnh hen suyễn)
có mối liên hệ với nhau.
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: cb8
## X-squared = 1.5551, df = 1, p-value = 0.2124
Với mức ý nghĩa 5%, p - value = 0.2124 > 0.05. Chưa có cơ sở
bác bỏ giả thuyết \(H_0\). Tức không có
mối liên hệ giữa hai biến (Không gian làm việc) và
(Bệnh tiểu đường). Tuy nhiên trong thực tế, môi trường làm
việc cũng có thể là một yếu tố nguy cơ vì môi trường ngoài trời thường
tiếp xúc nhiều bụi bẩn và các khí thải độc hại hơn so với môi trường làm
việc trong nhà.
Mức độ ô nhiễm không khí và
Bệnh hen suyễn Lập bảng tần số và biểu đồ tần suất cho hai biến
(Mức độ ô nhiễm không khí) và (Bệnh hen suyễn)
nhằm xem xét sự phân bổ nguy cơ mắc bệnh hen suyễn của mỗi cá nhân dựa
trên các mức ô nhiễm không khí tại khu vục sống.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Mức độ ô nhiễm không khí" <- factor(data$"Mức độ ô nhiễm không khí", levels = c("Cao", "Trung bình", "Thấp"))
cb6 <- table(data$"Mức độ ô nhiễm không khí", data$"Bệnh hen suyễn")
ppb6 <- addmargins(cb6)
kable(ppb6,
caption = "<center>**Bảng Tần số chéo: (`Mức độ ô nhiễm không khí`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Cao | 586 | 1345 | 1931 |
| Trung bình | 1367 | 3728 | 5095 |
| Thấp | 593 | 2381 | 2974 |
| Sum | 2546 | 7454 | 10000 |
data_percent6 <- data %>%
filter(!is.na(`Mức độ ô nhiễm không khí`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Mức độ ô nhiễm không khí`, `Bệnh hen suyễn`) %>%
group_by(`Mức độ ô nhiễm không khí`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent6, aes(x = `Mức độ ô nhiễm không khí`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo mức độ ô nhiễm không khí",
x = "Mức độ ô nhiễm không khí",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Mức ô nhiễm cao có tỷ lệ mắc hen suyễn lên đến 30.3%, chênh lệch tương đối so với mức ô nhiễm thấp (19.9%). Điều này gợi ý rằng ô nhiễm không khí cao là yếu tố nguy cơ đối với bệnh hen. Nhìn chung, có mối liên hệ rõ ràng giữa mức độ ô nhiễm và tỷ lệ hen suyễn. Không khí càng ô nhiễm, nguy cơ hen càng cao.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Mức độ ô nhiễm không khí) và
(Bệnh hen suyễn) có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Mức độ ô nhiễm không khí) và (Bệnh hen suyễn)
độc lập với nhau (không có mối liên hệ).
\(H_1\): Hai biến
(Mức độ ô nhiễm không khí) và (Bệnh hen suyễn)
có mối liên hệ với nhau.
##
## Pearson's Chi-squared test
##
## data: cb6
## X-squared = 77.1, df = 2, p-value < 2.2e-16
Với mức ý nghĩa 5%, p - value < 2.2e-16 < 0.05. Bác bỏ giả
thuyết \(H_0\). Tức có mối liên hệ giữa
hai biến (Mức độ ô nhiễm không khí) và
(Bệnh hen suyễn).
Nhằm đo lường mức độ liên quan giữa hai biến
(Mức độ ô nhiễm không khí) và
(Bệnh hen suyễn), tác giả thực hiện tính toán tỷ lệ tương
đối và khoảng tin cậy 95% đối với từng mức độ ô nhiễm không khí.
p <- data.frame(
level = c("Thấp", "Trung bình", "Cao"),
yes = c(593, 1367, 586),
no = c(2381, 3728, 1345)
)
p$total <- p$yes + p$no
# Tính tỷ lệ mắc hen suyễn ở mỗi mức độ
p$rate <- p$yes / p$total
# Tính RR so với nhóm tham chiếu
ref_rate <- p$rate[p$level == "Thấp"]
p$RR <- p$rate / ref_rate
# Tính KTC 95% cho RR
calc_CI <- function(a, b, c, d) {
rr <- (a / (a + b)) / (c / (c + d))
se_log_rr <- sqrt((1 / a) - (1 / (a + b)) + (1 / c) - (1 / (c + d)))
lower <- exp(log(rr) - 1.96 * se_log_rr)
upper <- exp(log(rr) + 1.96 * se_log_rr)
return(c(RR = rr, lower = lower, upper = upper))
}
ci_medium <- calc_CI(
a = p$yes[p$level == "Trung bình"],
b = p$no[p$level == "Trung bình"],
c = p$yes[p$level == "Thấp"],
d = p$no[p$level == "Thấp"]
)
ci_high <- calc_CI(
a = p$yes[p$level == "Cao"],
b = p$no[p$level == "Cao"],
c = p$yes[p$level == "Thấp"],
d = p$no[p$level == "Thấp"]
)
result_rr <- data.frame(
Level = c("Thấp (tham chiếu)", "Trung bình", "Cao"),
RR = c(1, round(ci_medium["RR"], 2), round(ci_high["RR"], 2)),
"Lower CI" = c(NA, round(ci_medium["lower"], 2), round(ci_high["lower"], 2)),
"Upper CI" = c(NA, round(ci_medium["upper"], 2), round(ci_high["upper"], 2))
, check.names = FALSE)
library(knitr)
kable(result_rr, caption = "<center>**Bảng ước lượng RR và KTC 95%**</center>", align = "lccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Level | RR | Lower CI | Upper CI |
|---|---|---|---|
| Thấp (tham chiếu) | 1.00 | NA | NA |
| Trung bình | 1.35 | 1.24 | 1.47 |
| Cao | 1.52 | 1.38 | 1.68 |
Nhận xét
Trong ba mức độ ô nhiễm không khí, tác giả lựa chọn mức “Thấp” làm mức cơ sở tham chiếu để so sánh nguy cơ mắc hen suyễn của hai nhóm còn lại. Kết quả thu được:
Mức độ ô nhiễm trung bình có RR = 1.35 cho biết rằng những người sống trong khu vực này có khả năng mắc hen suyễn cao gấp 1.3 lần người sống ở khu vực có mức ô nhiễm thấp hơn. Khoảng tin cậy 95% dao động từ 1.24 đến 1.47 không chứa 1, cho thấy kết quả thực sự có ý nghĩa thống kê.
Mức độ ô nhiễm cao có RR = 1.52, điều này cho biết những người sống trong khu vực ô nhiễm không khí cao có nguy cơ mắc hen suyễn gấp 1.5 lần so với nhóm ô nhiễm thấp. Ngoài ra, khoảng tin cậy 95% dao động từ 1.38 đến 1.68, không chứa 1, cho thấy kết quả có ý nghĩa thống kê.
Tóm lại, việc sống trong môi trường ô nhiễm không khí lâu ngày luôn là nguy cơ tiềm ẩn cao dẫn đến mắc bệnh hen suyễn.
Tương tự trên, tính toán tỷ lệ chênh OR, tác giả lựa chọn mức “Thấp” làm mức cơ sở tham chiếu để so sánh nguy cơ mắc hen suyễn của hai nhóm còn lại.
# Hàm tính OR và CI 95%
calc_or_ci <- function(a, b, c, d) {
OR <- (a * d) / (b * c)
SE_logOR <- sqrt(1/a + 1/b + 1/c + 1/d)
lower <- exp(log(OR) - 1.96 * SE_logOR)
upper <- exp(log(OR) + 1.96 * SE_logOR)
return(c(OR=OR, Lower_95CI=lower, Upper_95CI=upper))
}
# Tham chiếu: Thấp (474, 2510)
a_ref <- 593
b_ref <- 2381
# Tính OR cho Cao
a <- 586
b <- 1345
or_cao <- calc_or_ci(a, b, a_ref, b_ref)
# Tính OR cho Trung bình
a <- 1367
b <- 3728
or_tb <- calc_or_ci(a, b, a_ref, b_ref)
OR_table <- data.frame(
Level = c("Thấp (tham chiếu)", "Trung bình", "Cao"),
OR = c(1, round(or_tb[1], 2), round(or_cao[1], 2)),
"Lower CI" = c(NA, round(or_tb[2], 2), round(or_cao[2], 2)),
"Upper CI" = c(NA, round(or_tb[3], 2), round(or_cao[3], 2))
, check.names = FALSE)
library(knitr)
kable(OR_table, caption = "<center>**Bảng ước lượng OR và KTC 95%**</center>", align = "lccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Level | OR | Lower CI | Upper CI |
|---|---|---|---|
| Thấp (tham chiếu) | 1.00 | NA | NA |
| Trung bình | 1.47 | 1.32 | 1.64 |
| Cao | 1.75 | 1.53 | 2.00 |
Nhận xét:
Mức độ ô nhiễm trung bình có OR = 1.47, (CL 95%: 1.32 - 1.64) cho biết Odds mắc bệnh hen suyễn của nhóm người sống trong khu vực ô nhiễm trung bình cao hơn những người sống trong môi trường ít ô nhiễm hơn là 1.5 lần, khoảng tin cậy 95% không chứa giá trị 1 nên điều này là có ý nghĩa thống kê.
Mức độ ô nhiễm cao có OR = 1.75, điều này cho biết những người sống trong khu vực ô nhiễm không khí cao có Odds mắc hen cao hơn đến gần 1.8 lần so với khu vực ô nhiễm thấp. CL 95%: 1.53 - 2.00 và kết quả này cũng mang ý nghĩa thống kê.
Mức độ hoạt động thể chất và
Bệnh hen suyễn Lập bảng tần số và bn suiểu đồ tầất cho hai biến
(Mức độ hoạt động thể chất) và
(Bệnh hen suyễn) nhằm xem xét sự phân bổ nguy cơ mắc bệnh
hen suyễn của mỗi cá nhân dựa trên các mức hoạt động thể chất khác
nhau.
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c("Có", "Không"))
data$"Mức độ hoạt động thể chất" <- factor(data$"Mức độ hoạt động thể chất", levels = c("Không vận động", "Có vận động", "Vận động nhiều"))
cb7 <- table(data$"Mức độ hoạt động thể chất", data$"Bệnh hen suyễn")
ppb7 <- addmargins(cb7)
kable(ppb7,
caption = "<center>**Bảng Tần số chéo: (`Mức độ hoạt động thể chất`) và (`Bệnh hen suyễn`)**</center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Có | Không | Sum | |
|---|---|---|---|
| Không vận động | 1381 | 3644 | 5025 |
| Có vận động | 573 | 1861 | 2434 |
| Vận động nhiều | 592 | 1949 | 2541 |
| Sum | 2546 | 7454 | 10000 |
data_percent7 <- data %>%
filter(!is.na(`Mức độ hoạt động thể chất`) & !is.na(`Bệnh hen suyễn`)) %>%
count(`Mức độ hoạt động thể chất`, `Bệnh hen suyễn`) %>%
group_by(`Mức độ hoạt động thể chất`) %>%
mutate(perc = n / sum(n) * 100)
ggplot(data_percent7, aes(x = `Mức độ hoạt động thể chất`, y = perc, fill = `Bệnh hen suyễn`)) +
geom_col(position = "stack") +
geom_text(aes(label = paste0(round(perc, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black", size = 4) +
labs(
title = "Tỷ lệ mắc bệnh hen suyễn theo mức độ hoạt động thể chất",
x = "Mức độ hoạt động thể chất",
y = "Tỷ lệ phần trăm (%)",
fill = "Bệnh hen suyễn"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14))Những người không vận động có tỷ lệ mắc hen suyễn cao nhất (27.5%), cho thấy lối sống ít vận động có thể liên quan đến việc giảm chức năng hô hấp và tăng nguy cơ mắc hen.
Các nhóm có hoạt động thể chất (nhẹ và nhiều) đều có tỷ lệ mắc hen thấp hơn những cũng không chênh lệch quá nhiều, phản ánh phần nào vai trò tích cực của vận động trong bảo vệ hệ hô hấp và miễn dịch. Tuy nhiên, vận động nhiều, quá sức cũng là nguyên nhân gây ra cơn hen suyễn do gắng sức, nhưng tập thể dục thường xuyên, vừa sức lại có thể giúp kiểm soát bệnh hen suyễn tốt hơn và giảm nguy cơ nhập viện.
Thực hiện kiểm định Chi-squared nhằm xác định mối liên hệ giữa hai
biến (Mức độ hoạt động thể chất) và
(Bệnh hen suyễn) có ý nghĩa thống kê hay không.
Bài toán kiểm định:
\(H_0\): Hai biến
(Mức độ hoạt động thể chất) và
(Bệnh hen suyễn) độc lập với nhau (không
có mối liên hệ).
\(H_1\): Hai biến
(Mức độ hoạt động thể chất) và
(Bệnh hen suyễn) có mối liên hệ với
nhau.
##
## Pearson's Chi-squared test
##
## data: cb7
## X-squared = 21.811, df = 2, p-value = 1.835e-05
Với mức ý nghĩa 5%, p - value = 1.835e-05 < 0.05. Bác bỏ giả
thuyết \(H_0\). Tức có mối liên hệ giữa
hai biến (Mức độ hoạt động thể chất) và
(Bệnh hen suyễn).
Nhằm đo lường mức độ liên quan giữa hai biến
(Mức độ hoạt động thể chất) và
(Bệnh hen suyễn), tác giả thực hiện tính toán tỷ lệ tương
đối và khoảng tin cậy 95% đối với từng mức độ vận động.
p1 <- data.frame(
level = c("Không vận động", "Có vận động", "Vận động nhiều"),
yes = c(1381, 573, 592),
no = c(3644, 1861, 1949)
)
p1$total <- p1$yes + p1$no
p1$rate <- p1$yes / p1$total
ref_rate1 <- p1$rate[p1$level == "Không vận động"]
p$RR1 <- p1$rate / ref_rate1
calc_CI1 <- function(a1, b1, c1, d1) {
rr01 <- (a1 / (a1 + b1)) / (c1 / (c1 + d1))
se_log_rr1 <- sqrt((1 / a1) - (1 / (a1 + b1)) + (1 / c1) - (1 / (c1 + d1)))
lower1 <- exp(log(rr01) - 1.96 * se_log_rr1)
upper1 <- exp(log(rr01) + 1.96 * se_log_rr1)
return(c(RR = rr01, lower = lower1, upper = upper1))
}
ci_medium1 <- calc_CI1(
a1 = p1$yes[p1$level == "Có vận động"],
b1 = p1$no[p1$level == "Có vận động"],
c1 = p1$yes[p1$level == "Không vận động"],
d1 = p1$no[p1$level == "Không vận động"]
)
ci_high1 <- calc_CI1(
a1 = p1$yes[p1$level == "Vận động nhiều"],
b1 = p1$no[p1$level == "Vận động nhiều"],
c1 = p1$yes[p1$level == "Không vận động"],
d1 = p1$no[p1$level == "Không vận động"]
)
result_rr1 <- data.frame(
Level = c("Không vận động (tham chiếu)", "Có vận động", "Vận động nhiều"),
RR = c(1, round(ci_medium1["RR"], 2), round(ci_high1["RR"], 2)),
"Lower CI" = c(NA, round(ci_medium1["lower"], 2), round(ci_high1["lower"], 2)),
"Upper CI" = c(NA, round(ci_medium1["upper"], 2), round(ci_high1["upper"], 2)), check.names = FALSE
)
library(knitr)
kable(result_rr1, caption = "<center>**Bảng ước lượng RR và KTC 95**</center>", align = "lccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Level | RR | Lower CI | Upper CI |
|---|---|---|---|
| Không vận động (tham chiếu) | 1.00 | NA | NA |
| Có vận động | 0.86 | 0.79 | 0.93 |
| Vận động nhiều | 0.85 | 0.78 | 0.92 |
Nhận xét
Nhóm “có vận động” và “vận động nhiều” đều có RR < 1, cho thấy vận động thể chất giúp giảm nguy cơ bị hen suyễn so với nhóm người không có hoạt động thể chất.
Khoảng tin cậy 95% không chứa giá trị 1. Kết quả có ý nghĩa thống kê, và qua đó có thể thấy, vận động thể chất, ngay cả ở mức trung bình, cũng có thể giúp giảm đáng kể nguy cơ mắc bệnh hen suyễn. Việc duy trì thói quen vận động là một yếu tố bảo vệ sức khỏe hô hấp hiệu quả.
Tương tự trên, tính toán tỷ lệ chênh OR, tác giả lựa chọn mức “Không vận động” làm mức cơ sở tham chiếu để so sánh nguy cơ mắc hen suyễn của hai nhóm còn lại.
calc_or <- function(a2, b2, c2, d2) {
OR2 <- (a2 * d2) / (b2 * c2)
SE_logOR2 <- sqrt(1/a2 + 1/b2 + 1/c2 + 1/d2)
lower2 <- exp(log(OR2) - 1.96 * SE_logOR2)
upper2 <- exp(log(OR2) + 1.96 * SE_logOR2)
return(c(OR=OR2, Lower_95CI=lower2, Upper_95CI=upper2))
}
a_ref2 <- 1381
b_ref2 <- 3644
a2 <- 573
b2 <- 1861
or_cao2 <- calc_or(a2, b2, a_ref2, b_ref2)
a2 <- 592
b2 <- 1949
or_tb2 <- calc_or(a2, b2, a_ref2, b_ref2)
OR_table2 <- data.frame(
Level = c("Không vận động (tham chiếu)", "Có vận động", "Vận động nhiều"),
OR = c(1, round(or_tb2[1], 2), round(or_cao2[1], 2)),
"Lower CI" = c(NA, round(or_tb2[2], 2), round(or_cao2[2], 2)),
"Upper CI" = c(NA, round(or_tb2[3], 2), round(or_cao2[3], 2)), check.names = FALSE
)
library(knitr)
kable(OR_table2, caption = "<center>**Bảng ước lượng OR và KTC 95%**</center>", align = "lccc") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Level | OR | Lower CI | Upper CI |
|---|---|---|---|
| Không vận động (tham chiếu) | 1.00 | NA | NA |
| Có vận động | 0.80 | 0.72 | 0.90 |
| Vận động nhiều | 0.81 | 0.73 | 0.91 |
Nhận xét:
Nhóm “Có vận động” có OR = 0.80 , (CL 95%: 0.72 - 0.90) cho biết Odds mắc bệnh hen suyễn của người có vận động thấp hơn Odds của người không vận động và kết quả này có ý nghĩa về mặt thống kê dao động trong khoảng 0.72 đến 0.90. Tương tự, nhóm vận động nhiều ở mức ý nghĩa 5% cũng có odds mắc hen suyễn thấp hơn đến 0.21 lần so với nhóm không vận động.
Dựa vào phân tích mối quan hệ giữa các biến độc lập có nguy cơ ảnh
hưởng đến bệnh hen suyễn và có ý nghĩa thống kê, tác giả lựa chọn đưa
các biến độc lập phù hợp đưa vào mô hình bao gồm 6 biến định tính:
Tình trạng hút thuốc, Lịch sử gia đình,
Dị ứng, Mức độ ô nhiễm không khí,
Mức độ hoạt động thể chất và 1 biến định lượng:
Chỉ số BMIđể thực hiện các hàm hồi quy ước lượng tham số,
đánh giá và lựa chọn mô hình phù hợp.
Mô hình hồi quy logistic được sử dụng nhằm phân tích xác suất
Bệnh hen suyễn(Có = 1, Không = 0).
data$"Tình trạng hút thuốc" <- relevel(data$"Tình trạng hút thuốc", ref = "Không hút thuốc")
data$"Lịch sử gia đình" <- relevel(data$"Lịch sử gia đình", ref = "Không")
data$"Dị ứng" <- relevel(data$"Dị ứng", ref = "Không")
data$"Mức độ ô nhiễm không khí" <- factor(data$"Mức độ ô nhiễm không khí",
levels = c("Thấp", "Trung bình", "Cao"))
data$"Mức độ hoạt động thể chất" <- factor(data$"Mức độ hoạt động thể chất",
levels = c("Có vận động", "Không vận động", "Vận động nhiều"))
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c('Không','Có'))
reglogit <- glm(`Bệnh hen suyễn` ~ `Tình trạng hút thuốc` + `Lịch sử gia đình` + `Dị ứng` + `Chỉ số BMI` + `Mức độ ô nhiễm không khí` + `Mức độ hoạt động thể chất`, data = data, family = binomial(link = 'logit'))
summary(reglogit)##
## Call:
## glm(formula = `Bệnh hen suyễn` ~ `Tình trạng hút thuốc` +
## `Lịch sử gia đình` + `Dị ứng` + `Chỉ số BMI` +
## `Mức độ ô nhiễm không khí` + `Mức độ hoạt động thể chất`,
## family = binomial(link = "logit"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.81056 0.28137 -6.435 1.24e-10
## `Tình trạng hút thuốc`Có hút thuốc 0.78739 0.04872 16.163 < 2e-16
## `Lịch sử gia đình`Có 0.45360 0.04959 9.147 < 2e-16
## `Dị ứng`Có 0.55406 0.04754 11.654 < 2e-16
## `Chỉ số BMI` -0.01560 0.01189 -1.312 0.189482
## `Mức độ ô nhiễm không khí`Trung bình 0.41101 0.05715 7.192 6.39e-13
## `Mức độ ô nhiễm không khí`Cao 0.57617 0.06935 8.308 < 2e-16
## `Mức độ hoạt động thể chất`Không vận động 0.24535 0.06937 3.537 0.000405
## `Mức độ hoạt động thể chất`Vận động nhiều -0.04774 0.07260 -0.658 0.510830
##
## (Intercept) ***
## `Tình trạng hút thuốc`Có hút thuốc ***
## `Lịch sử gia đình`Có ***
## `Dị ứng`Có ***
## `Chỉ số BMI`
## `Mức độ ô nhiễm không khí`Trung bình ***
## `Mức độ ô nhiễm không khí`Cao ***
## `Mức độ hoạt động thể chất`Không vận động ***
## `Mức độ hoạt động thể chất`Vận động nhiều
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 11347 on 9999 degrees of freedom
## Residual deviance: 10770 on 9991 degrees of freedom
## AIC: 10788
##
## Number of Fisher Scoring iterations: 4
or_reglogit <- exp(coef(reglogit))
library(knitr)
library(dplyr)
or_table <- data.frame(
Biến = names(or_reglogit),
"Odds Ratio" = round(as.numeric(or_reglogit), 3), check.names = FALSE
)
kable(or_table, caption = "<center>**Bảng Odds Ratio từ mô hình**</center>", align = 'lc') %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Biến | Odds Ratio |
|---|---|
| (Intercept) | 0.164 |
Tình trạng hút thuốcCó hút thuốc
|
2.198 |
Lịch sử gia đìnhCó
|
1.574 |
Dị ứngCó
|
1.740 |
Chỉ số BMI
|
0.985 |
Mức độ ô nhiễm không khíTrung bình
|
1.508 |
Mức độ ô nhiễm không khíCao
|
1.779 |
Mức độ hoạt động thể chấtKhông vận động
|
1.278 |
Mức độ hoạt động thể chấtVận động nhiều
|
0.953 |
Mô hình Logit có dạng:
\(logit(\pi)\) = -1.81056 +
0.78739Tình trạng hút thuốc +
0.45360Lịch sử gia đình + 0.55406Dị ứng -
0.01560Chỉ số BMI +
0.41101Mức độ ô nhiễm trung bình +
0.57617Mức độ ô nhiễm cao +
0.24535Không vận động -
0.04774Vận động nhiều.
Để đảm bảo ước lượng hệ số có độ chính xác, phương sai nhỏ. Tác giả thực hiện kiểm định đa cộng tuyến đối với các biến độc lập trong mô hình nhằm xác định mối tương quan tuyến tính của chúng.
library(knitr)
vif_table <- data.frame(
Variable = c("Tình trạng hút thuốc", "Lịch sử gia đình", "Dị ứng",
"Chỉ số BMI", "Mức độ ô nhiễm không khí", "Mức độ hoạt động thể chất"),
GVIF = c(1.254150, 3.895524, 2.367237, 1.175053, 3.312194, 3.303778),
Df = c(1, 1, 1, 1, 2, 2),
`GVIF^(1/(2*Df))` = c(1.119888, 1.973708, 1.538583, 1.083999, 1.349053, 1.348195), check.names = FALSE
)
names(vif_table)[4] <- "$GVIF^{1/(2 \\cdot df)}$"
kable(vif_table,
align = "lc",
caption = "<center><b>Bảng: Kiểm định đa cộng tuyến trong mô hình Logit</b></center>") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Variable | GVIF | Df | \(GVIF^{1/(2 \cdot df)}\) |
|---|---|---|---|
| Tình trạng hút thuốc | 1.254150 | 1 | 1.119888 |
| Lịch sử gia đình | 3.895524 | 1 | 1.973708 |
| Dị ứng | 2.367237 | 1 | 1.538583 |
| Chỉ số BMI | 1.175053 | 1 | 1.083999 |
| Mức độ ô nhiễm không khí | 3.312194 | 2 | 1.349053 |
| Mức độ hoạt động thể chất | 3.303778 | 2 | 1.348195 |
Dựa trên bảng kiểm định đa cộng tuyến, tất cả các biến độc lập trong mô hình đều có chỉ số vif nhỏ hơn 2. Giá trị này cho thấy không có hiện tượng đa cộng tuyến nghiêm trọng giữa các biến giải thích. Vì vậy, mô hình hồi quy logistic được xây dựng là ổn định về mặt tuyến tính giữa các biến độc lập. Tác giả giữ lại toàn bộ các biến trong mô hình và giải thích các ước lượng tham số như sau:
Nhận xét:
Hệ số của biến Tình trạng hút thuốc = 0.787, tức OR =
2.198 cho thấy người sử dụng thuốc lá làm tăng tỷ lệ mắc bệnh hen. Khi
các yếu tố khác không đổi, những hút thuốc có odds bị hen suyễn cao gấp
khoảng 2 lần so với những người không hút thuốc. Mối liên hệ này có ý
nghĩa thống kê vì p-value < 2e-16 < 0.05.
Hệ số của biến Lịch sử gia đình = 0.454, tức OR =
1.5741 cho thấy việc có người thân từng mắc hen suyễn sẽ làm tăng tỷ lệ
mắc bệnh hen. Khi các yếu tố khác không đổi, những người này có odds mắc
hen suyễn cao gấp khoảng 1.5 lần so với nhóm còn lại. Đây là một yếu tố
nguy cơ mạnh mẽ trong mẫu nghiên cứu này và có ý nghĩa thống kê bởi
p-value = 1.24e-10 < 0.05.
Hệ số của biến Dị ứng = 6.011, tức OR = 408.02 cho
thấy việc dị ứng làm tăng tỷ lệ mắc hen suyễn. Khi các yếu tố khác không
đổi, những người có ít nhất một dị ứng liên quan có odds mắc hen suyễn
cao gấp 408.2 lần so với những người bình thường. Tương tự, mối liên hệ
này có ý nghĩa thống kê vì p-value < 2e-16 < 0.05 và là một yếu tố
nguy cơ mạnh mẽ trong mẫu nghiên cứu này.
Hệ số của biến Mức độ ô nhiễm không khí: Trung bình =
0.41101, tức OR = 1.508. Giữ nguyên các yếu tố khác, những người sống ở
khu vực có mức độ ô nhiễm không khí trung bình có odds bị hen suyễn cao
gấp khoảng 1.5 lần so với những người sống ở khu vực có mức độ ô nhiễm
không khí thấp. Tương tự điều này có ý nghĩa thống kê rất cao khi
p-value = 6.39e-13 < 0.05.
Hệ số của biến Mức độ ô nhiễm không khí: Cao =
0.57617, tức OR = 1.779. Giữ nguyên các yếu tố khác, những người sống ở
khu vực có mức độ ô nhiễm không khí cao có odds bị hen suyễn cao gấp
khoảng 1.8 lần so với những người sống ở khu vực có mức độ ô nhiễm không
khí thấp. Tương tự điều này có ý nghĩa thống kê rất cao khi p-value <
2e-16 < 0.05.
Hệ số của biến Mức hoạt động thể chất: Không vận động
= 0.24535, tức OR = 1.278. Khi các yếu tố khác không đổi, những người
không vận động thể chất có odđs bị hen suyễn cao gấp khoảng 1.3 lần so
với những người có mức độ hoạt động thể chất vừa phải. Mối quan hệ này
có ý nghĩa thống kê vì p-value = 0.0004 < 0.05.
Sau khi thực hiện hàm hồi quy logit, kết quả nhận được phản ánh
biến giả đưa vào mô hình nhằm giải thích, so sánh với mức tham chiếu của
biến Mức hoạt động thể chất và biến Chỉ số BMI
không có ý nghĩa thống kê vì p- value > 0.05.
Tương tự, nhằm phân tích xác suất Bệnh hen suyễn(Có =
1, Không = 0) dựa trên các biến độc lập, nhưng dựa trên hồi quy
probit.
data$"Tình trạng hút thuốc" <- relevel(data$"Tình trạng hút thuốc", ref = "Không hút thuốc")
data$"Lịch sử gia đình" <- relevel(data$"Lịch sử gia đình", ref = "Không")
data$"Dị ứng" <- relevel(data$"Dị ứng", ref = "Không")
data$"Mức độ ô nhiễm không khí" <- factor(data$"Mức độ ô nhiễm không khí",
levels = c("Thấp", "Trung bình", "Cao"))
data$"Mức độ hoạt động thể chất" <- factor(data$"Mức độ hoạt động thể chất",
levels = c("Có vận động", "Không vận động", "Vận động nhiều"))
data$"Bệnh hen suyễn" <- factor(data$"Bệnh hen suyễn", levels = c('Không','Có'))
regprobit <- glm(`Bệnh hen suyễn` ~ `Tình trạng hút thuốc` + `Lịch sử gia đình` + `Dị ứng` + `Chỉ số BMI` + `Mức độ ô nhiễm không khí` + `Mức độ hoạt động thể chất`, data = data, family = binomial(link = 'probit'))
summary(regprobit)##
## Call:
## glm(formula = `Bệnh hen suyễn` ~ `Tình trạng hút thuốc` +
## `Lịch sử gia đình` + `Dị ứng` + `Chỉ số BMI` +
## `Mức độ ô nhiễm không khí` + `Mức độ hoạt động thể chất`,
## family = binomial(link = "probit"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.097764 0.165074 -6.650 2.93e-11
## `Tình trạng hút thuốc`Có hút thuốc 0.471098 0.029066 16.208 < 2e-16
## `Lịch sử gia đình`Có 0.270631 0.029459 9.187 < 2e-16
## `Dị ứng`Có 0.329216 0.028047 11.738 < 2e-16
## `Chỉ số BMI` -0.008939 0.006985 -1.280 0.200590
## `Mức độ ô nhiễm không khí`Trung bình 0.244860 0.033027 7.414 1.23e-13
## `Mức độ ô nhiễm không khí`Cao 0.342482 0.040668 8.421 < 2e-16
## `Mức độ hoạt động thể chất`Không vận động 0.143862 0.040619 3.542 0.000397
## `Mức độ hoạt động thể chất`Vận động nhiều -0.033198 0.042331 -0.784 0.432900
##
## (Intercept) ***
## `Tình trạng hút thuốc`Có hút thuốc ***
## `Lịch sử gia đình`Có ***
## `Dị ứng`Có ***
## `Chỉ số BMI`
## `Mức độ ô nhiễm không khí`Trung bình ***
## `Mức độ ô nhiễm không khí`Cao ***
## `Mức độ hoạt động thể chất`Không vận động ***
## `Mức độ hoạt động thể chất`Vận động nhiều
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 11347 on 9999 degrees of freedom
## Residual deviance: 10765 on 9991 degrees of freedom
## AIC: 10783
##
## Number of Fisher Scoring iterations: 4
Mô hình Probit có dạng:
\(\hat\pi\) = \(\phi\)( -1.097764 + 0.471098
Tình trạng hút thuốc +
0.270631Lịch sử gia đình + 0.329216DƯ -
0.008939BMI + 0.244860TB +
0.342482Cao + 0.143862KVĐ -
0.033198VĐN)
library(knitr)
vif_probit <- data.frame(
Biến = c("Tình trạng hút thuốc", "Lịch sử gia đình", "Dị ứng",
"Chỉ số BMI", "Mức độ ô nhiễm không khí", "Mức độ hoạt động thể chất"),
GVIF = c(1.275644, 2.927756, 1.914315, 1.168671, 2.554191, 2.423961),
Df = c(1, 1, 1, 1, 2, 2),
`GVIF^(1/(2*Df))` = c(1.129444, 1.711069, 1.383588, 1.081051, 1.264193, 1.247761), check.names = FALSE
)
names(vif_probit)[4] <- "$GVIF^{1/(2 \\cdot df)}$"
kable(vif_probit,
align = "lc",
caption = "<center><b>Bảng: Kiểm định đa cộng tuyến trong mô hình Probit</b></center>") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Biến | GVIF | Df | \(GVIF^{1/(2 \cdot df)}\) |
|---|---|---|---|
| Tình trạng hút thuốc | 1.275644 | 1 | 1.129444 |
| Lịch sử gia đình | 2.927756 | 1 | 1.711069 |
| Dị ứng | 1.914315 | 1 | 1.383588 |
| Chỉ số BMI | 1.168671 | 1 | 1.081051 |
| Mức độ ô nhiễm không khí | 2.554191 | 2 | 1.264193 |
| Mức độ hoạt động thể chất | 2.423961 | 2 | 1.247761 |
Mô hình Probit không có dấu hiệu đa cộng tuyến, các biến độc lập đều thể hiện mức độ tương quan thấp với nhau. Vì vậy, tác giả giữ lại toàn bộ các biến trong mô hình và giải thích các ước lượng tham số như sau:
Nhận xét:
Hệ số của biến Tình trạng hút thuốc= 0.471. Khi các
yếu tố khác không đổi, việc sử dụng thuốc lá làm tăng khả năng mắc bệnh
hen suyễn.
Hệ số của biến Lịch sử gia đình = 0.271, khi các yếu
tố khác không đổi thì người có tiền sử người thân từng mắc hen suyễn sẽ
làm tăng khả năng mắc bệnh hen suyễn.
Hệ số của biến Dị ứng = 0.329, khi các yếu tố khác
không đổi, người bị dị ứng với ít nhất một yếu tố liên quan sẽ làm tăng
khả năng mắc hen.
Hệ số của biến Mức độ ô nhiễm không khí: Trung bình =
0.245, khi các yếu tố khác không đổi, khả năng mắc hen của người tiếp
xúc môi trường không khí ô nhiễm trung bình cao hơn so với người tiếp
xúc môi trường ô nhiễm không khí thấp.
Hệ số của biến Mức độ ô nhiễm không khí: Cao = 0.342,
khi các yếu tố khác không đổi, khả năng mắc hen của người tiếp xúc môi
trường không khí ô nhiễm cao cao hơn so với người tiếp xúc môi trường ô
nhiễm không khí thấp.
Hệ số của biến Mức hoạt động thể chất: Không vận động
= 0.144, khi các yếu tố khác không đổi, khả năng mắc hen của người không
vận động sẽ cao hơn so với người có vận động thể chất vừa phải.
Tương tự kết quả hồi quy logit, sau khi thực hiện hàm hồi quy
Probit, kết quả nhận được cho thấy biến giả đưa vào mô hình nhằm giải
thích, so sánh với mức tham chiếu của biến
Mức hoạt động thể chất và Chỉ số BMI không có
ý nghĩa thống kê vì p- value > 0.05 và tất cả các biến còn lại đều có
ý nghĩa thống kê ở mức 5% đối với khả năng mắc bệnh hen suyễn.
Tác giả so sánh các mô hình qua chỉ số AIC và Brier Score nhằm xác định mô hình phù hợp nhất với dữ liệu.
aic_vl <- c(Logit = AIC(reglogit),
Probit = AIC(regprobit))
library(DescTools)
brierS <- c(Logit = BrierScore(reglogit),
Probit = BrierScore(regprobit))
comparison_df <- data.frame(
Model = c("Logistic", "Probit"),
AIC = round(aic_vl, 2),
"Brier Score" = round(brierS, 4), check.names = FALSE
)
kable(comparison_df,
caption = "<center><b>Bảng so sánh chỉ số AIC và Brier Score giữa mô hình Logistic và Probit</b></center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE) %>%
row_spec(0, bold = TRUE)| Model | AIC | Brier Score | |
|---|---|---|---|
| Logit | Logistic | 10787.95 | 0.1791 |
| Probit | Probit | 10782.61 | 0.1790 |
Nhận xét
Mô hình Probit có giá trị AIC là 10782.61, thấp hơn so với mô hình Logistic với AIC là 10787.95. Điều này cho thấy mô hình Probit có mức độ phù hợp với dữ liệu tốt hơn. Bên cạnh đó, chỉ số Brier Score đo lường độ chính xác của dự báo xác suất của mô hình Probit là 0.1790, cũng thấp hơn so với 0.1791 của mô hình Logistic. Tuy nhiên, sự chênh lệch này không đáng kể, hai mô hình đếu xấp xỉ rất ít.
library(dplyr)
library(knitr)
library(kableExtra)
library(scales) # để dùng comma()
# Hàm tính ma trận nhầm lẫn
get_confusion_matrix <- function(model, data, threshold = 0.5) {
predicted_probs <- predict(model, newdata = data, type = "response")
predicted_class <- ifelse(predicted_probs >= threshold, 1, 0)
actual_class <- as.numeric(data$`Bệnh hen suyễn`) - 1
table(Predicted = predicted_class, Actual = actual_class)
}
# Ma trận cho từng mô hình
cm_logit <- get_confusion_matrix(reglogit, data)
cm_probit <- get_confusion_matrix(regprobit, data)
# Thành data frame
cm_logit_df <- as.data.frame.matrix(cm_logit)
cm_logit_df$`Dự đoán` <- rownames(cm_logit_df)
cm_logit_df$`Mô hình` <- "Logistic"
cm_probit_df <- as.data.frame.matrix(cm_probit)
cm_probit_df$`Dự đoán` <- rownames(cm_probit_df)
cm_probit_df$`Mô hình` <- "Probit"
# Gộp và chỉnh thứ tự
cm_combined <- bind_rows(cm_logit_df, cm_probit_df)
colnames(cm_combined)[1:2] <- c("Thực tế: 0", "Thực tế: 1")
cm_combined <- cm_combined[, c("Mô hình", "Dự đoán", "Thực tế: 0", "Thực tế: 1")]
# Format số có dấu phẩy
cm_combined <- cm_combined %>%
mutate(
`Thực tế: 0` = comma(`Thực tế: 0`),
`Thực tế: 1` = comma(`Thực tế: 1`)
)
# Hiển thị bảng
kable(cm_combined,
caption = "<center><b>So sánh ma trận nhầm lẫn của mô hình Logistic và Probit</b></center>",
align = "c", format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = T, position = "center") %>%
row_spec(0, bold = TRUE)| Mô hình | Dự đoán | Thực tế: 0 | Thực tế: 1 | |
|---|---|---|---|---|
| 0…1 | Logistic | 0 | 7,322 | 2,411 |
| 1…2 | Logistic | 1 | 132 | 135 |
| 0…3 | Probit | 0 | 7,335 | 2,419 |
| 1…4 | Probit | 1 | 119 | 127 |
# Hàm tính toán các chỉ số từ ma trận nhầm lẫn (dạng table)
calculate_metrics_from_cm <- function(cm_table) {
# Đảm bảo ma trận là 2x2
if (nrow(cm_table) != 2 || ncol(cm_table) != 2) {
stop("Ma trận nhầm lẫn phải là 2x2 với Predicted và Actual.")
}
TN <- cm_table["0", "0"] # True Negative: Thực tế 0, Dự đoán 0
FP <- cm_table["0", "1"] # False Positive: Thực tế 0, Dự đoán 1
FN <- cm_table["1", "0"] # False Negative: Thực tế 1, Dự đoán 0
TP <- cm_table["1", "1"] # True Positive: Thực tế 1, Dự đoán 1
# Tính toán các chỉ số đánh giá
accuracy <- (TP + TN) / sum(cm_table)
sensitivity <- TP / (TP + FN)
specificity <- TN / (TN + FP)
precision <- TP / (TP + FP)
neg_pred_value <- TN / (TN + FN)
# Xử lý trường hợp Precision + Recall = 0 để tránh NaN
f1_score <- if (is.nan(2 * (precision * sensitivity) / (precision + sensitivity))) {
0
} else {
2 * (precision * sensitivity) / (precision + sensitivity)
}
data.frame(
Accuracy = round(accuracy, 4),
Sensitivity = round(sensitivity, 4),
Specificity = round(specificity, 4),
Precision = round(precision, 4),
Neg_Pred_Value = round(neg_pred_value, 4),
F1_Score = round(f1_score, 4)
)
}
# Áp dụng hàm cho ma trận nhầm lẫn của mô hình Logistic và Probit
metrics_logit <- calculate_metrics_from_cm(cm_logit)
metrics_probit <- calculate_metrics_from_cm(cm_probit)
# Thêm cột tên mô hình để dễ dàng so sánh
metrics_logit$Model <- "Logistic"
metrics_probit$Model <- "Probit"
# Gộp kết quả của hai mô hình vào một bảng duy nhất
metrics_combined <- rbind(metrics_logit, metrics_probit)
# Sắp xếp lại các cột để tên mô hình hiển thị ở đầu bảng
metrics_combined <- metrics_combined %>%
dplyr::select(Model, everything())
kable(metrics_combined,
caption = "<center><b>**Bảng 2: Các chỉ số đánh giá hiệu suất của mô hình Logistic và Probit**</b></center>",
align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = TRUE,
position = "center") %>%
row_spec(0, bold = TRUE) | Model | Accuracy | Sensitivity | Specificity | Precision | Neg_Pred_Value | F1_Score |
|---|---|---|---|---|---|---|
| Logistic | 0.7457 | 0.5056 | 0.7523 | 0.0530 | 0.9823 | 0.096 |
| Probit | 0.7462 | 0.5163 | 0.7520 | 0.0499 | 0.9840 | 0.091 |
Nhận xét
Bảng ma trận nhầm lẫn so sánh hiệu quả của hai mô hình dự đoán bệnh hen suyễn là Logistic và Probit dựa trên khả năng phân loại đúng hoặc sai giữa người mắc và không mắc bệnh. Với mô hình Logistic, số lượng người không mắc bệnh được dự đoán đúng là 7.322 trường hợp, trong khi số ca mắc bệnh được dự đoán đúng là 135. Tuy nhiên, mô hình này cũng nhầm lẫn tới 2.411 người mắc bệnh thành không mắc. Trong khi đó, mô hình Probit có số ca không mắc được dự đoán đúng là 7.335 và ca mắc được dự đoán đúng là 127, cho thấy độ chính xác khá tương đương. Probit nhầm lẫn nhiều hơn với 2.419 người mắc nhưng bị đoán sai thành không mắc. Nhìn chung, Logistic tỏ ra nhỉnh hơn một chút trong việc phát hiện đúng người mắc bệnh, tuy nhiên cả hai mô hình đều mắc nhiều lỗi khi phân loại người bệnh,
Bảng 2 trình bày các chỉ số đánh giá hiệu suất của hai mô hình hồi quy nhị phân Logistic và Probit trong việc dự đoán bệnh hen suyễn. Cả hai mô hình đều có độ chính xác tổng thể khá cao với Accuracy xấp xỉ 74.6%, cho thấy khả năng phân loại khá tốt. Về khả năng phát hiện đúng ca mắc bệnh (Sensitivity), Probit nhỉnh hơn một chút với 51.63% so với 50.56% của Logistic. Tuy nhiên, Logistic lại có độ chính xác trong dự đoán ca mắc bệnh (Precision) cao hơn, đạt 5.30% so với 4.99% của Probit. Chỉ số đặc hiệu (Specificity) giữa hai mô hình là tương đương, ở mức khoảng 75.2%, cho thấy cả hai đều giỏi trong việc xác định người không mắc bệnh. Với Negative Predictive Value lên đến 98%, cả hai mô hình có độ tin cậy cao khi dự đoán người không mắc bệnh. Mặc dù chỉ số F1-Score của cả hai đều thấp, Logistic (9.6%) vẫn nhỉnh hơn Probit (9.1%), phản ánh sự cân bằng tốt hơn giữa độ nhạy và độ chính xác trong phân loại ca mắc. Nhìn chung, mô hình Logistic có ưu thế nhẹ về độ chính xác trong dự đoán ca bệnh, trong khi Probit lại nhạy hơn một chút trong việc phát hiện người bệnh.
Nghiên cứu đã xác định rõ mối quan hệ có ý nghĩa thống kê giữa nhiều yếu tố nhân khẩu học, hành vi sức khỏe và môi trường với nguy cơ mắc bệnh hen suyễn. Cụ thể, các yếu tố như dị ứng, lịch sử gia đình từng mắc bệnh, tình trạng hút thuốc lá, mức độ ô nhiễm không khí cao và lối sống ít vận động đều có ảnh hưởng đáng kể. Qua so sánh hiệu suất giữa mô hình hồi quy logistic và probit, mô hình Probit cho thấy khả năng phù hợp hơn đối với bộ dữ liệu này.
Bệnh hen suyễn là một bệnh hô hấp mãn tính có ảnh hưởng lâu dài đến sức khỏe cá nhân và cộng đồng. Dựa trên bộ dữ liệu gồm 10.000 quan sát từ nguồn mô phỏng “Synthetic Asthma” và các phương pháp phân tích định lượng như thống kê mô tả, kiểm định Chi bình phương, tỷ lệ tương đối (RR), tỷ lệ chênh (OR), và mô hình hồi quy nhị phân, nghiên cứu đã đưa ra những phát hiện quan trọng.
Tỷ lệ mắc bệnh hen suyễn trong mẫu nghiên cứu là 25.5%, phản ánh mức độ phổ biến của bệnh trong cộng đồng và cho thấy đây là vấn đề y tế cần được ưu tiên quan tâm. Qua các phân tích kiểm định, nghiên cứu xác định được rằng các yếu tố có ảnh hưởng rõ rệt và mang ý nghĩa thống kê đến nguy cơ mắc bệnh gồm: tiền sử dị ứng, lịch sử gia đình mắc hen suyễn, tình trạng hút thuốc, mức độ ô nhiễm không khí và mức độ hoạt động thể chất.
So sánh giữa mô hình hồi quy logistic và probit cho thấy mô hình Probit có hiệu suất dự báo tốt hơn với giá trị AIC và Brier Score thấp hơn những mức chênh lệch giữa hai mô hình ganf như rất nhỏ. Ma trận nhầm lẫn cũng cho thấy mô hình Probit có độ chính xác tốt hơn, với tỷ lệ phân loại đúng các trường hợp ở khía cạnh không mắc bệnh hen là khá cao. Nhìn chung, nghiên cứu đã đạt được mục tiêu đề ra: xác định, đo lường và lượng hóa mức độ ảnh hưởng của các yếu tố cá nhân, hành vi, và môi trường đến bệnh hen suyễn.
Từ các kết quả phân tích, nghiên cứu đưa ra một số khuyến nghị chính sách nhằm giảm thiểu nguy cơ mắc bệnh hen suyễn và nâng cao chất lượng sống cho người dân.
Thứ nhất, cần tăng cường tuyên truyền thay đổi hành vi sức khỏe như hạn chế thuốc lá và thúc đẩy vận động thể chất thường xuyên.
Thứ hai, các cơ quan chức năng nên đẩy mạnh kiểm soát ô nhiễm môi trường, đặc biệt là không khí, thông qua các quy định về giao thông, công nghiệp và phát triển đô thị xanh.
Thứ ba, hệ thống y tế cần triển khai các chương trình sàng lọc nguy cơ cho nhóm người có tiền sử dị ứng hoặc gia đình có người mắc hen suyễn, từ đó can thiệp sớm và giảm thiểu rủi ro.
Cuối cùng, việc ứng dụng phân tích dữ liệu vào hệ thống giám sát bệnh hô hấp sẽ là nền tảng quan trọng phục vụ dự báo, kiểm soát và phân bổ nguồn lực y tế hợp lý hơn.
Mặc dù mô hình được lựa chọn có độ phù hợp và chính xác, tuy nhiên nghiên cứu vẫn còn một số hạn chế nhất định.
Trước hết, dữ liệu chưa có độ tin cậy cao mặc dù được lấy trên các trang web lớn, có thể đây chỉ là một bộ dữ liệu mô phỏng hoặc khảo sát cắt ngang, không phản ánh đầy đủ đặc điểm thực tế của các nhóm khảo sát cụ thể, do đó hạn chế tính khái quát.
Kế đến, nghiên cứu chưa khai thác các biến định lượng bổ sung như tần suất cơn hen, thời gian tiếp xúc với chất dị ứng hoặc mức độ tiếp cận y tế và kể cả chưa có yếu tố can thiệp điều trị hoặc dữ liệu lâm sàng được đưa vào mô hình, trong khi đây là những thành phần quan trọng trong nghiên cứu bệnh lý hô hấp mạn tính. Do đó, các kết quả cần được xác nhận thêm qua các nghiên cứu thực nghiệm hoặc dữ liệu thực tế từ cộng đồng.
Ngoài ra, mô hình chỉ dự đoán đúng những người không mắc bệnh, nhưng lại nhầm lẫn lượng lớn người mắc thành không mắc. Để cải thiện khả năng xử lý ca mắc bệnh, cần xem xét điều chỉnh ngưỡng phân loại, cân bằng dữ liệu, hoặc áp dụng các mô hình nâng cao hơn.
Cuối cùng, bài nghiên cứu chỉ mới sử dụng một phần các kiểm định, chỉ số đánh giá mô hình, chưa hoàn toàn đáp ứng tất cả các phương pháp có thể áp dụng cho dữ liệu có biến phụ thuộc là nhị phân như bệnh hen suyễn.