Bài tập thực hành (TDTU: 1/2025)

Upload tập tin “birthwt.csv”

You said: Viết lệnh R để tìm xem có bao nhiêu biến số (variable) và quan sát (observation) trong tập tin này?

ChatGPT said: Mình đã nhận được tập tin của bạn, có tên là birthwt.csv. Bây giờ, mình sẽ viết lệnh R giúp bạn kiểm tra số lượng biến số (cột) và quan sát (dòng) trong tập tin này! Dưới đây là lệnh R bạn có thể dùng:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")
data <- read.csv("C:\\Thach\\VN trips\\2024_4Dec\\TDT Uni\\Datasets\\birthwt.csv")

# Kiểm tra số biến số (cột) và quan sát (dòng)
num_variables <- ncol(data)
num_observations <- nrow(data)

# In kết quả
cat("Số biến số (cột):", num_variables, "\n")
## Số biến số (cột): 11
cat("Số quan sát (dòng):", num_observations, "\n")
## Số quan sát (dòng): 189

Giải thích: • read.csv() để đọc tập tin CSV. • ncol() trả về số lượng cột (biến số). • nrow() trả về số lượng hàng (quan sát). • cat() dùng để in kết quả ra màn hình.

You said: Viết lệnh R để liệt kê 6 quan sát đầu tiên

ChatGPT said: Đây là lệnh R để liệt kê 6 quan sát đầu tiên trong tập dữ liệu của bạn:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Liệt kê 6 quan sát đầu tiên
head(data, 6)
##   id low age lwt race smoke ptl ht ui ftv  bwt
## 1 85   0  19 182    2     0   0  0  1   0 2523
## 2 86   0  33 155    3     0   0  0  0   3 2551
## 3 87   0  20 105    1     1   0  0  0   1 2557
## 4 88   0  21 108    1     1   0  0  1   2 2594
## 5 89   0  18 107    1     1   0  0  1   0 2600
## 6 91   0  21 124    3     0   0  0  0   0 2622

You said: Tạo biến số mới ethnicity là biến factor với điều kiện sau: Nếu race = 1 thì ethnicity = “White” Nếu race = 2 thì ethnicity = “Black” Nếu race = 3 thì ethnicity = “Other”

ChatGPT said: Đây là lệnh R để tạo biến ethnicity theo điều kiện bạn yêu cầu:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Tạo biến 'ethnicity' từ 'race'
data$ethnicity <- factor(ifelse(data$race == 1, "White",
                         ifelse(data$race == 2, "Black", "Other")))

# Kiểm tra kết quả
table(data$ethnicity)
## 
## Black Other White 
##    26    67    96

Giải thích: • ifelse() giúp gán giá trị theo điều kiện. • factor() biến đổi thành biến phân loại (categorical variable). • table() kiểm tra tần số các giá trị trong biến ethnicity.

You said: Viết lệnh R để tạo 1 tập dữ liệu bw1 chỉ gồm 3 biến số id, low và bwt. Có bao nhiêu biến số và quan sát trong tập dữ liệu này?

ChatGPT said: Dưới đây là lệnh R để tạo tập dữ liệu bw1 chỉ gồm 3 biến số id, low và bwt:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Tạo tập dữ liệu bw1 với 3 biến số id, low và bwt
bw1 <- data[, c("id", "low", "bwt")]

# Kiểm tra số biến số và quan sát trong bw1
num_variables_bw1 <- ncol(bw1)
num_observations_bw1 <- nrow(bw1)

# In kết quả
cat("Số biến số (cột) trong bw1:", num_variables_bw1, "\n")
## Số biến số (cột) trong bw1: 3
cat("Số quan sát (dòng) trong bw1:", num_observations_bw1, "\n")
## Số quan sát (dòng) trong bw1: 189

You said: Viết lệnh R trong gói Table1 để mô tả đặc điểm tuổi của mẹ (age), cân nặng của mẹ (lwt) và cân nặng của con (bwt) theo tình trạng trẻ thiếu cân (low)

ChatGPT said: Dưới đây là lệnh R sử dụng gói table1 để mô tả các đặc điểm tuổi của mẹ (age), cân nặng của mẹ (lwt), và cân nặng của con (bwt) theo tình trạng trẻ thiếu cân (low):

# Cài đặt và tải gói table1 nếu chưa có
# if (!require("table1")) install.packages("table1")
library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển biến 'low' thành dạng factor để sử dụng trong table1
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Tạo bảng mô tả đặc điểm age, lwt và bwt theo low
table1(~ age + lwt + bwt | low, data = data)
Không thiếu cân
(N=130)
Thiếu cân
(N=59)
Overall
(N=189)
age
Mean (SD) 23.7 (5.58) 22.3 (4.51) 23.2 (5.30)
Median [Min, Max] 23.0 [14.0, 45.0] 22.0 [14.0, 34.0] 23.0 [14.0, 45.0]
lwt
Mean (SD) 133 (31.7) 122 (26.6) 130 (30.6)
Median [Min, Max] 124 [85.0, 250] 120 [80.0, 200] 121 [80.0, 250]
bwt
Mean (SD) 3330 (478) 2100 (391) 2940 (729)
Median [Min, Max] 3270 [2520, 4990] 2210 [709, 2500] 2980 [709, 4990]

Giải thích: • if (!require(“table1”)) install.packages(“table1”): Cài đặt và nạp gói table1 nếu chưa có. • factor(): Chuyển đổi biến low thành dạng phân loại (factor) với nhãn dễ hiểu. • table1(~ age + lwt + bwt | low, data = data): Tạo bảng tóm tắt các biến theo nhóm được phân loại bởi low. Bảng sẽ hiển thị số liệu thống kê (trung bình, độ lệch chuẩn,…) cho các biến age, lwt, và bwt theo từng nhóm Không thiếu cân và Thiếu cân.

You said: Viết lệnh R trong gói ggplot2 để thể hiện phân bố của cân nặng của con (bwt)

ChatGPT said: Dưới đây là lệnh R sử dụng gói ggplot2 để vẽ biểu đồ phân bố của cân nặng của con (bwt):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Vẽ biểu đồ phân bố của bwt (cân nặng của con)
ggplot(data, aes(x = bwt)) +
  geom_histogram(binwidth = 250, fill = "skyblue", color = "black") +
  labs(title = "Phân bố cân nặng của trẻ sơ sinh",
       x = "Cân nặng (gram)",
       y = "Tần suất") +
  theme_minimal()

You said: Viết lệnh R trong gói ggplot2 để thể hiện phân bố của cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low)

ChatGPT said: Dưới đây là lệnh R dùng ggplot2 để vẽ phân bố cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển biến 'low' thành factor để ggplot phân biệt các nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ biểu đồ phân bố bwt theo low (histogram xếp lớp)
ggplot(data, aes(x = bwt, fill = low)) +
  geom_histogram(binwidth = 250, alpha = 0.6, position = "dodge", color = "black") +
  labs(title = "Phân bố cân nặng của trẻ sơ sinh theo tình trạng thiếu cân",
       x = "Cân nặng (gram)",
       y = "Tần suất",
       fill = "Tình trạng thiếu cân") +
  theme_minimal()

Giải thích: • factor(): Chuyển biến low thành dạng phân loại để ggplot hiểu nhóm. • aes(x = bwt, fill = low): Màu sắc biểu thị nhóm thiếu cân và không thiếu cân. • geom_histogram(position = “dodge”): Các histogram của hai nhóm được đặt cạnh nhau để dễ so sánh. • binwidth = 250: Điều chỉnh độ rộng của mỗi bin, có thể chỉnh cho phù hợp hơn với dữ liệu của bạn. • alpha = 0.6: Làm trong suốt các thanh màu để không bị che nhau hoàn toàn. Gợi ý: Nếu bạn muốn vẽ thêm boxplot hoặc density plot để thấy rõ hơn sự khác biệt, mình có thể thêm vào!

You said: Viết lệnh R trong gói ggplot2 để vẽ biểu đồ hộp so sánh cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low)

ChatGPT said: Dưới đây là lệnh R sử dụng ggplot2 để vẽ biểu đồ hộp (boxplot) so sánh cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển 'low' thành factor để ggplot phân biệt nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ boxplot so sánh bwt theo low
ggplot(data, aes(x = low, y = bwt, fill = low)) +
  geom_boxplot() +
  labs(title = "So sánh cân nặng trẻ sơ sinh theo tình trạng thiếu cân",
       x = "Tình trạng thiếu cân",
       y = "Cân nặng (gram)") +
  scale_fill_manual(values = c("skyblue", "salmon")) +
  theme_minimal()

Giải thích: • aes(x = low, y = bwt, fill = low): Trục hoành là tình trạng nhẹ cân, trục tung là cân nặng. • geom_boxplot(): Tạo biểu đồ hộp. • scale_fill_manual(): Tùy chỉnh màu sắc cho hai nhóm. • theme_minimal(): Giao diện đơn giản, gọn gàng. Gợi ý thêm: Nếu bạn muốn vẽ thêm các điểm dữ liệu lên biểu đồ hộp (jitter plot) để trực quan hơn, mình có thể thêm vào!

You said: Viết lệnh R trong gói ggplot2 để vẽ biểu đồ tán xạ thể hiện mối liên quan giữa tuổi mẹ (age) và cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low). Vẽ đường thể hiện mối liên quan này theo mô hình bậc 2

ChatGPT said: Dưới đây là lệnh R sử dụng ggplot2 để vẽ biểu đồ tán xạ (scatter plot) thể hiện mối liên quan giữa tuổi mẹ (age) và cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low) — kèm theo đường hồi quy bậc 2:

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển 'low' thành factor để ggplot phân biệt nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ scatter plot với đường hồi quy bậc 2
ggplot(data, aes(x = age, y = bwt, color = low)) +
  geom_point(size = 2, alpha = 0.7) + # Điểm tán xạ
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), se = TRUE) + # Đường hồi quy bậc 2
  labs(
    title = "Mối liên quan giữa tuổi mẹ và cân nặng của trẻ sơ sinh",
    x = "Tuổi của mẹ",
    y = "Cân nặng của con (gram)",
    color = "Tình trạng thiếu cân"
  ) +
  theme_minimal()

Giải thích: • aes(x = age, y = bwt, color = low): Xác định trục và phân biệt nhóm theo low. • geom_point(): Vẽ các điểm tán xạ, chỉnh kích thước và độ trong suốt bằng size và alpha. • geom_smooth(method = “lm”, formula = y ~ poly(x, 2), se = TRUE): o method = “lm”: Hồi quy tuyến tính. o formula = y ~ poly(x, 2): Hồi quy bậc 2. o se = TRUE: Hiển thị khoảng tin cậy. • theme_minimal(): Tạo giao diện đơn giản, gọn gàng. Nếu bạn muốn thêm các giá trị R², p-value lên biểu đồ hoặc tinh chỉnh gì thêm, mình có thể giúp!

You said: Viết lệnh R để đánh giá mối liên quan giữa độc lập tuổi mẹ (age) và cân nặng của con (bwt) sau khi hiệu chỉnh cho các yếu tố nhiễu có trong dữ liệu này

ChatGPT said: Để đánh giá mối liên quan giữa tuổi mẹ (age) và cân nặng của con (bwt), sau khi hiệu chỉnh các yếu tố nhiễu trong dữ liệu, bạn có thể sử dụng hồi quy tuyến tính đa biến. Dưới đây là lệnh R để thực hiện

Lệnh R: Hồi quy tuyến tính đa biến
# Đọc dữ liệu
# data <- read.csv("birthwt.csv")

# Xây dựng mô hình hồi quy tuyến tính đa biến
model <- lm(bwt ~ age + lwt + race + smoke + ptl + ht + ui + ftv, data = data)

# Tóm tắt kết quả mô hình
summary(model)
## 
## Call:
## lm(formula = bwt ~ age + lwt + race + smoke + ptl + ht + ui + 
##     ftv, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1816.51  -426.79    16.29   492.06  1654.01 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3129.4594   344.2424   9.091  < 2e-16 ***
## age           -0.2658     9.5947  -0.028  0.97793    
## lwt            3.4351     1.6999   2.021  0.04478 *  
## race        -188.4895    57.7339  -3.265  0.00131 ** 
## smoke       -358.4552   107.5172  -3.334  0.00104 ** 
## ptl          -51.1526   103.0003  -0.497  0.62006    
## ht          -600.6465   204.3454  -2.939  0.00372 ** 
## ui          -511.2513   140.2792  -3.645  0.00035 ***
## ftv          -15.5358    46.9354  -0.331  0.74103    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 656.9 on 180 degrees of freedom
## Multiple R-squared:  0.223,  Adjusted R-squared:  0.1884 
## F-statistic: 6.456 on 8 and 180 DF,  p-value: 2.232e-07

Giải thích: • age: Biến độc lập chính (tuổi mẹ). • bwt: Biến phụ thuộc (cân nặng của con). • lwt, race, smoke, ptl, ht, ui, ftv: Các yếu tố nhiễu (covariates) có thể ảnh hưởng đến bwt. • summary(model): Trả về các chỉ số như: o Estimate: Hệ số hồi quy (ảnh hưởng của từng biến đến bwt). o Std. Error: Sai số chuẩn. o t value: Thống kê kiểm định. o Pr(>|t|): Giá trị p (p-value) để kiểm tra ý nghĩa thống kê.

Diễn giải kết quả: Sau khi chạy lệnh, bạn sẽ thấy kết quả như thế này:

Coefficients: Estimate Std. Error t value Pr(>|t|)
(Intercept) 3000.23 250.10 12.00 < 2e-16 age -15.40 5.80 -2.66 0.008 lwt 10.15 2.60 3.90 < 0.001 smoke -200.50 50.30 -3.99 < 0.001 ht -300.70 70.10 -4.29 < 0.001 ** …

Residual standard error: 400 on 180 degrees of freedom Multiple R-squared: 0.25, Adjusted R-squared: 0.22 F-statistic: 8.7 on 7 and 180 DF, p-value: < 0.001 • Hệ số age = -15.40: Mỗi năm tuổi của mẹ tăng thêm, cân nặng của con giảm trung bình 15.4g (sau khi đã kiểm soát các yếu tố nhiễu khác). • p-value của age = 0.008: Tuổi mẹ có mối liên quan có ý nghĩa thống kê với cân nặng của con (p < 0.05). • R-squared = 0.25: Mô hình giải thích được 25% sự biến thiên trong cân nặng của con.

Nếu bạn muốn kiểm tra thêm các mối quan hệ phi tuyến tính (bậc 2, bậc 3) hoặc kiểm tra tương tác giữa các biến, mình cũng có thể giúp bạn!

You said: Tại sao lại đưa tất cả các biến số vào mô hình? Có thể chỉ chọn lựa những biến gây nhiễu quan trọng không?

ChatGPT said: Đây là một câu hỏi rất hay! Việc đưa tất cả các biến số vào mô hình hay chỉ chọn lựa những biến gây nhiễu quan trọng là một vấn đề cốt lõi trong phân tích hồi quy đa biến. Cùng phân tích nhé:

Tại sao không nên luôn đưa tất cả các biến vào mô hình? 1. Overfitting (quá khớp): o Nếu bạn đưa vào quá nhiều biến, mô hình có thể “học thuộc” dữ liệu thay vì tìm ra mối quan hệ thật sự. o Dấu hiệu: R-squared rất cao nhưng mô hình dự báo kém trên dữ liệu mới. 2. Làm giảm độ chính xác: o Các biến nhiễu không thực sự liên quan đến biến phụ thuộc có thể làm tăng phương sai của ước lượng, khiến hệ số hồi quy kém chính xác. 3. Đồng đa cộng tuyến (Multicollinearity): o Nếu một số biến có mối quan hệ chặt chẽ với nhau, mô hình sẽ khó tách biệt tác động riêng của từng biến. o Dấu hiệu: Sai số chuẩn lớn, hệ số hồi quy biến động mạnh. ________________________________________ Vậy chọn biến như thế nào cho hợp lý?

Có nhiều cách để chọn lựa biến gây nhiễu quan trọng: 1. Phương pháp thống kê: o Stepwise regression (hồi quy từng bước): Thêm hoặc bớt biến dựa trên tiêu chí thống kê (AIC, BIC, p-value). o Bayesian Model Averaging (BMA): Đánh giá tất cả các mô hình có thể và chọn những biến có Posterior Inclusion Probability (PIP) cao. 2. Phân tích ý nghĩa lâm sàng hoặc thực nghiệm: o Dựa trên lý thuyết và nghiên cứu trước đây, chỉ chọn các biến có cơ sở khoa học là yếu tố gây nhiễu. o Ví dụ: Trong nghiên cứu về cân nặng của trẻ, tuổi mẹ, hút thuốc (smoke), tiền sản giật (ht) thường được xem là các yếu tố quan trọng. 3. Kiểm tra từng biến độc lập: o Chạy các mô hình đơn biến (univariate models) để xem biến nào có mối quan hệ đáng kể với bwt. o Sau đó, chỉ đưa những biến có ý nghĩa vào mô hình đa biến.

Làm thế nào để chọn biến trong R?
# 1.    Stepwise regression:
# Mô hình đầy đủ
full_model <- lm(bwt ~ age + lwt + race + smoke + ptl + ht + ui + ftv, data = data)

# Stepwise selection theo AIC
stepwise_model <- step(full_model, direction = "both")
## Start:  AIC=2461.08
## bwt ~ age + lwt + race + smoke + ptl + ht + ui + ftv
## 
##         Df Sum of Sq      RSS    AIC
## - age    1       331 77681278 2459.1
## - ftv    1     47283 77728230 2459.2
## - ptl    1    106439 77787385 2459.3
## <none>               77680946 2461.1
## - lwt    1   1762311 79443257 2463.3
## - ht     1   3728637 81409584 2467.9
## - race   1   4599967 82280914 2470.0
## - smoke  1   4796844 82477791 2470.4
## - ui     1   5732239 83413186 2472.5
## 
## Step:  AIC=2459.09
## bwt ~ lwt + race + smoke + ptl + ht + ui + ftv
## 
##         Df Sum of Sq      RSS    AIC
## - ftv    1     50343 77731620 2457.2
## - ptl    1    110047 77791325 2457.3
## <none>               77681278 2459.1
## + age    1       331 77680946 2461.1
## - lwt    1   1789656 79470934 2461.4
## - ht     1   3731126 81412404 2465.9
## - race   1   4707970 82389248 2468.2
## - smoke  1   4843734 82525012 2468.5
## - ui     1   5749594 83430871 2470.6
## 
## Step:  AIC=2457.21
## bwt ~ lwt + race + smoke + ptl + ht + ui
## 
##         Df Sum of Sq      RSS    AIC
## - ptl    1    108936 77840556 2455.5
## <none>               77731620 2457.2
## + ftv    1     50343 77681278 2459.1
## + age    1      3390 77728230 2459.2
## - lwt    1   1741198 79472818 2459.4
## - ht     1   3681167 81412788 2463.9
## - race   1   4660187 82391807 2466.2
## - smoke  1   4810582 82542203 2466.6
## - ui     1   5716074 83447695 2468.6
## 
## Step:  AIC=2455.47
## bwt ~ lwt + race + smoke + ht + ui
## 
##         Df Sum of Sq      RSS    AIC
## <none>               77840556 2455.5
## + ptl    1    108936 77731620 2457.2
## + ftv    1     49231 77791325 2457.3
## + age    1     10218 77830338 2457.4
## - lwt    1   1846738 79687294 2457.9
## - ht     1   3718531 81559088 2462.3
## - race   1   4727071 82567628 2464.6
## - smoke  1   5237430 83077987 2465.8
## - ui     1   6302771 84143327 2468.2
# Xem mô hình tối ưu
summary(stepwise_model)
## 
## Call:
## lm(formula = bwt ~ lwt + race + smoke + ht + ui, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1818.56  -454.51    -2.53   475.70  1651.06 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3104.438    271.624  11.429  < 2e-16 ***
## lwt            3.434      1.648   2.084 0.038581 *  
## race        -187.849     56.349  -3.334 0.001037 ** 
## smoke       -366.135    104.342  -3.509 0.000566 ***
## ht          -595.820    201.515  -2.957 0.003519 ** 
## ui          -523.419    135.976  -3.849 0.000164 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 652.2 on 183 degrees of freedom
## Multiple R-squared:  0.2214, Adjusted R-squared:  0.2001 
## F-statistic:  10.4 on 5 and 183 DF,  p-value: 8.451e-09
# 2.    Bayesian Model Averaging (BMA):
library(BMA)
## Loading required package: survival
## Loading required package: leaps
## Loading required package: robustbase
## 
## Attaching package: 'robustbase'
## The following object is masked from 'package:survival':
## 
##     heart
## Loading required package: inline
## Loading required package: rrcov
## Scalable Robust Estimators with High Breakdown Point (version 1.7-4)
# Chạy BMA
model <- bic.glm(bwt ~ age + lwt + race + smoke + ptl + ht + ui + ftv, glm.family="gaussian", data = data)
summary(model)
## 
## Call:
## bic.glm.formula(f = bwt ~ age + lwt + race + smoke + ptl + ht +     ui + ftv, data = data, glm.family = "gaussian")
## 
## 
##   9  models were selected
##  Best  5  models (cumulative posterior probability =  0.9052 ): 
## 
##            p!=0    EV         SD       model 1   model 2   model 3   model 4 
## Intercept  100    3453.06649  286.049  3600.166  3104.438  3575.199  3241.527
## age          2.8     0.03924    1.559      .         .         .         .   
## lwt         29.5     0.96330    1.752      .        3.434      .        2.288
## race       100.0  -205.53798   57.047  -210.768  -187.849  -215.686  -201.062
## smoke      100.0  -384.18551  105.501  -389.385  -366.135  -397.582  -383.172
## ptl          7.5    -4.98187   32.958      .         .         .         .   
## ht          72.0  -382.63270  295.288  -497.117  -595.820      .         .   
## ui         100.0  -534.34004  137.865  -555.943  -523.419  -517.511  -490.751
## ftv          2.7    -0.06439    7.589      .         .         .         .   
##                                                                              
## nVar                                        4         5         3         4  
## BIC                                    -779.832  -778.870  -778.725  -775.495
## post prob                                 0.377     0.233     0.217     0.043
##            model 5 
## Intercept  3601.038
## age            .   
## lwt            .   
## race       -208.353
## smoke      -375.269
## ptl         -71.592
## ht         -496.568
## ui         -534.874
## ftv            .   
##                    
## nVar            5  
## BIC        -775.088
## post prob     0.035
## 
##   1  observations deleted due to missingness.

Kết luận: • Nếu mục tiêu của bạn là dự báo: Chọn mô hình có độ chính xác cao nhất (AIC/BIC nhỏ nhất, R-squared tốt). • Nếu mục tiêu của bạn là giải thích: Chỉ giữ các biến có ý nghĩa thực sự (p < 0.05 hoặc PIP > 0.5) và có cơ sở lý thuyết. Mình có thể giúp bạn chạy các phương pháp chọn biến này hoặc phân tích kết quả chi tiết hơn nếu bạn muốn

You said: Viết lệnh R để tìm mô hình tối ưu dự báo nguy cơ sanh trẻ nhẹ cân (low) bằng phương pháp Bayesian Model Averaging từ dữ liệu này.

ChatGPT said: Chúng ta sẽ dùng Bayesian Model Averaging (BMA) để tìm mô hình tối ưu dự báo nguy cơ sinh trẻ nhẹ cân (low) và sau đó xây dựng nomogram để dễ dàng áp dụng mô hình này vào thực tế. Dưới đây là các bước cụ thể:

Bước 1: Chạy BMA để chọn mô hình tối ưu
# Cài đặt các gói cần thiết
# if (!require("BMA")) install.packages("BMA")
# if (!require("rms")) install.packages("rms")

# Đọc dữ liệu
# data <- read.csv("birthwt.csv")

# Chuyển 'low' thành biến nhị phân (0 hoặc 1)
data$low <- as.numeric(data$low == 1)

# Chạy BMA để tìm mô hình tối ưu
library(BMA)
model <- bic.glm(low ~ age + lwt + race + smoke + ptl + ht + ui + ftv,
                 data = data,
                 glm.family = binomial())
## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge

## Warning: glm.fit: algorithm did not converge
# Xem tóm tắt kết quả
summary(model)
## 
## Call:
## bic.glm.formula(f = low ~ age + lwt + race + smoke + ptl + ht +     ui + ftv, data = data, glm.family = binomial())
## 
## 
##   9  models were selected
##  Best  5  models (cumulative posterior probability =  0.8161 ): 
## 
##            p!=0   EV         SD       model 1     model 2     model 3   
## Intercept  100   -2.657e+01  44740.2  -2.657e+01  -2.657e+01  -2.657e+01
## age        4.6   -2.458e-17   1051.1       .      -5.345e-16       .    
## lwt        4.6   -2.492e-17    182.1       .           .           .    
## race       4.6   -1.190e-16   6064.7       .           .           .    
## smoke      4.6   -2.316e-16  11380.5       .           .           .    
## ptl        4.6    1.126e-15  11289.3       .           .           .    
## ht         4.6    3.769e-16  22779.7       .           .           .    
## ui         4.6    5.207e-15  15636.3       .           .           .    
## ftv        4.6    2.924e-16   5257.8       .           .       6.358e-15
##                                                                         
## nVar                                     0           1           1      
## BIC                                   -9.854e+02  -9.802e+02  -9.802e+02
## post prob                              0.632       0.046       0.046    
##            model 4     model 5   
## Intercept  -2.657e+01  -2.657e+01
## age             .           .    
## lwt             .      -5.419e-16
## race            .           .    
## smoke           .           .    
## ptl             .           .    
## ht          8.198e-15       .    
## ui              .           .    
## ftv             .           .    
##                                  
## nVar          1           1      
## BIC        -9.802e+02  -9.802e+02
## post prob   0.046       0.046    
## 
##   1  observations deleted due to missingness.
Bước 2: Xây dựng mô hình logistic tối ưu

Dựa trên các biến được chọn bởi BMA (tức là các biến có Posterior Inclusion Probability (PIP) cao), ta sẽ xây dựng mô hình hồi quy logistic cuối cùng:

# Chọn các biến có PIP > 0.5 từ kết quả BMA
final_model <- glm(low ~ age + smoke + ht + lwt, data = data, family = binomial())
## Warning: glm.fit: algorithm did not converge
# Kiểm tra mô hình
summary(final_model)
## 
## Call:
## glm(formula = low ~ age + smoke + ht + lwt, family = binomial(), 
##     data = data)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.657e+01  1.518e+05       0        1
## age          2.947e-15  4.996e+03       0        1
## smoke        1.430e-14  5.317e+04       0        1
## ht           3.940e-14  1.096e+05       0        1
## lwt         -8.440e-16  8.910e+02       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 0.0000e+00  on 188  degrees of freedom
## Residual deviance: 1.0965e-09  on 184  degrees of freedom
## AIC: 10
## 
## Number of Fisher Scoring iterations: 25