Sunday, October 4, 2015

Biểu đồ bánh tằm (spaghetti plot)

Trong các nghiên cứu theo thời gian (prospective study), nhà nghiên cứu thường theo dõi một nhóm cá nhân trong một thời gian, có thể là vài tuần, vài tháng, vài năm. Mỗi cá nhân, do đó, có nhiều giá trị theo thời gian. Mục tiêu là xem xu hướng biến chuyển của biến số theo thời gian cho mỗi cá nhân. Thuật ngữ tiếng Anh gọi biểu đồ này là spaghetti plot, tức "biểu đồ bánh tằm", vì đường biểu diễn giống ... bánh tằm. Chúng ta có thể dùng ggplot2 để đáp ứng mục tiêu này.


Chẳng hạn như dữ liệu sau đây rút ra từ một nghiên cứu nồng độ glucose trên một nhóm chuột (ID); mỗi chuột được đo 4 lần (Time). Nghiên cứu có 2 nhóm chuột (Treatment):

Y = c(5.9, 3.9, 3.9, 3.6, 5.3, 4.7, 3.5, 3.2, 4.6, 3.7,
      3.3, 3.2, 6.2, 4.6, 4.3, 3.9, 6.0, 5.4, 5.2, 4.8,
      6.4, 4.7, 4.8, 4.3, 7.6, 4.1, 3.8, 4.1, 5.9, 3.1,
      3.6, 3.3, 7.5, 6.1, 5.4, 4.6, 6.2, 5.3, 4.9, 4.5,
      6.9, 5.6, 5.9, 5.9, 5.6, 4.7, 4.6, 4.0, 5.1, 3.9,
      2.9, 2.9, 5.7, 4.7, 4.3, 4.6, 5.0, 4.0, 3.5, 3.3,
      5.2, 4.2, 4.0, 3.8, 7.7, 6.2, 6.1, 5.7, 8.0, 5.8,
      6.5, 6.0, 7.7, 5.0, 6.3, 6.2)

# 3 lệnh sau đây thực hiện 3 việc:
# tạo biến số id
# tạo biến số time có giá trị 0,2,3,4 lặp lại 19 lần
# tạo biến số treatment

ID = rep(1:19, each=4)
Time = rep(c(0,2,3,4), 19)
Treatment = rep(1:2, c(9*4, 10*4))
Glucose = data.frame(ID, Treatment, Time, Y)

> head(Glucose)
  ID Treatment Time   Y
1  1         1    0 5.9
2  1         1    2 3.9
3  1         1    3 3.9
4  1         1    4 3.6
5  2         1    0 5.3
6  2         1    2 4.7


Chúng ta sẽ dùng ggplot2 và hàm geom_line để vẽ xu hướng Gluocse cho từng chuột như sau:

p = ggplot(data=Glucose, aes(x=Time, y=Y, group=ID, color=as.factor(Treatment)))

p = p + geom_line()

p + ylab("Concentration") + xlab("Time of treatment") + theme_bw()



Chúng ta cũng có thể tách ra thành hai "cửa sổ" cho 2 nhóm bằng cách dùng facet_grid():

p = ggplot(data=Glucose, aes(x=Time, y=Y, group=ID, color=as.factor(Treatment)))
p = p + geom_line()
p + ylab("Concentration") + xlab("Time of treatment") + theme_bw() + facet_grid(. ~ Treatment)



Thêm đường trung bình cho mỗi nhóm để dễ so sánh bằng cách dùng stat_summarygroup=1:

p = ggplot(data=Glucose, aes(x=Time, y=Y, group=ID, color=as.factor(Treatment)))

p = p + geom_line()
p = p + stat_summary(aes(group=1), geom="line", fun.y=mean, shape = 16, size=2)
p = p + facet_grid(. ~ Treatment)
p



Cũng có thể smooth:

p = ggplot(data=Glucose, aes(x=Time, y=Y, group=ID, color=as.factor(Treatment)))
p = p + geom_line()
p = p + stat_smooth(aes(group=1)) + stat_summary(aes(group=1), geom="line", fun.y=mean, shape = 16, size=2)
p = p + facet_grid(. ~ Treatment)
p




No comments:

Post a Comment