Tôi muốn thực hiện một phân tích ANOVA nhưng data của tôi không thỏa mãn những điều kiện của ANOVA test. Tôi phải làm gì đây? Hoặc mô hình linear của tôi đã giải thích được 72.3% sự biến thiên của y rồi, tôi muốn thử tìm thêm biến số nào sẽ góp phần giải thích cho 27.7% còn lại, tôi phải làm gì nữa?
Dữ liệu tương quan rất thường gặp trong các phân tích thống kê. Điều này có thể là do việc phân nhóm các đối tượng nghiên cứu, ví dụ: những bệnh nhân trong các nhóm điều trị khác nhau, các nhóm tuổi khác nhau hoặc các phép đo lặp lại của từng đối tượng theo thời gian T0, T1, T2. Dữ liệu tạo thành một hệ thống phân cấp của các phép đo có tương quan với nhau (hierachy for levels of correlated measurements).
Phân tích mixed models cho ta một cách tiếp cận chung, rõ ràng trong các tình huống này, bởi vì nó cho phép một loạt các mô hình tương quan (hoặc cấu trúc variance-covariance) được mô hình hóa một cách rõ ràng.
Mixed models = fixed effect + random effect
Trong bộ dữ liệu dưới đây, chúng ta đo lường giá trị xét nghiệm y ở những bệnh nhân, từ 1-6, tại ba thời điểm T0, T1, T2. Những bệnh nhân này được điều trị bởi các thầy thuốc khác nhau (therapists: 1 - 4), theo hai loại điều trị A và B.
Sơ đồ phân cấp ba level theo thời gian như sau:
Fixed effect tác động lên trung bình biến số y trong các nhóm đối tượng
Random effect tác động lên variance của y trong các nhóm đối tượng
Nói theo ví dụ trên, biến số Treatment làm thay đổi y, tạo ra khác biệt của trung bình y giữa hai nhóm của Treatment.
Biến số Therapist (người điều trị) không phản ánh khác biệt có ý nghĩa của trung bình y trong các nhóm của Therapist, nhưng variance của y thì khác nhau. Sự khác biệt variance này cho thấy y biến động khác thường, có ý nghĩa thực tế, khi được điều trị bởi những Therapists khác nhau, mặc dù giá trị trung bình không khác nhau.
Mixed models cho ta cơ hội đánh giá đồng thời của hai loại tác động fixed và random lên y, điều này khác với ANOVA, chỉ đánh giá những biến số có fixed effects.
ANOVA: Đòi hỏi tất cả những đối tượng phải có đầy đủ dữ liệu cho số lần đo lường bằng nhau. VD mọi đối tượng phải có đủ 3 lần đo như nhau. Những đối tượng bị missing data hoặc có nhiều hơn, ít hơn 3 lần đo đều bị loại khỏi phân tích.
Những điều kiện (assumptions) của ANOVA:
Trong thực hành, những yêu cầu này thường khó đạt được hoàn toàn. Khi dữ liệu tương quan thì các điều kiện đối với ANOVA không còn thỏa mãn nữa. Khi các những điều kiện bị vi phạm thì kết quả phân tích ANOVA không còn giá trị nữa.
LMMs chấp nhận missing data và xem chúng như những trường hợp mất dữ liệu ngẫu nhiên và cho phép các đối tượng có số lần đo lường không bằng nhau (unbalanced clustered data).
Việc nhân biết và sắp xếp các biến số này vào mô hình với vai trò là fixed hay random effects tùy thuộc vào kinh nghiệm xử lí số liệu của người phân tích. Một số biến số thường gặp như sau:
Nhóm điều trị, Giới tính, Centers, Khu vực, Địa phương
Phân nhóm tuổi, Cá nhân đối tượng, Thời điểm theo dõi, Hộ gia đình, Lứa gia súc
Kiểm tra việc nhận diện, phân loại một biến số là fixed hoặc random đúng hay chưa bằng cách đánh giá mô hình LMMs để biết ý nghĩa thống kê của mô hình khi có sự tham gia của biến số đó.
library(tidyverse)
## -- Attaching packages ---------------------------------- tidyverse 1.2.1 --
## v ggplot2 2.2.1 v purrr 0.2.4
## v tibble 1.4.1 v dplyr 0.7.4
## v tidyr 0.7.2 v stringr 1.2.0
## v readr 1.1.1 v forcats 0.2.0
## -- Conflicts ------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(data.table)
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
## The following object is masked from 'package:purrr':
##
## transpose
mydat <- fread('http://www-personal.umich.edu/~bwest/rat_pup.dat')
head(mydat,15)
## pup_id weight sex litter litsize treatment
## 1: 1 6.60 Male 1 12 Control
## 2: 2 7.40 Male 1 12 Control
## 3: 3 7.15 Male 1 12 Control
## 4: 4 7.24 Male 1 12 Control
## 5: 5 7.10 Male 1 12 Control
## 6: 6 6.04 Male 1 12 Control
## 7: 7 6.98 Male 1 12 Control
## 8: 8 7.05 Male 1 12 Control
## 9: 9 6.95 Female 1 12 Control
## 10: 10 6.29 Female 1 12 Control
## 11: 11 6.77 Female 1 12 Control
## 12: 12 6.57 Female 1 12 Control
## 13: 13 6.37 Male 2 14 Control
## 14: 14 6.37 Male 2 14 Control
## 15: 15 6.90 Male 2 14 Control
dim(mydat)
## [1] 322 6
Bộ dữ liệu về weight của những con chuột con, dataset có 322 dòng và 6 biến số như trên.Trong đó treatment là biến số nhóm điều trị (high, low và control), litter là bầy chuột được sinh ra bởi một chuột mẹ, litsize là số con trong một bầy chuột nhất định.
Mục đích của nghiên cứu là tìm quy luật biến đổi của trọng lượng chuột con (weight) theo giới tính, số con trong một lứa và dưới tác động của loại điều trị.
weight ~ treatment + sex + litter + treatment:sex + treatment:litter
Tóm tắt về weight của chuột con trong các nhóm
library(plyr)
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following object is masked from 'package:purrr':
##
## compact
ddply(mydat,~treatment*sex,summarise,mean=mean(weight),sd=sd(weight),min=min(weight),max=max(weight))
## treatment sex mean sd min max
## 1 Control Female 6.116111 0.6851179 3.68 7.57
## 2 Control Male 6.471039 0.7537880 4.57 8.33
## 3 High Female 5.851562 0.6001887 4.48 7.68
## 4 High Male 5.918485 0.6909058 5.01 7.70
## 5 Low Female 5.837538 0.4504964 4.75 7.73
## 6 Low Male 6.025082 0.3803403 5.25 7.13
table(mydat$treatment,mydat$sex)
##
## Female Male
## Control 54 77
## High 32 33
## Low 65 61
p<-ggplot(mydat, aes(x=treatment, y=weight, fill=sex)) +
geom_boxplot(position=position_dodge(1))+
ggtitle("Weight By Treatment Groups and Sex")+
stat_summary(fun.y="mean", geom="point", shape=23, size=4)
p
Nhìn vào bảng tóm tắt và biểu đồ, ta có những nhận xét sơ bộ như sau: trọng lượng (weight) của chuột con càng thấp khi có can thiệp (high treatment vs low treatment) so với không can thiệp (control) và chuột đực nặng hơn chuột cái.
Ngoài ra, nhìn vào biểu đồ có hình thoi (mean) và box (median) ta thấy variance của weight trong các nhóm tương đối khác nhau, đặt ra nghi vấn về unequal variances.
Trước hết chúng ta phân tích theo mô hình ANOVA xem weight thay đổi theo các nhóm điều trị, giới tính, số con trong lứa sinh như thế nào.
# Chuẩn bị dữ liệu cho ANOVA test
ratpup <- mydat
ratpup$sex1[ratpup$sex == "Female"] <- 1
ratpup$sex1[ratpup$sex == "Male"] <- 0
head(ratpup)
## pup_id weight sex litter litsize treatment sex1
## 1: 1 6.60 Male 1 12 Control 0
## 2: 2 7.40 Male 1 12 Control 0
## 3: 3 7.15 Male 1 12 Control 0
## 4: 4 7.24 Male 1 12 Control 0
## 5: 5 7.10 Male 1 12 Control 0
## 6: 6 6.04 Male 1 12 Control 0
# Anova model
fit <- aov(weight ~ treatment + sex1 + litter + treatment:sex1, data=ratpup)
summary(fit)
## Df Sum Sq Mean Sq F value Pr(>F)
## treatment 2 13.20 6.601 17.927 4.23e-08 ***
## sex1 1 4.19 4.194 11.389 0.000831 ***
## litter 1 0.16 0.156 0.424 0.515301
## treatment:sex1 2 1.01 0.504 1.368 0.256015
## Residuals 315 115.99 0.368
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Weight liên quan có ý nghĩa với treatment và sex1, không liên quan có ý nghĩa với litter và tương tác treatment:sex1.
# kiểm tra tính normal distribution of errors
fit2 <- aov(weight ~ treatment + sex1, data=ratpup)
ratpup$resids <- residuals(fit2)
ratpup$preds <- predict(fit2)
ratpup$sq_preds <- ratpup$preds^2
plot(resids ~ preds, data = ratpup, xlab = "Predicted Values", ylab = "Residuals")
shapiro.test(ratpup$resids)
##
## Shapiro-Wilk normality test
##
## data: ratpup$resids
## W = 0.97819, p-value = 8.285e-05
p-value = 8.285e-05 cho thấy residuals (errors) không có phân phối normal.
#Perform Levene's Test for homogenity of variances
library(car)
## Warning: package 'car' was built under R version 3.4.4
## Loading required package: carData
## Warning: package 'carData' was built under R version 3.4.4
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
leveneTest(weight ~ treatment, data = ratpup)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 10.921 2.586e-05 ***
## 319
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
leveneTest(weight ~ sex, data = ratpup)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 3.2755 0.07126 .
## 320
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p = 2.586e-05 *** cho thấy variance trong các nhóm của treatment không đồng nhất (unequal variance). Tôi sẽ trở lại vấn đề này trong phần sau.
Như vậy có ít nhất 2 assumptions của ANOVA test bị vi phạm, cho nên kết quả ANOVA test sẽ không có giá trị.
Việc kiểm tra những assumptions này có thể bị bỏ qua trong thực hành phân tích dữ liệu, dẫn đến kết quả phân tích không đáng tin cậy.
Đó là lí do chúng ta cần phải xem xét đến mixed effect models cho những trường hợp như thế này.
library(nlme)
## Warning: package 'nlme' was built under R version 3.4.4
##
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
##
## collapse
model3.1.fit <- lme(weight ~ treatment + sex1 + litsize +
treatment:sex1, random = ~ 1 | litter,
data = ratpup, method = "REML")
summary(model3.1.fit)
## Linear mixed-effects model fit by REML
## Data: ratpup
## AIC BIC logLik
## 419.1043 452.8775 -200.5522
##
## Random effects:
## Formula: ~1 | litter
## (Intercept) Residual
## StdDev: 0.3106722 0.404337
##
## Fixed effects: weight ~ treatment + sex1 + litsize + treatment:sex1
## Value Std.Error DF t-value p-value
## (Intercept) 8.323340 0.27333009 292 30.451605 0.0000
## treatmentHigh -0.906057 0.19154238 23 -4.730320 0.0001
## treatmentLow -0.467040 0.15818328 23 -2.952521 0.0071
## sex1 -0.411688 0.07315410 292 -5.627679 0.0000
## litsize -0.128382 0.01875336 23 -6.845819 0.0000
## treatmentHigh:sex1 0.107023 0.13176318 292 0.812239 0.4173
## treatmentLow:sex1 0.083866 0.10568189 292 0.793568 0.4281
## Correlation:
## (Intr) trtmnH trtmnL sex1 litsiz trtH:1
## treatmentHigh -0.562
## treatmentLow -0.297 0.404
## sex1 -0.111 0.158 0.191
## litsize -0.916 0.363 0.022 0.001
## treatmentHigh:sex1 0.043 -0.323 -0.106 -0.555 0.020
## treatmentLow:sex1 0.044 -0.096 -0.320 -0.692 0.036 0.385
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -7.47250744 -0.50014749 0.02911668 0.57348178 3.00962055
##
## Number of Observations: 322
## Number of Groups: 27
Phần fixed effect: treatment + sex1 + litsize + treatment:sex1
Phần random effect: random = ~ 1 | litter
Giải thích kết quả:
Các chỉ số AIC, BIC, LogLik nói lên performance của model này. Chúng ta dùng các chỉ số này để so sánh với các models biến đổi sau này nhằm tìm ra model tối ưu.
Intercept = 8.323340 là chỉ số weight trung bình.
Chuột trong nhóm “hight treatment” giảm trọng lượng -0.906057 đơn vị,
Chuột trong nhóm “low treatment” giảm trọng lượng -0.467040 đơn vị,
Chuột cái (sex = 1) nhẹ hơn chuột đực (sex = 0) -0.411688,
Trong những lứa (bầy) có số con tăng 1 thì trọng lượng trung bình của chuột giảm -0.128382 đơn vị.
Khi chọn biến số litter để đưa vào phần random effect trong mô hình, nó cho thấy có vai trò trong biến thiên của weight với SD = 0.3106722 và SD của residuals = 0.404337. Vai trò của biến số litter không được ANOVA test phát hiện vì thuật toán của ANOVA chỉ phát hiện fixed effects. Linear Mixed Effect Model (lme) giúp phát hiện ra sự khác biệt này.
Loại bỏ thành phần treatment:sex1 không có ý nghĩa thì mô hình còn lại sẽ là:
library(nlme)
model3.1b.fit <- lme(weight ~ treatment + sex1 + litsize , random = ~ 1 | litter,
data = ratpup, method = "REML")
Package nlme cũng có hàm gls() cho ta phần fixed effect mà thôi. Chúng ta thử so sánh hai models có và không có phần random effect để xem random variable có ý nghĩa trong sự biến thiên cùa weight hay không:
# Model with fixed effects only
model3.lc.fit <- gls(weight ~ treatment + sex1 + litsize , data = ratpup)
anova(model3.1b.fit, model3.lc.fit)
## Model df AIC BIC logLik Test L.Ratio p-value
## model3.1b.fit 1 7 410.9994 437.3117 -198.4997
## model3.lc.fit 2 6 499.4820 522.0354 -243.7410 1 vs 2 90.48262 <.0001
Kết quả cho thấy model3.lc.fit có các chỉ số AIC, BIC, LogLik không ưu thế bằng mô hình model3.1b.fit (có phần random effect) và sự khác biệt giữa hai mô hình có ý nghĩa thống kê, p < 0.001.
Điều này nói lên vai trò có ý nghĩa của random effect (random = ~ 1 | litter) trong sự biến thiên của weight.
Đánh giá performance của model này qua biểu đồ residual và QQ như sau:
library(lattice)
plot(model3.1b.fit,resid(., type = "p") ~ fitted(.) | factor(treatment), layout = c(3,1),aspect=2, abline=0)
qqnorm(model3.1b.fit, ~ resid(.) | factor(treatment),layout = c(3,1) ,aspect = 2)
Variance của weight trong các nhóm high, low và control của treatment không đồng nhất, biểu lộ rõ trong biểu đồ QQ ở trên với khác biệt rõ trong nhóm control.
Còn nhớ ở phần trên, ta đã phát hiện các nhóm control, high và low treatment có variance không đồng nhất. Tôi sẽ làm rõ những thông số residual variance ở các levels khác nhau của biến số treatment như sau:
model3.2a.fit <- lme(weight ~ treatment + sex1 + litsize,
random = ~1 | litter, ratpup, method = "REML",
weights = varIdent(form = ~1 | treatment))
summary(model3.2a.fit)
## Linear mixed-effects model fit by REML
## Data: ratpup
## AIC BIC logLik
## 373.1646 406.9947 -177.5823
##
## Random effects:
## Formula: ~1 | litter
## (Intercept) Residual
## StdDev: 0.3136624 0.5144278
##
## Variance function:
## Structure: Different standard deviations per stratum
## Formula: ~1 | treatment
## Parameter estimates:
## Control Low High
## 1.0000000 0.5643872 0.6354988
## Fixed effects: weight ~ treatment + sex1 + litsize
## Value Std.Error DF t-value p-value
## (Intercept) 8.322966 0.27310901 294 30.474886 0.0000
## treatmentHigh -0.862368 0.18297383 23 -4.713067 0.0001
## treatmentLow -0.433563 0.15163164 23 -2.859319 0.0089
## sex1 -0.343458 0.04180668 294 -8.215389 0.0000
## litsize -0.130331 0.01848141 23 -7.051998 0.0000
## Correlation:
## (Intr) trtmnH trtmnL sex1
## treatmentHigh -0.606
## treatmentLow -0.351 0.464
## sex1 -0.103 -0.005 -0.035
## litsize -0.913 0.399 0.066 0.044
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -5.97300195 -0.52157120 0.02077248 0.56022844 2.53765137
##
## Number of Observations: 322
## Number of Groups: 27
Thành tố weights = varIdent(form = ~ 1 | treatment) khai báo cho model biết ta đang khai thác biệt variance trong các levels của treatment.
Trong phần random effects cho thấy Residual SD = 0.5144278
trong phần Parameter estimates:
Control | Low | High
1.0000000 | 0.5643872 | 0.6354988
Ta nhân Residual SD = 0.5144278 cho từng parameter estimates ở trên để cho ra Residual SD cho từng levels của treatment.
Như vậy SD cho mỗi nhóm treatment là:
Control: 0.5144
Low: 0.2901
high: 0.3266
Như vậy SD trong nhóm Control lớn nhất, nói cách khác, weight trong nhóm Control biến động nhiều hơn các nhóm khác.
So sánh hai model:
anova(model3.1b.fit, model3.2a.fit)
## Model df AIC BIC logLik Test L.Ratio p-value
## model3.1b.fit 1 7 410.9994 437.3117 -198.4997
## model3.2a.fit 2 9 373.1646 406.9947 -177.5823 1 vs 2 41.83483 <.0001
Vậy model có sự xem xét của treatment variance cho kết quả tốt hơn.
Ngoài ra chúng ta có thể thay đổi phương pháp từ method = “REML” sang method = “ML” để so sánh và tìm ra models tối ưu, khi so sánh các chỉ số AIC, BIC và LogLik của chúng.
library(lme4)
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
## The following object is masked from 'package:tidyr':
##
## expand
##
## Attaching package: 'lme4'
## The following object is masked from 'package:nlme':
##
## lmList
model3.1.fit.lmer <- lmer(weight ~ treatment + sex1 + litsize +
(1 | litter), ratpup, REML = TRUE)
Trong hàm lmer() phần random có cách viết hơi khác với hàm lme() một tí, chúng ta chú ý.
summary(model3.1.fit.lmer)
## Linear mixed model fit by REML ['lmerMod']
## Formula: weight ~ treatment + sex1 + litsize + (1 | litter)
## Data: ratpup
##
## REML criterion at convergence: 397
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -7.5743 -0.4699 0.0111 0.5712 3.0603
##
## Random effects:
## Groups Name Variance Std.Dev.
## litter (Intercept) 0.0974 0.3121
## Residual 0.1628 0.4035
## Number of obs: 322, groups: litter, 27
##
## Fixed effects:
## Estimate Std. Error t value
## (Intercept) 8.30987 0.27371 30.360
## treatmentHigh -0.85870 0.18181 -4.723
## treatmentLow -0.42850 0.15040 -2.849
## sex1 -0.35908 0.04749 -7.562
## litsize -0.12900 0.01879 -6.864
##
## Correlation of Fixed Effects:
## (Intr) trtmnH trtmnL sex1
## treatmntHgh -0.581
## treatmentLw -0.300 0.423
## sex1 -0.111 -0.009 -0.040
## litsize -0.920 0.390 0.035 0.043
Kết quả được trình bày tương tự hàm lme(). Tuy nhiên, không có p values.
Để xem phần random effect mà thôi chúng ta dùng hàm ranef()
ranef(model3.1.fit.lmer)
## $litter
## (Intercept)
## 1 0.17805612
## 2 -0.07071525
## 3 -0.18289450
## 4 -0.05418319
## 5 0.34615302
## 6 -0.05363520
## 7 0.39046482
## 8 -0.02968245
## 9 -0.60785892
## 10 0.08429556
## 11 0.03832949
## 12 0.02490328
## 13 -0.36672606
## 14 0.01557233
## 15 0.03327425
## 16 0.07051165
## 17 -0.39760275
## 18 0.43692016
## 19 -0.18154659
## 20 0.32636424
## 21 -0.29062992
## 22 -0.49231419
## 23 0.26451251
## 24 0.18828098
## 25 0.23099260
## 26 0.24197633
## 27 -0.14281830
Muốn thể hiện các giá trị p-values ta gọi package lmerTest trước khi viết model như sau:
library(lmerTest)
## Warning: package 'lmerTest' was built under R version 3.4.4
##
## Attaching package: 'lmerTest'
## The following object is masked from 'package:lme4':
##
## lmer
## The following object is masked from 'package:stats':
##
## step
model3.1.fit.lmer <- lmer(weight ~ treatment + sex1 + litsize +
(1 | litter), ratpup, REML = TRUE)
summary(model3.1.fit.lmer)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: weight ~ treatment + sex1 + litsize + (1 | litter)
## Data: ratpup
##
## REML criterion at convergence: 397
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -7.5743 -0.4699 0.0111 0.5712 3.0603
##
## Random effects:
## Groups Name Variance Std.Dev.
## litter (Intercept) 0.0974 0.3121
## Residual 0.1628 0.4035
## Number of obs: 322, groups: litter, 27
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 8.30987 0.27371 32.61000 30.360 < 2e-16 ***
## treatmentHigh -0.85870 0.18181 24.98000 -4.723 7.65e-05 ***
## treatmentLow -0.42850 0.15040 22.90000 -2.849 0.0091 **
## sex1 -0.35908 0.04749 301.82000 -7.562 4.81e-13 ***
## litsize -0.12900 0.01879 31.67000 -6.864 9.63e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) trtmnH trtmnL sex1
## treatmntHgh -0.581
## treatmentLw -0.300 0.423
## sex1 -0.111 -0.009 -0.040
## litsize -0.920 0.390 0.035 0.043
Hy vọng bài viết sẽ hữu ích với các bạn, giúp giải đáp những hạn chế của ANOVA test trong thực hành phân tích dữ liệu.
Cám ơn.
KÌ TỚI:
Linear Mixed Effect Models cho dữ liệu longitudinal, tức là phép đo lặp lại ở nhiều thời điểm. ______________________________________________________________