dùng phần mềm R phân tích số liệu bằng biểu đồ
Trang 18
Y u t th giác r t quan tr ng Ng i Trung Qu c có câu “m t bi u đ có giá tr
b ng c v n ch vi t” Qu th t, bi u đ t t có kh n ng gây n t ng cho ng i đ c báo khoa h c r t l n, và th ng có giá tr đ i di n cho c công trình nghiên c u Vì th bi u
đ là m t ph ng ti n h u hi u nh t đ nh n m nh thông đi p c a bài báo Bi u đ
th ng đ c s d ng đ th hi n xu h ng và k t qu cho t ng nhóm, nh ng c ng có th dùng đ trình bày d ki n m t cách g n gàng Các bi u đ d hi u, n i dung phong phú
là nh ng ph ng ti n vô giá Do đó, nhà nghiên c u c n ph i suy ngh m t cách sáng t o cách th hi n s li u quan tr ng b ng bi u đ Vì th , phân tích bi u đ đóng m t vai trò
c c kì quan tr ng trong phân tích th ng kê Có th nói, không có đ th là phân tích
th ng kê không có ngh a
Trong ngôn ng R có r t nhi u cách đ thi t k m t bi u đ g n và đ p Ph n l n
nh ng hàm đ thi t k bi u đ có s n trong R, nh ng m t s lo i bi u đ tinh vi và ph c
t p khác có th thi t k b ng các package chuyên d ng nh lattice hay trellis có
th t i t website c a R Trong ch ng này tôi s ch cách v các bi u đ thông d ng
b ng cách s d ng các hàm ph bi n trong R
8.1 Môi tr ng và thi t k bi u đ
8.1.1 Nhi u bi u đ cho m t c a s (windows)
Thông th ng, R v m t bi u đ cho m t c a s Nh ng chúng ta có th v nhi u
bi u đ trong m t c a s b ng cách s d ng hàm par Ch ng h n nh par(mfrow=c(1,2))có hi u n ng chia c a s ra thành 1 dòng và hai c t, t c là chúng ta có th trình bày hai bi u đ k c nh bên nhau Còn par(mfrow=c(2,3)) chia c a s ra thành 2 dòng và 3 c t, t c chúng ta có th trình bày 6 bi u đ trong m c a
s Sau khi đã v xong, chúng ta có th quay v v i “ch đ ” 1 c a s b ng l nh par(mfrow=c(1,1)
Ví d sau đây t o ra m t d li u g m hai bi n x và y b ng ph ng pháp mô ph ng
(t c s li u hoàn toàn đ c t o ra b ng R) Sau đó, chúng ta chia c a s thành 2 dòng và
Trang 2> barplot(x, main=”Bar chart of x”)
8.1.2 t tên cho tr c tung và tr c hoành
Bi u đ th ng có tr c tung (y-axis) và tr c hoành Vì d li u th ng đ c g i
b ng các ch vi t t t, cho nên bi u đ c n ph i có tên cho t ng bi n đ d theo dõi Trong ví d sau đây, bi u đ bên trái không có tên mà ch dùng tên c a bi n g c (t c x và
y), còn bên ph i có tên d hi u h n
Trang 3Bi u đ 2 Bi u đ bên trái không có tên g i, bi u
đ bên ph i có tên g i cho tr c tung, tr c hoành và
Trang 48.1.3 Cho gi i h n c a tr c tung và tr c hoành
N u không cung c p gi i h n c a tr c tung và tr c hoành, R s t đ ng tìm đi u
ch nh và cho các s li u này Tuy nhiên, chúng ta c ng có th ki m soát bi u đ b ng cách s d ng xlim và ylim đ cho R bi t c th gi i h n c a hai tr c này:
> plot(x, y, xlab=”X factor”,
> plot(y, type="l"); title("lines")
> plot(y, type="b"); title("both")
> plot(y, type="o"); title("overstruck")
> plot(y, type="h"); title("high density")
Trang 5
> par(mfrow=c(2,2))
> plot(y, type="l", lty=1); title(main="Production data", sub="lty=1")
> plot(y, type="l", lty=2); title(main="Production data", sub="lty=2")
> plot(y, type="l", lty=3); title(main="Production data", sub="lty=3")
> plot(y, type="l", lty=4); title(main="Production data", sub="lty=4")
Chúng ta có th ki m soát màu s c c a m t bi u đ b ng l nh col Giá tr m c
đ nh c a col là 1 Tuy nhiên, chúng ta có th thay đ i các màu theo ý mu n h oc b ng cách cho s ho c b ng cách vi t ra tên màu nh “red”, “blue”, “green”,
“orange”, “yellow”, “cyan”, v.v…
Ví d sau đây dùng m t hàm đ v ba đ ng bi u di n v i ba màu đ , xanh n c bi n, và xanh lá cây:
> plot(runif (10), ylim=c(0,1), type='l')
> for (i in c('red', 'blue', 'green'))
Trang 6Ngoài ra, chúng ta còn có th v đ ng bi u di n b ng cách t ng b dày c a m i đ ng:
> plot(runif(5), ylim=c(0,1), type='n')
Varying the line thickness
Hình d ng c a bi u đ c ng có th thay đ i b ng type nh sau:
> op <- par(mfrow=c(3,2))
Trang 7Khung bi u đ có th ki m soát b ng l nh bty v i các thông s nh sau:
Cách hay nh t đ b n đ c làm quen v i các cách v bi u đ này là b ng cách th trên R
đ bi t rõ h n
Kí hi u c a m t bi u đ c ng có th thay th b ng cách cung c p s cho pch (plotting character) trong R Các kí hi u thông d ng là:
Trang 98.1.6 Ghi chú (legend)
Hàm legend r t có ích cho vi c ghi chú m t bi u đ và giúp ng i đ c hi u
đ c ý ngh a c a bi u đ t t h n Cách s d ng legend có th minh jo b ng ví d sau đây:
> legend(2,-2, c("Production","Regression line"), pch=16, lty=c(0,1))
Thông s legend(2, -2) có ngh a là đ t ph n ghi chú vào tr c hoành (x-axis) b ng 2
Bi u đ 5 nh h ng c a legend
8.1.7 Vi t ch trong bi u đ
Ph n l n các bi u đ không cung c p ph ng ti n đ vi t ch hay ghi chú trong
bi u đ , hay có cung c p nh ng r t h n ch Trong R có hàn mtext() cho phép chúng ta đ t ch vi t hay gi i thích bên c nh hay trong bi u đ
Trang 10B t đ u t phía d i c a bi u đ (side=1), chúng ta chuy n theo h ng kim
đ ng h đ n c nh s 4 L nh plot trong ví d sau đây không in tên c a tr c và tên c a
bi u đ , nh ng ch cung c p m t cái khung Trong ví d này, chúng ta s d ng cex (character expansion) đ ki m soát kích th c c a ch vi t Theo m c đ nh thì cex=1,
nh ng v i cex=2, ch vi t s có kích th c g p hai l n kích th c m c đ nh L nh text() cho phép chúng ta đ t ch vi t vào m t v trí c th L nh th nh t đ t ch
vi t trong ngo c kép và trung tâm t i x=15, y=4.3 Qua s d ng adj, chúng ta còn
có th s p x p v phía trái (adj=0) sao cho t a đ là đi m xu t phát c a ch vi t
> plot(y, xlab=" ", ylab=" ", type="n")
> mtext("Text on side 1, cex=1", side=1,cex=1)
> mtext("Text on side 2, cex=1.2", side=2,cex=1.2)
> mtext("Text on side 3, cex=1.5", side=3,cex=1.5)
> mtext("Text on side 4, cex=2", side=4,cex=2)
> text(15, 4.3, "text(15, 4.3)")
> text(35, 3.5, adj=0, "text(35, 3.5), left aligned")
> text(40, 5, adj=1, "text(40, 5), right aligned")
abline(a,b): đ ng h i qui tuy n tính a=intercept và b=slope
abline(h=30) v m t đ ng ngang t i y=30
abline(v=12) v m t đ ng th ng đ ng t i đi m x=12
Ngoài ra, chúng ta còn có th cho vào bi u đ m t m i tên đ ghi chú m t đi m s li u nào đó
> N <- 200
Trang 11Ph n text(0, 1) yêu c u R vi t ch t i t a đ x=0, y=1
> arrows(-1, 1.0, 1.5, 1.5)
> text(0, 1, "Trung tam", cex=0.7)
Trang 12Sau khi đã bi t qua môi tr ng và nh ng l a ch n đ thi t k m t bi u đ , bây
gi chúng ta có th s d ng m t s hàm thông d ng đ v các bi u đ cho s li u Theo tôi, bi u đ có th chia thành 2 lo i chính: bi u đ dùng đ mô t m t bi n s và bi u đ
v m i liên h gi a hai hay nhi u bi n s T t nhiên, bi n s có th là liên t c hay không liên t c, cho nên, trong th c t , chúng ta có 4 lo i bi u đ Trong ph n sau đây, tôi s
đi m qua các lo i bi u đ , t đ n gi n đ n ph c t p
Có l cách t t nh t đ tìm hi u cách v đ th b ng R là b ng m t d li u th c t
Tôi s quay l i ví d 2 trong ch ng tr c Trong ví d đó, chúng ta có d li u g m 8
c t (hay bi n s ): id, sex, age, bmi, hdl, ldl, tc, và tg (Chú ý, id
là mã s c a 50 đ i t ng nghiên c u; sex là gi i tính (nam hay n ); age là đ tu i; bmi là t s tr ng l ng; hdl là high density cholesterol; ldl là low density cholesterol; tc là t ng s - total – cholesterol; và tg triglycerides) D li u đ c ch a trong directory directory c:\works\insulin d i tên chol.txt Tr c khi v đ
th , chúng ta b t đ u b ng cách nh p d li u này vào R
> setwd(“c:/works/stats”)
> cong <- read.table(“chol.txt”, header=TRUE, na.strings=”.”)
> attach(cong)
Hay đ ti n vi c theo dõi tôi s nh p các d li u đó b ng các l nh sau đây:
sex <- c(“Nam”, “Nu”, “Nu”,“Nam”,“Nam”, “Nu”,“Nam”,“Nam”,“Nam”, “Nu”,
“Nu”,“Nam”, “Nu”,“Nam”,“Nam”, “Nu”, “Nu”, “Nu”, “Nu”, “Nu”,
“Nu”, “Nu”, “Nu”, “Nu”,“Nam”,“Nam”, “Nu”,“Nam”, “Nu”, “Nu”,
“Nu”,“Nam”,“Nam”, “Nu”, “Nu”,“Nam”, “Nu”,“Nam”, “Nu”, “Nu”,
Trang 13“Nam”, “Nu”,“Nam”,“Nam”,“Nam”, “Nu”,“Nam”,“Nam”, “Nu”, “Nu”)
cong <- data.frame(sex, age, bmi, hdl, ldl, tc, tg)
Sau khi đã có s li u, chúng ta s n sàng ti n hành phân tích s li u b ng bi u đ nh sau:
8.3 Bi u đ cho m t bi n s r i r c (discrete variable): barplot
Bi n sex trong d li u trên có hai giá tr (nam và nu), t c là m t bi n không liên
t c Chúng ta mu n bi t t n s c a gi i tính (bao nhiêu nam và bao nhiêu n ) và v m t
Trang 14Có 22 nam và 28 n a trong nghiên c u Sau đó dùng hàm barplot đ th hi n t n s này nh sau:
> barplot(sex.freq, main=”Frequency of males and females”)
Bi u trên c ng có th có đ c b ng m t l nh đ n gi n h n (Bi u đ 8a):
> barplot(table(sex), main=”Frequency of males and females”)
b ng thông s horiz = TRUE, nh sau (xem k t qu trong Bi u đ 6b):
> barplot(sex.freq,
horiz = TRUE,
col = rainbow(length(sex.freq)),
main=”Frequency of males and females”)
8.4 Bi u đ cho hai bi n s r i r c (discrete variable): barplot
Age là m t bi n s liên t c Chúng ta có th chia b nh nhân thành nhi u nhóm
d a vào đ tu i Hàm cut có ch c n ng “c t” m t bi n liên t c thành nhi u nhóm r i
Trang 15Có hi u qu chia bi n age thành 3 nhóm T n s c a ba nhóm này là: 42 tu i đ n 54.7
tu i thành nhóm 1, 54.7 đ n 67.3 thành nhóm 2, và 67.3 đ n 80 tu i thành nhóm 3 Nhóm 1 có 19 b nh nhân, nhóm 2 và 3 có 24 và 7 b nh nhân
Bây gi chúng ta mu n bi t có bao nhiêu b nh nhân trong t ng đ tu i và t ng gi i tính
K t qu trên cho th y chúng ta có 10 b nh nhân nam và 9 n trong nhóm tu i th nh t,
10 nam và 14 n a trong nhóm tu i th hai, v.v… th hi n t n s c a hai bi n này, chúng ta v n dùng barplot:
> barplot(age.sex, main=”Number of males and females in each age
Trong Bi u đ 7a, m i c t là cho m t đ tu i, và ph n đ m c a c t là n , và ph n màu
nh t là t n s c a nam gi i Thay vì th hi n t n s nam n trong m t c t, chúng ta c ng
có th th hi n b ng 2 c t v i beside=T nh sau (Bi u đ 7b):
barplot(age.sex, beside=TRUE, xlab="Age group")
8.5 Bi u đ hình tròn
Trang 16Bi u đ 8a T n s cho 3 nhóm tu i Bi u đ 8b T n s cho 5 nhóm tu i
8.6 Bi u đ cho m t bi n s liên t c: stripchart và hist
8.6.1 Stripchart
Bi u đ strip cho chúng ta th y tính liên t c c a m t bi n s Ch ng h n nh chúng ta mu n tìm hi u tính liên t c c a triglyceride (tg), hàm stripchart() s giúp trong m c tiêu này:
> stripchart(tg,
main=”Strip chart for triglycerides”, xlab=”mg/L”)
Trang 17Age là m t bi n s liên t c v bi u đ t n s c a bi n s age, chúng ta ch
đ n gi n l nh hist(age) Nh đã đ c p trên, chúng ta có th c i ti n đ th này b ng cách cho thêm t a đ chính (main) và t a đ c a tr c hoành (xlab) và tr c tung (ylab):
> hist(age)
> hist(age, main="Frequency distribution by age group", xlab="Age
group", ylab="No of patients")
Trang 18Bi u đ 9b Thêm tên bi u đ và tên c a tr c
trung và tr c hoành b ng xlab và ylab
Bi u đ 10a Xác su t phân ph i m t đ cho
bi n age (đ tu i) Bi u bi n age (đ 10b Xác su t phân ph i m t đ cho đ tu i) v i nhi u interquartile
Trang 19Chúng ta có th v hai đ th ch ng lên b ng cách dùng hàm interquartile nh sau (k t
qu xem Bi u đ 10b):
> iqr <- diff(summary(age)[c(2,5)])
> des <- density(age, width=0.5*iqr)
> hist(age, xlim=range(des$x), probability=TRUE)
> lines(des, lty=2)
Trong đ th trên, chúng ta dùng kho ng cách 0.5*iqr (t ng đ i “g n” nhau) Nh ng chúng ta có th bi n đ i thông s này thành 1.5*iqr đ làm cho phân ph i th c t h n:
> iqr <- diff(summary(age)[c(2,5)])
> des <- density(age, width=1.5*iqr)
> hist(age, xlim=range(des$x), probability=TRUE)
> n <- length(age)
> plot(sort(age), (1:n)/n, type="s", ylim=c(0,1))
K t qu đ c trình bày trong ph n trái c a bi u đ sau đây (Bi u đ 11)
Trang 20bi n age (đ tu i) Bi u phân ph i chu n hay không đ 12 Ki m tra bi n age có theo lu t
Trong đ th trên, tr c tung là xác su t tích l y và tr c hoành là đ tu i t th p đ n cao
đ (t c là đ nh l ng phân ph i và đ nh l ng s li u b ng nhau) Nh ng qua Bi u đ
12, chúng ta th y phân ph i c a age không h n theo lu t phân ph i chu n
8.6.3 Bi u đ h p (boxplot)
v bi u đ h p c a bi n s tc, chúng ta ch đ n gi n l nh:
> boxplot(tc, main="Box plot of total cholesterol", ylab="mg/L")
Trang 21Bi u đ 13. Trong bi u đ này, chúng ta th y median
(trung v ) kho ng 5.6 mg/L, 25% total cholesterol th p
h n 4.1, và 75% th p h n 6.2 Total cholesterol th p nh t
là khoang 3, và cao nh t là trên 8 mg/L.
Trong bi u đ sau đây, chúng ta so sánh tc gi a hai nhóm nam và n :
> boxplot(tc ~ sex, main=”Box plot of total cholestrol by sex”,
ylab="mg/L")
K t qu trình bày trong Bi u đ 14a Chúng ta có th bi n đ giao di n c a đ th b ng
cách dùng thông s horizontal=TRUE và thay đ i màu b ng thông s col nh sau
(Bi u đ 14b):
> boxplot(tc~sex, horizontal=TRUE, main="Box plot of total
cholesterol", ylab="mg/L", col = "pink")
Trang 22Bi u đ 14a Trong bi u đ này, chúng ta
th y trung v c a total cholesterol n gi i
th p h n nam gi i, nh ng đ dao đ ng gi a
hai nhóm không khác nhau bao nhiêu
Bi u đ 14b Total cholesterol cho t ng
gi i tính, v i màu s c và hình h p n m ngang
8.6.4 Bi u đ thanh (bar chart)
Trang 238.6.5 Bi u đ đi m (dotchart)
M t đ th khác cung c p thông tin gi ng nh barplot là dotchart:
> dotchart(bmi, xlab="Body mass index (kg/m^2)", main="Distribution of BMI")
v m i liên h gi a bi n s tc và hdl, chúng ta s d ng hàm plot Thông s th nh t
c a hàm plot là tr c hoành (x-axis) và thông s th 2 là tr c tung tìm hi u m i liên
h gi a tc và hdl chúng ta đ n gi n l nh:
> plot(tc, hdl)
Trang 25F M
M
F F
F F F
F
M
F M
F
F M F
M M
M F
M M F
Chúng ta c ng có th v m t đ ng bi u di n h i qui tuy n tính (regression line) qua các
đi m trên b ng cách ti p t c ra các l nh sau đây:
> plot(hdl ~ tc, pch=16, main="Total cholesterol and HDL cholesterol", xlab="Total cholesterol", ylab="HDL cholesterol", bty=”l”)
> reg <- lm(hdl ~ tc)
> abline(reg)
K t qu là Bi u đ 19a d i đây Chúng ta c ng có th dùng hàm tr n (smooth function)
đ bi u di n m i liên h gi a hai bi n s th sau đây s d ng lowess (m t hàm thông th ng nh t) trong vi c “làm tr n” s li u tc và hdl (Bi u đ 19b)
> plot(hdl ~ tc, pch=16,
main="Total cholesterol and HDL cholesterol with LOEWSS smooth
function",
xlab="Total cholesterol", ylab="HDL cholesterol", bty=”l”)
> lines(lowess(hdl, tc, f=2/3, iter=3), col="red")
Trang 268.8 Phân tích Bi u đ cho nhi u bi n: pairs
Chúng ta có th tìm hi u m i liên h gi a các bi n s nh age, bmi, hdl, ldl và
tc b ng cách dùng l nh pairs Nh ng tr c h t, chúng ta ph i đ a các bi n s này vào m t data.frame ch g m nh ng bi n s có th v đ c, và sau đó s d ng hàm pairs trong R
> lipid <- data.frame(age,bmi,hdl,ldl,tc)
> pairs(lipid, pch=16)
K t qu s là: