Hướng dẫn chạy hồi quy mẫu trên r năm 2024

Một công việc quan trọng của bất kỳ thủ tục thống kê xây dựng mô hình từ dữ liệu nào cũng đều là chứng minh sự phù hợp của mô hình. Để biết mô hình hồi quy tuyến tính đã xây dựng trên dữ liệu mẫu phù hợp đến mức độ nào với dữ liệu, chúng ta cần dùng một thước đo nào đó về độ phù hợp của nó.

Hướng dẫn chạy hồi quy mẫu trên r năm 2024

1. R bình phương là gì?

Một thước đo sự phù hợp của mô hình tuyến tính thường dùng là hệ số xác định R bình phương (Coefficient of Determination). Công thức tính R bình phương (R square) xuất phát từ ý tưởng xem toàn bộ biến thiên quan sát được của biến phụ thuộc được chia thành 2 phần: phần biến thiên do Hồi quy (Regression) và phần biến thiên do Phần dư (Residual). Nếu phần biến thiên do Phần dư càng nhỏ, nghĩa là khoảng cách từ các điểm quan sát đến đường ước lượng hồi quy càng nhỏ thì phần biến thiên do Hồi quy sẽ càng cao, khi đó giá trị R bình phương sẽ càng cao.

Hệ số R bình phương là hàm không giảm theo số biến độc lập được đưa vào mô hình, nếu chúng ta càng đưa thêm biến độc lập vào mô hình thì R bình phương càng tăng. Tuy nhiên, điều này cũng được chứng minh rằng không phải phương trình càng có nhiều biến thì càng tốt hơn.

2. R bình phương hiệu chỉnh là gì?

Ý nghĩa của R bình phương hiệu chỉnh cũng giống như R bình phương là phản ánh mức độ phù hợp của mô hình. R bình phương hiệu chỉnh được tính từ R bình phương thường được sử dụng hơn vì giá trị này phản ánh sát hơn mức độ phù hợp của mô hình hồi quy tuyến tính đa biến. R bình phương hiệu chỉnh không nhất thiết tăng lên khi chúng ta đưa thêm các biến độc lập vào mô hình.

Hướng dẫn chạy hồi quy mẫu trên r năm 2024

So sánh 2 giá trị như ở hình trên, giá trị R bình phương hiệu chỉnh (Adjusted R Square) nhỏ hơn giá trị R bình phương (R Square), dùng nó để đánh giá độ phù hợp của mô hình sẽ an toàn hơn vì nó không thổi phồng mức độ phù hợp của mô hình.

3. Ý nghĩa của R bình phương hiệu chỉnh

Mức dao động của R bình phương hiệu chỉnh là từ 0 đến 1, tuy nhiên việc đạt được mức giá trị bằng 1 là gần như không tưởng dù mô hình đó tốt đến nhường nào.

Hướng dẫn chạy hồi quy mẫu trên r năm 2024

Về ý nghĩa của R bình phương hiệu chỉnh, như đã đề cập ở trên. Chỉ số này phản ánh mức độ giải thích của các biến độc lập đối với biến phụ thuộc trong mô hình hồi quy.

Trong ví dụ đọc kết quả hồi quy trên SPSS ở trên, giá trị R bình phương hiệu chỉnh là 0.725. Như vậy, các biến độc lập giải thích được 72.5% sự biến thiên của biến phụ thuộc. Phần còn lại 27.5% được giải thích bởi các biến ngoài mô hình và sai số ngẫu nhiên.

4. R bình phương hiệu chỉnh dưới 0.5 (50%)

Không có tiêu chuẩn chính xác R bình phương hiệu chỉnh ở mức bao nhiêu thì mô hình mới đạt yêu cầu, chỉ số này nếu càng tiến về 1 thì mô hình càng có ý nghĩa, càng tiến về 0 thì ý nghĩa mô hình càng yếu. Mức R bình phương này phụ thuộc vào số lượng biến độc lập tác động vào biến phụ thuộc của phép hồi quy đó. Nhiều biến độc lập tác động vào biến phụ thuộc Y chúng ta thường sẽ kỳ vọng mức R2 cao hơn so với chỉ có 1 biến độc lập tác động vào Y bởi Y sẽ được giải thích bởi nhiều yếu tố hơn.

Thường với hồi quy SPSS ở mô hình đơn giản nhiều độc lập tác động vào 1 phụ thuộc, chúng ta chọn mức trung gian là 0.5 để phân ra 2 nhánh ý nghĩa mạnh/ý nghĩa yếu, từ 0.5 đến 1 thì mô hình là tốt, bé hơn 0.5 là mô hình chưa tốt. Tuy nhiên, điều này chỉ phù hợp trong một số ít tình huống, việc yêu cầu giá trị R2 phải lớn hơn 0.5 là đi ngược với lý thuyết thống kê.

Như vậy, nếu kết quả hồi quy bạn phân tích được có R bình phương hiệu chỉnh dưới 50% (0.5) thì kết quả vẫn được chấp nhận.

Nếu bạn gặp khó khăn khi thực hiện phân tích hồi quy vì số liệu khảo sát không tốt, vi phạm các tiêu chí kiểm định. Bạn có thể tham khảo dịch vụ chạy SPSS của Phạm Lộc Blog hoặc liên hệ trực tiếp email [email protected] để tối ưu thời gian làm bài và đạt kết quả tốt.

Tương quan giữa hai biến có nghĩa là khi giá trị một biến thay đổi thì biến còn lại cũng thay đổi theo.

Tương quan thuận là khi giá trị của một biến tăng, biến còn lại cũng tăng và ngược lại giá trị giảm thì biến còn lại cũng giảm theo. Tương quan nghịch là khi giá trị của một biến tăng, biến còn lại sẽ giảm và ngược lại giá trị giảm thì biến còn lại tăng lên.

Pearson

Pearson’s product-moment correlation (hay Pearson’s correlation) là một trong những phương pháp để ước lượng mối quan hệ giữa 2 biến liên tục.

Điều kiện áp dụng:

  • 2 biến cần tính tương quan là 2 biến liên tục, có phân phối chuẩn.
  • Mỗi giá trị của biến này sẽ liên quan với 1 giá trị của biến kia theo từng cặp.
  • Phải có mối quan hệ tuyến tính giữa 2 biến này.
  • Không có outliers đáng kể.

Hệ số tương quan Pearson (r) có giá trị từ -1 cho đến 1, được đánh giá như sau:

  • r = 0, không có mối tương quan
  • r = 1, tương quan tuyệt đối
  • r < 0, tương quan nghịch
  • r > 0, tương quan thuận

  • 0 < |r| < 0.2, tương quan rất yếu
  • 0.2 < |r| < 0.4, tương quan yếu
  • 0.4 < |r| < 0.6, tương quan trung bình
  • 0.6 < |r| < 0.8, tương quan mạnh
  • 0.8 < |r| < 1, tương quan rất mạnh

Thực hành trên R

Số liệu mẫu

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)
## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

(Lưu ý là hàm sample() là một hàm ngẫu nhiên, do đó mỗi lần chạy sẽ cho các số liệu khác nhau, dẫn tới kết quả sẽ khác nhau giữa từng lần chạy nhé)

Ta sẽ thử áp dụng Pearson’s correlation cho 2 biến liên tục là

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

3 và

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

4

Bước 1. Kiểm tra phân bố chuẩn của 2 biến này bằng biểu đồ boxplot

(Có nhiều phương pháp để kiểm tra phân bố chuẩn, tuy nhiên nếu dùng boxplot ta sẽ tiện kiểm tra outliers luôn)

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

B2. Kiểm tra mối quan hệ tuyến tính giữa 2 biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

Ta thấy có xu hướng khi

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

3 tăng thì

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

4 giảm, theo 1 đường thẳng (tuyến tính)

B3. Không có outlier đáng kể.

Từ 2 biểu đồ trên cho thấy có outliers (biến ngoại lai). Để áp dụng Pearson’s correlation ta phải loại bỏ các outliers này.

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

Sau đó kiểm tra lại

df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

B4. Tính hệ số tương quan Pearson

cor(df$depth, df$table, method = "pearson")
## [1] -0.219185

Sau khi có hệ số tương quan. Ta so sánh giá trị này với phần đánh giá ở trên nhé!

Kiểm định hệ số tương quan (r = 0)

cor.test(df$depth, df$table, method = "pearson")
# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

0

Giả sử ta thu được kết quả như sau:

r = -0.256, 95%CI: [-0.298; -0.213], p < 0.001

Kết luận đầy đủ là:

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

3 và

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

4 có mối tương quan nghịch, mức độ tương quan là yếu và mối tương quan này có ý nghĩa thống kê.

Spearman

Spearman’s rank-order correlation (hay Spearman’s correlation) là phương pháp nonparametric để ước lượng mối quan hệ của 2 biến thứ bậc (ordinal). Có thể dùng thay thế cho Pearson’s correlation khi 2 biến liên tục không có phân bố chuẩn.

Điều kiện áp dụng:

  • 2 biến cần tính tương quan là 2 biến ordinal hoặc continuous.
  • Mỗi giá trị của biến này sẽ liên quan với 1 giá trị của biến kia theo từng cặp.
  • Phải có mối quan hệ đơn điệu (monotonic) giữa 2 biến này.

Quan hệ đơn điệu tức là nếu biến này tăng thì biến kia một là tăng, hai là giảm, không thể vừa tăng và vừa giảm.

Xem ví dụ bên dưới để biết thế nào là không đơn điệu:

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

1

Bạn có thể thấy, ban đầu x tăng thì y tăng, nhưng lúc sau x tăng thì y giảm. Đó là ví dụ về tính không đơn điệu.

Áp dụng Spearman’s correlation

Ta có thể dùng lại ví dụ của Pearson’s correlation để thử áp dụng, bằng cách thay đổi method sang

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

9.

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

2

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

3

Hệ số tương quan của phương pháp Spearman gọi là

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

0. Vì rho = -0.21, ta có thể nói có mối tương quan nghịch mức độ yếu giữa 2 biến

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

3 và

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

4.

Kiểm định hệ số tương quan (rho = 0)

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

4

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

5

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

6

Giả sử ta thu được rho = -0.21, p <0.001, ta kết luận như sau: Vì p < 0.001, ta có thể mạnh dạn bác bỏ H0 (rho = 0). Ta kết luận hệ số tương quan giữa depth và table có ý nghĩa thống kê (rho = -0.21, p < 0.001)

Kendall

Ở ví dụ chạy tương quan Spearman, bạn sẽ thấy cảnh báo “Cannot compute exact p-value with ties”. Vậy ties là gì?

Tied data là khi số liệu bị trùng lặp.

Ví dụ: Ta có số liệu 1,2,3,4,4,4,5,5,6,7,8,9. Khi đó 4 và 5 bị lặp lại. Ta gọi là ties.

Ties ảnh hưởng đến phân bậc thứ hạng (rank) trong các kiểm định phi tham số (nonparametric).

Kendall’s correlation giúp kiểm tra hệ số tương quan khi số liệu có nhiều ties, cỡ mẫu nhỏ.

Áp dụng tính hệ số tương quan Kendall (tau):

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

7

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

8

Kiểm định hệ số tương quan (tau = 0)

# Ta lấy ngẫu nhiên mẫu 2000 trong 50000 trường hợp đầu tiên của dataset diamonds làm ví dụ
df = ggplot2::diamonds[sample(1:50000, 2000),]
head(df)

9

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

0

Nhận xét tương tự 2 ví dụ về Pearson’s và Spearman’s correlation nhé!

Hồi quy (Regression)

Hồi quy là một phương pháp phân tích thống kê nhằm xác định xem biến độc quy định biến phụ thuộc như thế nào. Hệ số tương quan chỉ cho chúng ta biến 2 biến số có liên quan với nhau hay không, chiều hướng tương quan và mức độ tương quan. Trong khi hồi quy sẽ cho chúng ta biết cụ thể sự quy định biến phụ thuộc của biến độc lập.

Phương trình hồi quy là phương trình diễn tả sự quy định đó. Ví dụ phương trình y = 2*x + 3. Nếu x = 1 thì y = 5, x = 2 thì y = 9,…

Hai dạng hồi quy cơ bản thường gặp nhất là hồi quy tuyến tính và hồi quy logistic:

Tuyến tính (Linear)

Là phương trình bậc 1, mô tả mối quan hệ giữa biến độc lập và biến phụ thuộc thông qua 2 giá trị b0 và b.

  • b0 còn gọi là hằng số, hệ số chặn, constant, intercept,…
  • b còn gọi là hệ số, hệ số góc, độ nghiên, coefficient, slobe,…

Đồ thị của phương trình tuyến tính là một đường thẳng.

Khi xem xét mối quan hệ giữa 2 biến, người ta chú ý đến hệ số b hơn vì nó quy định mức độ ảnh hưởng của biến độc lập lên biến phụ thuộc:

  • b = 0, biến độc lập không có tác động gì tới biến phụ thuộc.
  • b < 0, giá trị của biến độc lập tăng sẽ làm giảm giá trị của biến phụ thuộc và ngược lại (tương quan nghịch).
  • b > 0, giá trị của biến độc lập tăng làm cho giá trị của biến phụ thuộc cũng tăng theo (tương quan thuận).
  • b càng lớn, ảnh hưởng của biến độc lập lên biến phụ thuộc càng nhiều.
  • b càng bé, ảnh hưởng của biến độc lập lên biến phụ thuộc càng ít.

Điều kiện áp dụng

  • Biến phụ thuộc và biến độc lập là biến liên tục (continuous), có phân bố xấp xỉ phân bố chuẩn.
  • Các quan sát độc lập nhau.
  • Có mối quan hệ tuyến tính giữa 2 biến.
  • Không có giá trị ngoại lai đáng kể (no outlier).
  • Phương sai không đổi Phần dư (residuals, errors) của phương trình hồi quy tuân theo phân bố chuẩn.

Thực hành trên R

Data sử dụng lấy từ Scribbr.com. Bạn có thể tải về tại đây.

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

1

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

2

Kiểm tra điều kiện áp dụng:

Ta sẽ kiểm tra phân bố bằng boxplot để tiện cho việc kiểm tra outliers:

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

3

Ta thấy biểu đồ boxplot rất đối xứng ở cả 2 biến, ta có thể xem 2 biến này có phân bố xấp xỉ phân bố chuẩn. Boxplot cũng cho thấy 2 biến trên không có outliers.

Kiểm tra mối quan hệ tuyến tính dựa vào biểu đồ phân tán:

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

4

Điều kiện về phương sai không đổi và phân dư tuân theo phân bố chuẩn sẽ được kiểm tra sau khi chạy mô hình.

Chạy mô hình hồi quy tuyến tính bằng hàm lm()

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

5

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

6

Nhìn kết quả thu được, ta có:

Hệ số b = 0.7138, p < 0.001. Ta có thể kết luận income tăng sẽ làm happiness tăng. Kết luận này có ý nghĩa thống kê. Phương trình hồi quy: happiness = 0.2043 + 0.7138*income

Trước khi báo cáo kết quả, ta kiểm tra 2 điều kiện cuối cùng là phương sai không đổi và phần dư có phân bố chuẩn. Ta làm như sau:

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

7

Về cơ bản, những biểu đồ trên nếu các giá trị xoay quanh đường ngang màu đỏ thì phương sai của mô hình không thay đổi. Còn ở Q-Q plot, nếu các giá trị càng gần với đường chéo thì phân dư của mô hình càng xấp xỉ phân bố chuẩn.

Như vậy, kết luận đưa ra vừa rồi về mô hình hồi quy thu được là có ý nghĩa.

Logistics (Logit)

Tên đầy đủ: Hồi quy logistic nhị phân (Binomial logistics regression, Binomial logit model, logit model, logistics regression).

Khác với hồi quy tuyến tính, vì biến phụ thuộc trong hồi quy logistic chỉ nhận 2 giá trị (biến nhị phân) nên ta không thể áp dụng phương trình y = b0 + bx được.

Để áp dụng, người ta biến đổi y thành phương trình logarit của OR bằng giá trị y’, lúc này y’ của chúng ta không còn là biến nhị phân nữa mà đã là biến liên tục. Lúc này, ta có thể áp dụng hồi quy tuyến tính. y’ = b0 +bx, với y’ là logarit tự nhiên của p/(1-p) (OR của y). Khi đó, ta đánh giá hệ số b giống như mô hình hồi quy tuyến tính.

Hệ số b thể hiện mối quan hệ giữa x và y’. Để xem xét trực tiếp mối quan hệ giữa biến độc lập và biến phụ thuộc (x và y) mà không phải gián tiếp qua y’, ta chỉ cần lấy e mũ cơ số b (

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

3). Giá trị

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

3 lúc này gọi là OR của biến độc lập. Việc đánh giá

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

3 (hay OR) của biến độc lập có khác so với hệ số b trong hồi quy tuyến tính một chút:

  • OR luôn là số dương.
  • OR = 1, biến độc lập không có ảnh hưởng gì đến biến phụ thuộc.
  • OR < 1, biến độc lập tăng làm giảm (nguy cơ) giá trị của biến phụ thuộc.

Vì biến phụ thuộc lúc này chỉ có 2 giá trị, nếu ta chọn 1 giá trị làm giá trị tham chiếu (gọi là A), thì OR < 1 có nghĩa là biến độc lập tăng làm giảm nguy cơ biến phụ thuộc có giá trị còn lại kia (giá trị B). OR > 1, biến độc lập tăng làm tăng nguy cơ biến phụ thuộc có giá trị là B.

Ta có thể diễn tả theo cách ngược lại như sau: OR < 1, biến độc lập tăng làm tăng nguy cơ biến phụ thuộc có giá trị A. OR > 1, biến độc lập tăng làm giảm nguy cơ biến phụ thuộc có giá trị A. Dùng cách nào cũng được. Tuy nhiên để thống nhất với nhau, ta sẽ dùng cách đầu tiên.

Điều kiện áp dụng

Điều kiện áp dụng:

  • Biến phụ thuộc là biến nhị phân (dichotomous).
  • Các quan sát độc lập nhau.
  • Có mối quan hệ tuyến tính giữa biến độc lập (nếu là biến liên tục) với hàm biến đổi của biến phụ thuộc (y’)

Thực hành trên R

Ta sử dụng

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

6 có sẵn trong R base

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

8

Ta sẽ áp dụng mô hình hối quy logistic cho biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

7 (biến phụ thuộc) và biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

8 (biến độc lập)

Để chạy hồi quy logistic, ta chạy glm() với family=“binomial”

(Glm - Generalized linear model là mô hình tuyến tính tổng quát, binomial logistic regression chỉ là một trường hợp đặc biệt của glm)

## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  1.5  Very Good J     I1       63.3    58  5141  7.27  7.23  4.59
## 2  0.74 Fair      E     SI1      66      56  2069  5.6   5.67  3.72
## 3  0.38 Ideal     E     SI1      61.9    55   700  4.64  4.7   2.89
## 4  0.52 Ideal     D     SI2      62.5    56  1289  5.08  5.12  3.19
## 5  0.33 Very Good D     VS1      63.2    56  1109  4.45  4.44  2.81
## 6  2.05 Good      G     SI2      63.7    61 16148  7.99  8.03  5.1

9

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

0

Ta thấy hệ số b (Estimate) của biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

8 là -1.911, p <0.01, do đó ta có thể nói biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

8 có tương quan nghịch với hàm ln OR của biến

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

7.

Trước khi đưa ra kết luận cuối cùng, ta kiểm tra điều kiện biến liên tục có mối quan hệ tuyến tính với hàm ln OR của biến phụ thuộc.

(Trong toán học, logarit tự nhiên ký hiệu là

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

2, còn trong R,

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

2 được tính bằng hàm

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

4, cho nên bạn đừng bận tâm quá lúc thì viết là

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

2, lúc thì là

# Tìm ra các giá trị outliers
out_depth = boxplot(df$depth, plot = F)$out
out_table = boxplot(df$table, plot = F)$out

# Loại bỏ các trường hợp outliers này ra khỏi data frame
df = df[-which(df$depth %in% out_depth), ]
df = df[-which(df$table %in% out_table), ]

6)

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

1

Ta thấy tương quan của ln(OR(

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

7)) và biến wt có mối quan hệ tuyến tính, như vậy là thỏa mãn điều kiện.

Kết luận mối quan hệ giữa ln(OR(

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

7)) và wt rất khó hiểu. Để so sánh trực tiếp

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

7 và

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

8, ta lấy e mũ cơ số b vừa tính được.

# Boxplot của biến depth
p1 = ggplot(df) +
  geom_boxplot(aes(y = depth))

# Boxplot của biến table
p2 = ggplot(df) +
  geom_boxplot(aes(y = table))

# Print 2 boxplot cùng nhau
ggarrange(p1, p2, 
          labels = c("Biến depth", "Biến table"),
          ncol = 2, nrow = 1)

2

Ta thu được OR = 0.148, nhỏ hơn 1. Vậy ta kết luận:

# Sử dụng biểu đồ phân tán để kiểm tra
df %>% 
  ggplot(aes(x = depth, y = table)) +
  geom_point()

8 có liên quan đến vs, cứ wt tăng lên 1 sẽ giảm “nguy cơ” của vs có giá trị bằng 1 đi 14,8%. Kết luận có ý nghĩa thống kê (p<0.01).