Tương quan, hồi quy trên R

Liên hệ:


Thư viện cần thiết

Nếu chưa cài package pacman thì sử dụng lệnh install.packages(‘pacman’)

pacman::p_load(tidyverse, ggpubr)

Bài viết có liên quan:


Tương quan (Correlation)

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à depthtable

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 depth tăng thì table 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")
## 
##  Pearson's product-moment correlation
## 
## data:  df$depth and df$table
## t = -9.7664, df = 1890, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.2616653 -0.1758572
## sample estimates:
##       cor 
## -0.219185

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à:

depthtable 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:

data <- data.frame(hours=c(6, 9, 12, 14, 30, 35, 40, 47, 51, 55, 60),
                   happiness=c(14, 28, 50, 70, 89, 94, 90, 75, 59, 44, 27))

ggplot(data, aes(x = hours, y = happiness)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x + I(x^2), size = 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 spearman.

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

Hệ số tương quan của phương pháp Spearman gọi là rho. 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 depthtable.

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

cor.test(df$depth, df$table, method = "spearman")
## Warning in cor.test.default(df$depth, df$table, method = "spearman"): Cannot
## compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  df$depth and df$table
## S = 1339374826, p-value = 2.805e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## -0.1865611

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):

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

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

cor.test(df$depth, df$table, method = "kendall")
## 
##  Kendall's rank correlation tau
## 
## data:  df$depth and df$table
## z = -8.3118, p-value < 2.2e-16
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##        tau 
## -0.1372866

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.

data = read_csv("income.data.csv")
head(data)
## # A tibble: 6 × 3
##    ...1 income happiness
##   <dbl>  <dbl>     <dbl>
## 1     1   3.86      2.31
## 2     2   4.98      3.43
## 3     3   4.92      4.60
## 4     4   3.21      2.79
## 5     5   7.20      5.60
## 6     6   3.73      2.46

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:

p1 = data %>% ggplot(aes(y = income)) + geom_boxplot()
p2 = data %>% ggplot(aes(y = happiness)) + geom_boxplot()

ggarrange(p1, p2, 
          labels = c("Biến income", "Biến happiness"),
          ncol = 2, nrow = 1)

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:

data %>% 
  ggplot(aes(x = income, y = happiness)) +
  geom_point()

Đ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()

mo_hinh = lm(formula = happiness~income, data = data)
summary(mo_hinh)
## 
## Call:
## lm(formula = happiness ~ income, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.02479 -0.48526  0.04078  0.45898  2.37805 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.20427    0.08884   2.299   0.0219 *  
## income       0.71383    0.01854  38.505   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7181 on 496 degrees of freedom
## Multiple R-squared:  0.7493, Adjusted R-squared:  0.7488 
## F-statistic:  1483 on 1 and 496 DF,  p-value: < 2.2e-16

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:

par(mfrow=c(2,2)) # Chia output ra thành bảng 2x2 (chứa 4 biểu đồ)
plot(mo_hinh)

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 (exp(b)). Giá trị exp(b) lúc này gọi là OR của biến độc lập. Việc đánh giá exp(b) (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 mtcars có sẵn trong R base

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Ta sẽ áp dụng mô hình hối quy logistic cho biến vs (biến phụ thuộc) và biến wt (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)

mo_hinh = glm(data = mtcars, 
              formula = vs~wt,
              family = "binomial")
summary(mo_hinh)
## 
## Call:
## glm(formula = vs ~ wt, family = "binomial", data = mtcars)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.9003  -0.7641  -0.1559   0.7223   1.5736  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   5.7147     2.3014   2.483  0.01302 * 
## wt           -1.9105     0.7279  -2.625  0.00867 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 43.860  on 31  degrees of freedom
## Residual deviance: 31.367  on 30  degrees of freedom
## AIC: 35.367
## 
## Number of Fisher Scoring iterations: 5

Ta thấy hệ số b (Estimate) của biến wt là -1.911, p <0.01, do đó ta có thể nói biến wt có tương quan nghịch với hàm ln OR của biến vs.

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à ln, còn trong R, ln được tính bằng hàm log(), cho nên bạn đừng bận tâm quá lúc thì viết là ln, lúc thì là log)

# Lấy các giá trị của log OR biến vs
or_vs = predict(mo_hinh, type = "response")

# Hàm biến đổi
logit = log(or_vs/(1-or_vs))

# Kiểm tra mối quan hệ của hàm biến đổi này và biến wt
ggplot() +geom_point(aes(x = mtcars$wt, y = logit))

Ta thấy tương quan của ln(OR(vs)) 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(vs)) và wt rất khó hiểu. Để so sánh trực tiếp vswt, ta lấy e mũ cơ số b vừa tính được.

exp(-1.911)
## [1] 0.1479324

Ta thu được OR = 0.148, nhỏ hơn 1. Vậy ta kết luận: wt 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).